×
单片机 > 单片机程序设计 > 详情

51单片机串口通讯之中断法

发布时间:2020-08-25 发布时间:
|
程序讲解:
/*---------------------------------------------------------------*/
 //串口通讯
 //按下按钮,单片机发送数据"Come On!\r\n"给主机
 //单片机晶振:11.0592MHz
 //波特率:  9600bps
 
 
 /*-------------------------------------------------------------*/
 //包含头文件
 #include
 unsigned char code tab[]={"Come On!\r\n"};
 
 #define k1   P3_2  //对应开发板硬件
 
 /*-------------------------------------------------------------*/
 //串口初始化
 void UART_Init(void)
 {
  SCON = 0x50;    //串口工作方式为1,串行允许接受
  TMOD = 0x20;   //定时器1工作在方式2
  PCON = 0x80;   //SMOD = 1; 波特率加倍
  TH1  = 0xfA;      //波特率 9600bps fosc="11".0592MHz
  TL1  = 0xfA;
  ES   = 1;             //开串口中断
  TR1  = 1;            //允许定时器1工作
  EA   = 1;             //开总中断
 }
 
 
 
 /*-------------------------------------------------------------*/
 //延时5000+0us 函数定义
 void delay5ms(void)
 {
   unsigned char i,j,k;
   for(i=135;i>0;i--)
   for(j=2;j>0;j--)
   for(k=7;k>0;k--);
 }
 
 
 
 /*-------------------------------------------------------------*/
 //串口发送一个字节
 void Uart_SendChar(unsigned char dat)
 {
  SBUF = dat;    //待发送的数据写入缓冲区
  while(!TI);        //等待发送完成
  TI = 0;             //清零发送标志位
 }
 
 
 
 /*-------------------------------------------------------------*/
 //串口发送一个字符串
 void Uart_SendString(unsigned char *dat)
 {
  while(*dat!='\0')
  {
   Uart_SendChar(*dat); //发送当前数据
   dat++;                         //指向下一个要发送的数据
  } 
 }
  
 
 
 
 /*-------------------------------------------------------------*/
 //主函数
 void main(void)
 {
  UART_Init();   //初始化串口
 
  while(1)
  { 
   if(k1==0)
   {
    delay5ms();
    if(k1==0)
    {
     Uart_SendString(tab);  //发送数据
     while(P3_2==0);
    }
   }
  }    
 }
 
 
 
 /*-------------------------------------------------------------*/
 //串口接收中断函数
 void INT_UartRcv(void) interrupt 4
 {
  unsigned char Rcv = 0;
  if(RI)                   //查询接收标志位(有数据发送过来时置为1)
  {
   RI  = 0;              //接收标志位清零
   Rcv = SBUF;     //存储缓冲区的数据
   Uart_SendChar(Rcv); //让从电脑上传到单片机的数据,传回的电脑显示
  }
 }
 
本节重点:
1、ES 串行通信中断使能在中断使能寄存器IE 中
寄存器对应位:EA  -   ET2   ES   ET1   EX1   ET0   EX0
EA   使能标志位置位则所有中断使能复位则禁止所有中断
-       保留
ET2  定时器2 中断使能
ES   串行通信中断使能
ET1 定时器1 中断使能
EX1 外部中断1 使能
ET0 定时器0 中断使能
EX0 外部中断0 使能

2、当有数据从串口传送到单片机时,串口接收中断标志位RI会置位,此时若相关中断均使能则会进入串口接收中断服务函数


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Keil(MDK-ARM)系列教程(七)_菜单