單片機電子時鐘設(shè)計報告_第1頁
單片機電子時鐘設(shè)計報告_第2頁
免費預(yù)覽已結(jié)束,剩余46頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、電子時鐘實驗報告全部代碼在文檔末尾: 51 單片機, LCD1602 液晶顯示屏平臺下編程實現(xiàn),可直接編譯運行目錄:一, 實驗?zāi)康?. 2二,實驗要求 . 2三,實驗基本原理 . 3四,實驗設(shè)計分析 . 3五,實驗要求實現(xiàn) . 4A. 電路設(shè)計. 41. 整體設(shè)計 . 52. 分塊設(shè)計 . 5輸入部分 . 5輸出部分 . 5晶振與復(fù)位電路 . 6B. 程序設(shè)計 . 6程序總體設(shè)計 . 6程序主要模塊 . 6五. 實驗總結(jié)及感想 . 6一, 實驗?zāi)康?0 世紀(jì)末, 電子技術(shù)獲得了飛速的發(fā)展, 在其推動下, 現(xiàn)代電子產(chǎn)品幾乎滲透了社會的各個領(lǐng)域,有力地推動了社會生產(chǎn)力的發(fā)展和社會信息化程度的提高,

2、同 時也使現(xiàn)代電子產(chǎn)品性能進一步提高,產(chǎn)品更新?lián)Q代的節(jié)奏也越來越快?,F(xiàn)代生活的人們越來越重視起了時間觀念,可以說是時間和金錢劃上了等號。對于那些對時間把握非常嚴(yán)格和準(zhǔn)確的人或事來說, 時間的不準(zhǔn)確會帶來非常大的 麻煩,所以電子鐘是以其小巧,價格低廉,走時精度高,使用方便,功能多,便于 集成化而受廣大消費的喜愛,得到了廣泛的使用。1. 學(xué)習(xí) 8051 定時器時間計時處理、按鍵掃描及LCD 液晶顯示的設(shè)計方法。2. 設(shè)計任務(wù)及要求 利用實驗平臺上 LCD1602 液晶顯示屏,設(shè)計帶有鬧鈴功能的數(shù)字時鐘二,實驗要求A. 基本要求:1.在 LCD1602 液晶顯示屏上顯示當(dāng)前日期,時間。2. 利用按鍵

3、可對時間及鬧玲進行設(shè)置, 并可顯示設(shè)置鬧玲的時間。 鬧玲時間到蜂鳴器發(fā)出聲響,一分鐘后鬧鈴?fù)V埂. 擴展部分:1. 日歷功能(能對年,月,日,星期進行顯示,分辨平年,閏年以及各月天數(shù),并 調(diào)整)實現(xiàn)年月日時分秒的調(diào)整,星期準(zhǔn)確的隨著日期改變而改變進行顯示。2. 定時功能(設(shè)定一段時間長度,定時到后,鬧鈴提示)C.可擴展部分:1. 鬧鈴重響功能(鬧鈴被停止后,以停止時刻開始,一段時間后鬧鈴重響,且重響 時間的間隔可調(diào))2可進行備忘錄提示,按照年月日,可在設(shè)定的某年某月進行鬧鈴提示。三,實驗基本原理利用單片機定時器完成計時功能,定時器 0 計時中斷程序每隔中斷一次并當(dāng)作 一個計數(shù),設(shè)定定時 1

4、秒的中斷計數(shù)初值為 20,每中斷一次中斷計數(shù)初值加 1,當(dāng) 減到 20 時,貝 y 表示 1s 到了,秒變量加 1,同理再判斷是否 1min 鐘到了,再判斷是 否 1h 到了 , 是否一天到了,是否一個月到了,是否一年到了。將時間在 LCD 液晶屏上顯示,降低了程序的編寫難度。LCD 的固定顯示特性是我們省去了數(shù)碼管的動態(tài)掃描顯示。四,實驗設(shè)計分析針對要實現(xiàn)的功能,采用 AT89S5 單片機進行設(shè)計,AT89S52 單片機是一款低功 耗,高性能 CMOS 位單片機,片內(nèi)含 4KB 在線可編程(ISP)的可反復(fù)擦寫 1000 次的 Flash 只讀程序存儲器,器件采用高密度、非易失性存儲技術(shù)制造

