找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4844|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

住宅小區(qū)汽車超速檢測(cè)及報(bào)警系統(tǒng)設(shè)計(jì)(單片機(jī)源碼+圖+報(bào)告)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
“宏晶杯單片機(jī)大賽”設(shè)計(jì)報(bào)告—4、 住宅小區(qū)汽車超速檢測(cè)及報(bào)警系統(tǒng)

一、參賽題目
住宅小區(qū)汽車超速檢測(cè)及報(bào)警系統(tǒng)
(1)基本要求
速度檢測(cè)與顯示
速度報(bào)警值設(shè)定
環(huán)境氣象參數(shù)的顯示
(2)拓展功能自行考慮
二、方案比較及確定
依據(jù)題目基本要求:速度的檢測(cè)與顯示,速度報(bào)警值的設(shè)定以及環(huán)境氣象參數(shù)的顯示。團(tuán)隊(duì)以此作為基本要求展開(kāi)設(shè)計(jì),經(jīng)過(guò)討論以及程序的執(zhí)行情況,確定以下功能,其中包括基本功能模塊和拓展功能模塊。

(1)基本功能
常用顯示:溫度、濕度以及通過(guò)薄膜鍵盤設(shè)定速度報(bào)警值。
測(cè)速及報(bào)警顯示:測(cè)速時(shí)采用光電開(kāi)關(guān)進(jìn)行測(cè)量,通過(guò)測(cè)量汽車經(jīng)過(guò)兩個(gè)光電門之間的時(shí)間,運(yùn)用基本的物理速度公式:V=s/t 進(jìn)而獲得汽車的速度。如果汽車超速則 12864 將顯示時(shí)速并出現(xiàn)提醒超速標(biāo)語(yǔ),同時(shí)蜂鳴報(bào)警響起,LED燈亮起。
(2)拓展功能
初始化顯示:在電源供電之后,12864 將出現(xiàn)第一個(gè)界面,界面上顯示“歡迎使用小區(qū)車速檢測(cè)系統(tǒng),請(qǐng)輸入限定時(shí)速:”的標(biāo)語(yǔ)。
常用顯示:在利用薄膜鍵盤輸入限定時(shí)速按下確認(rèn)鍵, 12864 將出現(xiàn)第二個(gè)界面,其中包括基本顯示項(xiàng)目:萬(wàn)年歷、日期、溫度、濕度以及速度報(bào)警值。
測(cè)速及報(bào)警顯示:在汽車超速之后不僅會(huì)顯示超速和標(biāo)語(yǔ),同時(shí)報(bào)警蜂鳴響起,報(bào)警系統(tǒng)與小區(qū)監(jiān)控?cái)z像連接為一體,在顯示超速的同時(shí)會(huì)利用
監(jiān)控抓拍車牌號(hào),并做及時(shí)的記錄。

路燈控制:考慮到小區(qū)人們的出行, 在15 上增加了對(duì)路燈控制的模塊,在每天的 19:30-00:30 路燈會(huì)自動(dòng)亮起。同時(shí)兼顧每位居民的不同的作息時(shí)間,在路燈亮起的這段時(shí)間內(nèi)如果檢測(cè)到有超速的情況則蜂鳴警報(bào)聲不會(huì)響起,
只會(huì)在顯示屏上顯示超速并且LED 燈閃爍來(lái)替代警報(bào)聲,同時(shí)抓拍車牌號(hào)。深夜模式:在00:30 分之后,路燈熄滅,此時(shí)如果有人或者車經(jīng)過(guò)時(shí),聲控開(kāi)關(guān)會(huì)控制路燈再次點(diǎn)亮 10s,同時(shí)測(cè)速報(bào)警系統(tǒng)也會(huì)啟動(dòng)。在到達(dá)凌晨4 點(diǎn) 30 分之后,深夜模式關(guān)閉。既方便小區(qū)人們的出行又達(dá)到了節(jié)能減排的效果。
噪聲檢測(cè):通過(guò)檢測(cè)周圍環(huán)境的噪聲,如果檢測(cè)到噪音,則通過(guò)點(diǎn)
亮LED 燈來(lái)顯示噪聲檢測(cè)結(jié)果。

三、理論數(shù)據(jù)分析
此測(cè)速報(bào)警系統(tǒng)是通過(guò)測(cè)量汽車經(jīng)過(guò)兩個(gè)光電門之間的時(shí)間, 設(shè)定兩個(gè)光電門之間的距離為  s 10cm .編寫程序時(shí)將延時(shí)時(shí)間設(shè)定為1ms, 每經(jīng)過(guò) 1ms則檢測(cè)一次車頭是否到達(dá)第二個(gè)光電門, 同時(shí)計(jì)時(shí),如果到達(dá)則計(jì)時(shí)結(jié)束,得到車頭經(jīng)過(guò)兩個(gè)光電門所用時(shí)間t ,之后運(yùn)用基本的物理速度公式:
v=s/t 進(jìn)而獲得汽車的速度。

