版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 嵌入式C語言課程設(shè)計(jì)報(bào)告</p><p><b> 目錄</b></p><p><b> 一、設(shè)計(jì)方案1</b></p><p><b> 1、功能簡介1</b></p><p> 2、開發(fā)測試環(huán)境選擇1</p><p&
2、gt; 二、液晶時(shí)鐘程序設(shè)計(jì)1</p><p> 1、功能狀態(tài)轉(zhuǎn)換圖1</p><p> 2、主要功能模塊2</p><p> 2.1主顯示模塊2</p><p> 2.2功能選擇模塊2</p><p> 2.3時(shí)間修改模塊3</p><p> 2.4鬧鈴修改模塊3&
3、lt;/p><p> 2.6其他輔助模塊函數(shù)以及變量4</p><p><b> 三、小結(jié)4</b></p><p><b> 四、附錄5</b></p><p><b> 1、使用說明5</b></p><p> 2、參考文獻(xiàn)資料5&l
4、t;/p><p><b> 3、附表16</b></p><p><b> 一、設(shè)計(jì)方案</b></p><p><b> 1、功能簡介</b></p><p> 本文所設(shè)計(jì)的簡易電子時(shí)鐘可輸出當(dāng)前時(shí)間以及鬧鈴時(shí)間,并可通過機(jī)械按鍵來實(shí)現(xiàn)修改當(dāng)前時(shí)間、修改鬧鈴時(shí)間、退出修
5、改以及控制鬧鈴的打開和關(guān)閉,并通過1602型號(hào)的液晶屏顯示出不同操作時(shí)的不同界面。本程序共設(shè)計(jì)按鍵5個(gè),按鍵及功能分別是1鍵:選擇功能界面下選擇時(shí)間修改、時(shí)間和鬧鈴修改狀態(tài)下的增加“1”計(jì)數(shù);2鍵:選擇功能界面下選擇鬧鈴修改、時(shí)間和鬧鈴修改狀態(tài)下的減少“1”計(jì)數(shù);3鍵:主顯示界面下進(jìn)入選擇功能界面、時(shí)間和鬧鈴修改狀態(tài)下切換修改項(xiàng)目、修改完成退回主顯示界面;4鍵:時(shí)間和鬧鈴修改狀態(tài)下直接退回主顯示界面;5鍵:主顯示界面下控制鬧鈴的開關(guān)。&
6、lt;/p><p> 2、開發(fā)測試環(huán)境選擇</p><p> 開發(fā)軟件選擇了ARM公司的KeiluVision4,仿真軟件選擇了英國Labcenter electronics公司的proteus7 professional,測試硬件選擇了普中的HC6800開發(fā)箱。首先在KeiluVision4下進(jìn)行程序設(shè)計(jì),編譯通過后用proteus7 professional進(jìn)行仿真并嘗試下載到開發(fā)箱中
7、進(jìn)行操作,最后下載到開發(fā)箱中進(jìn)行操作演示。</p><p> 二、液晶時(shí)鐘程序設(shè)計(jì)</p><p><b> 1、功能狀態(tài)轉(zhuǎn)換圖</b></p><p><b> 2、主要功能模塊</b></p><p> 注:本文中提到的函數(shù)均見附表1的液晶時(shí)鐘源程序中,本次使用的是1602液晶。<
8、/p><p><b> 2.1主顯示模塊</b></p><p> 主顯示模塊包含了時(shí)間顯示模塊void TimeDisplay(void)函數(shù),其運(yùn)行過程為首先讀取初始值,再通過定時(shí)器中斷TO的中斷服務(wù)函數(shù)void T0_int () interrupt 1 來進(jìn)行秒計(jì)時(shí)并通過void TimeRunning(void)函數(shù)進(jìn)行時(shí)間的加計(jì)數(shù)和進(jìn)位運(yùn)算;鬧鈴顯示模塊v
9、oid AlarmDisplay(void),其運(yùn)行過程為首先讀取初始值,再通過void AlarmRunning(void)來進(jìn)行比較,如果預(yù)設(shè)時(shí)間與當(dāng)前時(shí)間相等就將響鈴標(biāo)記變量SoundFlage_1置為1,進(jìn)而引發(fā)主函數(shù)中的響鈴事件。在鬧鈴顯示模塊還包含了鬧鈴開關(guān)控制模塊,用于控制鬧鈴是否開啟,若鬧鈴開啟會(huì),鬧鈴時(shí)間后就會(huì)顯示“P”字母。主顯示界面仿真結(jié)果如</p><p><b> 圖2:&l
10、t;/b></p><p><b> 2.2功能選擇模塊</b></p><p> 功能選擇模塊包含了void Menu_display (void)函數(shù),其運(yùn)行過程為當(dāng)按鍵3時(shí)間觸發(fā),切換到功能選擇界面是顯示時(shí)間修改及鬧鈴修改的提示,并等待按鍵1(時(shí)間修改)事件或者按鍵2(鬧鈴修改)事件。功能選擇界面仿真結(jié)果如圖3:</p><p>
11、;<b> 2.3時(shí)間修改模塊</b></p><p> 時(shí)間修改模塊主要通過調(diào)用時(shí)間顯示函數(shù)和按鍵響應(yīng)函數(shù):按鍵讀值uchar GetKey(void)和響應(yīng)void QueryKeyboard(void),并通過時(shí)間設(shè)置標(biāo)記變量SetTimeFlage的值來判斷是否執(zhí)行時(shí)間修改。時(shí)間修改模式下計(jì)時(shí)會(huì)暫停,按鍵1、按鍵2、按鍵3以及按鍵4會(huì)響應(yīng),實(shí)現(xiàn)時(shí)間的加減、項(xiàng)目切換及退回主界面的操
12、作。進(jìn)行時(shí)間加減時(shí),計(jì)數(shù)會(huì)循環(huán)變化,如:當(dāng)時(shí)間為23:59:59時(shí),時(shí)加會(huì)變?yōu)?0,分加會(huì)變?yōu)?0并且時(shí)會(huì)加1,秒同理;當(dāng)時(shí)間為00:00:00時(shí),時(shí)減會(huì)變?yōu)?3,分減會(huì)變?yōu)?9并且時(shí)會(huì)減1,秒同理。同時(shí),當(dāng)進(jìn)入時(shí)間修改界面后三盞指示LED燈就會(huì)分別點(diǎn)亮,第一盞點(diǎn)亮表示時(shí)修改,第二盞點(diǎn)亮表示分修改,第三盞點(diǎn)亮表示秒修改(初始為時(shí)修改,可按按鍵3進(jìn)行切換)。時(shí)間修改界面仿真結(jié)果如圖4:</p><p><b&
13、gt; 2.4鬧鈴修改模塊</b></p><p> 鬧鈴修改模塊與時(shí)間修改模塊結(jié)構(gòu)類似,通過調(diào)用鬧鈴顯示函數(shù)和按鍵響應(yīng)函數(shù),并通過鬧鈴設(shè)置標(biāo)記變量SetAlarmFlage的值來判斷是否執(zhí)行鬧鈴修改。鬧鈴修改模式下,計(jì)時(shí)不會(huì)暫停但鬧鈴不會(huì)響應(yīng),按鍵1、按鍵2、按鍵3以及按鍵4會(huì)響應(yīng),實(shí)現(xiàn)時(shí)間的加減、項(xiàng)目切換及退回主界面的操作。進(jìn)行時(shí)間加減時(shí),計(jì)數(shù)會(huì)循環(huán)變化,如:當(dāng)鬧鈴時(shí)間為23:59:59時(shí),時(shí)
14、加會(huì)變?yōu)?0,分加會(huì)變?yōu)?0并且時(shí)會(huì)加1,秒同理;當(dāng)時(shí)間為00:00:00時(shí),時(shí)減會(huì)變?yōu)?3,分減會(huì)變?yōu)?9并且時(shí)會(huì)減1,秒同理。同時(shí),當(dāng)進(jìn)入鬧鈴修改界面后三盞指示LED燈就會(huì)分別點(diǎn)亮,第一盞點(diǎn)亮表示時(shí)修改,第二盞點(diǎn)亮表示分修改,第三盞點(diǎn)亮表示秒修改(初始為時(shí)修改,可按按鍵3進(jìn)行切換)。鬧鈴修改界面仿真結(jié)果如圖5(見下一頁):</p><p> 2.5.液晶使用模塊</p><p>
15、本模塊包含了,void init_lcd1602 (void) 1602液晶初始化函數(shù),void lcd_w_dat ( uchar dat )對(duì)1602液晶寫數(shù)據(jù)函數(shù)void lcd_w_cmd ( uchar com )對(duì)1602液晶寫指令函數(shù),void delay_us ( uchar t )延時(shí)函數(shù),均為1602型液晶必須函數(shù)。</p><p> 2.6其他輔助模塊函數(shù)以及變量</p>&
16、lt;p> 除了以上介紹的模塊以外,本程序還編寫了其他的輔助模塊函數(shù)以及變量。如前面提到的GetKey(void)讀按鍵值函數(shù),void QueryKeyboard(void)查詢按鍵函數(shù),還有SetTimeFlage設(shè)置時(shí)間標(biāo)志,DisplayFlage=0顯示標(biāo)志,用于防止在發(fā)生中斷時(shí),切斷當(dāng)前的顯示,防止造成顯示亂碼,SetAlarmFlage設(shè)置鬧鐘標(biāo)志,SetFlage設(shè)置標(biāo)志位,用于在設(shè)置選擇時(shí),防止在液晶第二行顯
17、示鬧鐘的時(shí)間,SoundFlage_1用于控制的鬧鐘的開和關(guān)的標(biāo)志位,SoundFlage_2用于計(jì)算響鈴的秒數(shù),Alarm_ON鬧鈴開關(guān)point_dis、ring用于標(biāo)志0.5S,mes用于定時(shí)器計(jì)時(shí)標(biāo)志。</p><p><b> 三、小結(jié)</b></p><p> 本次設(shè)計(jì)是采用液晶顯示,若僅是在液晶上顯示時(shí)鐘且無其他功能,程序的編寫非常簡單,但若加上可調(diào)
18、鬧鈴、可調(diào)時(shí)間,那么程序設(shè)計(jì)上就要花費(fèi)點(diǎn)功夫。編程調(diào)試時(shí)主要遇到如下問題:1、鬧鈴的響應(yīng),如果將整個(gè)模塊放到WHILE中,可能會(huì)造成響鈴時(shí)其他操作無法響應(yīng);2、時(shí)間和鬧鈴調(diào)節(jié)時(shí)液晶的響應(yīng)與按鍵的關(guān)系,如果將整個(gè)調(diào)節(jié)進(jìn)程放到顯示函數(shù)中,由于液晶的特性就導(dǎo)致了按鍵按下卻無響應(yīng)的情況;3、設(shè)置時(shí)的顯示提示,由于時(shí)間的調(diào)節(jié)需要調(diào)節(jié)時(shí)分秒三個(gè)項(xiàng)目,且切換到某個(gè)項(xiàng)目卻無提示是沒有意義的,但是實(shí)現(xiàn)時(shí)分秒的閃爍比較麻煩。</p><
19、p> 解決方法:1、2:通過編寫自定義函數(shù),并設(shè)置對(duì)應(yīng)的標(biāo)記變量,用標(biāo)記變量來控制對(duì)應(yīng)函數(shù)的運(yùn)行,進(jìn)而解決了響應(yīng)問題;3、通過外接3個(gè)LED燈,在設(shè)置時(shí)分秒時(shí)點(diǎn)亮對(duì)應(yīng)的燈進(jìn)行提示。</p><p><b> 四、附錄</b></p><p><b> 1、使用說明</b></p><p> 本程序下載到HC6
20、800單片機(jī)開發(fā)箱的使用方法如下:</p><p> 連接:用短路帽將MCU的P1.5腳與蜂鳴器連接,用連接線(排線或者杜邦線)分別將P3^0、P3^1、P3^2、P3^3連接到獨(dú)立按鍵的K1、K2、K3、K4、K5;分別將P1^0、P1^1、P1^2連接到8*1的LED等的D1、D2、D3,再在相應(yīng)的位置插上1602型液晶屏。</p><p><b> 操作方法:</
21、b></p><p> 主界面下:按鍵3(設(shè)置)、按鍵5(鬧鈴開關(guān))有效,按下按鍵3可進(jìn)入功能選擇界面,按鍵5可實(shí)現(xiàn)鬧鐘的開和關(guān)。</p><p> 功能選擇界面下:按鍵1、按鍵2有效,按下按鍵1可進(jìn)入時(shí)間修改界面,按下按鍵2可進(jìn)入鬧鈴修改界面。</p><p> 時(shí)間修改界面:按鍵1、按鍵2、按鍵3、按鍵4、LED1(對(duì)應(yīng)時(shí))、LED2(對(duì)應(yīng)分)、LE
22、D3(對(duì)應(yīng)秒)有效。按鍵1能進(jìn)行加1計(jì)數(shù),按鍵2能進(jìn)行減1計(jì)數(shù),按鍵3能進(jìn)行LED1~3的順序切換(LED3時(shí)再按一次則會(huì)回到主界面),按鍵4可直接退回主界面。</p><p> 鬧鈴修改界面:與時(shí)間修改界面相同。</p><p><b> 2、參考文獻(xiàn)資料</b></p><p> a.單片機(jī)應(yīng)用技術(shù):C語言版/王靜霞主編.——北京:電
23、子工業(yè)出版社,2009.5</p><p><b> b.百度文庫。</b></p><p><b> 3、附表1</b></p><p><b> 液晶時(shí)鐘源程序</b></p><p> #include <reg51.h> </
24、p><p> #define uchar unsigned char</p><p> #define RingingTime30 //定義鬧鐘響鈴時(shí)間</p><p> char Hour=23,Minute=59,Second=45; //定義時(shí)間的初始值</p><p> char AHour=23,AMinu
25、te=59,ASecond=50; //定義鬧鐘的初始值</p><p> sbit rs = P2^6; //設(shè)定液晶的相關(guān)管腳</p><p> sbit rw= P2^5; </p><p> sbit e = P2^7; </p><p> sbit one_add = P3^
26、0; //設(shè)定控制按鍵的IO口</p><p> sbit two_lower= P3^1; </p><p> sbit set_sel = P3^2;</p><p> sbit quit = P3^3;</p><p> sbit alarm_on = P3^4; <
27、/p><p> sbit Sound = P1^5; //設(shè)定的蜂鳴器的IO口</p><p> sbit LED1 = P1^0; //設(shè)定三盞LED的IO口,用于顯示當(dāng)前處于設(shè)置的時(shí)分秒</p><p> sbit LED2 = P1^1;</p><p> sbit LED3 = P1^2;</p
28、><p> uchar SetTimeFlage=0, //定義設(shè)置時(shí)間標(biāo)志位</p><p> DisplayFlage=0, //定義顯示標(biāo)志位,用于防止在發(fā)生中斷時(shí),切斷當(dāng)前的顯示,防止造成顯示亂碼</p><p> SetAlarmFlage=0, //定義設(shè)置鬧鐘標(biāo)志位</p><p> SetFl
29、age=0, //定義設(shè)置標(biāo)志位,用于在設(shè)置選擇時(shí),防止在液晶第二行顯示鬧鐘的時(shí)間</p><p> SoundFlage_1=0, //用于控制的鬧鐘的開和關(guān)的標(biāo)志位</p><p> SoundFlage_2=0, //用于計(jì)算響鈴的秒數(shù)</p><p> Alarm_ON=1; //鬧鈴開關(guān)</p&
30、gt;<p> point_dis=0,ring=0, //用于標(biāo)志0.5S</p><p><b> mes=0;</b></p><p> uchar table[]="0123456789: "; //定義用于液晶顯示的字符串?dāng)?shù)組</p><p> uchar Display2[]=
31、"1:Time 2:Alarm "; //定義顯示選擇菜單的內(nèi)容</p><p> uchar Display3[]="Time :"; //定義顯示時(shí)間T和鬧鐘A的內(nèi)容</p><p> uchar Display4[]="Alarm:";</p><p> void init_lcd1
32、602 (void); //聲明1602液晶初始化函數(shù)</p><p> void lcd_w_dat ( uchar dat ); //聲明對(duì)1602液晶寫數(shù)據(jù)函數(shù)</p><p> void lcd_w_cmd ( uchar com ); //聲明對(duì)1602液晶寫指令函數(shù)</p><p> void delay_u
33、s ( uchar t ); //聲明延時(shí)函數(shù)</p><p> uchar GetKey(void); //聲明讀按鍵值函數(shù)</p><p> void QueryKeyboard(void); //聲明查詢按鍵函數(shù)</p><p> void SetTime(void); //聲明設(shè)置時(shí)間函數(shù)</p>
34、<p> void SetAlarm(void); //聲明設(shè)置鬧鐘函數(shù)</p><p> void Menu_display(void); //聲明主菜單顯示函數(shù)</p><p> void Display(void); //聲明顯示函數(shù)</p><p> void TimeDisplay(void); /
35、/聲明時(shí)間顯示</p><p> void AlarmDisplay(void); //聲明鬧鐘顯示函數(shù)</p><p> void TimeRunning(void); //聲明時(shí)鐘運(yùn)行函數(shù)</p><p> void AlarmRunning(void); //聲明鬧鐘運(yùn)行函數(shù)</p><p> /*↓↓
36、↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓定時(shí)中斷服務(wù)函數(shù)↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/</p><p> void T0_int () interrupt1 //定時(shí)器0的中斷入口函數(shù)</p><p><b> {</b></p><p> TH0=15
37、536/256; //讀定時(shí)器0進(jìn)行重新裝載初始值</p><p> TL0=15536%256;</p><p> mes++; //計(jì)算定時(shí)器進(jìn)入中斷的次數(shù),也用于計(jì)算秒</p><p> if(mes<5) ring=1;</p><p> else if (mes<10)
38、 </p><p><b> {</b></p><p> point_dis=1;</p><p><b> ring=0;</b></p><p><b> }</b></p><p> else if (mes<15)
39、ring=1;</p><p><b> else</b></p><p><b> {</b></p><p> point_dis=0;</p><p><b> ring=0;</b></p><p><b> }</b&
40、gt;</p><p> if (mes==20) //當(dāng)計(jì)夠20次就等于1S</p><p><b> {</b></p><p><b> mes = 0;</b></p><p><b> Second++;</b></p><p
41、> if (SoundFlage_1==1) //若鬧鐘鈴被打開</p><p><b> {</b></p><p> SoundFlage_2++; //就對(duì)鬧鈴的時(shí)間進(jìn)行定時(shí)計(jì)數(shù)</p><p> if (SoundFlage_2==RingingTime) //若計(jì)夠設(shè)置的響鈴時(shí)間</p>
42、<p><b> {</b></p><p> SoundFlage_1=0; //關(guān)響鈴</p><p> SoundFlage_2=0; //清計(jì)數(shù)</p><p> Sound=1; //關(guān)蜂鳴器</p><p><b> }</b></p
43、><p><b> } </b></p><p><b> }</b></p><p> if (DisplayFlage==0) //判斷有無其它函數(shù)在對(duì)液晶進(jìn)行寫操作</p><p><b> {</b></p><p> Dis
44、play(); </p><p><b> }</b></p><p> TimeRunning(); //對(duì)時(shí)鐘時(shí)間進(jìn)行運(yùn)算</p><p><b> }</b></p><p> /*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓主函數(shù)
45、↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/</p><p> void main ( void ) //主函數(shù)</p><p><b> {</b></p><p><b> rw = 0;</b></p><p> init_lcd1602(
46、); //初始化1602液晶</p><p> TMOD=0x01; //開通定時(shí)計(jì)數(shù)器0</p><p> TH0=15536/256; //對(duì)定時(shí)計(jì)數(shù)器進(jìn)行賦初始值</p><p> TL0=15536%256;</p><p> EA=1; //打開總中斷<
47、/p><p><b> ET0=1;</b></p><p><b> TR0=1;</b></p><p><b> while (1)</b></p><p><b> {</b></p><p> QueryKeyboa
48、rd(); //查詢鍵盤,從中可以得出有沒有按鍵按下,按下的是不是設(shè)置按鍵3</p><p> if(SetTimeFlage==1) //設(shè)置時(shí)間標(biāo)志位被置1,就說明當(dāng)前處于設(shè)置時(shí)間狀態(tài)</p><p><b> {</b></p><p> SetTime(); //調(diào)用設(shè)置時(shí)間函數(shù)</p>&
49、lt;p><b> }</b></p><p> if(SetAlarmFlage==1) //設(shè)置鬧鐘標(biāo)志位被置1,就說明當(dāng)前處于設(shè)置鬧鐘狀態(tài)</p><p><b> {</b></p><p> SetAlarm(); //調(diào)用設(shè)置鬧鐘函數(shù)</p><p><
50、;b> }</b></p><p> AlarmRunning(); //鬧鐘運(yùn)行</p><p> if (SoundFlage_1==1 && Alarm_ON==1) //若時(shí)間到了,這標(biāo)志位就會(huì)被置1</p><p><b> {</b></p><p>
51、 if (ring==0) //判斷當(dāng)前是不是處于0.5S,用于半秒響一次鈴、滅一次鈴</p><p><b> {</b></p><p> Sound=1; </p><p><b> }</b></p><p><b> else</b>
52、</p><p><b> {</b></p><p><b> Sound=0;</b></p><p><b> }</b></p><p><b> } </b></p><p><b>
53、 }</b></p><p><b> }</b></p><p> /*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓時(shí)間、鬧鈴設(shè)置函數(shù)↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/</p><p> void SetTime(void) //時(shí)間設(shè)置
54、</p><p><b> {</b></p><p> uchar KeyValue=0,i=0;</p><p> uchar tset_dis[]=" Time setting";</p><p> while (SetTimeFlage == 1) //直到時(shí)間設(shè)置完成才推出
55、此循環(huán)</p><p><b> {</b></p><p> lcd_w_cmd(0x01);//液晶清屏命令</p><p> TimeDisplay();//顯示當(dāng)前時(shí)間</p><p> lcd_w_cmd(0xc0);</p><p> while(tset_
56、dis[i]!='\0')</p><p><b> {</b></p><p> lcd_w_dat(tset_dis[i]);</p><p><b> i++;</b></p><p><b> }</b></p><p>
57、 EA=0; //因?yàn)橐呀?jīng)進(jìn)入設(shè)置時(shí)間狀態(tài),所以關(guān)總中斷和管定時(shí)器中斷</p><p><b> ET0=0;</b></p><p><b> TR0=0;</b></p><p> point_dis=0; //將這值置0,用于時(shí)間顯示時(shí)顯示 :: </p>
58、<p> KeyValue = GetKey();</p><p> while(KeyValue!=3) //等待按下確認(rèn)按鍵</p><p><b> {</b></p><p> LED1 = 0; //點(diǎn)亮LED1,用于顯示當(dāng)前是在設(shè)置時(shí)鐘的時(shí)</p><p> Ke
59、yValue = GetKey(); //</p><p> if (KeyValue==1) //若按下按鍵1,就對(duì)時(shí)進(jìn)行加1</p><p><b> { </b></p><p> if (Hour<23) </p><p><b> Hour++;</b
60、></p><p> else Hour=0;</p><p><b> }</b></p><p> if (KeyValue==2) //若按下按鍵2,就對(duì)時(shí)進(jìn)行減1</p><p><b> {</b></p><p> if(Hour>1
61、)</p><p><b> Hour--;</b></p><p> else Hour=23;</p><p><b> }</b></p><p> TimeDisplay(); //顯示當(dāng)前時(shí)鐘的值,用于在液晶顯示刷新</p><p> if(Ke
62、yValue==4)</p><p><b> {</b></p><p> SetTimeFlage=0;</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</
63、b></p><p> LED1=1; //關(guān)閉設(shè)置時(shí)的LED,進(jìn)行下一步的設(shè)置分</p><p> KeyValue = GetKey();</p><p> while(KeyValue!=3) //若沒有按下確認(rèn)按鍵,直到按下確認(rèn)按鍵為止</p><p><b> {</b>
64、</p><p> if(SetTimeFlage==1)</p><p> LED2=0; //點(diǎn)亮LED2,用于顯示當(dāng)前是在設(shè)置時(shí)鐘的分</p><p> KeyValue = GetKey();</p><p> if (KeyValue==1) //若按下按鍵1,就對(duì)分進(jìn)行加1</p>&l
65、t;p><b> {</b></p><p> if(Minute<59)</p><p><b> Minute++;</b></p><p><b> else </b></p><p><b> {</b></p>
66、<p><b> Minute=0;</b></p><p> if(Hour==23)</p><p><b> Hour=0;</b></p><p> else Hour++;</p><p><b> }</b></p><p&
67、gt;<b> }</b></p><p> if (KeyValue==2) //若按下按鍵2,就對(duì)分進(jìn)行減1</p><p><b> {</b></p><p> if(Minute>1)</p><p><b> Minute--;</b><
68、;/p><p><b> else</b></p><p><b> {</b></p><p> Minute=59;</p><p> if(Hour==0)</p><p><b> Hour=23;</b></p><p
69、> else Hour--;</p><p><b> }</b></p><p><b> }</b></p><p> TimeDisplay(); //顯示當(dāng)前時(shí)鐘的值,用于在液晶顯示刷新</p><p> if(KeyValue==4 || SetTimeFlage
70、==0)</p><p><b> {</b></p><p> SetTimeFlage=0;</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b>&
71、lt;/p><p> LED2=1; //關(guān)閉設(shè)置時(shí)的LED,進(jìn)行下一步的設(shè)置秒</p><p> KeyValue = GetKey();</p><p> while(KeyValue!=3) //若沒有按下確認(rèn)按鍵,直到按下確認(rèn)按鍵為止</p><p><b> {</b></p
72、><p> if(SetTimeFlage==1)</p><p> LED3=0; //點(diǎn)亮LED3,用于顯示當(dāng)前是在設(shè)置時(shí)鐘的秒</p><p> KeyValue = GetKey();</p><p> if (KeyValue==1) //若按下按鍵1,就對(duì)秒進(jìn)行加1</p><p>
73、;<b> {</b></p><p> if(Second<59)</p><p><b> Second++;</b></p><p><b> else </b></p><p><b> {</b></p><p
74、><b> Second=0;</b></p><p> if(Minute==59)</p><p><b> {</b></p><p><b> Minute=0;</b></p><p> if(Hour==23)</p><p>
75、;<b> Hour=0;</b></p><p> else Hour++;</p><p><b> }</b></p><p> else Minute++;</p><p><b> }</b></p><p><b> }
76、</b></p><p> if (KeyValue==2) //若按下按鍵2,就對(duì)秒進(jìn)行減1</p><p><b> {</b></p><p> if(Second>1)</p><p><b> Second--;</b></p><p&
77、gt;<b> else</b></p><p><b> {</b></p><p> Second=59;</p><p> if(Minute==0)</p><p><b> {</b></p><p> Minute=59;<
78、/p><p> if(Hour==0)</p><p><b> Hour=23;</b></p><p> else Hour--;</p><p><b> }</b></p><p> else Minute--;</p><p><
79、b> }</b></p><p><b> }</b></p><p> TimeDisplay(); //顯示當(dāng)前時(shí)鐘的值,用于在液晶顯示刷新</p><p> if(KeyValue==4 || SetTimeFlage==0)</p><p><b> break;&
80、lt;/b></p><p><b> }</b></p><p> LED3=1; //關(guān)閉LED,設(shè)置完成</p><p> EA=1; //打開相關(guān)中斷</p><p><b> ET0=1;</b></p><p><
81、;b> TR0=1;</b></p><p> SetTimeFlage=0; //將時(shí)間設(shè)置標(biāo)志位置0,完成一次時(shí)間的設(shè)置</p><p><b> }</b></p><p><b> }</b></p><p> void SetAlarm(void)
82、 //鬧鈴設(shè)置</p><p><b> {</b></p><p> uchar KeyValue=0,i=0;</p><p> uchar aset_dis[]="Alarm setting";</p><p> while (SetAlarmFlage == 1)</p
83、><p><b> {</b></p><p> lcd_w_cmd(0x01);</p><p> lcd_w_cmd(0x80);</p><p> while(aset_dis[i]!='\0')</p><p><b> {</b></p&
84、gt;<p> lcd_w_dat(aset_dis[i]);</p><p><b> i++;</b></p><p><b> }</b></p><p> KeyValue = GetKey();</p><p> AlarmDisplay();</p>
85、<p> while(KeyValue!=3) //等待按下確認(rèn)按鍵</p><p><b> {</b></p><p> LED1 = 0; //點(diǎn)亮LED1,用于顯示當(dāng)前是在設(shè)置時(shí)鐘的時(shí)</p><p> KeyValue = GetKey(); //</p><p>
86、; if (KeyValue==1) //若按下按鍵1,就對(duì)時(shí)進(jìn)行加1</p><p><b> { </b></p><p> if (AHour<23) </p><p><b> AHour++;</b></p><p> else AHour=0;&l
87、t;/p><p><b> }</b></p><p> if (KeyValue==2) //若按下按鍵2,就對(duì)時(shí)進(jìn)行減1</p><p><b> {</b></p><p> if(AHour>1)</p><p><b> AHour--
88、;</b></p><p> else AHour=23;</p><p><b> }</b></p><p> AlarmDisplay(); //顯示當(dāng)前時(shí)鐘的值,用于在液晶顯示刷新</p><p> if(KeyValue==4)</p><p><b&
89、gt; {</b></p><p> SetAlarmFlage=0;</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> LED1=1;
90、 //關(guān)閉設(shè)置時(shí)的LED,進(jìn)行下一步的設(shè)置分</p><p> KeyValue = GetKey();</p><p> while(KeyValue!=3) //若沒有按下確認(rèn)按鍵,直到按下確認(rèn)按鍵為止</p><p><b> {</b></p><p> if(SetAlarmFl
91、age==1)</p><p> LED2=0; //點(diǎn)亮LED2,用于顯示當(dāng)前是在設(shè)置時(shí)鐘的分</p><p> KeyValue = GetKey();</p><p> if (KeyValue==1) //若按下按鍵1,就對(duì)分進(jìn)行加1</p><p><b> {</b></p
92、><p> if(AMinute<59)</p><p> AMinute++;</p><p><b> else </b></p><p><b> {</b></p><p> AMinute=0;</p><p> if(AHou
93、r==23)</p><p><b> AHour=0;</b></p><p> else AHour++;</p><p><b> }</b></p><p><b> }</b></p><p> if (KeyValue==2)
94、 //若按下按鍵2,就對(duì)分進(jìn)行減1</p><p><b> {</b></p><p> if(AMinute>1)</p><p> AMinute--;</p><p><b> else</b></p><p><b> {</b&g
95、t;</p><p> AMinute=59;</p><p> if(AHour==0)</p><p><b> AHour=23;</b></p><p> else AHour--;</p><p><b> }</b></p><p&g
96、t;<b> }</b></p><p> AlarmDisplay(); //顯示當(dāng)前時(shí)鐘的值,用于在液晶顯示刷新</p><p> if(KeyValue==4 || SetAlarmFlage==0)</p><p><b> {</b></p><p> SetAlarm
97、Flage=0;</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> LED2=1; //關(guān)閉設(shè)置時(shí)的LED,進(jìn)行下一步的設(shè)置秒</p><p&
98、gt; KeyValue = GetKey();</p><p> while(KeyValue!=3) //若沒有按下確認(rèn)按鍵,直到按下確認(rèn)按鍵為止</p><p><b> {</b></p><p> if(SetAlarmFlage==1)</p><p> LED3=0; //
99、點(diǎn)亮LED3,用于顯示當(dāng)前是在設(shè)置時(shí)鐘的秒</p><p> KeyValue = GetKey();</p><p> if (KeyValue==1) //若按下按鍵1,就對(duì)秒進(jìn)行加1</p><p><b> {</b></p><p> if(ASecond<59)</p>&
100、lt;p> ASecond++;</p><p><b> else </b></p><p><b> {</b></p><p> ASecond=0;</p><p> if(AMinute==59)</p><p><b> {</b
101、></p><p> AMinute=0;</p><p> if(AHour==23)</p><p><b> AHour=0;</b></p><p> else AHour++;</p><p><b> }</b></p><p&
102、gt; else AMinute++;</p><p><b> }</b></p><p><b> }</b></p><p> if (KeyValue==2) //若按下按鍵2,就對(duì)秒進(jìn)行減1</p><p><b> {</b></p>
103、<p> if(ASecond>1)</p><p> ASecond--;</p><p><b> else</b></p><p><b> {</b></p><p> ASecond=59;</p><p> if(AMinute==0
104、)</p><p><b> {</b></p><p> AMinute=59;</p><p> if(AHour==0)</p><p><b> AHour=23;</b></p><p> else AHour--;</p><p>
105、;<b> }</b></p><p> else AMinute--;</p><p><b> }</b></p><p><b> }</b></p><p> AlarmDisplay(); //顯示當(dāng)前時(shí)鐘的值,用于在液晶顯示刷新</p>
106、;<p> if(KeyValue==4 || SetAlarmFlage==0)</p><p><b> break;</b></p><p><b> }</b></p><p><b> LED3=1;</b></p><p> SetAla
107、rmFlage=0;</p><p><b> }</b></p><p><b> }</b></p><p> /*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓時(shí)間、鬧鈴、設(shè)置菜單顯示函數(shù)↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/</p>
108、;<p> void Menu_display (void) //主菜單顯示函數(shù)</p><p><b> {</b></p><p> uchar i=0,KeyValue=0;</p><p> uchar menu_dis[]="Setting Function";
109、</p><p> DisplayFlage=1; //將顯示標(biāo)志位置1,防止在發(fā)生中斷時(shí),切斷當(dāng)前的顯示,防止造成顯示亂碼</p><p> KeyValue = GetKey();</p><p><b> Sound=1;</b></p><p> lcd_w_cmd(0x01);</
110、p><p> lcd_w_cmd(0x80);</p><p> while(menu_dis[i]!='\0') //顯示 Setting Function</p><p><b> {</b></p><p> lcd_w_dat ( menu_dis[i] );</p>
111、<p><b> i++;</b></p><p><b> }</b></p><p><b> i=0;</b></p><p> lcd_w_cmd (0xc0); //在液晶上設(shè)置顯示的光標(biāo)位置,第二行第1個(gè)</p><p&g
112、t; while(Display2[i]!='\0') //循環(huán)輸出上面定義的主菜單顯示字符數(shù)組</p><p><b> {</b></p><p> lcd_w_dat ( Display2[i] );</p><p><b> i++;</b></p><p>
113、;<b> } </b></p><p> DisplayFlage=0; //清楚顯示標(biāo)志位</p><p><b> }</b></p><p> void Display(void) //主顯示函數(shù)</p><p><b> {</b&
114、gt;</p><p> if(SetAlarmFlage==0 && SetTimeFlage==0)</p><p> TimeDisplay(); //顯示時(shí)間</p><p> if(SetAlarmFlage==0 && SetTimeFlage==0) //判斷鬧鐘設(shè)置標(biāo)志位,用于防止在設(shè)置鬧
115、鐘時(shí),被定時(shí)中斷調(diào)用,防止出現(xiàn)亂碼</p><p><b> { </b></p><p> AlarmDisplay(); //鬧鐘時(shí)間顯示</p><p><b> }</b></p><p><b> }</b></p><p
116、> void TimeDisplay(void) //時(shí)間顯示</p><p><b> {</b></p><p> uchar i=0;</p><p> DisplayFlage=1; //將顯示標(biāo)志位置1,防止在發(fā)生中斷時(shí),切斷當(dāng)前的顯示,防止造成顯示亂碼</p><p>
117、 lcd_w_cmd (0x80); </p><p> if (SetFlage == 0)//若現(xiàn)在不是出于設(shè)置選擇狀態(tài)</p><p><b> {</b></p><p> while(Display3[i]!='\0')</p><p><b&
118、gt; {</b></p><p> lcd_w_dat(Display3[i]);</p><p><b> i++;</b></p><p><b> }</b></p><p> lcd_w_dat (table[Hour/10]);//顯示時(shí)間的時(shí)的十位</
119、p><p> lcd_w_dat (table[Hour%10]);//顯示時(shí)間的時(shí)的個(gè)位</p><p> if (point_dis==1)//判斷0.5S的標(biāo)志位,用于顯示 : ,或顯示空格字符,達(dá)到一種閃爍的效果</p><p><b> {</b></p><p> lcd_w_dat (t
120、able[11]);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> lcd_w_dat (table[10]);</p><p><b> }
121、</b></p><p> lcd_w_dat (table[Minute/10]);//顯示時(shí)間的分的十位</p><p> lcd_w_dat (table[Minute%10]);//顯示時(shí)間的分的個(gè)位</p><p> if (point_dis==1)//判斷0.5S的標(biāo)志位,用于顯示 : ,或顯示空格字符,達(dá)到一種閃爍
122、的效果</p><p><b> {</b></p><p> lcd_w_dat (table[11]);</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b&
123、gt;</p><p> lcd_w_dat (table[10]);</p><p><b> }</b></p><p> lcd_w_dat (table[Second/10]);//顯示時(shí)間的秒的十位</p><p> lcd_w_dat (table[Second%10]);//顯示時(shí)間的秒的個(gè)
124、位</p><p> DisplayFlage=0;//清除顯示標(biāo)志位</p><p><b> }</b></p><p><b> }</b></p><p> void AlarmDisplay(void) //鬧鐘顯示</p>
125、<p><b> {</b></p><p> uchar i=0;</p><p> DisplayFlage=1;//將顯示標(biāo)志位置1,防止在發(fā)生中斷時(shí),切斷當(dāng)前的顯示,防止造成顯示亂碼</p><p> if (SetFlage == 0)//若現(xiàn)在不是出于設(shè)置選擇狀態(tài)</p>
126、;<p><b> { </b></p><p> if(Alarm_ON==1)</p><p><b> {</b></p><p> lcd_w_cmd(0xcf);</p><p> lcd_w_dat('P');</p><p&g
127、t;<b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> lcd_w_cmd(0xcf);</p><p> lcd_w_dat(' ');</p><p>&
128、lt;b> }</b></p><p> lcd_w_cmd (0xc0); </p><p> while(Display4[i]!='\0')</p><p><b> {</b></p><p> lcd_w_dat(Display4[i]);
129、</p><p><b> i++;</b></p><p><b> }</b></p><p> lcd_w_dat (table[AHour/10]);//顯示鬧鐘的時(shí)的十位</p><p> lcd_w_dat (table[AHour%10]);//顯示鬧鐘的時(shí)的個(gè)位</
130、p><p> lcd_w_dat (table[10]);//顯示 :</p><p> lcd_w_dat (table[AMinute/10]);//顯示鬧鐘的分的十位</p><p> lcd_w_dat (table[AMinute%10]);//顯示鬧鐘的分的個(gè)位</p><p> lcd_w_dat (table[1
131、0]);//顯示 :</p><p> lcd_w_dat (table[ASecond/10]);//顯示鬧鐘的秒的十位</p><p> lcd_w_dat (table[ASecond%10]);//顯示鬧鐘的秒的個(gè)位</p><p><b> }</b></p><p> DisplayFlag
132、e=0;//清除顯示標(biāo)志位</p><p><b> }</b></p><p> /*↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓時(shí)間、鬧鈴計(jì)時(shí)運(yùn)算函數(shù)↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓*/</p><p> void TimeRunning(void
133、) //時(shí)鐘運(yùn)行</p><p><b> {</b></p><p> if (Second>59) //對(duì)時(shí)分秒進(jìn)行運(yùn)算</p><p><b> {</b></p><p><b> Second=0;</b></p>
134、<p><b> Minute++;</b></p><p> if (Minute>59)</p><p><b> {</b></p><p><b> Minute=0;</b></p><p><b> Hour++;</b&
135、gt;</p><p> if (Hour>23)</p><p><b> {</b></p><p> Hour=0; </p><p><b> }</b></p><p><b> } </b></p>
136、<p><b> }</b></p><p><b> }</b></p><p> void AlarmRunning(void) //鬧鐘運(yùn)行</p><p><b> {</b></p><p> if (Hour==AHour)
137、 //鬧鐘時(shí)分秒和時(shí)鐘時(shí)分秒進(jìn)行對(duì)比</p><p><b> {</b></p><p> if (Minute==AMinute)</p><p><b> {</b></p><p> if (Second==ASecond)</p><p><b>
138、; {</b></p><p> SoundFlage_1=1; //若時(shí)分秒都相等,就將響鈴打開</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- c51課程設(shè)計(jì)報(bào)告液晶時(shí)鐘
- c51課程設(shè)計(jì)
- c51課程設(shè)計(jì)電子琴
- c51課程設(shè)計(jì)報(bào)告基于at89c51單片機(jī)的水位控制系統(tǒng)設(shè)計(jì)
- c51單片機(jī)lcd電子時(shí)鐘課程設(shè)計(jì)
- c51課程設(shè)計(jì)--基于單片機(jī)的電子鐘的設(shè)計(jì)
- c51單片機(jī)課程設(shè)計(jì)
- 基于c51單片機(jī)的數(shù)字時(shí)鐘課程設(shè)計(jì)(c語言,帶鬧鐘)
- c51單片機(jī)課程設(shè)計(jì)
- 可調(diào)時(shí)鐘c51程序
- 基于c51的轉(zhuǎn)速測量課程設(shè)計(jì)論文
- protel課程設(shè)計(jì)--基于c51單片機(jī)的實(shí)用電子時(shí)鐘設(shè)計(jì)
- 基于c51的四路搶答器課程設(shè)計(jì)報(bào)告
- c51單片機(jī)課程設(shè)計(jì)定時(shí)鬧鐘
- c51單片機(jī)課程設(shè)計(jì)——電子琴
- c51單片機(jī)交通燈課程設(shè)計(jì)
- c51單片機(jī)課程設(shè)計(jì)——電子琴
- 基于c51單片機(jī)的usb接口課程設(shè)計(jì)
- 基于c51單片機(jī)的usb接口課程設(shè)計(jì)
- c語言課程設(shè)計(jì)實(shí)踐報(bào)告--時(shí)鐘
評(píng)論
0/150
提交評(píng)論