;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;
}
}
}
}