智能電子鐘(LCD)應(yīng)用電子專業(yè)綜合課程設(shè)計(jì)_第1頁(yè)
智能電子鐘(LCD)應(yīng)用電子專業(yè)綜合課程設(shè)計(jì)_第2頁(yè)
智能電子鐘(LCD)應(yīng)用電子專業(yè)綜合課程設(shè)計(jì)_第3頁(yè)
智能電子鐘(LCD)應(yīng)用電子專業(yè)綜合課程設(shè)計(jì)_第4頁(yè)
智能電子鐘(LCD)應(yīng)用電子專業(yè)綜合課程設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩69頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、湖北文理學(xué)院物理與電子工程學(xué)院11應(yīng)用電子專業(yè)綜合課程設(shè)計(jì)-智能電子鐘專業(yè)綜合課程設(shè)計(jì)報(bào)告題目:智能電子鐘(lcd)題目智能電子鐘(lcd)一、 設(shè)計(jì)要求:制作一個(gè)lcd顯示的智能電子鐘:(1) 計(jì)時(shí):秒、分、時(shí)、日、月、年、星期。(2) 閏年自動(dòng)判別。(3) 時(shí)間、年、月、日、星期交替顯示。(5) 自定任意時(shí)刻自動(dòng)開/關(guān)屏。(6) 計(jì)時(shí)精度:誤差1秒/月(具有微調(diào)設(shè)置)。二、 方案論證:本實(shí)驗(yàn)可采用并行時(shí)鐘芯片(ds12c887)和串行時(shí)鐘芯片(ds1302),ds1302要用戶自己安裝后備電池和串口通訊,要32.768khz的晶振,而ds12c887自帶后備電池,并口通訊,無(wú)需外圍元件,并

2、且ds12c887多了一個(gè)字節(jié)來(lái)記錄世紀(jì)使用的,處在ram的32h單元,但是其他的寄存器定義都相同。由于本實(shí)驗(yàn)用到了stc12c5a60s2直插40p封裝的單片機(jī)、nokia5110液晶屏、獨(dú)立式按鍵、四路2輸入與門并且都是直插的,而且在實(shí)驗(yàn)室做pcb只能是單層板,為了節(jié)約空間和簡(jiǎn)化電路于是就選用了串行時(shí)鐘芯片ds1302。三、 理論設(shè)計(jì):用cad軟件繪制的硬件原理圖電源和程序下載端口,此部分的usb可提供電源和下載端口適用于usb下載端口,down端口適用于四角插針式下載、bat為備用電源端口。cpu主控部分,此部分采用的是高速51系列的stc12c5a60s2的單片機(jī),該芯片不僅運(yùn)行速度快

3、穩(wěn)定驅(qū)動(dòng)能力更大,還為用戶提供了內(nèi)部集成8位/10位可調(diào)分辨率adc模塊(在此設(shè)計(jì)中有用到),1kb可擦寫eeprom本設(shè)計(jì)中用其設(shè)計(jì)成可調(diào)鬧鐘功能存放鬧鐘值。此圖為串行數(shù)據(jù)nokia5110的lcd顯示器模塊,采用可控背光和可控電源有很好的節(jié)能效果。該顯示器能顯示漢字,字符,圖片、并且處理顯示數(shù)據(jù)速度快。此模塊為串行數(shù)據(jù)實(shí)時(shí)時(shí)鐘模塊,此模塊采用的是達(dá)拉斯公司生產(chǎn)的ds1302具有閏年補(bǔ)償。此圖為按鍵中斷模塊,在此模塊中每個(gè)獨(dú)立式按鍵都能申請(qǐng)外部中斷及時(shí)處理按鍵按下的值來(lái)執(zhí)行用戶的操作。此圖為蜂鳴器模塊此模塊用于鬧鐘鈴聲設(shè)計(jì),和開機(jī)提示。此圖為pcb版圖此圖為pcb打印預(yù)覽軟件流程圖開始按鍵檢

