您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>源码下载>汇编编程>

16F877单片机与PC机通讯的源程序

大小:2 人气: 2010-02-25 需要积分:0
的空间

用户级别:注册会员

贡献文章:

贡献资料:

elecfans.com- 16F877单片机与PC机通讯的源程序.rar

;****************************************
;*       单片机与PC机通讯的源程序       *
;****************************************

       ;※※※※※※※※※※※※※※※※※
       ;※资料提供:上海齐济电子有限公司
       ;※联系电话:21-65630199         ※
       ;※※※※※※※※※※※※※※※※※


;单片机与PC机通讯的源程序(详细)  

;单片机的程序
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                  ;程序完

P C 机 程 序
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) 100%

不好我反对

(0) 0%

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!