十年專注單片機方案開發的方案公司英銳恩,分享基于QL200的數字電壓表。英銳恩現提供服務產品涉及主控芯片:8位單片機、16位單片機、32位單片機及各類運算放大器等。
單片機PIC1編程(發送部分) LIST P=16F877 #INCLUDE P16F876單片機.INC CBLOCK 0X24 ;保留三個字節作為顯示用 COUNT ;作計數器或暫存器用 ENDC ORG 0X0000 ;程序復位入口 NOP START GOTO MAIN ORG 0X20 MAIN MOVLW 0X30 ;以下將RAM內容初始化 MOVWF FSR ;從30H單元開始 MOVLW 0X30 ;將值30H賦給單元30H MOVWF COUNT INTRAM MOVF COUNT,0 ;將30H~7FH賦給單元30H~7FH MOVWF INDF INCF COUNT,1 INCF FSR,1 BTFSS COUNT,7 GOTO INTRAM BSF STATUS,RP0 ;將SCI部件初始化 MOVLW 0X19 ;
將傳輸的波特率設為約9600 bps MOVWF SPBRG MOVLW 0X04 ;選擇異步高速方式傳輸8位數據 MOVWF TXSTA BCF STATUS,RP0 MOVLW 0X80 ;允許同步串行口工作 MOVWF RCSTA BSF STATUS,RP0 BSF TRISC,7 ;將RC6、RC7設置為輸入方式,斷絕與外接電路的連接 BSF TRISC,6 BCF STATUS,RP0 MOVLW 0X30 ;30H作為同步字符發送 MOVWF FSR MOVF INDF,0 MOVWF TXREG ;將待發送的數據寫入發送緩沖器TXREG BSF STATUS,RP0 BSF TXSTA,TXEN ;發送允許 BCF STATUS,RP0 BSF RCSTA,CREN ;接收數據允許 LOOPTX BTFSS PIR1,RCIF ;等待PIC2的響應字節 GOTO LOOPTX MOVF RCREG,0 ;讀響應字節,清RCIF LOOPTX1 BTFSS PIR1,TXIF ;發送下一字節 GOTO LOOPTX1 INCF FSR MOVF INDF,0 MOVWF TXREG BTFSS FSR,7 ;30H~7FH單元的內容是否發送完? GOTO LOOPTX ;沒有,繼續下一字節的發送 BSF STATUS,RP0 ;如果是,則停止發送 BCF TXSTA,TXEN BCF STATUS,RP0 ;數據發送完畢 CALL LED ;調用顯示子程序,將發送的數據顯示出來 END ;程序完
2. 單片機PIC2編程(接收部分) LIST P=16F876 #INCLUDE P16F876.INC CBLOCK 0X24 COUNT ENDC ORG 0X0000 NOP START GOTO MAIN MAIN BSF STATUS,RP0 ;初始化程序同發送子程序 MOVLW 0X19 ;波特率設置與PIC1相同 MOVWF SPBRG MOVLW 0X04 ;異步高速傳輸 MOVWF TXSTA BCF STATUS,RP0 MOVLW 0X80 ;串行口工作使能 MOVWF RCSTA BSF STATUS,RP0 BSF TRISC,7 ;與外接電路隔離 BSF TRISC,6 BCF STATUS,RP0 MOVLW 0X30 ;從30H單元開始存放發送來的數據 MOVWF FSR BSF RCSTA,CREN ;接收允許 BSF STATUS,RP0 BSF TXSTA,TXEN ;發送允許 BCF STATUS,RP0 WAIT BTFSS PIR1,RCIF ;等待接收數據 GOTO WAIT MOVF RCREG,0 ;讀取數據 MOVWF INDF ;將接收到的響應字節存入PIC2的RAM INCF FSR MOVWF TXREG ;發送響應字節 LOOPTX BTFSS PIR1,TXIF ;等待寫入完成 GOTO LOOPTX BTFSS FSR,7 ;全部數據接收否? GOTO WAIT1 ;沒有,繼續接收其它數據 BCF RCSTA,RCEN ;接收完,則關斷接收和發送數據允許 BSF STATUS,RP0 BCF PIE1,TXEN BCF STATUS,RP0 CALL LED ;調用顯示子程序,將接受到的數據顯示出來 END ;程序完
單片機雙機同步通信 1. 單片機PIC1編程(主控發送) LIST P=16F876 #INCLUDE P16F876.INC CBLOCK 0X24 ;保留三個字節作為顯示用 COUNT ;作計數器或暫存器用 ENDC ORG 0X0000 ;程序復位入口 NOP START GOTO MAIN ORG 0X0100 MAIN MOVLW 0X30 MOVWF FSR ;以下將從30H單元開始的RAM內容初始化 MOVLW 0X30 ;將值30H賦給單元30H MOVWF COUNT INTRAM MOVF COUNT,0 ;將30H~7FH賦給單元30H~7FH MOVWF INDF INCF COUNT,1 INCF FSR,1 BTFSS COUNT,7 GOTO INTRAM BSF STATUS,RP0 ;將SCI部件初始化 MOVLW 0X19 ;將傳輸的波特率設為約9600 bps MOVWF SPBRG MOVLW 0X94 ;選擇同步高速方式傳輸8位數據 MOVWF TXSTA BCF STATUS,RP0 MOVLW 0X80 ;允許同步串行口工作 MOVWF RCSTA BSF STATUS,RP0 BSF TRISC,7 ;將RC6、RC7設置為輸入方式,斷絕與外接電路的連接 BSF TRISC,6 BSF STATUS,RP0 MOVLW 0X30 ;將從30H單元開始的內容傳送到PIC2 MOVWF FSR MOVF INDF,0 MOVWF TXREG ;將待發送的數據寫入發送緩沖器TXREG BSF STATUS,RP0 BSF TXSTA,TXEN ;發送允許 BCF STATUS,RP0 TX1 BTFSS PIR1,TXIF ;等待上一個數據寫完 GOTO TX1 INCF FSR ;準備發送下一個數據 MOVF INDF,0 MOVWF TXREG ;將新的數據寫入TXREG BTFSS FSR,7 ;判斷所有30H~7FH單元的內容是否發送完畢? GOTO TX1 ;沒有,則繼續發送其它字節 TX2 BTFSS PIR1,TXIF ;等所有要求發送的數據已經發送完,再額外 GOTO TX2 ;寫一個字節到TXREG,使最后一個數據能夠順利發送 MOVWF TXREG NOP ;延時幾個微秒后,關發送允許 NOP NOP NOP NOP BSF STATUS,RP0 BCF TXSTA,TXEN BCF STATUS,RP0 CALL LED ;調用顯示子程序,將發送的數據顯示出來 END ;程序完 2. 單片機PIC2編程(從動接收) LIST P=16F876 #INCLUDE P16F876.INC CBLOCK 0X24 COUNT ENDC ORG 0X0000 NOP START GOTO MAIN ORG 0X0100 MAIN BSF STATUS,RP0 MOVLW 0X10 ;選擇同步從動方式 MOVWF TXSTA BCF STATUS,RP0 MOVLW 0X80 ;串行口使能 MOVWF RCSTA BSF STATUS,RP0 BSF TRISC,7 ;關斷與外部電路的聯系 BSF TRISC,6 BCF STATUS,RP0 MOVLW 0X30 ;從30H單元開始存放接收的數據 MOVWF FSR BSF RCSTA,CREN ;接收允許 WAIT BTFSS PIR1,RCIF ;等待接收 GOTO WAIT MOVF RCREG,0 ;讀取接收到的數據 MOVWF INDF ;將接收到的數據存入PIC2的RAM INCF FSR BTFSS FSR,7 ;所有的數據是否已接收完? GOTO WAIT ;沒有,繼續接收其它字節 NOP ;延時數微秒后,清接收允許位 NOP NOP NOP BCF RCSTA,RCEN CALL LED ;調用顯示子程序,將接受到的數據顯示出來 END ;程序完
單片機與PC機通信 1. PC機編程 PC采用Toubr C 進行編寫。程序如下: #include #define port 0x3f8 /*利用串口1進行通信*/ int ch[15]; main () { int a; int i,j; int b[6]={88,15,38,26,20,0}; char c; clrscr(); outportb(port+3,0x80); /*準備設置波特率*/ outportb(port,0x0C); /*波特率設置為9 600 bps*/ outportb(port+1,0x00); outportb(port+3,0x03); /*8位數據位,奇偶檢驗,1位停止位*/ outportb(port+1,0x00); /*關中斷*/ inportb(port+5); /*讀一次線路狀態寄存器,使其復位*/ { printf("\t\tsend data or receive data: (s or r?)\n\n\n"); c=getchar(); switch(c) { case ’s’: case ’S’: { while(!(inportb(port+5)&0x20)); /*發送保持器滿則等待*/ outportb(port,0x01); /*否則發送數據01通知單片機準備接收*/ for(i=0;i<6;i++) /*共發送6個數據*/ { a=b[i]; while(!(inportb(port+5)&0x20)) delay(100); /*發送保持器滿,等待*/ outportb(port,a); /*發送a*/ printf("%d\n",a);
/*顯示a*/ while(!(inport(port+5)&1)); /*接收單片機送回的數據*/ ch[i]=inport(port); /*保存*/ } delay(10); for(j=0;j<8;j++) /*顯示接收的回送數據*/ printf("\n%d\n",ch[j]); getch(); break; } case’r’: /*接收數據*/ case’R’: { while(!(inportb(port+5)&0x20)); outportb(port,0x02); /*發送數據02通知單片機發送數據*/ for(j=0;j<9;j++) /*共接收9個數據*/ { while(!(inportb(port+5)&1)); ch[j]=inportb(port); } for(j=0;j<9;j++) printf("\n %d\n",ch[j]); getch(); break; } } } } 2. 單片機編程 LIST P=16F876 #INCLUDE P16F876.INC CBLOCK 0X24 COUNT TEMP ENDC ORG 0X0000 NOP START GOTO MAIN ORG 0X020 MAIN MOVLW 0X30 ;將RAM單元初始化 MOVWF FSR BCF STATUS,RP0 MOVLW 0X22 MOVWF COUNT INTRAM MOVF COUNT,0 MOVWF INDF INCF COUNT,1 INCF FSR,1 BTFSS FSR,7 GOTO INTRAM BANKSEL TXSTA ;波特率設置為9 600 bps MOVLW 0X19 MOVWF SPBRG ;異步高速方式 MOVLW 0X04 MOVWF TXSTA BCF STATUS,RP0 MOVLW 0X80 ;串行口使能 MOVWF RCSTA MOVLW 0X30 MOVWF FSR BSF RCSTA,CREN ;接收允許 BSF STATUS,RP0 BSF TXSTA,TXEN ;發送允許 BCF STATUS,RP0 WAIT BTFSS PIR1,RCIF ;接收PC機命令 GOTO WAIT MOVF RCREG,0 MOVWF TEMP MOVWF INDF INCF FSR DECFSZ TEMP ;
接收到的數據為1,則接收 GOTO TXW ;否則發送數據 MOVLW 0X06 MOVWF TEMP WAIT1 BTFSS PIR1,RCIF ;接收一個數據 GOTO WAIT1 MOVF RCREG,0 MOVWF COUNT MOVWF TXREG LOOPTX BTFSS PIR1,TXIF ;將接收到的數據送回PC機 GOTO LOOPTX MOVF COUNT,0 MOVWF INDF INCF FSR DECFSZ TEMP GOTO WAIT1 GOTO OVER ;處理完畢 TXW MOVLW 0X09 ;向PC機發送9個數據 MOVWF TEMP MOVLW 0X30 MOVWF FSR TXW0 MOVF INDF,0 MOVWF TXREG INCF FSR TXW1 BTFSS PIR1,TXIF GOTO TXW1 DECFSZ TEMP GOTO TXW0 OVER BCF RCSTA,CREN ;通信任務完成,關接受和發送允許 BSF STATUS,RP0 BCF TXSTA,TXEN BCF STATUS,RP0 CALL LED ;調用顯示子程序,將發送(或接收)的數據顯示出來 END ;