久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 51單片機中斷、串口通信綜合程序 [打印本頁]

作者: 境s。    時間: 2019-8-19 17:02
標題: 51單片機中斷、串口通信綜合程序
正在初學51的中斷,定時器,串口等等,遇到很多瓶頸比如串口怎么發(fā)送變量的數(shù)值啦(加一個0x30就好),分享這個程序給初學者們啦

功能:
1. 開機以后,LED0和LED1實現(xiàn)0.5秒間隔閃爍2次,蜂鳴器同時鳴叫2次。
2. 之后,串口等待接收到一個字符'R',開始進入主循環(huán)體。
3. 主循環(huán)體中,LED0和LED1實現(xiàn)1秒間隔閃爍。
4. 串口接收到字符'D',回復LED當前狀態(tài)和系統(tǒng)當前處于運行還是暫停狀態(tài),如果運行狀態(tài),收到字符'R',如果暫停狀態(tài),收到字符'P'。
5. 串口接收到字符'T',回復主循環(huán)體開始運行的時間和系統(tǒng)當前處于運行還是暫停狀態(tài),時間單位為秒,最大計數(shù)值65535,以每一位的ASCII碼字符發(fā)送,最后加換行符。
6. 串口接收到其他字符,回復字符'W',且蜂鳴器高頻率鳴叫2次。
7. 主循環(huán)體運行每分鐘,蜂鳴器低頻率鳴叫1次。
8. 開啟INT0中斷,按下S_INT0,可以暫停目前的程序運行,再次按下,可以繼續(xù)運行,之前的所有都保持繼續(xù)運行的狀態(tài),計數(shù)值也繼續(xù)累加。暫停狀態(tài)下, 依然可以響應串口的'D'和'T'的應答回復,具體暫停還是運行狀態(tài)的解釋,詳見第4條要求。
9. 所有定時, 用T0方式1中斷實現(xiàn)。
10. 串行口配置為方式1,4800波特率,中斷接收,查詢發(fā)送。



PS:定時器的初值為了方便是用晶振12HZ算的哦,想要精確延時的朋友記得換成11.0592算一下啦
用的STC89C52REC的迷你單片機,原理圖附在壓縮包里啦

