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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

藍橋杯單片機超聲波測距報警實時時鐘電路電路具體功能與程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:1073111 發表于 2023-4-25 14:26 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
要求:1. 電路通電后進入初始化狀態:燈L1亮,數碼管全亮,蜂鳴器接通,1s后全部關閉,顯示時間設定11-50-59。2. 按下S7按鍵切換顯示實時時鐘XX-XX-XX、顯示超聲波測量距離XXX。3. 顯示實時時鐘狀態下,按S6按鍵進行時間調整,第一次按下S6進入時調整, “時”閃爍;第二次按下S6進入分調整,“分”閃爍。再一次按下退出調整。S4、S5為調節數值S5+,S4-(時間距離)的加減按鍵。4. 顯示超聲波測距狀態下,按S6按鍵進行報警距離調整,S6按第一次進入調整狀態,第二次按下退出,將調節后的數值保存到24C02中。S4、S5為調節數值S5+,S4-(時間距離)的加按鍵。顯示超聲波報警距離--XXX。5. 超聲波測距報警初值設定為30cm,超聲波檢測超過設定值X不報警,小于X立即報警,小于1.2倍的X, L1燈閃爍。6. 設計一個欠壓電路,12V供電,電壓小于10V切斷電路電源。

單片機源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #include"dsp.h"                                        //顯示函數頭文件
  6. #include"1302.h"                                
  7. #include"chaoshenbo.h"
  8. #include"iic.h"

  9. sbit s7=P3^0;                                        //按鍵
  10. sbit s6=P3^1;
  11. sbit s5=P3^2;
  12. sbit s4=P3^3;

  13. uint sec_add;                   //中斷1秒標志
  14. bit sec_flag;

  15. uint sec_szadd;
  16. bit sec_szflag;

  17. uchar bj_jl;   //報警距離

  18. uint ss;  //距離函數

  19. uchar sz_time[3];

  20. uchar ms_add;    //模式標志位
  21. bit ms_flag;

  22. bit ms_HCflag;         //測距模式下  設置與正常顯示的標志位   為0時正常顯示距離  為1時設置報警距離

  23. void int_t0();                //定時器T0、T1初始化   

  24. void open_led1();
  25. void cls_led1();
  26. void open_beep();
  27. void cls_beep();        

  28. void int_sd();   //上電初始化

  29. void moshi();                                   //正常顯示模式
  30. void sz_moshi();                           //設置時間時的顯示模式

  31. void szHC_moshi();                           //設置報警距離時的顯示模式

  32. void key_s7();                                   //s7功能按鈕,設置時間模式或者距離模式
  33. void key_s6_time();                           //s6設置時間模式功能按鈕
  34. void key_s6_HC();                           //s6設置距離模式功能按鈕

  35. void jiaohu();                                   //功能交互函數


  36. void main()
  37. {                                                         
  38.         int_t0();                                     //定時器初始化
  39.         int_sd();                                    //上電初始化
  40.         int_1302();                                          //初始化1302
  41. //        bj_jl=30;                                        //設置報警距離                                                  第一次寫入程序時要把這兩行屏蔽的恢復  然后再屏蔽掉再寫入  
  42. //        w_iic(0x00,bj_jl);                        //將報警距離寫入24C02
  43.         bj_jl=r_iic(0x00);                        //從24C02中讀取報警距離
  44.         while(1)
  45.         {
  46.                 red_1302();                                //讀取1302時間

  47.                 if(sec_flag)                        //1s讀取一次超聲波距離
  48.                 {
  49.                         ss=red_HC();
  50.                         sec_flag=0;
  51.                 }

  52.                 key_s7();                   //s7按鍵功能

  53.                 jiaohu();                   //功能交互
  54.                

  55.                 if(ss<bj_jl)                   //報警函數
  56.                 {
  57.                         open_beep();
  58.                 }        
  59.                 else
  60.                 {cls_beep();}

  61.                 if(ss<(uint)(bj_jl*1.2))                //小與1.2倍距離時led1閃爍
  62.                 {
  63.                         if(sec_szflag)
  64.                         open_led1();
  65.                         else
  66.                         cls_led1();
  67.                 }  else cls_led1();

  68.         }
  69. }

  70. void t0() interrupt 1
  71. {
  72.         TH0=(65535-1000)/256;
  73.         TL0=(65535-1000)&256;

  74.         sec_add++;                                                  //1秒后sec_flag標志位置1
  75.         if(sec_add==200)
  76.         {
  77.                 sec_add=0;
  78.                 sec_flag=1;
  79.         }

  80.         sec_szadd++;
  81.         if(sec_szadd==1000)
  82.         {
  83.                 sec_szadd=0;
  84.                 sec_szflag=~sec_szflag;
  85.         }

  86.         display();
  87. }

  88. void int_t0()
  89. {
  90.         TMOD=0X11;
  91.         EA=1;
  92.         ET0=1;
  93.         TH0=(65535-1000)/256;
  94.         TL0=(65535-1000)&256;
  95.         TH1=0;
  96.         TL1=0;
  97.         TR0 = 1;                //定時器0開始計時
  98. }


  99. void open_led1()
  100. {
  101.         P2=(P2&0x1f)|0x80;
  102.         P0=0x7f;
  103.         P2&=0x1f;
  104. }

  105. void cls_led1()
  106. {
  107.         P2=(P2&0x1f)|0x80;
  108.         P0=0xff;
  109.         P2&=0x1f;
  110. }

  111. void open_beep()
  112. {
  113.         P2=(P2&0x1f)|0xa0;
  114.         P0=0xff;
  115.         P2&=0x1f;
  116. }

  117. void cls_beep()
  118. {
  119.         P2=(P2&0x1f)|0xa0;
  120.         P0=0x00;
  121.         P2&=0x1f;
  122. }

  123. void int_sd()
  124. {
  125.         open_led1();                                                                                                                                                         //開led1
  126.         dspbuf[0]=dspbuf[1]=dspbuf[2]=dspbuf[3]=dspbuf[4]=dspbuf[5]=dspbuf[6]=dspbuf[7]=12;                 //數碼管全量
  127.         open_beep();                                                                                                                                                         //開蜂鳴器
  128.         while(!sec_flag);                                                                                                                                                 //等待1秒
  129.         cls_led1();                                                                                                                                                                 //關led1  關顯示   關蜂鳴器  sec_flag標志位清零
  130.         dspbuf[0]=dspbuf[1]=dspbuf[2]=dspbuf[3]=dspbuf[4]=dspbuf[5]=dspbuf[6]=dspbuf[7]=11;
  131.         cls_beep();
  132.         sec_flag=0;
  133. }

  134. void delay(uint time)
  135. {
  136.         uint i;
  137.         while(time--)
  138.         {
  139.                 for(i=0;i<800;i++);
  140.         }
  141. }

  142. void moshi()                                                   //顯示模式   
  143. {
  144.         uchar x;
  145.         x=ms_flag;
  146.         switch(x)
  147.         {
  148.                 case 0: dspbuf[0]=shi/10;          //顯示時間模式
  149.                                 dspbuf[1]=shi%10;
  150.                                 dspbuf[2]=10;
  151.                                 dspbuf[3]=min/10;
  152.                                 dspbuf[4]=min%10;
  153.                                 dspbuf[5]=10;
  154.                                 dspbuf[6]=sec/10;
  155.                                 dspbuf[7]=sec%10;
  156.                                 break;

  157.                 case 1: dspbuf[5]=ss/100;          //顯示距離模式
  158.                                 dspbuf[6]=ss%100/10;
  159.                                 dspbuf[7]=ss%10;
  160.                                 dspbuf[0]=11;
  161.                                 dspbuf[1]=11;
  162.                                 dspbuf[2]=11;
  163.                                 dspbuf[3]=11;
  164.                                 dspbuf[4]=11;
  165.                                 break;

  166.         }
  167. }

  168. void key_s7()
  169. {
  170.         if(s7==0)
  171.         {
  172.                 delay(5);
  173.                 if(s7==0)
  174.                 {
  175.                         ms_flag=~ms_flag;                //模式 當MS_FLAG=0時 為顯示時間模式  當MS_FLAG=1時為顯示距離模式
  176.                         while(!s7);
  177.                 }
  178.         }
  179. }

  180. void key_s6_time()                   //時間模式下 s6按鍵功能函數
  181. {
  182.         if(s6==0)
  183.         {
  184.                 delay(5);
  185.                 if(s6==0)
  186.                 {
  187.                         if(ms_add==0)                           //如果s6被按下
  188.                         {
  189.                                 sz_time[0]=shi;                   //儲存當前的時間
  190.                                 sz_time[1]=min;
  191.                                 sz_time[2]=sec;
  192.                         }
  193.                         ms_add++;
  194.                         if(ms_add==3)                                   //當按鈕按下三次以后 將設置后的時間寫入1302
  195.                         {
  196.                                 ms_add=0;                                   //標志清零
  197.                                 write_13(0x8e,0x00);
  198.                                 write_13(0x80,sz_time[2]);                //秒存
  199.                                 write_13(0x82,sz_time[1]);                //分存
  200.                                 write_13(0x84,sz_time[0]);                //時存
  201.                                 write_13(0x8e,0x80);
  202.                         }
  203.                         while(!s6);
  204.                 }
  205.         }
  206. }

  207. void key_s6_HC()                                                           //距離模式時  s6按鈕功能函數
  208. {
  209.         if(s6==0)
  210.         {
  211.                 delay(5);
  212.                 if(s6==0)
  213.                 {
  214.                         if(ms_HCflag)                                                //再次按下時將設置的報警距離存入24C02
  215.                         {
  216.                                 w_iic(0x00,bj_jl);
  217.                                 delay(10);
  218.                         }
  219.                         ms_HCflag=~ms_HCflag;
  220.                         while(!s6);
  221.                 }
  222.         }
  223. }

  224. void sz_moshi()                                                                                                         //設置時間的顯示模式
  225. {
  226.         switch(ms_add)                                                                                                 //ms_add為1時顯示case 1的內容 時閃爍   為2時顯示case 2的內容 分閃爍
  227.         {
  228.                 case 1: if(sec_szflag)                                                                          //小時位閃爍
  229.                                 {
  230.                                         dspbuf[0]=sz_time[0]/10;
  231.                                         dspbuf[1]=sz_time[0]%10;
  232.                                 }  else
  233.                                 {
  234.                                         dspbuf[0]=11;
  235.                                         dspbuf[1]=11;
  236.                                 }
  237.                                 dspbuf[2]=10;                                                                        
  238.                                 dspbuf[3]=sz_time[1]/10;                                                  //顯示按下設置鍵后存儲的時間                                                   
  239.                                 dspbuf[4]=sz_time[1]%10;
  240.                                 dspbuf[5]=10;
  241.                                 dspbuf[6]=sz_time[2]/10;
  242.                                 dspbuf[7]=sz_time[2]%10;
  243.                                 break;
  244.                 case 2: if(sec_szflag)
  245.                                 {
  246.                                         dspbuf[3]=sz_time[1]/10;
  247.                                         dspbuf[4]=sz_time[1]%10;
  248.                                 }  else
  249.                                 {
  250.                                         dspbuf[3]=11;
  251.                                         dspbuf[4]=11;
  252.                                 }
  253.                                 dspbuf[2]=10;
  254.                                 dspbuf[0]=sz_time[0]/10;
  255.                                 dspbuf[1]=sz_time[0]%10;
  256.                                 dspbuf[5]=10;
  257.                                 dspbuf[6]=sz_time[2]/10;
  258.                                 dspbuf[7]=sz_time[2]%10;
  259.                                 break;

  260.         }         
  261. }

  262. void szHC_moshi()
  263. {
  264.         dspbuf[5]=bj_jl/100;
  265.         dspbuf[6]=bj_jl%100/10;
  266.         dspbuf[7]=bj_jl%10;
  267.         dspbuf[0]=11;
  268.         dspbuf[1]=11;
  269.         dspbuf[2]=11;
  270.         dspbuf[3]=11;
  271.         dspbuf[4]=11;
  272.         if(s5==0)
  273.         {
  274.                 delay(5);
  275.                 if(s5==0)
  276.                 {
  277.                         bj_jl++;
  278.                         while(!s5);
  279.                 }
  280.         }

  281.         if(s4==0)
  282.         {
  283.                 delay(5);
  284.                 if(s4==0)
  285.                 {
  286.                         bj_jl--;
  287.                         while(!s4);
  288.                 }
  289.         }

  290.         
  291. }

  292. void jiaohu()
  293. {
  294.           if(ms_flag==0)
  295.         {
  296.                 key_s6_time();
  297.                 if(ms_add==0)                        //s6按鍵沒有被按下時 ms_add為0          顯示正常界面
  298.                 {
  299.                         moshi();
  300.                 }
  301.                 else
  302.                 {
  303.                         sz_moshi();                   //s6被按下后  ms-add不為0  顯示設置時間模式函數
  304.                         if(s5==0)                   //如果s5按下 對應的時間加1
  305.                         {
  306.                                 delay(5);
  307.                                 if(s5==0)
  308.                                 {
  309.                                         sz_time[ms_add-1]++;
  310.                                         while(!s5);
  311.                                 }
  312.                         }

  313.                         if(s4==0)                   //如果s4按下 對應的時間減1
  314.                         {
  315.                                 delay(5);
  316.                                 if(s4==0)
  317.                                 {
  318.                                         sz_time[ms_add-1]--;
  319.                                         while(!s4);
  320.                                 }
  321.                         }
  322.                 }
  323.                
  324.         }        
  325.         else
  326.         {                                                 //顯示距離模式時
  327.                 key_s6_HC();
  328.                 if(ms_HCflag==0)
  329.                 moshi();
  330.                 else
  331.                 szHC_moshi();                 //設置報警距離顯示模式
  332.         }
  333. }
