- ;PIC16F877单片机程序
- 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 ;程序完
PC 机程序
PC采用Toubr C 进行编写。程序如下:
- #include<stdio.h>
- #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;
- }
- }
- }
- }