4、測(cè),判斷按鍵是否按下yes其他鍵yes按下目錄鍵no時(shí)間處理初始化時(shí)鐘功能1(時(shí)間)內(nèi)部子程序,包括鍵值處理,加減上下,確認(rèn),背光控制,鬧鐘,時(shí)間日期的設(shè)置溫度處理讀數(shù)據(jù)功能2(溫度)電壓處理數(shù)據(jù)處理功能3(電壓)顯示鬧鐘處理功能4(鬧鐘)返回程序清單完整c程序源代碼/* 主程序:頂層程序 * * 顯示默認(rèn)功能:時(shí)間日期顯示; * 調(diào)用子程序; * */# include # include zimo.h /字模程序;# include nokia5110.h/5110驅(qū)動(dòng)程序;# include ds1302.h /ds1302驅(qū)動(dòng)程序;# include key.h /按鍵掃描程序;# i

5、nclude printf.h /顯示函數(shù);# include power.h /電源模塊;# include main.h /引腳定義;# include delay.h /延時(shí)函數(shù);# include macroandconst.h/數(shù)據(jù)類型宏定義;# include adc.h /adc電壓測(cè)量# include ds18b20.h /溫度模塊;void main()system_inint();/系統(tǒng)初始化;/set_rtc();while(1)checkclock();caidan(); /菜單顯示;if(menue=0)if(ok=1) lcd_clear(); /清屏幕while

6、(menue=0) /由此進(jìn)入時(shí)鐘功能ok=0;logo();read_rtc();/讀取時(shí)鐘;data_change();/時(shí)鐘數(shù)據(jù)處理tiaozheng_flag();date_time(); /顯示年月日時(shí)分秒;week();/星期處理;set_date_time();/設(shè)置改變時(shí)間和日期;powervcc();checkclock();lcd_clear(); /清屏幕else if(menue=1)/由此進(jìn)入溫度檢測(cè)功能if(ok=1) lcd_clear(); /清屏幕while(menue=1)temperatuercheck();ok=0;lcd_clear(); /清屏幕el

7、seif(menue=2) /由此進(jìn)入電壓測(cè)量功能if(ok=1) lcd_clear(); /清屏幕while(menue=2)power();/電量檢測(cè) ok=0;lcd_clear(); /清屏幕else if(menue=3)/由此進(jìn)入鬧鐘功能if(ok=1) lcd_clear(); /清屏幕while(menue=3)clock();ok=0;checkclock();lcd_clear(); /清屏幕else lcd_clear(); caidan();void extern0() interrupt 0 /*外部中斷0中斷函數(shù)定義;*/ key(); /* 子程序:底層程序 *

8、 * 功能:時(shí)間日期數(shù)據(jù)處理; * * */# include # include macroandconst.h# include stc12c5a60s2.h# include nokia5110.hsbit sck = p02;/ds1302時(shí)鐘;sbit sda = p01;/ds1302數(shù)據(jù);sbit rst = p00;/ ds1302復(fù)位;uchar l_tmpdate=0,0,0,1,1,1,13;/秒分時(shí)日月周年08-05-15 12:00:00uchar l_tmpdisplay13;code uchar write_rtc_address7=0x80,0x82,0x84,