復制代碼
Keil代碼下載:
超聲波測距及時鐘.rar (144.53 KB, 下載次數: 37)

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:1113104 發表于 2024-3-21 21:41 來自手機 | 只看該作者
樓主這個真的很全。。。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产第一区二区 | 日韩和的一区二区 | 亚洲一区二区三区免费在线观看 | 免费观看成人鲁鲁鲁鲁鲁视频 | 日韩久久久久久久久久久 | 国产成人久久av免费高清密臂 | h视频在线观看免费 | www国产亚洲精品久久网站 | 国产一级片久久久 | 成人一区二区三区 | 色啪网| 国产精品久久久久久久久免费相片 | 欧洲一区在线观看 | 成人福利视频网站 | 亚洲精品视频在线 | 欧美精品欧美精品系列 | 久久久成人免费一区二区 | 亚洲国产激情 | av中文网| 在线播放中文字幕 | 日韩免费网站 | 国产精品福利在线 | 久久精品成人热国产成 | 欧美一区视频 | 97久久超碰 | 一区二区三区四区不卡视频 | 日本成人中文字幕在线观看 | 国产日韩久久 | 欧美日韩亚洲一区 | zzzwww在线看片免费 | 在线免费观看视频黄 | 99精品久久久久 | 欧美日韩高清在线一区 | 亚洲免费在线视频 | 91av在线看 | 久久综合一区二区 | 中文字幕视频在线观看 | 精品视频在线免费观看 | 欧美日韩视频在线第一区 | 亚洲男人的天堂网站 | 国产乱码久久久久久 |