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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4808|回復: 1
收起左側

住宅小區汽車超速檢測及報警系統設計(單片機源碼+圖+報告)

[復制鏈接]
ID:334647 發表于 2018-5-21 09:38 | 顯示全部樓層 |閱讀模式
“宏晶杯單片機大賽”設計報告—4、 住宅小區汽車超速檢測及報警系統
0.png
一、參賽題目
住宅小區汽車超速檢測及報警系統
(1)基本要求
速度檢測與顯示
速度報警值設定
環境氣象參數的顯示
(2)拓展功能自行考慮
二、方案比較及確定
依據題目基本要求:速度的檢測與顯示,速度報警值的設定以及環境氣象參數的顯示。團隊以此作為基本要求展開設計,經過討論以及程序的執行情況,確定以下功能,其中包括基本功能模塊和拓展功能模塊。

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

路燈控制:考慮到小區人們的出行, 在15 上增加了對路燈控制的模塊,在每天的 19:30-00:30 路燈會自動亮起。同時兼顧每位居民的不同的作息時間,在路燈亮起的這段時間內如果檢測到有超速的情況則蜂鳴警報聲不會響起,
只會在顯示屏上顯示超速并且LED 燈閃爍來替代警報聲,同時抓拍車牌號。深夜模式:在00:30 分之后,路燈熄滅,此時如果有人或者車經過時,聲控開關會控制路燈再次點亮 10s,同時測速報警系統也會啟動。在到達凌晨4 點 30 分之后,深夜模式關閉。既方便小區人們的出行又達到了節能減排的效果。
噪聲檢測:通過檢測周圍環境的噪聲,如果檢測到噪音,則通過點
亮LED 燈來顯示噪聲檢測結果。

三、理論數據分析
此測速報警系統是通過測量汽車經過兩個光電門之間的時間, 設定兩個光電門之間的距離為  s 10cm .編寫程序時將延時時間設定為1ms, 每經過 1ms則檢測一次車頭是否到達第二個光電門, 同時計時,如果到達則計時結束,得到車頭經過兩個光電門所用時間t ,之后運用基本的物理速度公式:
v=s/t 進而獲得汽車的速度。

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

2、路燈控制功能流程圖
2.png

六、電路圖及相關設計文件
0.png

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

八、測試數據及結果分析
1、 此報警系統不僅能夠測定速度,通過測定車頭通過兩個光電門所用時間 t,利用物理公式v=s/t 判斷是否超速。
2、 通過溫濕度傳感器測量周圍環境的環境參數, 并顯示在12864顯示屏的第三行。
3、通過噪音傳感器測量噪音系數,根據系數大小判斷是否點亮噪音顯示燈。

九、總結
此次大賽我們選中了“小區測速報警系統”的題目,這個命題十分貼近我們的日常生活, 真正的將平時在課本上所學習的有關單片機的知識運用到實踐中,在技術設計中更多地要考慮的是實用性,合理性。而且,平時我們大多數用的單片機都是 51 系列,此次大賽要求我們應用 15 系列,這又是一次鍛煉我們的機會,掌握了更多型號的單片機的使用方法。在設計中,向 15 單片機上轉化是一項很大的考驗,通過幾天的努力我們終于讓程序在 15 上正常運行,這次比賽讓我們的專業知識儲備更加豐富, 也在實踐中應用了所學, 受益匪淺。


附錄:
15單片機設計程序及注釋

