“宏晶杯單片機大賽”設計報告—4、 住宅小區汽車超速檢測及報警系統
一、參賽題目
住宅小區汽車超速檢測及報警系統
(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、測速功能流程圖
2、路燈控制功能流程圖
六、電路圖及相關設計文件
所用軟件:proteus 電路仿真軟件
七、比賽器件
STC15 單片機、薄膜鍵盤、12864 液晶顯示屏、溫濕度傳感器DHT11、時間顯示 DS1302、噪音檢測器、光電門等。
八、測試數據及結果分析
1、 此報警系統不僅能夠測定速度,通過測定車頭通過兩個光電門所用時間 t,利用物理公式v=s/t 判斷是否超速。
2、 通過溫濕度傳感器測量周圍環境的環境參數, 并顯示在12864顯示屏的第三行。
3、通過噪音傳感器測量噪音系數,根據系數大小判斷是否點亮噪音顯示燈。
九、總結
此次大賽我們選中了“小區測速報警系統”的題目,這個命題十分貼近我們的日常生活, 真正的將平時在課本上所學習的有關單片機的知識運用到實踐中,在技術設計中更多地要考慮的是實用性,合理性。而且,平時我們大多數用的單片機都是 51 系列,此次大賽要求我們應用 15 系列,這又是一次鍛煉我們的機會,掌握了更多型號的單片機的使用方法。在設計中,向 15 單片機上轉化是一項很大的考驗,通過幾天的努力我們終于讓程序在 15 上正常運行,這次比賽讓我們的專業知識儲備更加豐富, 也在實踐中應用了所學, 受益匪淺。
附錄:
15單片機設計程序及注釋
單片機源程序如下:
- #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;//蜂鳴器報警
- sbit voice = P3^0; //鳴笛檢測輸出
- sbit led6 = P1^5; // 燈光報警
- sbit led5 = P1^4;//鳴笛檢測燈光示意
- 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[] = {" 歡迎使用小區 "};
- uchar code init2[] = {" 車速檢測系統 "};
- uchar code init3[] = {"請輸入小區限速: "};
- uchar code init4[] = {" km/h "};
- uchar code warning1[] = {"車速: 020km/h "};
- uchar code warning2[] = {"您已超速, 為了 "};
- uchar code warning3[] = {"您和他人的安全 "};
- uchar code warning4[] = {"請減速慢行 "};
- uchar code slogan1[] = {" 文明禮讓 "};
- uchar code slogan2[] = {" 有序通行 "};
- uchar code slogan3[] = {" 互相體諒 "};
- uchar code slogan4[] = {" 請勿鳴笛 "};
- 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_();
- }
- }
- }
-
- /*******************************************************************/
- /* */
- /*檢查LCD忙狀態 */
- /*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數據。 */
- /* */
- /*******************************************************************/
- bit lcd_busy()
- {
- bit result;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_EN = 1;
- delayNOP();
- result = (bit)(P0&0x80);
- LCD_EN = 0;
- return(result);
- }
- /*******************************************************************/
- /* */
- /*寫指令數據到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;
- }
- /*******************************************************************/
- /* */
- /*寫顯示數據到LCD */
- /*RS=H,RW=L,E=高脈沖,D0-D7=數據。 */
- /* */
- /*******************************************************************/
- 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初始化設定 */
- /* */
- /*******************************************************************/
- void lcd_init()
- {
-
- LCD_PSB = 1;
- lcd_wcmd(0x34); //擴充指令操作
- delay(5);
- lcd_wcmd(0x30); //基本指令操作
- delay(5);
- lcd_wcmd(0x0C); //顯示開,關光標
- delay(5);
- lcd_wcmd(0x01); //清除LCD的顯示內容
- delay(5);
- }
- #define MAIN_Fosc 11059200UL //宏定義主時鐘HZ
- #define DS1302_W_ADDR 0x80 //寫時鐘日歷寄存器起始地址
- #define DS1302_R_ADDR 0x81 //讀時鐘日歷寄存器起始地址
- //時鐘日歷暫存數組,秒、分、時、日、月、周、年 初值為= 16年6月4日 周六 19:29:50
- uchar TimeData[7]={0, 29, 19, 4, 6, 6, 16};
- /*=================================================
- *函數名稱:Delay_Ms
- *函數功能:12T 51單片機自適應主時鐘毫秒級延時函數
- *說明:需定義MAIN_Fosc(晶振主頻單位HZ)
- *輸入:ms:要延時的毫秒
- =================================================*/
- void Delay_Ms(uint ms)
- {
- uint i;
- do{
- i = MAIN_Fosc / 96000;
- while(--i); //96T per loop
- }while(--ms);
- }
- /*=================================================
- *函數名稱:DS1302_W_Byte
- *函數功能:DS1302寫一字節數據
- *輸入:dat:要寫入的數據
- =================================================*/
- void DS1302_W_Byte(uchar dat)
- {
- uchar i;
- for(i = 0; i < 8; i++) //每次寫1bit,寫8次
- {
- TSCLK = 0; //拉低時鐘總線
- TIO = dat & 0x01; //從一字節最低位開始寫
- TSCLK = 1; //拉高時鐘總線,DS1302把數據讀走
- dat >>= 1; //數據右移一位
- }
- }
- /*=================================================
- *函數名稱:DS1302_R_Byte
- *函數功能:DS1302讀一字節
- *輸出:dat:讀取的數據
- =================================================*/
- uchar DS1302_R_Byte()
- {
- uchar i, dat;
- for(i = 0; i < 8; i++) //每次寫1bit,寫8次
- {
- TSCLK = 0; //拉低時鐘總線,DS1302把數據放到數據總線上
- dat >>= 1; //數據右移一位,數據從最低位開始讀
- if(TIO) dat |= 0x80;//讀取數據
- TSCLK = 1; //拉高時鐘總線
- }
- return dat; //返回讀取的數據
- }
- /*=================================================
- *函數名稱:DS1302_W_DAT
- *函數功能:寫DS1302數據一次寫2個字節
- *說明:先寫命令后寫數據
- *調用:DS1302_W_Byte()
- *輸入:cmd:需要寫的命令 ,dat:需要些的數據
- =================================================*/
- void DS1302_W_DAT(uchar cmd, uchar dat)
- {
- TRST = 0; //拉低使能端
- TSCLK = 0; //拉低數據總線
- TRST = 1; //拉高使能端,開始寫數據
- DS1302_W_Byte(cmd); //寫命令
- DS1302_W_Byte(dat); //寫數據
- }
- /*=================================================
- *函數名稱:DS1302_R_DAT
- *函數功能:讀DS1302數據
- *說明:先寫入命令字節后讀出對應數據
- *調用: DS1302_W_Byte();DS1302_R_Byte();
- *輸入: cmd:需要寫的命令
- *輸出: dat:讀出的數據
- =================================================*/
- uchar DS1302_R_DAT(uchar cmd)
- {
- uchar dat;
- TRST = 0; //拉低使能端
- TSCLK = 0; //拉低數據總線
- TRST = 1; //拉高使能端,開始寫數據
- DS1302_W_Byte(cmd); //寫命令
- dat = DS1302_R_Byte(); //讀出數據
- return dat; //返回讀出數據
- }
- /*=================================================
- *函數名稱:DS1302_Clear_WP
- *函數功能:清除DS1302寫保護
- *說明:先寫入命令0x8e(寫控制寄存器)接著向該寄存器寫0
- *調用:DS1302_W_DAT()
- =================================================*/
- void DS1302_Clear_WP()
- {
- DS1302_W_DAT(0x8e,0x00); //把控制寄存器WP位置0
- }
- /*=================================================
- *函數名稱:DS1302_Clear_WP
- *函數功能:設置DS1302寫保護
- *說明:先寫入命令0x8e(寫控制寄存器)接著向該寄存器寫0x80
- *調用:DS1302_W_DAT()
- =================================================*/
- void DS1302_Set_WP()
- {
- DS1302_W_DAT(0x8e,0x80); //把控制寄存器WP位置1
- TRST = 0; //拉低使能端
- TSCLK = 0; //拉低數據總線
- }
- /*=================================================
- *函數名稱:Set_DS1302_Time
- *函數功能:設置DS1302時鐘日歷數據
- *說明:把時鐘日歷暫存數組TimeData數據轉換為BCD碼并
- 寫入到DS1302時鐘日歷寄存器中
- *調用:DS1302_Clear_WP();DS1302_W_DAT();DS1302_Set_WP();
- *輸入:addr:需要寫入寄存器的地址 ,TimeData數組:時鐘日歷初始值
- =================================================*/
- void Set_DS1302_Time(uchar addr)
- {
- uchar i, j;
- DS1302_Clear_WP(); //清除寫保護
- for(i = 0; i < 7; i++) //寫入7個字節的時鐘初始值
- {
- j = TimeData[i]/10; //BCD碼轉換
- TimeData[i] %= 10; //BCD碼轉換
- TimeData[i] += j*16; //BCD碼轉換
- DS1302_W_DAT(addr, TimeData[i]); //先寫DS1302時鐘日歷起始地址,再寫數據
- addr += 2; //時鐘日歷寄存器地址+2轉向下一個寄存器
- }
- DS1302_Set_WP(); //開起寫保護
- }
- /*=================================================
- *函數名稱:Read_DS1302_Time
- *函數功能:讀取DS1302時鐘數據
- *說明: 讀取DS1302時鐘數據 返回數據存入時鐘日歷暫存
- 數組TimeData(數據格式BCD碼)
- *調用:DS1302_Clear_WP();DS1302_R_DAT();DS1302_Set_WP();
- *輸入: addr:需要讀取時鐘日歷寄存器的起始地址
- =================================================*/
- void Read_DS1302_Time(uchar addr)
- {
- uchar i;
- DS1302_Clear_WP(); //清楚些保護
- for(i = 0; i < 7; i++) //從DS1302讀取7個字節的時鐘日歷數據
- {
- TimeData[i] = DS1302_R_DAT(addr);//先寫入要讀取數據的寄存器起始地址,再讀出數據存入TimeData數組
- addr += 2; //時鐘日歷寄存器地址+2轉向下一個寄存器
- }
- DS1302_Set_WP(); //開起寫保護
- }
- void init()
- {
-
- TMOD = 0x01; //定時器16位計數工作模式
- TH0 =0xfc;
- TL0 =0x66; //1ms定時
- EX0 = 1; //開外部中斷0
- IT0 = 1; //負跳變觸發
- EX1 = 1; //開外部中斷1
- IT1 = 1; //負跳變觸發
- EA = 1; //開總中斷
- }
- uchar KeyScan() //帶返回值的子函數
- {
- uchar cord_l = 0,cord_h = 0;//聲明列線和行線的值的儲存變量
- P0 = 0xf0;//1111 0000
- if( (P0 & 0xf0) != 0xf0)//判斷是否有按鍵按下
- {
- delay(20);//軟件消抖
- if( (P0 & 0xf0) != 0xf0)//判斷是否有按鍵按下
- { flag0 = 1;
- cord_l = P0 & 0xf0;// 儲存列線值
- P0 = cord_l | 0x0f;
- cord_h = P0 & 0x0f;// 儲存行線值
- while( (P0 & 0x0f) != 0x0f );//松手檢測
- 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();//定時器初始化
- 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; // 定時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;
-
- }
-
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
最終工程(51).zip
(62.8 KB, 下載次數: 38)
|