;PIC16F877单片机程序 LISTP=16F876 #INCLUDEP16F876.INC CBLOCK 0X24 COUNT TEMP ENDC ORG0X0000 NOP STARTGOTOMAIN ORG0X020 MAINMOVLW0X30;将RAM单元初始化 MOVWFFSR BCFSTATUS,RP0 MOVLW0X22 MOVWFCOUNT INTRAMMOVFCOUNT,0 MOVWFINDF INCFCOUNT,1 INCFFSR,1 BTFSSFSR,7 GOTOINTRAM BANKSELTXSTA;波特率设置为9 600 bps MOVLW0X19 MOVWFSPBRG;异步高速方式 MOVLW0X04 MOVWFTXSTA BCFSTATUS,RP0 MOVLW0X80;串行口使能 MOVWFRCSTA MOVLW0X30 MOVWFFSR BSFRCSTA,CREN;接收允许 BSFSTATUS,RP0 BSFTXSTA,TXEN;发送允许 BCFSTATUS,RP0 WAITBTFSSPIR1,RCIF;接收PC机命令 GOTOWAIT MOVFRCREG,0 MOVWFTEMP MOVWFINDF INCFFSR DECFSZTEMP;接收到的数据为1,则接收 GOTOTXW;否则发送数据 MOVLW0X06 MOVWFTEMP WAIT1BTFSSPIR1,RCIF;接收一个数据 GOTOWAIT1 MOVFRCREG,0 MOVWFCOUNT MOVWFTXREG LOOPTXBTFSSPIR1,TXIF;将接收到的数据送回PC机 GOTOLOOPTX MOVFCOUNT,0 MOVWFINDF INCFFSR DECFSZTEMP GOTOWAIT1 GOTOOVER;处理完毕 TXWMOVLW0X09;向PC机发送9个数据 MOVWFTEMP MOVLW0X30 MOVWFFSR TXW0MOVFINDF,0 MOVWFTXREG INCFFSR TXW1BTFSSPIR1,TXIF GOTOTXW1 DECFSZTEMP GOTOTXW0 OVERBCFRCSTA,CREN;通信任务完成,关接受和发送允许 BSFSTATUS,RP0 BCFTXSTA,TXEN BCFSTATUS,RP0 CALLLED;调用显示子程序,将发送(或接收)的数据显示出来 END;程序完
PC 机程序
PC采用Toubr C 进行编写。程序如下:
#defineport0x3f8/*利用串口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; } } } }