当前位置: 上海铭静电子科技有限公司 » 单片机

51单片机 (6)串口中断通信+定时器2串口中断

分类:单片机 发布:2018年05月19日 22:42 浏览:1225次 Tag:

51单片机默认使用定时器1作为串口通信的波特率发生器、定时器1中断通信,串口与定时器1冲突,在遇到定时器不够用的时候可以用定时器2


  1. #include   

  2.  

  3. void DelayMs(unsigned int i);  

  4. void SerialInit();  

  5. void SendByte(unsigned char sbyte);  

  6. void SendString(unsigned char *pstr);  

  7.   

  8.   

  9. void main(void)  

  10. {  

  11.         SerialInit();  

  12.         while(1);     //注:必需要无限循环  

  13. }  

  14.   

  15.   

  16. /* 

  17. //单片机时钟周期:11.0592MHz   以时钟1作为波特率发生器 

  18. void SerialInit(){ 

  19.  TMOD=0x20;   //设置T1工作方式为方式2 

  20.  TH1=0xfd; //给定时器高位装初值 

  21.  TL1=0xfd; //给定时器低位装初值 

  22.  TR1=1;  //开定时器 

  23.              //以上是设置波特率 

  24.  SM0=0;  //设置串口通讯方式为方式1 

  25.  SM1=1;   

  26.  REN=1;  //串口是否接收数据的开关 

  27.  

  28.  EA=1; //总中断打开,采用查询法时不用打开中断 

  29.  ES=1; //串口中断开关,采用查询法时不用打开中断 

  30. } 

  31. */  

  32. //单片机时钟周期:11.0592MHz       以时钟T2作为波特率发生器  

  33. void SerialInit(){  

  34.      PCON &= 0x7F;      //波特率不倍速 SMOD=0  

  35.      SCON = 0x50;       //方式1,8位数据,可变波特率,接收允许  

  36.      T2CON  = 0x34;     

  37.      RCAP2H = 0xFF;      

  38.      RCAP2L = 0xDC;    

  39.      TH2    = 0xFF;    

  40.      TL2    = 0xDC;  

  41.          

  42.      EA=1; //总中断打开,采用查询法时不用打开中断   

  43.      ES = 1;          //串口中断开关,采用查询法时不用打开中断  

  44.   

  45. }  

  46.   

  47.   

  48. //串口中断函数:  

  49. void SerialPortInte(void) interrupt 4 //采用串口中断法收发数据  

  50. {  

  51.      unsigned char rbyte;  

  52.      if(RI){     //RI=1,判定为串口接收到了数据,RI要清零,  

  53.          RI=0;  

  54.          rbyte=SBUF;   

  55.          if(rbyte==0x0A){       

  56.             SendString("换行");  

  57.          }else if(rbyte==0x0D){  

  58.             SendString("回车");  

  59.          }else{  

  60.             SendByte(rbyte);   

  61.          }  

  62.               

  63.      }  

  64.   

  65. }  

  66.   

  67. //串口发送一个字节:  

  68. void SendByte(unsigned char sbyte)  

  69. {   

  70.      SBUF=sbyte; //发送数据  

  71.      while(!TI); //等待发送完成  

  72.      TI=0; //清零发送标志位  

  73. }  

  74.    

  75. //串口发送一个字符串:  

  76. void SendString(unsigned char *pstr) //定义指针  

  77. {  

  78.      while(*pstr!='\0') //字符串是否发完  

  79.      {  

  80.          SendByte(*pstr);//发送字符串数据  

  81.          pstr++; //指向下一个字符  

  82.      }  

  83. }  

  84.   

  85. void DelayMs(unsigned int i)  //延时i ms  

  86. {  

  87.     unsigned int j;  

  88.     while(i--)  

  89.     {  

  90.         for(j = 0; j < 125; j++);  

  91.     }  

  92. } 


相关文章
 
资讯栏目
最新资讯
资讯排行
 

收缩
  • 电话咨询

  • 021-31007558