四、軟件設(shè)計(jì)
根據(jù)STC15單片機(jī)的 O I / 端口的數(shù)目以及功能要求軟件程
序如下:(具體程序詳見(jiàn)附錄)
1、薄膜鍵盤輸入程序模塊
2、12864程序模塊
3、路燈控制程序模塊
4、蜂鳴報(bào)警程序模塊
5、深夜模式程序模塊
6、噪音檢測(cè)程序模塊
五、流程圖
1、測(cè)速功能流程圖


2、路燈控制功能流程圖


六、電路圖及相關(guān)設(shè)計(jì)文件


所用軟件:proteus 電路仿真軟件
七、比賽器件
STC15 單片機(jī)、薄膜鍵盤、12864 液晶顯示屏、溫濕度傳感器DHT11、時(shí)間顯示 DS1302、噪音檢測(cè)器、光電門等。

八、測(cè)試數(shù)據(jù)及結(jié)果分析
1、 此報(bào)警系統(tǒng)不僅能夠測(cè)定速度,通過(guò)測(cè)定車頭通過(guò)兩個(gè)光電門所用時(shí)間 t,利用物理公式v=s/t 判斷是否超速。
2、 通過(guò)溫濕度傳感器測(cè)量周圍環(huán)境的環(huán)境參數(shù), 并顯示在12864顯示屏的第三行。
3、通過(guò)噪音傳感器測(cè)量噪音系數(shù),根據(jù)系數(shù)大小判斷是否點(diǎn)亮噪音顯示燈。

九、總結(jié)
此次大賽我們選中了“小區(qū)測(cè)速報(bào)警系統(tǒng)”的題目,這個(gè)命題十分貼近我們的日常生活, 真正的將平時(shí)在課本上所學(xué)習(xí)的有關(guān)單片機(jī)的知識(shí)運(yùn)用到實(shí)踐中,在技術(shù)設(shè)計(jì)中更多地要考慮的是實(shí)用性,合理性。而且,平時(shí)我們大多數(shù)用的單片機(jī)都是 51 系列,此次大賽要求我們應(yīng)用 15 系列,這又是一次鍛煉我們的機(jī)會(huì),掌握了更多型號(hào)的單片機(jī)的使用方法。在設(shè)計(jì)中,向 15 單片機(jī)上轉(zhuǎn)化是一項(xiàng)很大的考驗(yàn),通過(guò)幾天的努力我們終于讓程序在 15 上正常運(yùn)行,這次比賽讓我們的專業(yè)知識(shí)儲(chǔ)備更加豐富, 也在實(shí)踐中應(yīng)用了所學(xué), 受益匪淺。


附錄:
15單片機(jī)設(shè)計(jì)程序及注釋

