51系列单片机与PC端串口调试助手进行串口通信

一、51系列单片机与PC端串口调试助手互相进行串口通信的单片机C语言程序

#include <reg52.h> 
#define uchar unsigned char
#define uint unsigned int
unsigned char flag,a,i;
uchar code table[6]="I get";
  //uchar code table[]="I get";
  void init()//初始化函数
{
   TMOD=0x20;//0010 0000定时器工作方式为方式2 8位自动重装
   TH1=0xfd;//初始化计数器高8位 1111 1101
   TL1=0xfd;//初始化计数器低8位
   TR1=1;//启动定时器1
   REN=1;//允许串行中断接收
   SM0=0;//设定串口工作方式 为方式1(10位异步通信)
   SM1=1;//设定串口工作方式
   EA=1;//打开全局中断
   ES=1;//打开串口中断 ES(IE.4)是串行口中断允许位
  }
  void main()
{
   init();
   while(1)
 {
    if(flag==1)//检测变量flag是否为1 为1则中断结束
  {
     ES=0;//关闭串口中断
     for(i=0;i<6;i++)//发送数据
   {
      SBUF=table[i];
      while(!TI);//TI是串口发送完成标志,发送完成硬件自动置TI为1并发起中断进入中断程序
      TI=0;//TI=0,发送未完成
     }
   SBUF=a;//接收数据
   while(!TI);//while(1);是一条指令,它让单片机停在这个位置,一般用来检测中断,只有cpu收到中断指令,才会跳出wh    ile(1),进入中断服务子程序
   TI=0; //TI串口发送中断标志位。每发送完一个串行帧,由硬件置位TI。
   //CPU响应中断时,不能自动清除TI,TI必须由软件清除。
   ES=1;//打开串口中断
   flag=0;
  } 
 }
}
  void ser() interrupt 4//4为串口中断,中断服务程序(函数)不需要申明,所以可以放在main函数后面
{
   RI=0;//RI(SCON.0)串行口接收中断标志位,RI清0取消中断申请便于接收下一个中断
   a=SBUF;//接收、发送缓存器赋于变量a
   flag=1;//置标志位为1
  }

猜你喜欢

转载自www.cnblogs.com/AChenWeiqiangA/p/13178267.html