




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 .專業綜合課程設計報告題目:智能電子鐘(LCD)班 級:1121應用電子 (學號):游政園2011212150 題目智能電子鐘(LCD)一、 設計要求:制作一個LCD顯示的智能電子鐘:(1) 計時:秒、分、時、日、月、年、星期。(2) 閏年自動判別。(3) 時間、年、月、日、星期交替顯示。(5) 自定任意時刻自動開/關屏。(6) 計時精度:誤差1秒/月(具有微調設置)。二、 方案論證:本實驗可采用并行時鐘芯片(DS12C887)和串行時鐘芯片(DS1302),DS1302要用戶自己安裝后備電池和串口通訊,要32.768KHz的晶振,而DS12C887自帶后備電池,并口通訊,無需外圍元件,并且
2、DS12C887多了一個字節來記錄世紀使用的,處在RAM的32H單元,但是其他的寄存器定義都一樣。由于本實驗用到了STC12C5A60S2直插40P封裝的單片機、nokia5110液晶屏、獨立式按鍵、四路2輸入與門并且都是直插的,而且在實驗室做PCB只能是單層板,為了節約空間和簡化電路于是就選用了串行時鐘芯片DS1302。三、 理論設計:用CAD軟件繪制的硬件原理圖電源和程序下載端口,此部分的USB可提供電源和下載端口適用于USB下載端口,DOWN端口適用于四角插針式下載、BAT為備用電源端口。CPU主控部分,此部分采用的是高速51系列的STC12C5A60S2的單片機,該芯片不僅運行速度快穩
3、定驅動能力更大,還為用戶提供了部集成8位/10位可調分辨率ADC模塊(在此設計中有用到),1KB可擦寫EEPROM本設計中用其設計成可調鬧鐘功能存放鬧鐘值。此圖為串行數據nokia5110的LCD顯示器模塊,采用可控背光和可控電源有很好的節能效果。該顯示器能顯示漢字,字符,圖片、并且處理顯示數據速度快。此模塊為串行數據實時時鐘模塊,此模塊采用的是達拉斯公司生產的DS1302具有閏年補償。此圖為按鍵中斷模塊,在此模塊中每個獨立式按鍵都能申請外部中斷與時處理按鍵按下的值來執行用戶的操作。此圖為蜂鳴器模塊此模塊用于鬧鐘鈴聲設計,和開機提示。此圖為PCB版圖此圖為PCB打印預覽軟件流程圖開始按鍵檢測,
4、判斷按鍵是否按下yes其他鍵yes按下目錄鍵NO時間處理初始化時鐘功能1(時間)內部子程序,包括鍵值處理,加減上下,確認,背光控制,鬧鐘,時間日期的設置溫度處理讀數據功能2(溫度)電壓處理數據處理功能3(電壓)顯示鬧鐘處理功能4(鬧鐘)返回程序清單完整C程序源代碼/* 主程序:頂層程序 * * 顯示默認功能:時間日期顯示; * 調用子程序; * */# include <intrins.h># include "zimo.h" /字模程序;# include "nokia5110.h"/5110驅動程序;# include "ds1
5、302.h" /ds1302驅動程序;# include "key.h" /按鍵掃描程序;# include "printf.h" /顯示函數;# include "power.h" /電源模塊;# include "main.h" /引腳定義;# include "delay.h" /延時函數;# include "macroandconst.h"/數據類型宏定義;# include "ADC.H" /ADC電壓測量# include &quo
6、t;ds18b20.h" /溫度模塊;void main()system_inint();/系統初始化;/Set_RTC();while(1)checkclock();caidan(); /菜單顯示;if(menue=0)if(ok=1) LCD_clear(); /清屏幕while(menue=0) /由此進入時鐘功能ok=0;logo();Read_RTC();/讀取時鐘;data_change();/時鐘數據處理tiaozheng_flag();date_time(); /顯示年月日時分秒;week();/星期處理;set_date_time();/設置改變時間和日期;powe
7、rvcc();checkclock();LCD_clear(); /清屏幕else if(menue=1)/由此進入溫度檢測功能if(ok=1) LCD_clear(); /清屏幕while(menue=1)temperatuercheck();ok=0;LCD_clear(); /清屏幕elseif(menue=2) /由此進入電壓測量功能if(ok=1) LCD_clear(); /清屏幕while(menue=2)power();/電量檢測 ok=0;LCD_clear(); /清屏幕else if(menue=3)/由此進入鬧鐘功能if(ok=1) LCD_clear(); /清屏幕w
8、hile(menue=3)clock();ok=0;checkclock();LCD_clear(); /清屏幕else LCD_clear(); caidan();void extern0() interrupt 0 /*外部中斷0中斷函數定義;*/ key(); /* 子程序:底層程序 * * 功能:時間日期數據處理; * * */# include <intrins.h># include "macroandconst.h"# include "stc12c5a60s2.h"# include "nokia5110.h&quo
9、t;sbit SCK = P02;/DS1302時鐘;sbit SDA = P01;/DS1302數據;sbit RST = P00;/ DS1302復位;uchar l_tmpDate=0,0,0,1,1,1,13;/秒分時日月周年08-05-15 12:00:00uchar l_tmpdisplay13;code uchar Write_rtc_address7=0x80,0x82,0x84,0x86,0x88,0x8a,0x8c; /秒分時日月周年 最低位讀寫位code uchar Read_RTC_address7=0x81,0x83,0x85,0x87,0x89,0x8b,0x8d;
10、 /*/* 寫一個字節 */*/void Write_Ds1302_Byte(unsigned char temp) unsigned char i; for (i=0;i<8;i+) /循環8次 寫入數據 SCK=0; SDA=temp&0x01; /每次傳輸低字節 temp>>=1; /右移一位 SCK=1; /*/* 寫入DS1302 */*/void Write_Ds1302( unsigned char address,unsigned char dat ) RST=0;_nop_(); SCK=0;_nop_(); RST=1; _nop_(); /啟動
11、Write_Ds1302_Byte(address);/發送地址 Write_Ds1302_Byte(dat);/發送數據 RST=0; /恢復/*/* 讀出DS1302數據 */*/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;i<8;i+) /循環8次 讀取數據 if(SDA) t
12、emp|=0x80;/每次傳輸低字節temp>>=1;/右移一位SCK=1; _nop_(); _nop_(); SCK=0; RST=0;_nop_(); /以下為DS1302復位的穩定時間 _nop_();RST=0;SCK=0;_nop_();_nop_();_nop_();_nop_();SCK=1;_nop_();_nop_();SDA=0;_nop_();_nop_();SDA=1;_nop_();_nop_();return (temp);/返回/*/* 讀時鐘數據 */*/void Read_RTC(void) /讀取 日歷 unsigned char i,*p;
13、p=Read_RTC_address; /地址傳遞 for(i=0;i<7;i+) /分7次讀取 秒分時日月周年 l_tmpDatei=Read_Ds1302(*p); p+; /*/* 設定時鐘數據 */*/void Set_RTC(void) /設定 日歷uchar i,*p,tmp;for(i=0;i<7;i+) /BCD處理 tmp=l_tmpDatei/10;l_tmpDatei=l_tmpDatei%10;l_tmpDatei=l_tmpDatei+tmp*16; Write_Ds1302(0x8E,0X00); /關閉寫保護; p=Write_rtc_address;
14、/傳地址 for(i=0;i<7;i+)/7次寫入 秒分時日月周年 Write_Ds1302(*p,l_tmpDatei); p+; Write_Ds1302(0x8E,0x80); /打開寫保護; /* 子程序:底層程序 * * 功能:按鍵處理,鍵值顯示; * * */# include "main.h"# include "ds1302.h"# include "nokia5110.h"# include "delay.h"# include "printf.h"# include &
15、quot;eeprom.h"uchar set=0;/按鍵選擇標志位;char key_flag=0;/按鍵加減標志位;uchar menue=0;/菜單選擇標志位;uchar ok=0;/確認標志位;char miao,fen,shi,ri,yue,zhou,nian;/*時間日期數值標志位;*/uchar clocktable5; /分,時,星期;char hour=7;char minute=30;char week2=1;void Delay10ms()/11.0592MHzunsigned char i, j;i = 108;j = 145;dowhile (-j); wh
16、ile (-i);void key() EA=0; /*判斷選擇按鍵是否按下;如果按下了當松開的時候讓背光打開;set+;*/ if(keyswitch=0) Delay10ms();if(keyswitch=0) Delay10ms();while(keyswitch=0);LCD_BLA=1;if(set>8)set=0;set+; /*up和down按鍵的檢測;加減標志位*/if(keyup=0)Delay10ms();if(keyup=0) LCD_BLA=1;Delay10ms();while(keyup=0); key_flag+;if(keydown=0)Delay10ms
17、();if(keydown=0) LCD_BLA=1;Delay10ms();while(keydown=0);key_flag-; if(keymenue=0)Delay10ms();if(keymenue=0) /菜單選擇標志位; Delay10ms();while(keymenue=0); LCD_BLA=1; menue+; if(menue>3)menue=0; if(keyok=0) Delay10ms(); if(keyok=0) /確認標志位; Delay10ms(); while(keyok=0); ok+; if(ok>1)ok=0; set=0;LCD_BLA
18、=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_flag<0)&(miao=0)miao=59;if(miao>59)miao=0;miao=miao%10+(miao/10)*16;Write_Ds1302(0x8E,0x00);Write_Ds1302(0x80,miao);Write_Ds1302(0x8
19、E,0x80);if(set=3) / while(keyup=0|keydown=0); fen=l_tmpdisplay8*10+l_tmpdisplay9;fen=fen+key_flag;if(fen>59)fen=0;if(key_flag<0)&&(fen<0)fen=59;fen=fen%10+(fen/10)*16;Write_Ds1302(0x8E,0x00);Write_Ds1302(0x82,fen);Write_Ds1302(0x8E,0x80);if(set=4)/ while(keyup=0|keydown=0);shi=l_tmp
20、display6*10+l_tmpdisplay7;shi=shi+key_flag;if(shi>23)shi=0;if(key_flag<0)&&(shi<0)shi=23; shi=shi%10+(shi/10)*16;Write_Ds1302(0x8E,0x00);Write_Ds1302(0x84,shi);Write_Ds1302(0x8E,0x80);if(set=5) / while(keyup=0|keydown=0); ri=l_tmpdisplay4*10+l_tmpdisplay5;ri=ri+key_flag;if(ri>31)
21、ri=1;if(key_flag<0)&&(ri<1)ri=31;ri=ri%10+(ri/10)*16;Write_Ds1302(0x8E,0x00);Write_Ds1302(0x86,ri);Write_Ds1302(0x8E,0x80);if(set=6)/while(keyup=0|keydown=0); yue=l_tmpdisplay2*10+l_tmpdisplay3;yue=yue+key_flag;if(yue>12)yue=1;if(key_flag<0)&&(yue<1)yue=12;yue=yue%10+(
22、yue/10)*16;Write_Ds1302(0x8E,0x00);Write_Ds1302(0x88,yue);Write_Ds1302(0x8E,0x80);if(set=7)/while(keyup=0|keydown=0);zhou=l_tmpdisplay12;zhou=zhou+key_flag;if(zhou>7)zhou=1;if(key_flag<0)&&(zhou<1)zhou=7;zhou=zhou%10+(zhou/10)*16;Write_Ds1302(0x8E,0x00);Write_Ds1302(0x8A,zhou);Write
23、_Ds1302(0x8E,0x80);if(set=8)/while(keyup=0|keydown=0);nian=l_tmpdisplay0*10+l_tmpdisplay1+key_flag;if(nian>79)nian=0;if(key_flag<0)&&(nian<0)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 count
24、er; uchar function;/*光標顯示位置控制*/if(menue=0)LCD_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);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,
25、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);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_ha
26、nzi(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(function=0;function<2;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(set<2) TR0 = 1;if(TF
27、0=1)counter+;TF0=0;if(counter=100) counter=0;LCD_BLA=0;TR0 = 0;if(menue=0)ok=1; /*鬧鐘程序*/void clock()Read_RTC();/讀取時鐘;data_change();/時鐘數據處理if(set=2)/while(keyup=0|keydown=0);minute+=key_flag;if(key_flag<0)&(minute=0)minute=59;if(minute>59)minute=0;EA=0;/使用iap功能時關閉中斷;hour=R_EROM(1,2);/讀鬧鐘小時數
28、據;week2=R_EROM(1,3);/讀鬧鐘分數據; C_EROM(1);W_EROM(1,1,minute);/寫鬧鐘分數據;W_EROM(1,2,hour); /寫鬧鐘小時數據;W_EROM(1,3,week2);/寫鬧鐘星期數據;EA=1;/不使用iap功能時打開中斷; key_flag=0;if(set=3) / while(keyup=0|keydown=0); hour=hour+key_flag;if(hour>23)hour=0;if(key_flag<0)&&(hour<0)hour=23;EA=0;/使用iap功能時關閉中斷 minut
29、e=R_EROM(1,1);week2=R_EROM(1,3);C_EROM(1);W_EROM(1,1,minute);W_EROM(1,2,hour);W_EROM(1,3,week2); EA=1;/不使用iap功能時打開中斷;key_flag=0;if(set=4)/ while(keyup=0|keydown=0);week2=week2+key_flag;if(week2>7)week2=1;if(key_flag<0)&&(week2<1)week2=7;EA=0;/使用iap功能時關閉中斷minute=R_EROM(1,1);hour=R_ER
30、OM(1,2);C_EROM(1);W_EROM(1,1,minute);W_EROM(1,2,hour);W_EROM(1,3,week2);EA=1;/不使用iap功能時打開中斷;key_flag=0;EA=0;/使用iap功能時關閉中斷 minute=R_EROM(1,1);hour=R_EROM(1,2);week2=R_EROM(1,3);EA=1;/不使用iap功能時打開中斷; clocktable0=minute/10;/分十位; clocktable1=minute%10;/分個位 clocktable2=hour/10; /時十位 clocktable3=hour%10; /
31、時個位 clocktable4=week2; /星期;LCD_write_hanzi(2,0,28);LCD_write_shu(1,2,clocktable2);LCD_write_shu(2,2,clocktable3);/時LCD_write_shu(3,2,64);LCD_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(
32、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_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)L
33、CD_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,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,
34、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_6x8shu(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_6x8s
35、hu(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);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:Delay100m
36、s();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(11,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
37、_6x8shu(13,4,96);set=0;break;void checkclock()key();if(hour=(l_tmpdisplay6*10+l_tmpdisplay7)&&(minute=(l_tmpdisplay8*10+l_tmpdisplay9)&&(week2=l_tmpdisplay12)&&(set=0) beep=0;else beep=1;/* 子程序:底層程序 * * 功能:部EEPROM IAP功能,存放鬧鐘值; * 調用子程序; * */#include <intrins.h># include
38、"stc12c5a60s2.h" #define uchar unsigned char #define uint unsigned int /以下是ISP/IAP操作時間宏定義選項 #define EN_IAP 0x83 /系統時鐘 12MHz/*IAP功能使用時調用的3個函數*/ uchar R_EROM(uchar n,uint x); /讀第n扇區,第x字節的數據 void W_EROM(uchar n,uint x,uchar dat); /向第n扇區,第x字節寫入數據dat void C_EROM(uchar n); /擦除第n扇區/*函數:禁止IAP操作,清I
39、AP相關寄存器*/ void Q0() IAP_CONTR = 0; IAP_CMD = 0; IAP_TRIG = 0; IAP_ADDRH = 0x80; IAP_ADDRL = 0; /*函數:讀一字節入口:第n扇區,第x字節 出口:dat*/uchar R_EROM(uchar n,uint x) uchar dat; uint addr; addr =(n-1)*0x0200 + x-1; IAP_CONTR = EN_IAP; IAP_CMD = 1; /允許讀取EEPROM IAP_ADDRL = addr; IAP_ADDRH = addr >> 8; IAP_TR
40、IG = 0x5a; IAP_TRIG = 0xa5; _nop_(); dat = IAP_DATA; Q0(); return dat; /*函數:寫一字節入口:第n扇區,第x字節,待寫入數據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(); /*函數:擦除某一扇區入口:第n扇區*/void C_EROM(uchar n) uint addr; a
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030中國電風扇行業市場深度調研及調查研究報告
- 2025-2030中國電商快遞行業市場發展分析及前景趨勢與投資研究報告
- 2025-2030中國深圳寫字樓裝飾市場現狀調研及競爭策略分析研究報告
- 2025-2030中國汽車燃油泵電機行業市場發展趨勢與前景展望戰略研究報告
- 2025年中學教師資格考試《綜合素質》教育案例深度剖析試題解析試卷
- 基于深度學習的工控通信協議識別研究
- 2025年職業指導師專業能力測試卷:職業指導師職業素養與能力測評試題
- 2025年輔導員職業能力測試試卷:學生職業生涯規劃指導課程設計與評估
- 2025-2030中國板材行業市場發展分析及前景趨勢與投資研究報告
- 2025高三一模徐匯作文:生命的意義在于探索……解析及范文
- 2023年鄭州工業應用技術學院單招考試面試題庫及答案解析
- 《電子制造技術-電子封裝》配套教學課件
- 二月份循證護理查房課件
- 粉筆國考行測模考大賽第八季
- JJF(湘) 09-2018 純水-超純水系統監測儀表(電導率)計量校準規范-(高清現行)
- 大一下【世界古代史】期末復習資料
- 延安市幼兒教師心理健康現狀調查分析
- 尾礦庫筑壩施工組織方案
- 中藥斗譜排序
- 數學建模“如何進行人員分配”問題
- 空調系統維保記錄表格模板
評論
0/150
提交評論