5、,兼容標(biāo)準(zhǔn)MCS-51 指令系統(tǒng)及 80C51 引腳結(jié)構(gòu)。這樣,既能做到經(jīng)濟合理又能實現(xiàn)預(yù)期的功能。在程序方面,采用分塊設(shè)計的方法,這樣既減小了編程難度、使程序易于理解, 又能便于添加各項功能。程序可分為鬧鐘的聲音程序、時間顯示程序、日期顯示程 序,秒表顯示程序,時間調(diào)整程序、鬧鐘調(diào)整程序、定時調(diào)整程序,延時程序等。 運用這種方法,關(guān)鍵在于各模塊的兼容和配合,若各模塊不匹配會出現(xiàn)意想不到的 錯誤。首先,在編程之前必須了解硬件結(jié)構(gòu)尤其是各引腳的用法,以及內(nèi)部寄存器、 存儲單元的用法,否則,編程無從下手,電路也無法設(shè)計。這是前期準(zhǔn)備工作。第 二部分是硬件部分:依據(jù)想要的功能分塊設(shè)計設(shè)計,比如輸入需

6、要開關(guān)電路,輸出 需要顯示驅(qū)動電路和數(shù)碼管電路等。第三部分是軟件部分:先學(xué)習(xí)理解 C 吾言的編程方法再根據(jù)設(shè)計的硬件電路進行分塊的編程調(diào)試,最終完成程序設(shè)計。第四部分是 軟件畫圖部分:設(shè)計好電路后進行畫圖,包括電路圖和仿真圖的繪制。第五部分是 軟件仿真部分:軟硬件設(shè)計好后將軟件載入芯片中進行仿真, 仿真無法完成時檢查 軟件程序和硬件電路并進行修改直到仿真成功。第六部分是硬件實現(xiàn)部分:連接電 路并導(dǎo)入程序檢查電路,若與設(shè)計的完全一樣一般能實現(xiàn)想要的功能。最后進行功 能擴展,在已經(jīng)正確的設(shè)計基礎(chǔ)上,添加額外的功能!五,實驗要求實現(xiàn)A.電路設(shè)計1.整體設(shè)計此次設(shè)計主要是應(yīng)用單片機來設(shè)計電子時鐘,硬件

7、部分主要分以下電路模塊:顯示電路用 lcd1602 顯示,年份,月份,星期,小時、分鐘和秒(日),使電路更加簡單。單片機采用 AT89S5 係列,這種單片機應(yīng)用簡單,適合電子鐘設(shè)計。電路的總體設(shè)計框架如下:輸入信號主要是各種模式選擇和調(diào)整信號,由按鍵幵關(guān)提供。以下為輸入部分樣例:在本實驗中主要用用 P3 口輸入按鍵信號,還用到了特殊的P0 口。對于 P0 口,由于其存在高阻狀態(tài),為了實現(xiàn)幵關(guān)功能,給其添加上拉電阻,具體如下圖所示:輸出部分 本電路的輸出信號 LCD 勺寫入命令和寫入數(shù)據(jù),鬧鈴脈沖信號鬧鈴由端輸出,模塊如下: 日期時間由 LCD1602 俞出,模塊如下:晶振與復(fù)位電路本實驗單片機

8、時鐘用內(nèi)部時鐘,模塊如下: 復(fù)位電路為手動復(fù)位構(gòu)成,模塊如下: B.程序設(shè)計程序總體設(shè)計本實驗用匯編程序完成 . 程序總的流程圖如下:程序主要模塊中斷服務(wù)程序:/*一秒定時中斷函數(shù) */void timer0() interrupt 1 using 1ET0=0;驗總結(jié)及感想一分耕耘,一分收獲。只有親自用實踐來驗證這句話,在能得其要領(lǐng)。經(jīng)過這 次單片機課程設(shè)計,我從一個單片機實踐的門外漢,已經(jīng)越升為略知一二的新手。雖然還有很多有關(guān)單片機的應(yīng)用有待學(xué)習(xí),但萬變不離其宗,只要深入了解單片的 原理,全部知識點,各個細(xì)節(jié),一切設(shè)計皆有可能。在實驗的開始幾天,基本上沒有收獲,不知何從下手,不知所措。為了