9、0x86,0x88,0x8a,0x8c; /秒分時(shí)日月周年 最低位讀寫位code uchar read_rtc_address7=0x81,0x83,0x85,0x87,0x89,0x8b,0x8d; /*/* 寫一個(gè)字節(jié) */*/void write_ds1302_byte(unsigned char temp) unsigned char i; for (i=0;i=1; /右移一位 sck=1; /*/* 寫入ds1302 */*/void write_ds1302( unsigned char address,unsigned char dat ) rst=0;_nop_(); sck

10、=0;_nop_(); rst=1; _nop_(); /啟動(dòng) write_ds1302_byte(address);/發(fā)送地址 write_ds1302_byte(dat);/發(fā)送數(shù)據(jù) rst=0; /恢復(fù)/*/* 讀出ds1302數(shù)據(jù) */*/unsigned char read_ds1302 ( uchar address ) unsigned char i,temp=0x00; rst=0;_nop_();_nop_(); sck=0;_nop_();_nop_(); rst=1;_nop_();_nop_(); write_ds1302_byte(address); for (i=0

11、;i=1;/右移一位sck=1; _nop_(); _nop_(); sck=0; rst=0;_nop_(); /以下為ds1302復(fù)位的穩(wěn)定時(shí)間 _nop_();rst=0;sck=0;_nop_();_nop_();_nop_();_nop_();sck=1;_nop_();_nop_();sda=0;_nop_();_nop_();sda=1;_nop_();_nop_();return (temp);/返回/*/* 讀時(shí)鐘數(shù)據(jù) */*/void read_rtc(void) /讀取 日歷 unsigned char i,*p; p=read_rtc_address; /地址傳遞 fo

12、r(i=0;i7;i+) /分7次讀取 秒分時(shí)日月周年 l_tmpdatei=read_ds1302(*p); p+; /*/* 設(shè)定時(shí)鐘數(shù)據(jù) */*/void set_rtc(void) /設(shè)定 日歷uchar i,*p,tmp;for(i=0;i7;i+) /bcd處理 tmp=l_tmpdatei/10;l_tmpdatei=l_tmpdatei%10;l_tmpdatei=l_tmpdatei+tmp*16; write_ds1302(0x8e,0x00); /關(guān)閉寫保護(hù); p=write_rtc_address;/傳地址 for(i=0;i8)set=0;set+; /*up和dow

13、n按鍵的檢測(cè);加減標(biāo)志位*/if(keyup=0)delay10ms();if(keyup=0) lcd_bla=1;delay10ms();while(keyup=0); key_flag+;if(keydown=0)delay10ms();if(keydown=0) lcd_bla=1;delay10ms();while(keydown=0);key_flag-; if(keymenue=0)delay10ms();if(keymenue=0) /菜單選擇標(biāo)志位; delay10ms();while(keymenue=0); lcd_bla=1; menue+; if(menue3)men

14、ue=0; if(keyok=0) delay10ms(); if(keyok=0) /確認(rèn)標(biāo)志位; delay10ms(); while(keyok=0); ok+; if(ok1)ok=0; set=0;lcd_bla=0;tr0 = 0; if(set=2)tr0 = 0; ea=1;void set_date_time()if(set=2)/while(keyup=0|keydown=0);miao=l_tmpdisplay10*10+l_tmpdisplay11;miao=miao+key_flag;if(key_flag59)miao=0;miao=miao%10+(miao/10

15、)*16;write_ds1302(0x8e,0x00);write_ds1302(0x80,miao);write_ds1302(0x8e,0x80);if(set=3) / while(keyup=0|keydown=0); fen=l_tmpdisplay8*10+l_tmpdisplay9;fen=fen+key_flag;if(fen59)fen=0;if(key_flag0)&(fen23)shi=0;if(key_flag0)&(shi31)ri=1;if(key_flag0)&(ri12)yue=1;if(key_flag0)&(yue7)zhou=1;if(key_flag0

16、)&(zhou79)nian=0;if(key_flag0)&(nian0)nian=79;nian=nian%10+(nian/10)*16;write_ds1302(0x8e,0x00);write_ds1302(0x8c,nian);write_ds1302(0x8e,0x80);key_flag=0; void caidan() uchar counter; uchar function;/*光標(biāo)顯示位置控制*/if(menue=0)lcd_write_hanzi(0,4,10);delay1ms(120);lcd_write_hanzi(0,0,3);delay1ms(120);lc

17、d_write_hanzi(0,2,10);lcd_write_hanzi(4,0,10);else if(menue=1)lcd_write_hanzi(0,0,10);delay1ms(120);lcd_write_hanzi(0,2,3);delay1ms(120);lcd_write_hanzi(0,4,10);lcd_write_hanzi(4,0,10);else if(menue=2)lcd_write_hanzi(0,2,10);delay1ms(120);lcd_write_hanzi(0,4,3);delay1ms(120);lcd_write_hanzi(0,0,10);

18、lcd_write_hanzi(4,0,10);else if(menue=3) lcd_write_hanzi(0,4,10);delay1ms(120);lcd_write_hanzi(0,0,10);delay1ms(120);lcd_write_hanzi(0,2,10);lcd_write_hanzi(4,0,28);elselcd_write_hanzi(0,4,10);delay1ms(120);lcd_write_hanzi(0,0,3);delay1ms(120);lcd_write_hanzi(0,2,10);lcd_write_hanzi(4,0,10); for(fun

19、ction=0;function2;function+)lcd_write_hanzi(function+1,0,function+4);lcd_write_hanzi(function+1,2,function+6);lcd_write_hanzi(function+1,4,function+8); if(set2) tr0 = 1;if(tf0=1)counter+;tf0=0;if(counter=100) counter=0;lcd_bla=0;tr0 = 0;if(menue=0)ok=1; /*鬧鐘程序*/void clock()read_rtc();/讀取時(shí)鐘;data_chan

20、ge();/時(shí)鐘數(shù)據(jù)處理if(set=2)/while(keyup=0|keydown=0);minute+=key_flag;if(key_flag59)minute=0;ea=0;/使用iap功能時(shí)關(guān)閉中斷;hour=r_erom(1,2);/讀鬧鐘小時(shí)數(shù)據(jù);week2=r_erom(1,3);/讀鬧鐘分?jǐn)?shù)據(jù); c_erom(1);w_erom(1,1,minute);/寫鬧鐘分?jǐn)?shù)據(jù);w_erom(1,2,hour); /寫鬧鐘小時(shí)數(shù)據(jù);w_erom(1,3,week2);/寫鬧鐘星期數(shù)據(jù);ea=1;/不使用iap功能時(shí)打開中斷; key_flag=0;if(set=3) / while(

21、keyup=0|keydown=0); hour=hour+key_flag;if(hour23)hour=0;if(key_flag0)&(hour7)week2=1;if(key_flag0)&(week21)week2=7;ea=0;/使用iap功能時(shí)關(guān)閉中斷minute=r_erom(1,1);hour=r_erom(1,2);c_erom(1);w_erom(1,1,minute);w_erom(1,2,hour);w_erom(1,3,week2);ea=1;/不使用iap功能時(shí)打開中斷;key_flag=0;ea=0;/使用iap功能時(shí)關(guān)閉中斷 minute=r_erom(1,1

22、);hour=r_erom(1,2);week2=r_erom(1,3);ea=1;/不使用iap功能時(shí)打開中斷; clocktable0=minute/10;/分十位; clocktable1=minute%10;/分個(gè)位 clocktable2=hour/10; /時(shí)十位 clocktable3=hour%10; /時(shí)個(gè)位 clocktable4=week2; /星期;lcd_write_hanzi(2,0,28);lcd_write_shu(1,2,clocktable2);lcd_write_shu(2,2,clocktable3);/時(shí)lcd_write_shu(3,2,64);lc

