网站导航: 首页 > 设计参考 > 正文 文章搜索
PIC16F877单片机与PC机通讯的汇编程序
 
文章编号:
081209132045
文章分类: 单片机 PIC
点 击:
...
关 键 词: PIC16F877,PC通讯
文章来源:
网络
摘 要:

 
  1. ;PIC16F877单片机程序  
  2. LIST      P=16F876   
  3. #INCLUDE    P16F876.INC  
  4. CBLOCK 0X24   
  5. COUNT     
  6. TEMP   
  7. ENDC   
  8.       ORG   0X0000   
  9.       NOP  
  10. START   GOTO   MAIN   
  11.       ORG      0X020   
  12. MAIN   MOVLW   0X30            ;将RAM单元初始化   
  13.       MOVWF   FSR   
  14.       BCF      STATUS,RP0   
  15.       MOVLW   0X22   
  16.       MOVWF   COUNT   
  17. INTRAM   MOVF   COUNT,0   
  18.       MOVWF   INDF   
  19.       INCF      COUNT,1   
  20.       INCF      FSR,1   
  21.       BTFSS   FSR,7   
  22.       GOTO   INTRAM   
  23.       BANKSEL   TXSTA         ;波特率设置为9 600 bps   
  24.       MOVLW   0X19   
  25.       MOVWF   SPBRG         ;异步高速方式   
  26.       MOVLW   0X04   
  27.       MOVWF   TXSTA   
  28.       BCF   STATUS,RP0   
  29.       MOVLW   0X80            ;串行口使能   
  30.       MOVWF   RCSTA   
  31.       MOVLW   0X30   
  32.       MOVWF   FSR   
  33.       BSF      RCSTA,CREN      ;接收允许   
  34.       BSF      STATUS,RP0   
  35.       BSF      TXSTA,TXEN      ;发送允许   
  36.       BCF      STATUS,RP0   
  37. WAIT   BTFSS   PIR1,RCIF      ;接收PC机命令   
  38.       GOTO   WAIT   
  39.       MOVF   RCREG,0   
  40.       MOVWF   TEMP   
  41.       MOVWF   INDF   
  42.       INCF   FSR   
  43.       DECFSZ   TEMP         ;接收到的数据为1,则接收   
  44.       GOTO   TXW            ;否则发送数据   
  45.       MOVLW   0X06   
  46.       MOVWF   TEMP   
  47. WAIT1   BTFSS   PIR1,RCIF      ;接收一个数据   
  48.       GOTO   WAIT1   
  49.       MOVF   RCREG,0   
  50.       MOVWF   COUNT   
  51.       MOVWF   TXREG   
  52. LOOPTX   BTFSS   PIR1,TXIF      ;将接收到的数据送回PC机   
  53.       GOTO   LOOPTX   
  54.       MOVF   COUNT,0   
  55.       MOVWF   INDF     
  56.       INCF      FSR   
  57.       DECFSZ   TEMP   
  58.       GOTO   WAIT1   
  59.       GOTO   OVER         ;处理完毕   
  60. TXW      MOVLW   0X09            ;向PC机发送9个数据   
  61.       MOVWF   TEMP   
  62.       MOVLW   0X30   
  63.       MOVWF   FSR   
  64. TXW0   MOVF   INDF,0   
  65.       MOVWF   TXREG   
  66.       INCF      FSR   
  67. TXW1   BTFSS   PIR1,TXIF   
  68.       GOTO   TXW1   
  69.       DECFSZ   TEMP   
  70.       GOTO   TXW0     
  71. OVER   BCF      RCSTA,CREN      ;通信任务完成,关接受和发送允许   
  72.       BSF      STATUS,RP0   
  73.       BCF      TXSTA,TXEN   
  74.       BCF      STATUS,RP0   
  75.       CALL   LED            ;调用显示子程序,将发送(或接收)的数据显示出来   
  76.       END                  ;程序完   
  77.   

PC 机程序
PC采用Toubr C 进行编写。程序如下:

 
  1. #include<stdio.h>   
  2. #define  port    0x3f8               /*利用串口1进行通信*/   
  3. int ch[15];   
  4. main ()   
  5. {   
  6.     int a;   
  7.     int i,j;   
  8.     int b[6]={88,15,38,26,20,0};   
  9.     char c;   
  10.     clrscr();   
  11.     outportb(port+3,0x80);               /*准备设置波特率*/  
  12.     outportb(port,0x0C);               /*波特率设置为9 600 bps*/  
  13.     outportb(port+1,0x00);   
  14.     outportb(port+3,0x03);               /*8位数据位,奇偶检验,1位停止位*/  
  15.     outportb(port+1,0x00);               /*关中断*/  
  16.     inportb(port+5);                  /*读一次线路状态寄存器,使其复位*/  
  17.     {   
  18.         printf("\t\tsend data or receive data: (s or r?)\n\n\n");   
  19.         c=getchar();   
  20.         switch(c)   
  21.         {   
  22.         case 's':   
  23.         case 'S':   
  24.             {   
  25.                 while(!(inportb(port+5)&0x20));         /*发送保持器满则等待*/  
  26.                 outportb(port,0x01);            /*否则发送数据01通知单片机准备接收*/  
  27.                 for(i=0;i<6;i++)               /*共发送6个数据*/  
  28.                 {   
  29.                     a=b[i];   
  30.                     while(!(inportb(port+5)&0x20))   
  31.                         delay(100);                  /*发送保持器满,等待*/  
  32.                     outportb(port,a);               /*发送a*/  
  33.                     printf("%d\n",a);               /*显示a*/  
  34.                     while(!(inport(port+5)&1));         /*接收单片机送回的数据*/  
  35.                     ch[i]=inport(port);               /*保存*/  
  36.                 }   
  37.                 delay(10);   
  38.                 for(j=0;j<8;j++)               /*显示接收的回送数据*/  
  39.                     printf("\n%d\n",ch[j]);   
  40.                 getch();   
  41.                 break;   
  42.             }   
  43.         case'r':                     /*接收数据*/  
  44.         case'R':   
  45.             {   
  46.                 while(!(inportb(port+5)&0x20));        
  47.                 outportb(port,0x02);            /*发送数据02通知单片机发送数据*/  
  48.                 for(j=0;j<9;j++)               /*共接收9个数据*/  
  49.                 {   
  50.                     while(!(inportb(port+5)&1));   
  51.                     ch[j]=inportb(port);   
  52.                 }   
  53.                 for(j=0;j<9;j++)   
  54.                     printf("\n %d\n",ch[j]);   
  55.                 getch();   
  56.                 break;   
  57.             }   
  58.         }   
  59.     }   
  60. }  

 

 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4