9、看得更遠(yuǎn),不妨站在前人的肩膀上,我在整體思路模糊的情況下,在網(wǎng)上大量招資糧,各種與電子時鐘相關(guān)的文章,我閱讀了不少。隨著涉獵的點滴積累,我對電子時鐘的設(shè)計方案已經(jīng)慢慢醞釀而成。有了方向和不少知識儲備后,在接下來的幾天,幾乎 每天都有突破, 雖然有時只是一句程序的修改或誕生, 但那種收獲的感覺很暖人心。實驗中遇到了不少問題,接下來總結(jié)一下,共同探討。1, P0 口幵關(guān)問題。P0 口比較特殊,它存在高阻態(tài),要使其輸入不是高電平就 是低電平,就要接上拉電阻,給其高電平輸入。以上就是實驗中遇到的主要問題, 基本上都找到了相應(yīng)的解決之道。 整個實驗的過程就是一個解決問題的過程,每天都解決一些問題,我的實

10、驗也就解決了,當(dāng) 然結(jié)果不重要,功利化的追求結(jié)果,會使人浮躁,還是享受那份疑難迎刃而解的快 感吧!全部完整代碼:此代碼未經(jīng)本人優(yōu)化,可以根據(jù)自己的需求優(yōu)化代碼。盜版不究,可直接引用。/*/基于 STC89S52 單片機以及液晶 1602 顯示的萬年歷項目/*/#include#include #define uchar unsigned char #define uint unsigned int液晶 1602 相關(guān)參數(shù) */sbit timer=P1A5;/蜂鳴器sbit sound=P3A4;/進入鬧鈴設(shè)置狀態(tài)鍵uchar sflag=0,ssflag=0;/ 鬧鈴設(shè)置標(biāo)志位;鬧鈴工作標(biāo)#

11、define data_port P0sbit rs=P1A0;指令寄存器, rs=1 時選擇數(shù)據(jù)寄存器)sbit rw=P1A1;入, rw=1 時選擇讀出)sbit en=P1A2;斷, en=1 時通信接口接通)uchar code line1_str=-Welcome!-;/uchar code line2_str= made by: MCU ;/ 液晶屏指令、數(shù)據(jù)通信接口/ 液晶屏寄存器選擇接口 (rs=0 時選擇/ 液晶屏讀寫選擇接口 (rw=0 時選擇寫/ 液晶屏使能接口 (en=0 時通信接口中液晶屏第一行要顯示的字符串液晶屏第二行要顯示的字符串按鍵設(shè)置的相關(guān)參數(shù) */志位sb

12、it set_key=P3A7;/ 進入設(shè)置sbit up_key二卩3八6;/ 加號鍵sbit cancle_key=P3A5;/ 完成設(shè)置鍵uchar set=0;/ 是否進行了設(shè)置uchar flag=0;/設(shè)置選擇標(biāo)志uchar year=0 x00;/ 年 寄存器uchar month=0 x01;/月寄存器uchar day=0 x01;/日 寄存器uchar week=0 x06;/ 星期 寄存器uchar hour;/時寄存器uchar minite;/分寄存器uchar second;/秒寄存器uchar jiamiao=0;/ 加秒?yún)?shù)uchar fen1,fen2;/ (

13、數(shù)據(jù)交換)分定時寄存器uchar shi1,shi2;/ (數(shù)據(jù)交換)時定時寄存器uchar code num_tab=09;/ 液晶屏要顯示的數(shù)字表uchar dis_val7=0 x00,0 x01,0 x01,0 x06,0 x00,0 x00,0 x00;/日,星期,時,分,秒依次存儲 : 年, 月,子函數(shù)部分*/void lcd_int();void welcome();void in_command(uchar com);void in_data(uchar dat);void delay(uint ms);void key();uchar calculate_week();voi

14、d week_disp(uchar x);void lcd_disp_string(uchar str);void brush_lcd();void run();/ 初始化 1602 液晶/ 歡迎界面/ 向液晶屏輸入命令/ 向液晶屏輸入數(shù)據(jù)/ 延時函數(shù)/ 按鍵設(shè)置函數(shù)/ 星期計算函數(shù)/LCD1602 顯示星期值子函數(shù)聲明/ 液晶屏顯示一串字符子函數(shù)聲明/ 刷新液晶屏顯示內(nèi)容子函數(shù)聲明/ 萬年歷正常運行函數(shù)*void main()TMOD=0 x01;/OOOO OOO1 使用定時器 TO 的模式 1 (16 位模式)TH0=(65536-50000)/256; / 設(shè)定每次中斷間隔 50msT

15、LO=(65536-5OOOO)%256;jiamiao=1;EA=1;/打開總中斷允許ETO=1;/打幵定時器 TO 中斷允許位TRO=1;/啟動定時器 TOlcd_int();welcome();delay(1OOO);while(1)key();if(jiamiao=2O)second+;dis_val6=(second/10)4)|(second%10); / 刷新 秒 jiamiao=0;run();if(flag=0)if(dis_val0=0 x00 & dis_val1=0 x01dis_val2=0 x01)/2000 年 1 月 1 日為星期六dis_val3=0

