加入收藏 | 设为首页 | 会员中心 | 我要投稿 | RSSRSS-巴斯仪表网
您当前的位置:首页 > 电子发烧 > 单片机学习

PIC16F877单片机与PC机通讯的汇编程序

时间:2013-09-08  来源:123485.com  作者:9stone

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


分享到:
来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
栏目导航->单片机学习
  • 电子应用基础
  • 电源技术
  • 无线传输技术
  • 信号处理
  • PCB设计
  • EDA技术
  • 单片机学习
  • 电子工具设备
  • 技术文章
  • 精彩拆解欣赏
  • 推荐资讯
    使用普通运放的仪表放大器
    使用普通运放的仪表放
    3V与5V混合系统中逻辑器接口问题
    3V与5V混合系统中逻辑
    数字PID控制及其改进算法的应用
    数字PID控制及其改进
    恶劣环境下的高性价比AD信号处理数据采集系统
    恶劣环境下的高性价比
    栏目更新
    栏目热门