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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5875|回復: 3
打印 上一主題 下一主題
收起左側

51單片機中斷、串口通信綜合程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:382145 發表于 2019-8-19 17:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
正在初學51的中斷,定時器,串口等等,遇到很多瓶頸比如串口怎么發送變量的數值啦(加一個0x30就好),分享這個程序給初學者們啦

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



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;//暫停和繼續的切換
  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++;  //記錄主循環運行時間
  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. //發送一個字符
  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;//判斷是否是第一次發送R
  103.         g_b_enter_flag=0; //判斷是否進入主循環,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低電平觸發

  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中斷服務函數
  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,開始進入主循環體
  146.                 {       
  147.                     g_b_enter_flag = 1;
  148.                         g_b_R_flag=1;
  149.             }
  150.                 else if(SBUF==0x44)//接收字母為D,發送LED狀態
  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發送系統狀態和運行時間
  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)//判斷是否發送完成
  222.         {       
  223.             TI = 0;//清零發送完成標志位
  224.         }
  225.     }//end of if(RI)
  226. }
復制代碼

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



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:653636 發表于 2019-12-1 17:12 | 只看該作者
我也是初學者,感謝分享
回復

使用道具 舉報

板凳
ID:682129 發表于 2020-1-6 14:49 | 只看該作者
非常不錯
回復

使用道具 舉報

地板
ID:583247 發表于 2020-3-2 00:32 | 只看該作者

非常不錯
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产视频中文字幕 | 91在线精品秘密一区二区 | 中文字幕中文字幕 | 暖暖成人免费视频 | 国产成人99久久亚洲综合精品 | 亚洲国产精品一区二区久久 | 亚洲视频在线观看免费 | 成人国产精品久久 | 免费在线观看成人av | 日韩一区二区三区精品 | 在线观看国产h | 久久久91精品国产一区二区三区 | 在线免费观看一区二区 | 亚洲国产精品第一区二区 | 成人3d动漫一区二区三区91 | 日韩在线小视频 | 国产一区二区三区 | 午夜精品久久久久久久久久久久 | 国产欧美日韩一区二区三区 | 涩色视频在线观看 | 久久精品国产一区二区三区 | 午夜精品久久久久久久星辰影院 | 密色视频 | 激情一区二区三区 | 国产91在线视频 | 亚洲一区二区三区四区五区午夜 | 午夜丰满少妇一级毛片 | 二区三区av | 伊人久久综合 | 97色在线视频 | 欲色av| 久产久精国产品 | 久久久久国 | 亚洲综合天堂网 | 成人免费看片又大又黄 | av手机在线播放 | 久久小视频 | 国产美女在线免费观看 | 自拍偷拍第一页 | 在线观看国产h | 欧美精品在线播放 |