23、d_write_shu(4,2,clocktable0);lcd_write_shu(5,2,clocktable1);/分;if(clocktable4=1)lcd_write_6x8shu(10,3,23);lcd_write_6x8shu(11,3,25);lcd_write_6x8shu(12,3,24);if(clocktable4=2)lcd_write_6x8shu(10,3,30);lcd_write_6x8shu(11,3,31);lcd_write_6x8shu(12,3,15);if(clocktable4=3)lcd_write_6x8shu(10,3,33);lcd_

24、write_6x8shu(11,3,15);lcd_write_6x8shu(12,3,14);if(clocktable4=4)lcd_write_6x8shu(10,3,30);lcd_write_6x8shu(11,3,18);lcd_write_6x8shu(12,3,31);if(clocktable4=5)lcd_write_6x8shu(10,3,16);lcd_write_6x8shu(11,3,28);lcd_write_6x8shu(12,3,19);if(clocktable4=6)lcd_write_6x8shu(10,3,29);lcd_write_6x8shu(11

25、,3,11);lcd_write_6x8shu(12,3,30);if(week2=7)lcd_write_6x8shu(10,3,29);lcd_write_6x8shu(11,3,31);lcd_write_6x8shu(12,3,24);switch(set)case 0: lcd_write_6x8shu(10,4,96);lcd_write_6x8shu(11,4,96);lcd_write_6x8shu(12,4,96);lcd_write_6x8shu(13,4,96);break;case 1: lcd_write_6x8shu(10,4,96);lcd_write_6x8sh