單片機源程序如下:
  1. #include <reg52.h>
  2. #include"main.h"   

  3. void main()
  4. {        
  5.     init();

  6.     for(i=0; i<2; i++)
  7.         {
  8.             LED0 = 0;
  9.             LED1 = 0;
  10.             beep = 0;
  11.             delay(25);
  12.                 LED0 = ~LED0;
  13.             LED1 = ~LED1;
  14.             beep = 1;
  15.             delay(25);
  16.         }

  17. while(1)            
  18. {       
  19.     while(g_b_enter_flag)
  20.     {       
  21.                 if(LED0 == LED1)
  22.             {
  23.                     LED0 = 0;
  24.                 LED1 = 1;
  25.                     delay(50);
  26.                 }
  27.                 LED0 = ~LED0;
  28.             LED1 = ~LED1;
  29.             delay(50);
  30.     }//end of while(g_b_enter_flag)
  31.         while(!g_b_enter_flag)
  32.         {
  33.             ;
  34.         }
  35. }//end of while(1)                 
  36. }

  37. //按鍵中斷子程序
  38. void int0() interrupt 0
  39. {
  40.         g_b_enter_flag = ~g_b_enter_flag;//暫停和繼續(xù)的切換
  41. }  

  42. //定時器中斷子程序
  43. void Timer0() interrupt 1 using 1
  44. {
  45.     TH0 = 0xB1; //重新加載初值
  46.     TL0 = 0xE0;
  47.         g_i_cnt++;
  48.        
  49.         if(g_b_enter_flag)
  50.     {
  51.                  g_i_20ms_time++;  //記錄主循環(huán)運行時間
  52.         }

  53.     if(g_i_20ms_time>50) //主程序運行1s  
  54.         {
  55.         g_i_1s_time++;
  56.                 g_i_totaltime++;
  57.                 g_i_20ms_time = 0;
  58.     }
  59.         if(g_i_1s_time>60) //運行一分鐘
  60.         {          
  61.             beep = 0;
  62.                 cdelay(200);
  63.                 beep = 1;
  64.                 g_i_1s_time=0;       
  65.                                                  
  66.     }
  67.         if(g_i_1s_time>65535)//最大計時值655353
  68.         {
  69.             g_i_1s_time = 0;
  70.         }
  71. }               

  72. //精確延時
  73. void delay(unsigned int z)            
  74. {   
  75.          g_i_cnt=0;
  76.      while(g_i_cnt<z)
  77.          {
  78.                ;
  79.          }
  80.          g_i_cnt=0;         
  81. }

  82. //發(fā)送一個字符
  83. void send(unsigned char byte)
  84. {
  85.         SBUF=byte;
  86.         while(!TI);
  87.         TI=0;
  88. }

  89. //不精確延時
  90. void cdelay(unsigned int k)
  91. {         
  92.      unsigned int x,y;

  93.          for(x=0; x<k; x++)
  94.          {  
  95.              for(y=0;y<600;y++);
  96.          }
  97. }

  98. //外部中斷和定時器的初始化
  99. void init()
  100. {
  101.     i=0;
  102.         g_b_R_flag=0;//判斷是否是第一次發(fā)送R
  103.         g_b_enter_flag=0; //判斷是否進入主循環(huán),0為否,1為是
  104.         g_i_cnt=0;        //精確延時用
  105.         g_i_20ms_time=0;        //一個等于20ms
  106.     g_i_1s_time=0; //一個等于1s
  107.         g_i_totaltime=0;   //主程序運行總時間

  108.         EX0 = 1;//開外部中斷0
  109.         IT0 = 0;//外部中斷0低電平觸發(fā)

  110.     ET0 = 1;//打開定時器0中斷
  111.         TMOD |= 0X01; //定時器工作模式1,16位定時模式
  112.         TR0 = 1;//啟動定時器0
  113.         TH0 = 0xB1;
  114.         TL0 = 0xE0; //定時20ms

  115.     ES = 1; //打開串口中斷
  116.     SCON = 0x50;//配置串口為模式 1
  117.         REN = 1;//串口允許接收
  118.        
  119.         TMOD |= 0x20;//定時器1,工作模式2 8位自動重裝
  120.         TH1 = 0xFA;        //波特率4800
  121.         TL1 = 0xFA;
  122.         ET1 = 0; //禁止 T1 中斷
  123.         TR1 = 1;//啟動定時器1
  124.     EA = 1;        //打開總中斷
  125. }   

  126. //UART中斷服務函數(shù)
  127. void InterruptUART() interrupt 4 using 1
  128. {
  129.    
  130.         if(RI)//判斷接收是否完成
  131.         {
  132.                 RI = 0;//手動清零接收中斷標志位       

  133.                 if((SBUF==0x52)&(g_b_R_flag==1))
  134.                 {
  135.                     send('W');
  136.                     beep=0;
  137.                         cdelay(60);
  138.                         beep=1;
  139.                         cdelay(60);
  140.                         beep=0;
  141.                         cdelay(60);
  142.                         beep=1;
  143.                         cdelay(60);
  144.                 }
  145.             if(SBUF==0x52)        //接受字母為R,開始進入主循環(huán)體
  146.                 {       
  147.                     g_b_enter_flag = 1;
  148.                         g_b_R_flag=1;
  149.             }
  150.                 else if(SBUF==0x44)//接收字母為D,發(fā)送LED狀態(tài)
  151.                 {
  152.                         if(g_b_enter_flag)
  153.                         {
  154.                                 send('R');
  155.                                 send('\n');
  156.                                 if(LED0==1&&LED1==0)
  157.                             {
  158.                                  send('C');
  159.                                 send('O');
  160.                                 send('\n');
  161.                             }
  162.                             else
  163.                             {
  164.                                 send('O');
  165.                                 send('C');
  166.                                 send('\n');
  167.                             }
  168.                         }
  169.                         else
  170.                         {
  171.                                 send('P');
  172.                                 send('\n');
  173.                         }
  174.                 }//end of else if(SBUF==0x44)
  175.                 else if(SBUF==0x54)//接受字母T發(fā)送系統(tǒng)狀態(tài)和運行時間
  176.                 {       
  177.                     if(g_b_enter_flag)
  178.                         {
  179.                         send('R');
  180.                                 send('\n');
  181.                         }
  182.                         else
  183.                         {         
  184.                             send('P');
  185.                                 send('\n');
  186.                         }
  187.                         num1 = 0x30+g_i_totaltime/10000;
  188.                     SBUF = num1;
  189.             while(!TI);
  190.             TI = 0;
  191.                         num2 = 0x30+g_i_totaltime%10000/1000;
  192.                     SBUF = num2;
  193.             while(!TI);
  194.             TI = 0;
  195.                         num3 = 0x30+g_i_totaltime%1000/100;
  196.                     SBUF = num3;
  197.             while(!TI);
  198.             TI = 0;
  199.                         num4 = 0x30+g_i_totaltime%100/10;
  200.                     SBUF = num4;
  201.             while(!TI);
  202.             TI = 0;
  203.                         num5 = 0x30+g_i_totaltime%10;
  204.                     SBUF = num5;
  205.             while(!TI);
  206.             TI = 0;
  207.                         send('\n');
  208.         } //end of        else if(SBUF==0x54)
  209.                 else
  210.                 {
  211.                     send('W');
  212.                         beep=0;
  213.                         cdelay(60);
  214.                         beep=1;
  215.                         cdelay(60);
  216.                         beep=0;
  217.                         cdelay(60);
  218.                         beep=1;
  219.                         cdelay(60);
  220.             }
  221.     if(TI)//判斷是否發(fā)送完成
  222.         {       
  223.             TI = 0;//清零發(fā)送完成標志位
  224.         }
  225.     }//end of if(RI)
  226. }
