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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

超聲波測距報警實時時鐘電路與源程序-藍橋杯2012年決賽

[復制鏈接]
跳轉到指定樓層
樓主
選用材料為藍橋杯官方提供的開發板。

因為此板選用了4塊74LS573芯片用于鎖存P0口信號,這種設計可節約很多的i/0口,與市面上很多的開發板不一樣,所以如果要換到其他開發板上使用,需要改一下顯示代碼 和LED亮滅代碼,但是大致思路不變,只要改變一下那幾個比較特殊的使用到了573鎖存來編程的函數即可。

我也是一名菜雞  如果有那個大神有更好的編程思路的話 那就拜托大神賜教了。


電路具體功能要求:
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. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼


全部資料51hei下載地址:
2012決.rar (144.53 KB, 下載次數: 37)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:89286 發表于 2018-1-15 19:29 | 只看該作者
thanks for sharing
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91免费在线| 91精品在线播放 | 超碰精品在线 | 九九热精品在线 | 青草久久免费视频 | 成人网在线 | 国产毛片毛片 | 91久久国产综合久久 | 国产精品成人一区二区 | 91欧美 | 成人h片在线观看 | 欧美日韩精品一区二区三区视频 | 91精品久久久久久久久久 | 日韩毛片 | 一区二区三区视频在线观看 | 国产麻豆乱码精品一区二区三区 | 亚洲精品久久久蜜桃 | 欧美在线视频一区二区 | 三级黄色片在线播放 | 亚洲成av人片在线观看 | 狠狠色综合久久婷婷 | 91精品观看| 国产免费一二三区 | 精品久久久网站 | 日韩和的一区二区 | 嫩草影院黄 | 国产亚洲一区二区三区 | 亚洲永久字幕 | 欧美黄色一区 | 成年人在线播放 | 啪啪毛片 | 成人欧美一区二区三区在线观看 | 69av片| 欧美日韩国产一区二区三区 | 亚洲精品乱码久久久久v最新版 | 国产精品一区二区三区在线 | 国产中文在线观看 | 精品成人佐山爱一区二区 | 精产国产伦理一二三区 | 欧美成人一级 | av免费成人 |