• <label id="gmp5l"></label>

    <li id="gmp5l"></li>
      • 您好,歡迎訪問上海意泓電子科技有限責(zé)任公司網(wǎng)站!
        4新聞資訊
        您的位置: 首頁 ->  新聞資訊 -> 單片機

        ?51單片機 (6)串口中斷通信+定時器2串口中斷

        文章出處:單片機 責(zé)任編輯:上海意泓電子科技有限責(zé)任公司 發(fā)表時間:
        2018
        05-19

        51單片機默認使用定時器1作為串口通信的波特率發(fā)生器、定時器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);     //注:必需要無限循環(huán)  

        13. }  

        14.   

        15.   

        16. /* 

        17. //單片機時鐘周期:11.0592MHz   以時鐘1作為波特率發(fā)生器 

        18. void SerialInit(){ 

        19.  TMOD=0x20;   //設(shè)置T1工作方式為方式2 

        20.  TH1=0xfd; //給定時器高位裝初值 

        21.  TL1=0xfd; //給定時器低位裝初值 

        22.  TR1=1;  //開定時器 

        23.              //以上是設(shè)置波特率 

        24.  SM0=0;  //設(shè)置串口通訊方式為方式1 

        25.  SM1=1;   

        26.  REN=1;  //串口是否接收數(shù)據(jù)的開關(guān) 

        27.  

        28.  EA=1; //總中斷打開,采用查詢法時不用打開中斷 

        29.  ES=1; //串口中斷開關(guān),采用查詢法時不用打開中斷 

        30. */  

        31. //單片機時鐘周期:11.0592MHz       以時鐘T2作為波特率發(fā)生器  

        32. void SerialInit(){  

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

        34.      SCON = 0x50;       //方式1,8位數(shù)據(jù),可變波特率,接收允許  

        35.      T2CON  = 0x34;     

        36.      RCAP2H = 0xFF;      

        37.      RCAP2L = 0xDC;    

        38.      TH2    = 0xFF;    

        39.      TL2    = 0xDC;  

        40.          

        41.      EA=1; //總中斷打開,采用查詢法時不用打開中斷   

        42.      ES = 1;          //串口中斷開關(guān),采用查詢法時不用打開中斷  

        43.   

        44. }  

        45.   

        46.   

        47. //串口中斷函數(shù):  

        48. void SerialPortInte(void) interrupt 4 //采用串口中斷法收發(fā)數(shù)據(jù)  

        49. {  

        50.      unsigned char rbyte;  

        51.      if(RI){     //RI=1,判定為串口接收到了數(shù)據(jù),RI要清零,  

        52.          RI=0;  

        53.          rbyte=SBUF;   

        54.          if(rbyte==0x0A){       

        55.             SendString("換行");  

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

        57.             SendString("回車");  

        58.          }else{  

        59.             SendByte(rbyte);   

        60.          }  

        61.               

        62.      }  

        63.   

        64. }  

        65.   

        66. //串口發(fā)送一個字節(jié):  

        67. void SendByte(unsigned char sbyte)  

        68. {   

        69.      SBUF=sbyte; //發(fā)送數(shù)據(jù)  

        70.      while(!TI); //等待發(fā)送完成  

        71.      TI=0; //清零發(fā)送標志位  

        72. }  

        73.    

        74. //串口發(fā)送一個字符串:  

        75. void SendString(unsigned char *pstr) //定義指針  

        76. {  

        77.      while(*pstr!='\0') //字符串是否發(fā)完  

        78.      {  

        79.          SendByte(*pstr);//發(fā)送字符串數(shù)據(jù)  

        80.          pstr++; //指向下一個字符  

        81.      }  

        82. }  

        83.   

        84. void DelayMs(unsigned int i)  //延時i ms  

        85. {  

        86.     unsigned int j;  

        87.     while(i--)  

        88.     {  

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

        90.     }  


        上海意泓電子科技有限責(zé)任公司 版權(quán)所有 未經(jīng)授權(quán)禁止復(fù)制或鏡像

        CopyRight 2020-2025 www.jlodreman.com All rights reserved   滬ICP備2021005866號

        亚洲人成影院在线观看,91综合永久在线观看,欧洲亚洲日韩国产AV一级,中文字幕在线视频播放
      • <label id="gmp5l"></label>

        <li id="gmp5l"></li>