找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3986|回復(fù): 1
收起左側(cè)

超聲波測距報(bào)警實(shí)時(shí)時(shí)鐘電路與源程序-藍(lán)橋杯2012年決賽

[復(fù)制鏈接]
ID:272080 發(fā)表于 2018-1-15 16:10 | 顯示全部樓層 |閱讀模式
選用材料為藍(lán)橋杯官方提供的開發(fā)板。

因?yàn)榇税暹x用了4塊74LS573芯片用于鎖存P0口信號,這種設(shè)計(jì)可節(jié)約很多的i/0口,與市面上很多的開發(fā)板不一樣,所以如果要換到其他開發(fā)板上使用,需要改一下顯示代碼 和LED亮滅代碼,但是大致思路不變,只要改變一下那幾個(gè)比較特殊的使用到了573鎖存來編程的函數(shù)即可。

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


電路具體功能要求:
1. 電路通電后進(jìn)入初始化狀態(tài):燈L1亮,數(shù)碼管全亮,蜂鳴器接通,1s后全部關(guān)閉,顯示時(shí)間設(shè)定11-50-59。
2. 按下S7按鍵切換顯示實(shí)時(shí)時(shí)鐘XX-XX-XX、顯示超聲波測量距離XXX。
3. 顯示實(shí)時(shí)時(shí)鐘狀態(tài)下-----------------------------------,按S6按鍵進(jìn)行時(shí)間調(diào)整,第一次按下S6進(jìn)入時(shí)調(diào)整,“時(shí)”閃爍;第二次按下S6進(jìn)入分調(diào)整,“分”閃爍。再一次按下退出調(diào)整。S4、S5為調(diào)節(jié)數(shù)值S5+,S4-(時(shí)間距離)的加減按鍵。
4. 顯示超聲波測距狀態(tài)下,按S6按鍵進(jìn)行報(bào)警距離調(diào)整,S6按第一次進(jìn)入調(diào)整狀態(tài),第二次按下退出,將調(diào)節(jié)后的數(shù)值保存到24C02中。S4、S5為調(diào)節(jié)數(shù)值S5+,S4-(時(shí)間距離)的加按鍵。顯示超聲波報(bào)警距離--XXX。
5. 超聲波測距報(bào)警初值設(shè)定為30cm,超聲波檢測超過設(shè)定值X不報(bào)警,小于X立即報(bào)警,小于1.2倍的X, L1燈閃爍。
6. 設(shè)計(jì)一個(gè)欠壓電路,12V供電,電壓小于10V切斷電路電源。

下面有項(xiàng)目的壓縮文件
0.jpg
部分代碼如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #include"dsp.h"                                        //顯示函數(shù)頭文件
  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秒標(biāo)志
  14. bit sec_flag;

  15. uint sec_szadd;
  16. bit sec_szflag;

  17. uchar bj_jl;   //報(bào)警距離

  18. uint ss;  //距離函數(shù)

  19. uchar sz_time[3];

  20. uchar ms_add;    //模式標(biāo)志位
  21. bit ms_flag;

  22. bit ms_HCflag;         //測距模式下  設(shè)置與正常顯示的標(biāo)志位   為0時(shí)正常顯示距離  為1時(shí)設(shè)置報(bào)警距離

  23. void int_t0();                //定時(shí)器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();                           //設(shè)置時(shí)間時(shí)的顯示模式

  31. void szHC_moshi();                           //設(shè)置報(bào)警距離時(shí)的顯示模式

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

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


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

  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)                   //報(bào)警函數(shù)
  56.                 {
  57.                         open_beep();
  58.                 }        
  59.                 else
  60.                 {cls_beep();}

  61.                 if(ss<(uint)(bj_jl*1.2))                //小與1.2倍距離時(shí)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標(biāo)志位置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;                //定時(shí)器0開始計(jì)時(shí)
  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;                 //數(shù)碼管全量
  127.         open_beep();                                                                                                                                                         //開蜂鳴器
  128.         while(!sec_flag);                                                                                                                                                 //等待1秒
  129.         cls_led1();                                                                                                                                                                 //關(guān)led1  關(guān)顯示   關(guān)蜂鳴器  sec_flag標(biāo)志位清零
  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;          //顯示時(shí)間模式
  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;                //模式 當(dāng)MS_FLAG=0時(shí) 為顯示時(shí)間模式  當(dāng)MS_FLAG=1時(shí)為顯示距離模式
  176.                         while(!s7);
  177.                 }
  178.         }
  179. }

  180. void key_s6_time()                   //時(shí)間模式下 s6按鍵功能函數(shù)
  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;                   //儲存當(dāng)前的時(shí)間
  190.                                 sz_time[1]=min;
  191.                                 sz_time[2]=sec;
  192.                         }
  193.                         ms_add++;
  194.                         if(ms_add==3)                                   //當(dāng)按鈕按下三次以后 將設(shè)置后的時(shí)間寫入1302
  195.                         {
  196.                                 ms_add=0;                                   //標(biāo)志清零
  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]);                //時(shí)存
  201.                                 write_13(0x8e,0x80);
  202.                         }
  203.                         while(!s6);
  204.                 }
  205.         }
  206. }

  207. void key_s6_HC()                                                           //距離模式時(shí)  s6按鈕功能函數(shù)
  208. {
  209.         if(s6==0)
  210.         {
  211.                 delay(5);
  212.                 if(s6==0)
  213.                 {
  214.                         if(ms_HCflag)                                                //再次按下時(shí)將設(shè)置的報(bào)警距離存入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()                                                                                                         //設(shè)置時(shí)間的顯示模式
  225. {
  226.         switch(ms_add)                                                                                                 //ms_add為1時(shí)顯示case 1的內(nèi)容 時(shí)閃爍   為2時(shí)顯示case 2的內(nèi)容 分閃爍
  227.         {
  228.                 case 1: if(sec_szflag)                                                                          //小時(shí)位閃爍
  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;                                                  //顯示按下設(shè)置鍵后存儲的時(shí)間                                                   
  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按鍵沒有被按下時(shí) ms_add為0          顯示正常界面
  298. ……………………

  299. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼


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


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:89286 發(fā)表于 2018-1-15 19:29 | 顯示全部樓層
thanks for sharing
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表