|
“宏晶杯單片機(jī)大賽”設(shè)計(jì)報(bào)告—4、 住宅小區(qū)汽車超速檢測(cè)及報(bào)警系統(tǒng)
0.png (33.48 KB, 下載次數(shù): 59)
下載附件
2018-5-21 15:14 上傳
一、參賽題目
住宅小區(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è)速功能流程圖
1.png (152.45 KB, 下載次數(shù): 46)
下載附件
2018-5-21 17:46 上傳
2、路燈控制功能流程圖
2.png (311.88 KB, 下載次數(shù): 35)
下載附件
2018-5-21 17:46 上傳
六、電路圖及相關(guān)設(shè)計(jì)文件
0.png (60.81 KB, 下載次數(shù): 54)
下載附件
2018-5-21 17:43 上傳
所用軟件: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ī)源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define LCD_data P0
- #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
- #define MAIN_Fosc 11059200UL //
- #define DS1302_W_ADDR 0x80 //
- #define DS1302_R_ADDR 0x81 //
- sbit buzzer = P2^3;//蜂鳴器報(bào)警
- sbit voice = P3^0; //鳴笛檢測(cè)輸出
- sbit led6 = P1^5; // 燈光報(bào)警
- sbit led5 = P1^4;//鳴笛檢測(cè)燈光示意
- sbit TSCLK = P1^0;
- sbit TIO = P1^1;
- sbit TRST = P1^2;
- sbit streetlight = P1^7;//路燈
- sbit LCD_RS = P3^5;//
- sbit LCD_RW = P3^6;//
- sbit LCD_EN = P3^4; //
- sbit LCD_PSB = P3^7;
- sbit wela = P2^7;
- sbit dula = P2^6;
- sbit DQ=P2^2; //DTH11
- uint vtest= 0;
- uint t = 0;
- uchar vlim = 0;
- v_test[3] = {0,0,0};
- v_lim[3] = {0,0,0};
- uchar flag,flag0,flag1,flag2,flag4,flag5,flag6= 0;
- uchar flag3 = 1;
- uchar flag7 = 1;
- uchar weed,x;
- uchar tem = 0;
- uchar hum = 0;
- display0[2]={0,0};
- display1[2]={0,0};
- uchar code init1[] = {" 歡迎使用小區(qū) "};
- uchar code init2[] = {" 車速檢測(cè)系統(tǒng) "};
- uchar code init3[] = {"請(qǐng)輸入小區(qū)限速: "};
- uchar code init4[] = {" km/h "};
- uchar code warning1[] = {"車速: 020km/h "};
- uchar code warning2[] = {"您已超速, 為了 "};
- uchar code warning3[] = {"您和他人的安全 "};
- uchar code warning4[] = {"請(qǐng)減速慢行 "};
- uchar code slogan1[] = {" 文明禮讓 "};
- uchar code slogan2[] = {" 有序通行 "};
- uchar code slogan3[] = {" 互相體諒 "};
- uchar code slogan4[] = {" 請(qǐng)勿鳴笛 "};
- uchar code dis1[]= {"20 年 月 日 "};
- uchar code dis2[]= {"星期 : : "};
- uchar code dis3[] = {"溫度26℃濕度30%"};
- uchar code dis4[] = {"限速: km/h "};
-
-
- void delay(uint ms)
- {
- while(ms--)
- {
- uchar i;
- for(i=0;i<250;i++)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- }
- }
-
- /*******************************************************************/
- /* */
- /*檢查L(zhǎng)CD忙狀態(tài) */
- /*lcd_busy為1時(shí),忙,等待。lcd-busy為0時(shí),閑,可寫指令與數(shù)據(jù)。 */
- /* */
- /*******************************************************************/
- bit lcd_busy()
- {
- bit result;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_EN = 1;
- delayNOP();
- result = (bit)(P0&0x80);
- LCD_EN = 0;
- return(result);
- }
- /*******************************************************************/
- /* */
- /*寫指令數(shù)據(jù)到LCD */
- /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。 */
- /* */
- /*******************************************************************/
- void lcd_wcmd(uchar cmd)
- {
- while(lcd_busy());
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_EN = 0;
- _nop_();
- _nop_();
- P0 = cmd;
- delayNOP();
- LCD_EN = 1;
- delayNOP();
- LCD_EN = 0;
- }
- /*******************************************************************/
- /* */
- /*寫顯示數(shù)據(jù)到LCD */
- /*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。 */
- /* */
- /*******************************************************************/
- void lcd_wdat(uchar dat)
- {
- while(lcd_busy());
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_EN = 0;
- P0 = dat;
- delayNOP();
- LCD_EN = 1;
- delayNOP();
- LCD_EN = 0;
- }
- /*******************************************************************/
- /* */
- /* LCD初始化設(shè)定 */
- /* */
- /*******************************************************************/
- void lcd_init()
- {
-
- LCD_PSB = 1;
- lcd_wcmd(0x34); //擴(kuò)充指令操作
- delay(5);
- lcd_wcmd(0x30); //基本指令操作
- delay(5);
- lcd_wcmd(0x0C); //顯示開(kāi),關(guān)光標(biāo)
- delay(5);
- lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容
- delay(5);
- }
- #define MAIN_Fosc 11059200UL //宏定義主時(shí)鐘HZ
- #define DS1302_W_ADDR 0x80 //寫時(shí)鐘日歷寄存器起始地址
- #define DS1302_R_ADDR 0x81 //讀時(shí)鐘日歷寄存器起始地址
- //時(shí)鐘日歷暫存數(shù)組,秒、分、時(shí)、日、月、周、年 初值為= 16年6月4日 周六 19:29:50
- uchar TimeData[7]={0, 29, 19, 4, 6, 6, 16};
- /*=================================================
- *函數(shù)名稱:Delay_Ms
- *函數(shù)功能:12T 51單片機(jī)自適應(yīng)主時(shí)鐘毫秒級(jí)延時(shí)函數(shù)
- *說(shuō)明:需定義MAIN_Fosc(晶振主頻單位HZ)
- *輸入:ms:要延時(shí)的毫秒
- =================================================*/
- void Delay_Ms(uint ms)
- {
- uint i;
- do{
- i = MAIN_Fosc / 96000;
- while(--i); //96T per loop
- }while(--ms);
- }
- /*=================================================
- *函數(shù)名稱:DS1302_W_Byte
- *函數(shù)功能:DS1302寫一字節(jié)數(shù)據(jù)
- *輸入:dat:要寫入的數(shù)據(jù)
- =================================================*/
- void DS1302_W_Byte(uchar dat)
- {
- uchar i;
- for(i = 0; i < 8; i++) //每次寫1bit,寫8次
- {
- TSCLK = 0; //拉低時(shí)鐘總線
- TIO = dat & 0x01; //從一字節(jié)最低位開(kāi)始寫
- TSCLK = 1; //拉高時(shí)鐘總線,DS1302把數(shù)據(jù)讀走
- dat >>= 1; //數(shù)據(jù)右移一位
- }
- }
- /*=================================================
- *函數(shù)名稱:DS1302_R_Byte
- *函數(shù)功能:DS1302讀一字節(jié)
- *輸出:dat:讀取的數(shù)據(jù)
- =================================================*/
- uchar DS1302_R_Byte()
- {
- uchar i, dat;
- for(i = 0; i < 8; i++) //每次寫1bit,寫8次
- {
- TSCLK = 0; //拉低時(shí)鐘總線,DS1302把數(shù)據(jù)放到數(shù)據(jù)總線上
- dat >>= 1; //數(shù)據(jù)右移一位,數(shù)據(jù)從最低位開(kāi)始讀
- if(TIO) dat |= 0x80;//讀取數(shù)據(jù)
- TSCLK = 1; //拉高時(shí)鐘總線
- }
- return dat; //返回讀取的數(shù)據(jù)
- }
- /*=================================================
- *函數(shù)名稱:DS1302_W_DAT
- *函數(shù)功能:寫DS1302數(shù)據(jù)一次寫2個(gè)字節(jié)
- *說(shuō)明:先寫命令后寫數(shù)據(jù)
- *調(diào)用:DS1302_W_Byte()
- *輸入:cmd:需要寫的命令 ,dat:需要些的數(shù)據(jù)
- =================================================*/
- void DS1302_W_DAT(uchar cmd, uchar dat)
- {
- TRST = 0; //拉低使能端
- TSCLK = 0; //拉低數(shù)據(jù)總線
- TRST = 1; //拉高使能端,開(kāi)始寫數(shù)據(jù)
- DS1302_W_Byte(cmd); //寫命令
- DS1302_W_Byte(dat); //寫數(shù)據(jù)
- }
- /*=================================================
- *函數(shù)名稱:DS1302_R_DAT
- *函數(shù)功能:讀DS1302數(shù)據(jù)
- *說(shuō)明:先寫入命令字節(jié)后讀出對(duì)應(yīng)數(shù)據(jù)
- *調(diào)用: DS1302_W_Byte();DS1302_R_Byte();
- *輸入: cmd:需要寫的命令
- *輸出: dat:讀出的數(shù)據(jù)
- =================================================*/
- uchar DS1302_R_DAT(uchar cmd)
- {
- uchar dat;
- TRST = 0; //拉低使能端
- TSCLK = 0; //拉低數(shù)據(jù)總線
- TRST = 1; //拉高使能端,開(kāi)始寫數(shù)據(jù)
- DS1302_W_Byte(cmd); //寫命令
- dat = DS1302_R_Byte(); //讀出數(shù)據(jù)
- return dat; //返回讀出數(shù)據(jù)
- }
- /*=================================================
- *函數(shù)名稱:DS1302_Clear_WP
- *函數(shù)功能:清除DS1302寫保護(hù)
- *說(shuō)明:先寫入命令0x8e(寫控制寄存器)接著向該寄存器寫0
- *調(diào)用:DS1302_W_DAT()
- =================================================*/
- void DS1302_Clear_WP()
- {
- DS1302_W_DAT(0x8e,0x00); //把控制寄存器WP位置0
- }
- /*=================================================
- *函數(shù)名稱:DS1302_Clear_WP
- *函數(shù)功能:設(shè)置DS1302寫保護(hù)
- *說(shuō)明:先寫入命令0x8e(寫控制寄存器)接著向該寄存器寫0x80
- *調(diào)用:DS1302_W_DAT()
- =================================================*/
- void DS1302_Set_WP()
- {
- DS1302_W_DAT(0x8e,0x80); //把控制寄存器WP位置1
- TRST = 0; //拉低使能端
- TSCLK = 0; //拉低數(shù)據(jù)總線
- }
- /*=================================================
- *函數(shù)名稱:Set_DS1302_Time
- *函數(shù)功能:設(shè)置DS1302時(shí)鐘日歷數(shù)據(jù)
- *說(shuō)明:把時(shí)鐘日歷暫存數(shù)組TimeData數(shù)據(jù)轉(zhuǎn)換為BCD碼并
- 寫入到DS1302時(shí)鐘日歷寄存器中
- *調(diào)用:DS1302_Clear_WP();DS1302_W_DAT();DS1302_Set_WP();
- *輸入:addr:需要寫入寄存器的地址 ,TimeData數(shù)組:時(shí)鐘日歷初始值
- =================================================*/
- void Set_DS1302_Time(uchar addr)
- {
- uchar i, j;
- DS1302_Clear_WP(); //清除寫保護(hù)
- for(i = 0; i < 7; i++) //寫入7個(gè)字節(jié)的時(shí)鐘初始值
- {
- j = TimeData[i]/10; //BCD碼轉(zhuǎn)換
- TimeData[i] %= 10; //BCD碼轉(zhuǎn)換
- TimeData[i] += j*16; //BCD碼轉(zhuǎn)換
- DS1302_W_DAT(addr, TimeData[i]); //先寫DS1302時(shí)鐘日歷起始地址,再寫數(shù)據(jù)
- addr += 2; //時(shí)鐘日歷寄存器地址+2轉(zhuǎn)向下一個(gè)寄存器
- }
- DS1302_Set_WP(); //開(kāi)起寫保護(hù)
- }
- /*=================================================
- *函數(shù)名稱:Read_DS1302_Time
- *函數(shù)功能:讀取DS1302時(shí)鐘數(shù)據(jù)
- *說(shuō)明: 讀取DS1302時(shí)鐘數(shù)據(jù) 返回?cái)?shù)據(jù)存入時(shí)鐘日歷暫存
- 數(shù)組TimeData(數(shù)據(jù)格式BCD碼)
- *調(diào)用:DS1302_Clear_WP();DS1302_R_DAT();DS1302_Set_WP();
- *輸入: addr:需要讀取時(shí)鐘日歷寄存器的起始地址
- =================================================*/
- void Read_DS1302_Time(uchar addr)
- {
- uchar i;
- DS1302_Clear_WP(); //清楚些保護(hù)
- for(i = 0; i < 7; i++) //從DS1302讀取7個(gè)字節(jié)的時(shí)鐘日歷數(shù)據(jù)
- {
- TimeData[i] = DS1302_R_DAT(addr);//先寫入要讀取數(shù)據(jù)的寄存器起始地址,再讀出數(shù)據(jù)存入TimeData數(shù)組
- addr += 2; //時(shí)鐘日歷寄存器地址+2轉(zhuǎn)向下一個(gè)寄存器
- }
- DS1302_Set_WP(); //開(kāi)起寫保護(hù)
- }
- void init()
- {
-
- TMOD = 0x01; //定時(shí)器16位計(jì)數(shù)工作模式
- TH0 =0xfc;
- TL0 =0x66; //1ms定時(shí)
- EX0 = 1; //開(kāi)外部中斷0
- IT0 = 1; //負(fù)跳變觸發(fā)
- EX1 = 1; //開(kāi)外部中斷1
- IT1 = 1; //負(fù)跳變觸發(fā)
- EA = 1; //開(kāi)總中斷
- }
- uchar KeyScan() //帶返回值的子函數(shù)
- {
- uchar cord_l = 0,cord_h = 0;//聲明列線和行線的值的儲(chǔ)存變量
- P0 = 0xf0;//1111 0000
- if( (P0 & 0xf0) != 0xf0)//判斷是否有按鍵按下
- {
- delay(20);//軟件消抖
- if( (P0 & 0xf0) != 0xf0)//判斷是否有按鍵按下
- { flag0 = 1;
- cord_l = P0 & 0xf0;// 儲(chǔ)存列線值
- P0 = cord_l | 0x0f;
- cord_h = P0 & 0x0f;// 儲(chǔ)存行線值
- while( (P0 & 0x0f) != 0x0f );//松手檢測(cè)
- return (cord_l + cord_h);//返回鍵值碼
- }
- }
-
- }
- void input_bai()
- {
- switch( KeyScan() )
- {
- case 0xd7: v_lim[0] = 0; break;
- case 0xee: v_lim[0] = 1; break;
- case 0xde: v_lim[0] = 2; break;
- case 0xbe: v_lim[0] = 3; break;
- case 0xed: v_lim[0] = 4; break;
- case 0xdd: v_lim[0] = 5; break;
- case 0xbd: v_lim[0] = 6; break;
- case 0xeb: v_lim[0] = 7; break;
- case 0xdb: v_lim[0] = 8; break;
- case 0xbb: v_lim[0] = 9; break;
-
-
- }
- }
- void input_shi()
- {
- switch( KeyScan() )
- {
- case 0xd7: v_lim[1] = 0; break;
- case 0xee: v_lim[1] = 1; break;
- case 0xde: v_lim[1] = 2; break;
- case 0xbe: v_lim[1] = 3; break;
- case 0xed: v_lim[1] = 4; break;
- case 0xdd: v_lim[1] = 5; break;
- case 0xbd: v_lim[1] = 6; break;
- case 0xeb: v_lim[1] = 7; break;
- case 0xdb: v_lim[1] = 8; break;
- case 0xbb: v_lim[1] = 9; break;
-
-
- }
- }
- void input_ge()
- {
- switch( KeyScan() )
- {
- case 0xd7: v_lim[2] = 0; break;
- case 0xee: v_lim[2] = 1; break;
- case 0xde: v_lim[2] = 2; break;
- case 0xbe: v_lim[2] = 3; break;
- case 0xed: v_lim[2] = 4; break;
- case 0xdd: v_lim[2] = 5; break;
- case 0xbd: v_lim[2] = 6; break;
- case 0xeb: v_lim[2] = 7; break;
- case 0xdb: v_lim[2] = 8; break;
- case 0xbb: v_lim[2] = 9; break;
-
-
- }
- }
- bit Init_DTH11()
- {
- bit flag;
- uchar num;
- DQ=0;
- delay(19); // >18ms
- DQ=1;
- for(num=0;num<10;num++); //
- for(num=0;num<12;num++);
- flag=DQ;
- for(num=0;num<11;num++);
- for(num=0;num<24;num++);
- return flag;
- }
- uchar DTH11_RD_CHAR()
- {
- uchar byte=0;
- uchar num;
- uchar num1;
- while(DQ==1);
- for(num1=0;num1<8;num1++)
- {
- while(DQ==0);
- byte<<=1; //
- for(num=0;DQ==1;num++);
- if(num<10)
- byte|=0x00;
- else
- byte|=0x01;
- }
- return byte;
- }
- void DTH11_DUSHU()
- {
- uchar num;
- if(Init_DTH11()==0)
- {
- hum=DTH11_RD_CHAR(); //
- DTH11_RD_CHAR();
- tem=DTH11_RD_CHAR();
- DTH11_RD_CHAR();
- DTH11_RD_CHAR();
- for(num=0;num<17;num++); //
- DQ=1;
- }
- }
- void Display_DTH11()
- {
- display0[0]=hum/10%10;
- display0[1]=hum%10;
- lcd_wcmd(0x8e);
- for(x=0;x<2;x++)
- lcd_wdat(display0[0+x]);//顯示濕度
- display1[0]=tem/10%10;
- display1[1]=tem%10;
- lcd_wcmd(0x8a);
- for(x=0;x<2;x++)
- lcd_wdat(display1[0+x]);//顯示溫度
- }
- void main()
- { wela = 0;
- dula = 0;
- Init_DTH11();
- lcd_init();//12864初始化
- init();//定時(shí)器初始化
- Set_DS1302_Time(DS1302_W_ADDR);
- lcd_wcmd(0x80);
- for(x=0;x<16;x++)
- lcd_wdat(init1[x]);
- lcd_wcmd(0x90);
- for(x=0;x<16;x++)
- lcd_wdat(init2[x]);
-
- lcd_wcmd(0x88);
- for(x=0;x<16;x++)
- lcd_wdat(init3[x]);
- lcd_wcmd(0x98);
- for(x=0;x<16;x++)
- lcd_wdat(init4[x]); //顯示初始界面
-
-
-
-
-
-
- while(1)
- {
- input_bai();
- if(flag0)
- {
- flag0 = 0;
- lcd_wcmd(0x98);
- for(x=0;x<1;x++)
- lcd_wdat(v_lim[0+x]+ '0');
- break;
- }
- }
-
- while(1)
- {
- input_shi();
- if(flag0)
- {
- flag0 = 0;
- lcd_wcmd(0x98);
- for(x=0;x<2;x++)
- lcd_wdat(v_lim[0+x]+ '0');
- break;
- }
- }
-
- while(1)
- {
- input_ge();
- if(flag0)
- {
- flag0 = 0;
- lcd_wcmd(0x99);
-
- lcd_wdat(v_lim[2]+ '0');
-
- }
- if (KeyScan() == 0x7e)
- {
- vlim = v_lim[0]*100+v_lim[1]*10+v_lim[2];
-
- break;
- }
-
-
- }
-
- while(1)
- { delay(5);
- lcd_wcmd(0x01);
- delay(5);
- lcd_wcmd(0x80);
- for(x=0;x<16;x++)
- lcd_wdat(dis1[x]);
- lcd_wcmd(0x90);
- for(x=0;x<16;x++)
- lcd_wdat(dis2[x]);
-
- lcd_wcmd(0x88);
- for(x=0;x<16;x++)
- lcd_wdat(dis3[x]);
- lcd_wcmd(0x98);
- for(x=0;x<16;x++)
- lcd_wdat(dis4[x]);
- while(flag3)
- {
- Read_DS1302_Time(DS1302_R_ADDR);//
- delay(5);
- lcd_wcmd(0x81);
- lcd_wdat(TimeData[6]/16 + '0');
- lcd_wdat(TimeData[6]%16 + '0');//year
- delay(5);
- lcd_wcmd(0x83);
- lcd_wdat(TimeData[4]/16 + '0');
- lcd_wdat(TimeData[4]%16 + '0');//month
- delay(5);
- lcd_wcmd(0x85);
- lcd_wdat(TimeData[3]/16 + '0');
- lcd_wdat(TimeData[3]%16 + '0');//day
- delay(5);
- lcd_wcmd(0x92);
- lcd_wdat(TimeData[5]%16 + '0');//weed
- delay(20);
- lcd_wcmd(0x93);
- lcd_wdat(TimeData[2]/16 + '0');
- lcd_wdat(TimeData[2]%16 + '0');//hour
- delay(5);
- lcd_wcmd(0x95);
- lcd_wdat(TimeData[1]/16 + '0');
- lcd_wdat(TimeData[1]%16 + '0');//minute
- delay(5);
- lcd_wcmd(0x97);
- lcd_wdat(TimeData[0]/16 + '0');
- lcd_wdat(TimeData[0]%16 + '0');//second
- if((TimeData[2] == 0x19)&&(TimeData[1] == 0x30))streetlight = 0;
- if((TimeData[2] == 0x00)&&(TimeData[1] == 0x30))streetlight = 1;
- if((TimeData[2] == 0x40)&&(TimeData[1] == 0x00)) flag7 = 0;
- Delay_Ms(600);
- DTH11_DUSHU();
- display0[0]=hum/10%10;
- display0[1]=hum%10;
- lcd_wcmd(0x8e);
- for(x=0;x<2;x++)
- lcd_wdat(display0[0+x]+'0');//顯示濕度
- display1[0]=tem/10%10;
- display1[1]=tem%10;
- lcd_wcmd(0x8a);
- for(x=0;x<2;x++)
- lcd_wdat(display1[0+x]+'0');//顯示溫度
- lcd_wcmd(0x9b);
- for(x=0;x<3;x++)
- lcd_wdat(v_lim[0+x]+'0');
- while(flag)
- {
- TR0 = 1;
- if(TF0 == 1)
- {
- TF0 = 0;
- TH0 = 0xfc;
- TL0 = 0x66; // 定時(shí)1ms
- t++;
- }
- }
- if(t > 0)
- {
- vtest = 10000/t;//
- if (vtest > vlim)
- {
-
- v_test[0] = vtest/100;
- v_test[1] = (vtest/10)-(vtest/100)*10;
- v_test[2] = vtest%10;
- flag3 = 0;
- flag4 = 1;
-
- t = 0;
- vtest = 0;
- flag = 0;
-
- }
- }
- if(!voice)
- {
- delay(5);
- if(!voice)
- {flag3 = 0;
- flag5 = 1;
- }
- }
-
- }
- if(flag4)
- {lcd_wcmd(0x01);
- delay(5);
- lcd_wcmd(0x80);
- for(x=0;x<16;x++)
- lcd_wdat(warning1[x]);
- lcd_wcmd(0x90);
- for(x=0;x<16;x++)
- lcd_wdat(warning2[x]);
-
- lcd_wcmd(0x88);
- for(x=0;x<16;x++)
- lcd_wdat(warning3[x]);
- lcd_wcmd(0x98);
- for(x=0;x<16;x++)
- lcd_wdat(warning4[x]);
- lcd_wcmd(0x83);
- for(x=0;x<3;x++)
- lcd_wdat(v_test[0+x]+'0');
-
- //Delay_Ms(2000);
- if(streetlight == 1)
- { buzzer = 0;
- Delay_Ms(2000);
- buzzer = 1;}
- else
- {
- led6 = 0;
- Delay_Ms(2000);
- led6= 1;
- }
- flag3 = 1;
- flag4 = 0;
-
- }
-
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
0.png (48.5 KB, 下載次數(shù): 45)
下載附件
2018-5-21 15:04 上傳
所有資料51hei提供下載:
最終工程(51).zip
(62.8 KB, 下載次數(shù): 38)
2018-5-21 09:37 上傳
點(diǎn)擊文件名下載附件
完整程序 下載積分: 黑幣 -5
2016年“宏晶杯單片機(jī)大賽”設(shè)計(jì)報(bào)告.pdf
(460.53 KB, 下載次數(shù): 20)
2018-5-21 09:37 上傳
點(diǎn)擊文件名下載附件
設(shè)計(jì)報(bào)告 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|