单片机
返回首页

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

2012-11-27 来源:21ic

;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
#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?) ");
  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 ",a);               /*显示a*/
    while(!(inport(port+5)&1));         /*接收单片机送回的数据*/
    ch[i]=inport(port);               /*保存*/
    }
    delay(10);
    for(j=0;j<8;j++)               /*显示接收的回送数据*/
    printf(" %d ",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(" %d ",ch[j]);
     getch();
     break;
     }
    }
  }
}

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 带有短路保护系统的5V直流稳压电源电路图

  • 如何构建一个触摸传感器电路

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

    相关电子头条文章