26、u(11,4,96);lcd_write_6x8shu(12,4,96);lcd_write_6x8shu(13,4,96);break;case 2:delay100ms();lcd_write_shu(4,2,76);lcd_write_shu(5,2,76);delay100ms(); lcd_write_6x8shu(10,4,96);lcd_write_6x8shu(11,4,23);lcd_write_6x8shu(12,4,45);lcd_write_6x8shu(13,4,50);break;case 3: delay100ms();lcd_write_shu(1,2,76);

27、lcd_write_shu(2,2,76);delay100ms();lcd_write_6x8shu(10,4,18);lcd_write_6x8shu(11,4,51);lcd_write_6x8shu(12,4,57);lcd_write_6x8shu(13,4,54);break;case 4:delay100ms();lcd_write_6x8shu(10,3,98);lcd_write_6x8shu(11,3,98);lcd_write_6x8shu(12,3,98);delay100ms();lcd_write_6x8shu(10,4,33);lcd_write_6x8shu(1

28、1,4,41);lcd_write_6x8shu(12,4,41);lcd_write_6x8shu(13,4,47);break;default:lcd_write_6x8shu(10,4,96);lcd_write_6x8shu(11,4,96);lcd_write_6x8shu(12,4,96);lcd_write_6x8shu(13,4,96);set=0;break;void checkclock()key();if(hour=(l_tmpdisplay6*10+l_tmpdisplay7)&(minute=(l_tmpdisplay8*10+l_tmpdisplay9)&(week

29、2=l_tmpdisplay12)&(set=0) beep=0;else beep=1;/* 子程序:底層程序 * * 功能:內(nèi)部eeprom iap功能,存放鬧鐘值; * 調(diào)用子程序; * */#include # include stc12c5a60s2.h #define uchar unsigned char #define uint unsigned int /以下是isp/iap操作時(shí)間宏定義選項(xiàng) #define en_iap 0x83 /系統(tǒng)時(shí)鐘 12mhz/*【iap功能使用時(shí)調(diào)用的3個(gè)函數(shù)】*/ uchar r_erom(uchar n,uint x); /讀第n扇區(qū),第x

30、字節(jié)的數(shù)據(jù) void w_erom(uchar n,uint x,uchar dat); /向第n扇區(qū),第x字節(jié)寫入數(shù)據(jù)dat void c_erom(uchar n); /擦除第n扇區(qū)/*函數(shù):禁止iap操作,清iap相關(guān)寄存器*/ void q0() iap_contr = 0; iap_cmd = 0; iap_trig = 0; iap_addrh = 0x80; iap_addrl = 0; /*函數(shù):讀一字節(jié)入口:第n扇區(qū),第x字節(jié) 出口:dat*/uchar r_erom(uchar n,uint x) uchar dat; uint addr; addr =(n-1)*0x02

31、00 + x-1; iap_contr = en_iap; iap_cmd = 1; /允許讀取eeprom iap_addrl = addr; iap_addrh = addr 8; iap_trig = 0x5a; iap_trig = 0xa5; _nop_(); dat = iap_data; q0(); return dat; /*函數(shù):寫一字節(jié)入口:第n扇區(qū),第x字節(jié),待寫入數(shù)據(jù)dat*/void w_erom(uchar n,uint x,uchar dat) uint addr; addr = (n-1)*0x0200 + x-1; iap_contr = en_iap; iap_cmd = 2; /允許編寫eeprom iap_addrl = addr; iap_addrh = addr 8; iap_data = dat; iap_trig = 0x5a; iap_trig = 0xa5; _nop_(); q0(); /*函數(shù):擦除某一扇區(qū)入口:第n扇區(qū)*/void c_erom(uchar n) uint addr; addr = (n-1)*0x0200; iap_contr = en_iap; iap_cmd = 3; /允許擦除eeprom iap_addrl = addr; iap_addrh

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論