16、x06;brush_lcd(); / 刷新液晶屏顯示內(nèi)容if(hour=shi2 & minite=fen2 &ssflag=1)timer=0;&void delay(uint ms)uchar i;while(ms-)for(i=0;i=1)days_number=(year-1)/4)+1); / 從 00 年到 year-1 年的閏年個數(shù)days_number=days_number+(year*365); / 從 00 年到 year-1 年的總天數(shù)elsedays_number=0;for(i=1;imonth;i+)計算星期值子函數(shù)*/switch(i)c

17、ase 1:case 3:case 5:case 7:case 8:case 10:case 12:days_number+=31;/ 大月 31 天break;case 4:case 6:case 9: case 11:days_number+=30;/ 小月 30 天case 2: if(year%4=0)/ 閏年 2 月 29 天days_number+=29;else / 平年 2 月 28 天break;days_number+=28;break;days_number+=day;/ 加上本月日期if(days_number+5)%7=0)/ 計算現(xiàn)在的星期值 , 并返回其值retu

18、rn(7);elsereturn(days_number+5)%7);/*LCD1602 顯示星期值子函數(shù) */ void week_disp(uchar x)switch(x)case 1:case 2:case 3:case 4:case 5:case 6:lcd_disp_string(MON);break;lcd_disp_string(TUE);break;lcd_disp_string(WED);break;lcd_disp_string(THU);break;lcd_disp_string(FRI);break;lcd_disp_string(SAT);break;/ 顯示星期一

19、 / 顯示星期二 / 顯示星期三 / 顯示星期四 / 顯示星期五 / 顯示星期六 case 7:lcd_disp_string(SUN);/ 顯示星期日 break;/ 檢測 設(shè)置 鍵是否按下/ 延時消抖/ 打開定時器 T0 中斷允許位/ 啟動定時器 T0按鍵設(shè)置函數(shù)*/elsevoid key()if(set_key=0)delay(5);if(set_key=0)ET0=0;TR0=0;if(flag6)flag+;IIIIIIflag=0;switch(flag)case 0:if(set=1)set=0;/ 檢測時間是否更改/ 時間更改標(biāo)志復(fù)位dis_val0=(year/10)4)|

20、(year%10);dis_val1=(month/10)4)|(month%10); /dis_val2=(day/10)4)|(day%10);dis_val3=week;/ 刷新刷新/ 刷新IIIIII年月日刷新 星期 dis_val4=(hour/10)4)|(hour%10);dis_val5=(minite/10)4)|(minite%10);dis_val6=(second/10)4)*10)+(dis_val0&0 x0f); / 預(yù) 設(shè)調(diào)節(jié)變量初始值為當(dāng)前時刻month=(dis_val14)*10)+(dis_val1&0 x0f);day=(dis_val

21、24)*10)+(dis_val2&0 x0f);hour=(dis_val44)*10)+(dis_val4&0 x0f);minite=(dis_val54)*10)+(dis_val5&0 x0f);second=(dis_val64)*10)+(dis_val6&0 x0f);break;case 2:in_command(0 x86); / 設(shè)定顯示 ( 光標(biāo) ) 位置 月 低位閃爍break;case 3:in_command(0 x89); / 設(shè)定顯示 ( 光標(biāo) ) 位置 日 低位閃爍break;case 4: in_command(0 xc5)

