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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

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

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

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

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

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

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

12、it set_key=P3A7;/ 進(jìn)入設(shè)置sbit up_key二卩3八6;/ 加號(hào)鍵sbit cancle_key=P3A5;/ 完成設(shè)置鍵uchar set=0;/ 是否進(jìn)行了設(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;/時(shí)寄存器uchar minite;/分寄存器uchar second;/秒寄存器uchar jiamiao=0;/ 加秒?yún)?shù)uchar fen1,fen2;/ (

13、數(shù)據(jù)交換)分定時(shí)寄存器uchar shi1,shi2;/ (數(shù)據(jù)交換)時(shí)定時(shí)寄存器uchar code num_tab=09;/ 液晶屏要顯示的數(shù)字表uchar dis_val7=0 x00,0 x01,0 x01,0 x06,0 x00,0 x00,0 x00;/日,星期,時(shí),分,秒依次存儲(chǔ) : 年, 月,子函數(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ù)/ 星期計(jì)算函數(shù)/LCD1602 顯示星期值子函數(shù)聲明/ 液晶屏顯示一串字符子函數(shù)聲明/ 刷新液晶屏顯示內(nèi)容子函數(shù)聲明/ 萬年歷正常運(yùn)行函數(shù)*void main()TMOD=0 x01;/OOOO OOO1 使用定時(shí)器 TO 的模式 1 (16 位模式)TH0=(65536-50000)/256; / 設(shè)定每次中斷間隔 50msT

15、LO=(65536-5OOOO)%256;jiamiao=1;EA=1;/打開總中斷允許ETO=1;/打幵定時(shí)器 TO 中斷允許位TRO=1;/啟動(dòng)定時(shí)器 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 年的閏年個(gè)數(shù)days_number=days_number+(year*365); / 從 00 年到 year-1 年的總天數(shù)elsedays_number=0;for(i=1;imonth;i+)計(jì)算星期值子函數(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)/ 計(jì)算現(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;/ 檢測(cè) 設(shè)置 鍵是否按下/ 延時(shí)消抖/ 打開定時(shí)器 T0 中斷允許位/ 啟動(dòng)定時(shí)器 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;/ 檢測(cè)時(shí)間是否更改/ 時(shí)間更改標(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)前時(shí)刻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) ) 位置 - 時(shí) 低位閃爍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)按下/ 檢測(cè) 設(shè)置時(shí)間 啟動(dòng)時(shí) , 上升 鍵是否/ 延時(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();/ 計(jì)算星期值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();/ 計(jì)算星期值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();/ 計(jì)算星期值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)) 位置- 時(shí)高位in_data(num_tabhour/10); / 顯示正在調(diào)節(jié)的 時(shí)in_data(num_tabhour%10)

溫馨提示

  • 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. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論