單片機源程序如下:
  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;//蜂鳴器報警
  11. sbit voice = P3^0; //鳴笛檢測輸出
  12. sbit led6 = P1^5; //        燈光報警
  13. sbit led5 = P1^4;//鳴笛檢測燈光示意

  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[] = {"  歡迎使用小區  "};
  39. uchar code init2[] = {"  車速檢測系統  "};
  40. uchar code init3[] = {"請輸入小區限速: "};
  41. uchar code init4[] = {"    km/h        "};
  42. uchar code warning1[] = {"車速: 020km/h   "};
  43. uchar code warning2[] = {"您已超速, 為了  "};
  44. uchar code warning3[] = {"您和他人的安全  "};
  45. uchar code warning4[] = {"請減速慢行      "};
  46. uchar code slogan1[] = {"    文明禮讓    "};
  47. uchar code slogan2[] = {"    有序通行    "};
  48. uchar code slogan3[] = {"    互相體諒    "};
  49. uchar code slogan4[] = {"    請勿鳴笛    "};
  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. /*檢查LCD忙狀態                                                    */
  71. /*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數據。      */
  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. /*寫指令數據到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. /*寫顯示數據到LCD                                                  */
  108. /*RS=H,RW=L,E=高脈沖,D0-D7=數據。                               */
  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初始化設定                                                  */
  126. /*                                                                 */
  127. /*******************************************************************/
  128. void lcd_init()
  129. {

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


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

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

  146. /*=================================================
  147. *函數名稱:Delay_Ms
  148. *函數功能:12T 51單片機自適應主時鐘毫秒級延時函數
  149. *說明:需定義MAIN_Fosc(晶振主頻單位HZ)
  150. *輸入:ms:要延時的毫秒
  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. *函數名稱:DS1302_W_Byte
  162. *函數功能:DS1302寫一字節數據
  163. *輸入:dat:要寫入的數據
  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;                   //拉低時鐘總線
  171.                 TIO = dat & 0x01;  //從一字節最低位開始寫
  172.                 TSCLK = 1;                   //拉高時鐘總線,DS1302把數據讀走
  173.                 dat >>= 1;                   //數據右移一位
  174.         }        
  175. }
  176. /*=================================================
  177. *函數名稱:DS1302_R_Byte
  178. *函數功能:DS1302讀一字節
  179. *輸出:dat:讀取的數據
  180. =================================================*/
  181. uchar DS1302_R_Byte()
  182. {
  183.         uchar i, dat;
  184.         for(i = 0; i < 8; i++)  //每次寫1bit,寫8次
  185.         {
  186.                 TSCLK = 0;                        //拉低時鐘總線,DS1302把數據放到數據總線上
  187.                 dat >>= 1;                         //數據右移一位,數據從最低位開始讀
  188.                 if(TIO)        dat |= 0x80;//讀取數據
  189.                 TSCLK = 1;                        //拉高時鐘總線
  190.         }
  191.         return dat;                                //返回讀取的數據
  192. }
  193. /*=================================================
  194. *函數名稱:DS1302_W_DAT
  195. *函數功能:寫DS1302數據一次寫2個字節
  196. *說明:先寫命令后寫數據
  197. *調用:DS1302_W_Byte()
  198. *輸入:cmd:需要寫的命令 ,dat:需要些的數據
  199. =================================================*/
  200. void DS1302_W_DAT(uchar cmd, uchar dat)
  201. {
  202.         TRST = 0;                         //拉低使能端
  203.         TSCLK = 0;                         //拉低數據總線
  204.         TRST = 1;                         //拉高使能端,開始寫數據
  205.         DS1302_W_Byte(cmd);         //寫命令
  206.         DS1302_W_Byte(dat);         //寫數據
  207. }
  208. /*=================================================
  209. *函數名稱:DS1302_R_DAT
  210. *函數功能:讀DS1302數據
  211. *說明:先寫入命令字節后讀出對應數據
  212. *調用:        DS1302_W_Byte();DS1302_R_Byte();
  213. *輸入:        cmd:需要寫的命令
  214. *輸出:        dat:讀出的數據
  215. =================================================*/
  216. uchar DS1302_R_DAT(uchar cmd)
  217. {
  218.         uchar dat;
  219.         TRST = 0;                                 //拉低使能端
  220.         TSCLK = 0;                                //拉低數據總線
  221.         TRST = 1;                                //拉高使能端,開始寫數據
  222.         DS1302_W_Byte(cmd);                //寫命令
  223.         dat = DS1302_R_Byte();        //讀出數據
  224.         return dat;                                //返回讀出數據
  225. }

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



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

  300. }



  301. uchar KeyScan()        //帶返回值的子函數
  302. {
  303.         uchar cord_l = 0,cord_h = 0;//聲明列線和行線的值的儲存變量
  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;// 儲存列線值
  311.                           P0 = cord_l | 0x0f;
  312.                           cord_h = P0 & 0x0f;// 儲存行線值
  313.                           while( (P0 & 0x0f) != 0x0f );//松手檢測
  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();//定時器初始化
  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; // 定時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. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png

所有資料51hei提供下載:
最終工程(51).zip (62.8 KB, 下載次數: 38)

評分

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

查看全部評分

回復

使用道具 舉報

ID:489394 發表于 2023-4-7 10:19 | 顯示全部樓層
附件沒有仿真圖和原理圖呀
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久一日本道色综合久久 | 国产午夜精品理论片a大结局 | 国产视频中文字幕 | a级毛片国产 | 国产免费一区二区三区最新6 | 成人精品福利 | 午夜电影网| 国产乱码精品一区二区三区五月婷 | 欧美自拍另类 | 性高湖久久久久久久久3小时 | 在线亚洲免费视频 | 亚洲精品一区二区在线观看 | 国产精品国产三级国产aⅴ入口 | 亚洲精品黑人 | av在线免费观看网址 | 日本不卡免费新一二三区 | 91xxx在线观看| 请别相信他免费喜剧电影在线观看 | 精品99爱视频在线观看 | 国产欧美精品一区二区 | 免费在线观看一区二区三区 | 福利片在线观看 | 国产精品亚洲一区 | 精品在线99 | 欧美日韩中文字幕在线播放 | 日韩成人在线视频 | 久久免费看| 欧美日韩一区二区三区在线观看 | www.国产精品 | 成人精品高清 | 亚洲成年影院 | 国产精品久久久久久吹潮 | 免费的日批视频 | 黄色男女网站 | 欧美亚洲国产一区二区三区 | 一区二区三区视频免费观看 | 粉嫩一区二区三区性色av | 成人九色 | 老司机免费视频 | 日韩午夜一区二区三区 | 天天看天天干 |