單片機(jī)源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #define LCD_data  P0
  6. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  7. #define MAIN_Fosc                11059200UL        //
  8. #define DS1302_W_ADDR 0x80  //
  9. #define DS1302_R_ADDR 0x81        //

  10. sbit buzzer = P2^3;//蜂鳴器報(bào)警
  11. sbit voice = P3^0; //鳴笛檢測(cè)輸出
  12. sbit led6 = P1^5; //        燈光報(bào)警
  13. sbit led5 = P1^4;//鳴笛檢測(cè)燈光示意

  14. sbit TSCLK = P1^0;
  15. sbit TIO = P1^1;   
  16. sbit TRST = P1^2;
  17. sbit streetlight = P1^7;//路燈
  18. sbit LCD_RS  =  P3^5;//
  19. sbit LCD_RW  =  P3^6;//
  20. sbit LCD_EN  =  P3^4; //
  21. sbit LCD_PSB =  P3^7;
  22. sbit wela = P2^7;
  23. sbit dula = P2^6;

  24. sbit DQ=P2^2;    //DTH11
  25. uint vtest= 0;
  26. uint t = 0;
  27. uchar vlim = 0;
  28. v_test[3] = {0,0,0};
  29. v_lim[3] = {0,0,0};
  30. uchar flag,flag0,flag1,flag2,flag4,flag5,flag6= 0;
  31. uchar flag3 = 1;
  32. uchar flag7 = 1;
  33. uchar weed,x;
  34. uchar tem = 0;
  35. uchar hum = 0;
  36. display0[2]={0,0};
  37. display1[2]={0,0};        
  38. uchar code init1[] = {"  歡迎使用小區(qū)  "};
  39. uchar code init2[] = {"  車速檢測(cè)系統(tǒng)  "};
  40. uchar code init3[] = {"請(qǐng)輸入小區(qū)限速: "};
  41. uchar code init4[] = {"    km/h        "};
  42. uchar code warning1[] = {"車速: 020km/h   "};
  43. uchar code warning2[] = {"您已超速, 為了  "};
  44. uchar code warning3[] = {"您和他人的安全  "};
  45. uchar code warning4[] = {"請(qǐng)減速慢行      "};
  46. uchar code slogan1[] = {"    文明禮讓    "};
  47. uchar code slogan2[] = {"    有序通行    "};
  48. uchar code slogan3[] = {"    互相體諒    "};
  49. uchar code slogan4[] = {"    請(qǐng)勿鳴笛    "};
  50. uchar code dis1[]= {"20  年  月  日 "};
  51. uchar code dis2[]= {"星期    :   :   "};
  52. uchar code dis3[] = {"溫度26℃濕度30%"};
  53. uchar code dis4[] = {"限速:     km/h  "};



  54. void delay(uint ms)
  55. {
  56.     while(ms--)
  57.         {
  58.       uchar i;
  59.           for(i=0;i<250;i++)  
  60.            {
  61.             _nop_();                           
  62.                 _nop_();
  63.                 _nop_();
  64.                 _nop_();
  65.            }
  66.         }
  67. }               

  68. /*******************************************************************/
  69. /*                                                                 */
  70. /*檢查L(zhǎng)CD忙狀態(tài)                                                    */
  71. /*lcd_busy為1時(shí),忙,等待。lcd-busy為0時(shí),閑,可寫指令與數(shù)據(jù)。      */
  72. /*                                                                 */
  73. /*******************************************************************/
  74. bit lcd_busy()
  75. {                          
  76.     bit result;
  77.     LCD_RS = 0;
  78.     LCD_RW = 1;
  79.     LCD_EN = 1;
  80.     delayNOP();
  81.     result = (bit)(P0&0x80);
  82.     LCD_EN = 0;
  83.     return(result);
  84. }
  85. /*******************************************************************/
  86. /*                                                                 */
  87. /*寫指令數(shù)據(jù)到LCD                                                  */
  88. /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。                             */
  89. /*                                                                 */
  90. /*******************************************************************/
  91. void lcd_wcmd(uchar cmd)
  92. {                          
  93.    while(lcd_busy());
  94.     LCD_RS = 0;
  95.     LCD_RW = 0;
  96.     LCD_EN = 0;
  97.     _nop_();
  98.     _nop_();
  99.     P0 = cmd;
  100.     delayNOP();
  101.     LCD_EN = 1;
  102.     delayNOP();
  103.     LCD_EN = 0;  
  104. }
  105. /*******************************************************************/
  106. /*                                                                 */
  107. /*寫顯示數(shù)據(jù)到LCD                                                  */
  108. /*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。                               */
  109. /*                                                                 */
  110. /*******************************************************************/
  111. void lcd_wdat(uchar dat)
  112. {                          
  113.    while(lcd_busy());
  114.     LCD_RS = 1;
  115.     LCD_RW = 0;
  116.     LCD_EN = 0;
  117.     P0 = dat;
  118.     delayNOP();
  119.     LCD_EN = 1;
  120.     delayNOP();
  121.     LCD_EN = 0;
  122. }
  123. /*******************************************************************/
  124. /*                                                                 */
  125. /*  LCD初始化設(shè)定                                                  */
  126. /*                                                                 */
  127. /*******************************************************************/
  128. void lcd_init()
  129. {

  130.    
  131.      LCD_PSB = 1;
  132.     lcd_wcmd(0x34);      //擴(kuò)充指令操作
  133.     delay(5);
  134.     lcd_wcmd(0x30);      //基本指令操作
  135.     delay(5);
  136.     lcd_wcmd(0x0C);      //顯示開(kāi),關(guān)光標(biāo)
  137.     delay(5);
  138.     lcd_wcmd(0x01);      //清除LCD的顯示內(nèi)容
  139.     delay(5);
  140. }


  141. #define MAIN_Fosc                11059200UL        //宏定義主時(shí)鐘HZ
  142. #define DS1302_W_ADDR 0x80  //寫時(shí)鐘日歷寄存器起始地址
  143. #define DS1302_R_ADDR 0x81        //讀時(shí)鐘日歷寄存器起始地址

  144. //時(shí)鐘日歷暫存數(shù)組,秒、分、時(shí)、日、月、周、年 初值為= 16年6月4日 周六 19:29:50
  145. uchar TimeData[7]={0, 29, 19, 4, 6, 6, 16};

  146. /*=================================================
  147. *函數(shù)名稱:Delay_Ms
  148. *函數(shù)功能:12T 51單片機(jī)自適應(yīng)主時(shí)鐘毫秒級(jí)延時(shí)函數(shù)
  149. *說(shuō)明:需定義MAIN_Fosc(晶振主頻單位HZ)
  150. *輸入:ms:要延時(shí)的毫秒
  151. =================================================*/
  152. void Delay_Ms(uint ms)
  153. {
  154.      uint i;
  155.          do{
  156.               i = MAIN_Fosc / 96000;
  157.                   while(--i);   //96T per loop
  158.      }while(--ms);
  159. }
  160. /*=================================================
  161. *函數(shù)名稱:DS1302_W_Byte
  162. *函數(shù)功能:DS1302寫一字節(jié)數(shù)據(jù)
  163. *輸入:dat:要寫入的數(shù)據(jù)
  164. =================================================*/
  165. void DS1302_W_Byte(uchar dat)
  166. {
  167.         uchar i;
  168.         for(i = 0; i < 8; i++) //每次寫1bit,寫8次
  169.         {
  170.                 TSCLK = 0;                   //拉低時(shí)鐘總線
  171.                 TIO = dat & 0x01;  //從一字節(jié)最低位開(kāi)始寫
  172.                 TSCLK = 1;                   //拉高時(shí)鐘總線,DS1302把數(shù)據(jù)讀走
  173.                 dat >>= 1;                   //數(shù)據(jù)右移一位
  174.         }        
  175. }
  176. /*=================================================
  177. *函數(shù)名稱:DS1302_R_Byte
  178. *函數(shù)功能:DS1302讀一字節(jié)
  179. *輸出:dat:讀取的數(shù)據(jù)
  180. =================================================*/
  181. uchar DS1302_R_Byte()
  182. {
  183.         uchar i, dat;
  184.         for(i = 0; i < 8; i++)  //每次寫1bit,寫8次
  185.         {
  186.                 TSCLK = 0;                        //拉低時(shí)鐘總線,DS1302把數(shù)據(jù)放到數(shù)據(jù)總線上
  187.                 dat >>= 1;                         //數(shù)據(jù)右移一位,數(shù)據(jù)從最低位開(kāi)始讀
  188.                 if(TIO)        dat |= 0x80;//讀取數(shù)據(jù)
  189.                 TSCLK = 1;                        //拉高時(shí)鐘總線
  190.         }
  191.         return dat;                                //返回讀取的數(shù)據(jù)
  192. }
  193. /*=================================================
  194. *函數(shù)名稱:DS1302_W_DAT
  195. *函數(shù)功能:寫DS1302數(shù)據(jù)一次寫2個(gè)字節(jié)
  196. *說(shuō)明:先寫命令后寫數(shù)據(jù)
  197. *調(diào)用:DS1302_W_Byte()
  198. *輸入:cmd:需要寫的命令 ,dat:需要些的數(shù)據(jù)
  199. =================================================*/
  200. void DS1302_W_DAT(uchar cmd, uchar dat)
  201. {
  202.         TRST = 0;                         //拉低使能端
  203.         TSCLK = 0;                         //拉低數(shù)據(jù)總線
  204.         TRST = 1;                         //拉高使能端,開(kāi)始寫數(shù)據(jù)
  205.         DS1302_W_Byte(cmd);         //寫命令
  206.         DS1302_W_Byte(dat);         //寫數(shù)據(jù)
  207. }
  208. /*=================================================
  209. *函數(shù)名稱:DS1302_R_DAT
  210. *函數(shù)功能:讀DS1302數(shù)據(jù)
  211. *說(shuō)明:先寫入命令字節(jié)后讀出對(duì)應(yīng)數(shù)據(jù)
  212. *調(diào)用:        DS1302_W_Byte();DS1302_R_Byte();
  213. *輸入:        cmd:需要寫的命令
  214. *輸出:        dat:讀出的數(shù)據(jù)
  215. =================================================*/
  216. uchar DS1302_R_DAT(uchar cmd)
  217. {
  218.         uchar dat;
  219.         TRST = 0;                                 //拉低使能端
  220.         TSCLK = 0;                                //拉低數(shù)據(jù)總線
  221.         TRST = 1;                                //拉高使能端,開(kāi)始寫數(shù)據(jù)
  222.         DS1302_W_Byte(cmd);                //寫命令
  223.         dat = DS1302_R_Byte();        //讀出數(shù)據(jù)
  224.         return dat;                                //返回讀出數(shù)據(jù)
  225. }

  226. /*=================================================
  227. *函數(shù)名稱:DS1302_Clear_WP
  228. *函數(shù)功能:清除DS1302寫保護(hù)
  229. *說(shuō)明:先寫入命令0x8e(寫控制寄存器)接著向該寄存器寫0
  230. *調(diào)用:DS1302_W_DAT()
  231. =================================================*/
  232. void DS1302_Clear_WP()
  233. {
  234.         DS1302_W_DAT(0x8e,0x00);  //把控制寄存器WP位置0
  235. }
  236. /*=================================================
  237. *函數(shù)名稱:DS1302_Clear_WP
  238. *函數(shù)功能:設(shè)置DS1302寫保護(hù)
  239. *說(shuō)明:先寫入命令0x8e(寫控制寄存器)接著向該寄存器寫0x80
  240. *調(diào)用:DS1302_W_DAT()
  241. =================================================*/
  242. void DS1302_Set_WP()
  243. {        
  244.         DS1302_W_DAT(0x8e,0x80); //把控制寄存器WP位置1
  245.         TRST = 0;                                 //拉低使能端
  246.         TSCLK = 0;                                 //拉低數(shù)據(jù)總線
  247. }
  248. /*=================================================
  249. *函數(shù)名稱:Set_DS1302_Time
  250. *函數(shù)功能:設(shè)置DS1302時(shí)鐘日歷數(shù)據(jù)
  251. *說(shuō)明:把時(shí)鐘日歷暫存數(shù)組TimeData數(shù)據(jù)轉(zhuǎn)換為BCD碼并
  252.            寫入到DS1302時(shí)鐘日歷寄存器中
  253. *調(diào)用:DS1302_Clear_WP();DS1302_W_DAT();DS1302_Set_WP();
  254. *輸入:addr:需要寫入寄存器的地址 ,TimeData數(shù)組:時(shí)鐘日歷初始值
  255. =================================================*/
  256. void Set_DS1302_Time(uchar addr)
  257. {
  258.         uchar i, j;
  259.         DS1302_Clear_WP();                //清除寫保護(hù)
  260.         for(i = 0; i < 7; i++)        //寫入7個(gè)字節(jié)的時(shí)鐘初始值
  261.         {
  262.                 j = TimeData[i]/10;         //BCD碼轉(zhuǎn)換
  263.                 TimeData[i] %= 10;         //BCD碼轉(zhuǎn)換
  264.                 TimeData[i] += j*16; //BCD碼轉(zhuǎn)換
  265.                 DS1302_W_DAT(addr, TimeData[i]); //先寫DS1302時(shí)鐘日歷起始地址,再寫數(shù)據(jù)
  266.                 addr += 2;         //時(shí)鐘日歷寄存器地址+2轉(zhuǎn)向下一個(gè)寄存器
  267.         }
  268.         DS1302_Set_WP(); //開(kāi)起寫保護(hù)               
  269. }
  270. /*=================================================
  271. *函數(shù)名稱:Read_DS1302_Time
  272. *函數(shù)功能:讀取DS1302時(shí)鐘數(shù)據(jù)
  273. *說(shuō)明:        讀取DS1302時(shí)鐘數(shù)據(jù) 返回?cái)?shù)據(jù)存入時(shí)鐘日歷暫存
  274.                 數(shù)組TimeData(數(shù)據(jù)格式BCD碼)
  275. *調(diào)用:DS1302_Clear_WP();DS1302_R_DAT();DS1302_Set_WP();
  276. *輸入:        addr:需要讀取時(shí)鐘日歷寄存器的起始地址
  277. =================================================*/
  278. void Read_DS1302_Time(uchar addr)
  279. {
  280.         uchar i;
  281.         DS1302_Clear_WP();            //清楚些保護(hù)
  282.         for(i = 0; i < 7; i++)        //從DS1302讀取7個(gè)字節(jié)的時(shí)鐘日歷數(shù)據(jù)
  283.         {
  284.                 TimeData[i] = DS1302_R_DAT(addr);//先寫入要讀取數(shù)據(jù)的寄存器起始地址,再讀出數(shù)據(jù)存入TimeData數(shù)組
  285.                 addr += 2;                                                 //時(shí)鐘日歷寄存器地址+2轉(zhuǎn)向下一個(gè)寄存器
  286.         }
  287.         DS1302_Set_WP();   //開(kāi)起寫保護(hù)
  288. }



  289. void init()
  290. {
  291.         
  292.         TMOD = 0x01;  //定時(shí)器16位計(jì)數(shù)工作模式
  293.         TH0 =0xfc;
  294.         TL0 =0x66; //1ms定時(shí)
  295.         EX0 = 1; //開(kāi)外部中斷0
  296.     IT0 = 1; //負(fù)跳變觸發(fā)
  297.         EX1 = 1; //開(kāi)外部中斷1
  298.     IT1 = 1; //負(fù)跳變觸發(fā)
  299.     EA = 1; //開(kāi)總中斷

  300. }



  301. uchar KeyScan()        //帶返回值的子函數(shù)
  302. {
  303.         uchar cord_l = 0,cord_h = 0;//聲明列線和行線的值的儲(chǔ)存變量
  304.         P0 = 0xf0;//1111 0000
  305.         if( (P0 & 0xf0) != 0xf0)//判斷是否有按鍵按下
  306.         {
  307.                 delay(20);//軟件消抖
  308.                 if( (P0 & 0xf0) != 0xf0)//判斷是否有按鍵按下
  309.                 {     flag0 = 1;
  310.                           cord_l = P0 & 0xf0;// 儲(chǔ)存列線值
  311.                           P0 = cord_l | 0x0f;
  312.                           cord_h = P0 & 0x0f;// 儲(chǔ)存行線值
  313.                           while( (P0 & 0x0f) != 0x0f );//松手檢測(cè)
  314.                           return (cord_l + cord_h);//返回鍵值碼
  315.                 }        
  316.         }
  317.                
  318. }

  319. void input_bai()
  320. {
  321.         switch( KeyScan() )
  322.         {
  323.                  case 0xd7: v_lim[0] = 0;            break;
  324.                 case 0xee: v_lim[0] = 1;                break;
  325.                 case 0xde: v_lim[0] = 2;                break;
  326.                 case 0xbe: v_lim[0] = 3;                break;
  327.                 case 0xed: v_lim[0] = 4;                break;
  328.                 case 0xdd: v_lim[0] = 5;                break;
  329.                 case 0xbd: v_lim[0] = 6;                break;
  330.             case 0xeb: v_lim[0] = 7;                break;
  331.                 case 0xdb: v_lim[0] = 8;                break;
  332.                 case 0xbb: v_lim[0] = 9;            break;
  333.                
  334.                
  335.         }        
  336. }
  337. void input_shi()
  338. {
  339.         switch( KeyScan() )
  340.         {
  341.                  case 0xd7: v_lim[1] = 0;            break;
  342.                 case 0xee: v_lim[1] = 1;                break;
  343.                 case 0xde: v_lim[1] = 2;                break;
  344.                 case 0xbe: v_lim[1] = 3;                break;
  345.                 case 0xed: v_lim[1] = 4;                break;
  346.                 case 0xdd: v_lim[1] = 5;                break;
  347.                 case 0xbd: v_lim[1] = 6;                break;
  348.             case 0xeb: v_lim[1] = 7;                break;
  349.                 case 0xdb: v_lim[1] = 8;                break;
  350.                 case 0xbb: v_lim[1] = 9;            break;
  351.                
  352.                
  353.         }        
  354. }
  355. void input_ge()
  356. {
  357.         switch( KeyScan() )
  358.         {
  359.                  case 0xd7: v_lim[2] = 0;            break;
  360.                 case 0xee: v_lim[2] = 1;                break;
  361.                 case 0xde: v_lim[2] = 2;                break;
  362.                 case 0xbe: v_lim[2] = 3;                break;
  363.                 case 0xed: v_lim[2] = 4;                break;
  364.                 case 0xdd: v_lim[2] = 5;                break;
  365.                 case 0xbd: v_lim[2] = 6;                break;
  366.             case 0xeb: v_lim[2] = 7;                break;
  367.                 case 0xdb: v_lim[2] = 8;                break;
  368.                 case 0xbb: v_lim[2] = 9;            break;
  369.                
  370.                
  371.         }        
  372. }


  373. bit Init_DTH11()
  374. {
  375. bit flag;
  376. uchar num;
  377. DQ=0;
  378. delay(19);   // >18ms
  379. DQ=1;
  380. for(num=0;num<10;num++);   //
  381. for(num=0;num<12;num++);
  382. flag=DQ;
  383. for(num=0;num<11;num++);
  384. for(num=0;num<24;num++);   
  385. return flag;
  386. }

  387. uchar DTH11_RD_CHAR()
  388. {
  389. uchar byte=0;
  390. uchar num;
  391. uchar num1;
  392. while(DQ==1);
  393. for(num1=0;num1<8;num1++)
  394. {
  395.   while(DQ==0);
  396.   byte<<=1;     //
  397.   for(num=0;DQ==1;num++);
  398.   if(num<10)
  399.    byte|=0x00;
  400.   else
  401.    byte|=0x01;
  402. }
  403. return byte;
  404. }

  405. void  DTH11_DUSHU()
  406. {
  407. uchar num;
  408. if(Init_DTH11()==0)
  409. {
  410.   hum=DTH11_RD_CHAR();   //
  411.   DTH11_RD_CHAR();
  412.   tem=DTH11_RD_CHAR();
  413.   DTH11_RD_CHAR();
  414.   DTH11_RD_CHAR();
  415.   for(num=0;num<17;num++);  //
  416.   DQ=1;
  417. }
  418. }
  419. void Display_DTH11()  
  420. {
  421. display0[0]=hum/10%10;
  422. display0[1]=hum%10;
  423. lcd_wcmd(0x8e);
  424. for(x=0;x<2;x++)
  425. lcd_wdat(display0[0+x]);//顯示濕度
  426. display1[0]=tem/10%10;
  427. display1[1]=tem%10;
  428. lcd_wcmd(0x8a);
  429. for(x=0;x<2;x++)
  430. lcd_wdat(display1[0+x]);//顯示溫度
  431. }
  432. void main()
  433. {         wela = 0;
  434.            dula = 0;
  435.           Init_DTH11();                 
  436.           lcd_init();//12864初始化               
  437.             init();//定時(shí)器初始化
  438.                 Set_DS1302_Time(DS1302_W_ADDR);
  439.                 lcd_wcmd(0x80);                        
  440.         for(x=0;x<16;x++)
  441.                 lcd_wdat(init1[x]);
  442.         lcd_wcmd(0x90);                        
  443.         for(x=0;x<16;x++)
  444.                 lcd_wdat(init2[x]);
  445.         
  446.         lcd_wcmd(0x88);
  447.         for(x=0;x<16;x++)
  448.                 lcd_wdat(init3[x]);
  449.         lcd_wcmd(0x98);
  450.         for(x=0;x<16;x++)
  451.                 lcd_wdat(init4[x]);  //顯示初始界面  
  452.         

  453.                     
  454.                
  455.                         
  456.            
  457.      
  458.         while(1)
  459.         {
  460.                 input_bai();
  461.                 if(flag0)
  462.                 {
  463.                         flag0 = 0;
  464.                         lcd_wcmd(0x98);
  465.                         for(x=0;x<1;x++)
  466.                         lcd_wdat(v_lim[0+x]+ '0');
  467.                         break;
  468.                 }
  469.         }
  470.         
  471.         while(1)
  472.         {
  473.                 input_shi();
  474.                 if(flag0)
  475.                 {
  476.                         flag0 = 0;
  477.                         lcd_wcmd(0x98);
  478.                         for(x=0;x<2;x++)
  479.                         lcd_wdat(v_lim[0+x]+ '0');
  480.                         break;
  481.                 }
  482.         }
  483.         
  484.         while(1)
  485.         {
  486.                 input_ge();
  487.                 if(flag0)
  488.                 {
  489.                         flag0 = 0;
  490.                         lcd_wcmd(0x99);
  491.                         
  492.                         lcd_wdat(v_lim[2]+ '0');
  493.                
  494.                         }
  495.          if (KeyScan() == 0x7e)
  496.                 {         
  497.                 vlim = v_lim[0]*100+v_lim[1]*10+v_lim[2];
  498.                
  499.                 break;
  500.                   }         
  501.                
  502.                
  503.         }
  504.      

  505. while(1)  
  506. {        delay(5);
  507.          lcd_wcmd(0x01);
  508.                   delay(5);
  509.                    lcd_wcmd(0x80);                        
  510.                 for(x=0;x<16;x++)
  511.                         lcd_wdat(dis1[x]);
  512.                 lcd_wcmd(0x90);                        
  513.                 for(x=0;x<16;x++)
  514.                         lcd_wdat(dis2[x]);
  515.                
  516.                 lcd_wcmd(0x88);
  517.                 for(x=0;x<16;x++)
  518.                         lcd_wdat(dis3[x]);
  519.                 lcd_wcmd(0x98);
  520.                 for(x=0;x<16;x++)
  521.                           lcd_wdat(dis4[x]);
  522.          while(flag3)
  523.         {        
  524.                   Read_DS1302_Time(DS1302_R_ADDR);//
  525.                  delay(5);
  526.                 lcd_wcmd(0x81);
  527.                 lcd_wdat(TimeData[6]/16 + '0');
  528.                 lcd_wdat(TimeData[6]%16 + '0');//year
  529.                 delay(5);
  530.                 lcd_wcmd(0x83);
  531.                 lcd_wdat(TimeData[4]/16 + '0');
  532.                 lcd_wdat(TimeData[4]%16 + '0');//month
  533.                 delay(5);
  534.                 lcd_wcmd(0x85);
  535.                 lcd_wdat(TimeData[3]/16 + '0');
  536.                 lcd_wdat(TimeData[3]%16 + '0');//day
  537.                 delay(5);
  538.                   lcd_wcmd(0x92);
  539.                 lcd_wdat(TimeData[5]%16 + '0');//weed
  540.                   delay(20);
  541.                 lcd_wcmd(0x93);
  542.                 lcd_wdat(TimeData[2]/16 + '0');
  543.                 lcd_wdat(TimeData[2]%16 + '0');//hour
  544.                 delay(5);
  545.                 lcd_wcmd(0x95);
  546.                 lcd_wdat(TimeData[1]/16 + '0');
  547.                 lcd_wdat(TimeData[1]%16 + '0');//minute
  548.                 delay(5);
  549.                 lcd_wcmd(0x97);
  550.                 lcd_wdat(TimeData[0]/16 + '0');
  551.                 lcd_wdat(TimeData[0]%16 + '0');//second

  552.                 if((TimeData[2] == 0x19)&&(TimeData[1] == 0x30))streetlight = 0;
  553.                 if((TimeData[2] == 0x00)&&(TimeData[1] == 0x30))streetlight = 1;
  554.                 if((TimeData[2] == 0x40)&&(TimeData[1] == 0x00)) flag7 = 0;
  555.                 Delay_Ms(600);
  556.                 DTH11_DUSHU();
  557.                  display0[0]=hum/10%10;
  558.                  display0[1]=hum%10;
  559.                  lcd_wcmd(0x8e);
  560.                  for(x=0;x<2;x++)
  561.                  lcd_wdat(display0[0+x]+'0');//顯示濕度
  562.                  display1[0]=tem/10%10;
  563.                  display1[1]=tem%10;
  564.                  lcd_wcmd(0x8a);
  565.                  for(x=0;x<2;x++)
  566.                  lcd_wdat(display1[0+x]+'0');//顯示溫度
  567.                  lcd_wcmd(0x9b);
  568.                  for(x=0;x<3;x++)
  569.                  lcd_wdat(v_lim[0+x]+'0');
  570.                  while(flag)
  571.                 {   
  572.                          TR0 = 1;
  573.                         if(TF0 == 1)
  574.                         {
  575.                                 TF0 = 0;
  576.                                 TH0 = 0xfc;
  577.                                 TL0 = 0x66; // 定時(shí)1ms
  578.                                 t++;
  579.                         }
  580.                 }        
  581.                 if(t > 0)
  582.                 {
  583.                   vtest = 10000/t;//
  584.                         if (vtest > vlim)
  585.                         {
  586.                         
  587.                         v_test[0] = vtest/100;
  588.                         v_test[1] = (vtest/10)-(vtest/100)*10;
  589.                         v_test[2] = vtest%10;
  590.                         flag3 = 0;
  591.                         flag4 = 1;
  592.                         
  593.                         t = 0;
  594.                         vtest = 0;
  595.                         flag = 0;
  596.                         
  597.                 }
  598.                 }
  599.          if(!voice)
  600.          {
  601.            delay(5);
  602.            if(!voice)
  603.            {flag3 = 0;
  604.            flag5 = 1;
  605.           }
  606. }
  607.    
  608.         }        
  609.              if(flag4)
  610.                  {lcd_wcmd(0x01);
  611.                   delay(5);
  612.              lcd_wcmd(0x80);                        
  613.                 for(x=0;x<16;x++)
  614.                         lcd_wdat(warning1[x]);
  615.                 lcd_wcmd(0x90);                        
  616.                 for(x=0;x<16;x++)
  617.                         lcd_wdat(warning2[x]);
  618.                
  619.                 lcd_wcmd(0x88);
  620.                 for(x=0;x<16;x++)
  621.                         lcd_wdat(warning3[x]);
  622.                 lcd_wcmd(0x98);
  623.                 for(x=0;x<16;x++)
  624.                           lcd_wdat(warning4[x]);
  625.                 lcd_wcmd(0x83);
  626.                 for(x=0;x<3;x++)
  627.                 lcd_wdat(v_test[0+x]+'0');                 
  628.                      
  629.                 //Delay_Ms(2000);
  630.                  if(streetlight == 1)
  631.                         { buzzer = 0;
  632.                           Delay_Ms(2000);
  633.                           buzzer = 1;}
  634.                         else
  635.                         {
  636.                           led6 = 0;
  637.                           Delay_Ms(2000);
  638.                           led6=  1;
  639.                          }
  640.                 flag3 = 1;
  641.                   flag4 = 0;
  642.                   
  643.                   }
  644.                   
  645. ……………………

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


所有資料51hei提供下載:
最終工程(51).zip (62.8 KB, 下載次數(shù): 38)
2016年“宏晶杯單片機(jī)大賽”設(shè)計(jì)報(bào)告.pdf (460.53 KB, 下載次數(shù): 20)


評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:489394 發(fā)表于 2023-4-7 10:19 | 只看該作者
附件沒(méi)有仿真圖和原理圖呀
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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