復制代碼

所有資料51hei提供下載:
totaltask.rar (83.75 KB, 下載次數(shù): 34)




作者: Peilin1024    時間: 2019-12-1 17:12
我也是初學者,感謝分享
作者: liang1889    時間: 2020-1-6 14:49
非常不錯
作者: wang_00008    時間: 2020-3-2 00:32

非常不錯




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 91久久爽久久爽爽久久片 | 国产第一亚洲 | 国产高清av免费观看 | 热久久免费视频 | 99热在线播放 | 九九九久久国产免费 | 日韩一 | 九九热精品视频 | 国产视频一区在线观看 | 国产精品一区二区三区免费观看 | 精品国产乱码久久久久久闺蜜 | 日韩av免费在线电影 | 日韩av三区| 中文天堂在线一区 | 美女在线观看av | 一区二区三区不卡视频 | 欧美日韩国产在线观看 | 日日骚视频 | 日韩精品一区二区三区在线观看 | 免费激情 | 日韩av免费在线电影 | 亚洲精品免费在线 | 日韩在线不卡 | 噜噜噜噜狠狠狠7777视频 | 91视频免费在观看 | 亚洲天堂精品久久 | 日韩欧美久久精品 | 中文字幕视频三区 | 午夜久久久久 | 国产激情第一页 | 免费黄色片在线观看 | 91中文字幕在线观看 | 国产成人精品一区二区三区在线 | 国产午夜精品理论片a大结局 | 国产激情视频 | 午夜精品久久久 | 九九热在线观看视频 | 国产免费视频 | 成人免费看片 | 日本在线视频中文字幕 | av影音资源 |