22、; / 設(shè)定顯示 ( 光標(biāo) ) 位置 - 時 低位閃爍break;case 5: in_command(0 xc8); / 設(shè)定顯示 ( 光標(biāo) ) 位置 - 分 低位閃爍break;case 6: in_command(0 xcb); / 設(shè)定顯示 ( 光標(biāo) ) 位置 - 秒 低位閃爍break;while(set_key=0);if(up_key=0 & flag!=0)按下/ 檢測 設(shè)置時間 啟動時 , 上升 鍵是否/ 延時消抖if(sflag=1)break;if(year28)delay(5);if(up_key=0)switch(flag)case 1:in_data(num

23、_tabday/10); /in_data(num_tabday%10);week=calculate_week();/ 計算星期值in_command(0 x8c);/ 設(shè)定顯示 ( 光標(biāo) ) 位置 星期 week_disp(week);/LCD1602 顯示星期值in_command(0 x82);/ 設(shè)定顯示 (光標(biāo)) 位置- 年高in_data(num_tabyear/10); / 顯示正在調(diào)節(jié)的 年in_data(num_tabyear%10);in_command(0 x83); / 設(shè)定顯示 ( 光標(biāo) ) 位置 - 年 低day=28;in_command(0 x88);/ 設(shè)定

24、顯示 ( 光標(biāo) ) 位置- 日 高位修正 日位閃爍break;case 2: if(sflag=1)break;if(month30)day=30;in_command(0 x88);/ 設(shè)定顯示 ( 光標(biāo) ) 位置 - 日 in_data(num_tabday/10); /修正 日高位in_data(num_tabday%10);if(month=2)if(year%4!=0) / 平年if(day28)day=28;in_command(0 x88); / 設(shè) 定 顯 示 ( 光 標(biāo) ) 位 置in_data(num_tabday/10); /修正 日in_data(num_tabday%

25、10);else / 閏年- 日 高位if(day29)day=29;in_command(0 x88); / 設(shè) 定 顯 示 ( 光 標(biāo) ) 位 置in_data(num_tabday/10); /修正 日in_data(num_tabday%10);week=calculate_week();/ 計算星期值in_command(0 x8c); / 設(shè)定顯示 (光標(biāo)) 位置- 星期week_disp(week); /LCD1602 顯示星期值in_command(0 x85); / 設(shè)定顯示 (光標(biāo)) 位置- 月高位in_data(num_tabmonth/10); / 顯示正在調(diào)節(jié)的 月i

26、n_data(num_tabmonth%10);- 日 高位in_command(0 x86); / 設(shè)定顯示 ( 光標(biāo) ) 位置 月 低位閃爍break;case 3: if(sflag=1)break;if(month=4 | month=6 | month=9 | month=11)if(day30)day+;elseday=1;else if(month=2)if(year%4!=0) / 平年if(day28) day+; elseday=1;elseif(day29)day+;elseday=1;elseif(day31)/ 閏年if(sflag=1)/ 完成鬧鐘狀態(tài)下的數(shù)值變換,

27、并保day+; elseday=1;week=calculate_week();/ 計算星期值in_command(0 x8c); / 設(shè)定顯示 (光標(biāo)) 位置-week_disp(week); /LCD1602 顯示星期值in_command(0 x88); / 設(shè)定顯示 (光標(biāo)) 位置-in_data(num_tabday/10); / 顯示正在調(diào)節(jié)的 in_data(num_tabday%10);in_command(0 x89); / 設(shè)定顯示 ( 光標(biāo) ) 位置 -break;case 4: if(hour23)閃爍星期日 高位日- 日 低位shi1=hour;hour+;shi2=hour;elsehour+;elsehour=0;in_command(0 xc4); / 設(shè)定顯示 (光標(biāo)) 位置- 時高位in_data(num_tabhour/10); / 顯示正在調(diào)節(jié)的 時in_data(num_tabhour%10)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論