基于51單片機(jī)的數(shù)字電子鐘仿真原理圖:
1.設(shè)計(jì)任務(wù)和要求 1、數(shù)字電子鐘(使用定時(shí)器做計(jì)時(shí),用靜態(tài)或動(dòng)態(tài)顯示時(shí)鐘) 主要設(shè)計(jì)內(nèi)容 : (1)用定時(shí)器實(shí)現(xiàn)走時(shí)功能 (2)用 4 位或 6 位數(shù)碼管實(shí)現(xiàn)時(shí)鐘顯示(時(shí)、分、秒) (3)用 2 個(gè)或多個(gè)按鍵實(shí)現(xiàn)校時(shí)修改(采用移位鍵和加 1 鍵修改時(shí)、分、秒) (4)修改校時(shí)過(guò)程中,被修改位要求定位閃爍,以表明該位數(shù)值正在修改 (5)時(shí)鐘走時(shí),要求秒點(diǎn)閃爍 (6)時(shí)鐘走時(shí)誤差控制在 1 秒/天 (7)擴(kuò)展增加年月日計(jì)時(shí)功能,并按鍵切換分屏顯示 2.電路設(shè)計(jì)方案選擇,分析電路工作原理和系統(tǒng)性能 1. 數(shù)據(jù)顯示模塊 考慮到要顯示的內(nèi)容頗多,故運(yùn)用1602A顯示實(shí)時(shí)數(shù)據(jù),第一行顯示狀態(tài)以及年月日星期(如S 2009—01—01 THU),第二行顯示溫度和實(shí)時(shí)時(shí)間( 22.0C12:00:00),在處理按鍵設(shè)置時(shí),第二行暫時(shí)屏蔽溫度的顯示而顯示設(shè)置的內(nèi)容。這樣雖然在程序方面多了1602A的一些初始化和讀寫子函數(shù)的定義,但程序的模塊化卻更加的清楚。而且采用1602A LCM的液晶顯示模塊后不僅滿足了大量數(shù)據(jù)的顯示,系統(tǒng)的硬件電路變的十分簡(jiǎn)單清晰明 2.溫度采集模塊 采用常用的溫度采集芯片DS18B20單線數(shù)字溫度傳感器進(jìn)行溫度的采集DS18B20的外部電源供電方式 在外部電源供電方式下,DS18B20工作電源由VDD引腳接入,此時(shí)I/O線不需要強(qiáng)上拉,不存在電源電流不足的問(wèn)題,可以保證轉(zhuǎn)換精度,外部電源供電方式是DS18B20最佳的工作方式,工作穩(wěn)定可靠,抗干擾能力強(qiáng),而且電路也比較簡(jiǎn)單。在外接電源方式下,可以充分發(fā)揮DS18B20寬電源電壓范圍的優(yōu)點(diǎn),即使電源電壓VCC降到3V時(shí),依然能夠保證溫度量精度。外接電源解決了電壓方面的苛刻要求,雖多接了一根線,但對(duì)于本設(shè)計(jì)的近距離測(cè)試來(lái)說(shuō)還是很適合的 3.時(shí)間處理模塊 利用51內(nèi)部的定時(shí)器和中生成秒,再利用程序累加清零等基本時(shí)間,爾后再調(diào)用C中一些經(jīng)典的算法生成年月日以及星期等信息。但是該方案必須保證系統(tǒng)一直處于供電的情況,不能斷電,否則時(shí)間由初始化了,所以該方案中又添加了三個(gè)設(shè)置按鈕,也就是增加了一個(gè)設(shè)置調(diào)整模塊,在再次供電后可以調(diào)整時(shí)間以同步,完美的解決了時(shí)間的連續(xù)性問(wèn)題。這雖使得電路和方案一復(fù)雜度相當(dāng),但是系統(tǒng)的設(shè)計(jì)對(duì)資源的利用更充分。 4.調(diào)整設(shè)置模塊 這個(gè)模塊完全是第三個(gè)模塊的一個(gè)衍生品,它就是為了調(diào)整時(shí)間以便斷電后正常使用。該模塊包括四個(gè)按鍵(兩個(gè)中斷,兩個(gè)設(shè)置),一個(gè)中斷就是簡(jiǎn)單要停止鬧鐘;另一個(gè)中斷時(shí)是停止時(shí)鐘,進(jìn)入設(shè)置狀態(tài),包括調(diào)整時(shí)間以同步和設(shè)置鬧鐘的值,而另外兩個(gè)設(shè)置建一個(gè)就是為了此時(shí)增加或減少時(shí)間值,另一個(gè)的作用是在調(diào)整完了當(dāng)前量后進(jìn)入下一個(gè)量的調(diào)整或退出調(diào)整。
3.主控制器AT89C52介紹 1.AT89C52功能介紹 AT89C52是8字節(jié)FLASH閃速存儲(chǔ)器,256字竹內(nèi)部RAM , 32個(gè)I/O口線,3個(gè)16 位定時(shí)/計(jì)數(shù)器,一個(gè)6向量?jī)杉?jí)中斷結(jié)構(gòu),一個(gè)全雙工串行通信口,片內(nèi)振蕩器及時(shí)鐘電路。同時(shí),AT89c52可降至OHz的靜態(tài)邏輯操作,并支持兩種軟件可選的節(jié)電上作模式?臻e方式停止CPU 的工作,但允許RAM,定時(shí)/計(jì)數(shù)器.串行通信口及中斷系統(tǒng)繼續(xù)工作。掉電方式保存RAM 中的內(nèi)容,但振蕩器停止工作并禁止其它所有部件工作直到下一個(gè)硬件復(fù)位. 2.功能引腳說(shuō)明: Vcc:電源電壓 GND:地 P0:P0口是一組8位漏極開(kāi)路型雙向1/O 口,也即地址/數(shù)據(jù)總線復(fù)用口。作為輸出口用時(shí).每位能吸收電流的方式驅(qū)動(dòng)8個(gè)TTL 邏輯門電路,對(duì)端口P0 寫“1”時(shí),可作為高阻抗輸入端用。 在訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器或程序存儲(chǔ)器時(shí),這組口線分時(shí)轉(zhuǎn)換地址(低8位)和數(shù)據(jù)總線復(fù)用,在訪問(wèn)期間激活內(nèi)部 上拉電阻。 在FLASH由編程時(shí),P0口接收指令字節(jié),而在程序校驗(yàn)時(shí),輸出指令字 節(jié),校驗(yàn)時(shí),要求外接上拉電阻。 P1口:PI 是一個(gè)帶內(nèi)部上拉電阻的8位雙向I/O口,Pl的輸出緩沖級(jí)可驅(qū)動(dòng)(吸收或輸出電流4個(gè)TTL邏輯門電路。對(duì)端口寫“1”,通過(guò)內(nèi)部的上拉電阻把端口拉到高電平,此時(shí)可作輸入口。作 輸入口使用時(shí),因?yàn)閮?nèi)部存在上拉電阻某個(gè)引腳被外部信號(hào)拉低時(shí)會(huì)輸出一個(gè)電流IIL 與AT89C51不同之處是,Pl.0 和P1.1還可分別作為定時(shí)/計(jì)數(shù)器2 的外部計(jì)數(shù)輸入(Pl.0/T2 )和輸入(P1.1/T2EX) , FLASH編程和程序校驗(yàn)期間,Pl接收低8位地址。 PI.O 和PI.l 的第二功能: P2 是一個(gè)帶有內(nèi)部上拉電阻的8位雙向I/O口,P2的輸出緩沖級(jí)可驅(qū)動(dòng)(吸收或輸出電流)4個(gè)TTL邏輯電路。對(duì)端口P2寫“l(fā)",通過(guò)內(nèi)部的上拉電阻把端口拉到高電平,此時(shí)可作輸入口, 作輸入口使用時(shí),因?yàn)閮?nèi)部存在上拉電阻,某個(gè)引腳被外部信號(hào)拉低時(shí)會(huì)輸出一個(gè)電流(llt )。 在訪問(wèn)外部程序存儲(chǔ)器或16位地址的外部數(shù)據(jù)存儲(chǔ)器,P2送出高8 位地址數(shù)據(jù)。在訪問(wèn)8位地址的外部數(shù)據(jù)存儲(chǔ)器、如執(zhí)行MOVX@RI指令)時(shí),P2口輸出P2鎖存器的內(nèi)容。 FLASH編程或校驗(yàn)時(shí),P2亦接收高位地址和一些控制信號(hào)。 P3口:P3口是一組帶有內(nèi)部上拉電阻的8位雙向I/O口。P3口輸出緩沖級(jí)可驅(qū)動(dòng)(吸收或輸出電流)4個(gè)TTL邏輯門電路。對(duì)P3口寫入“1”時(shí),它們被內(nèi)部上拉電阻拉高并可作為輸入端口。此時(shí),被外部拉低的P3口將用上拉電阻輸出電流(IIL) . P3口除了作為一般的I/0口線外,更重要的用途是它的第二功能,如下表所示: P3.0 RXD(串行輸入口〕 P3.1 TXD(串行輸出口〕 P3.2 INTO(外中斷0〕 P3.3 INTO(外中斷l(xiāng)) P3.4 TO (定時(shí)/計(jì)數(shù)器0 ) P3.5 Tl (定時(shí)/計(jì)數(shù)器l ) P3.6 WR(外部數(shù)據(jù)存儲(chǔ)器寫選通) P3.7 RD(外部數(shù)據(jù)存儲(chǔ)器讀選通) 此外,P3口還接收一些用于FLASH閃速存儲(chǔ)器編程和程序校驗(yàn)的控制信號(hào)。 RST:復(fù)位輸入。當(dāng)振蕩器工作時(shí),RST引腳出現(xiàn)兩個(gè)機(jī)器周期以上高電平將使單片機(jī)復(fù)位。 ALE/PROG:當(dāng)訪問(wèn)外部程序存儲(chǔ)器或數(shù)據(jù)存儲(chǔ)器時(shí),ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低8位字節(jié).一般情況下,ALE仍以時(shí)鐘振蕩頻率的1/6輸出固定的脈沖信號(hào),因此它可對(duì)外輸出時(shí)鐘或用于定時(shí)目的。要注意的是:每當(dāng)訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器時(shí)將跳過(guò)一個(gè)ALE脈沖。對(duì)Flash存儲(chǔ)器編程期間,該引腳還用于輸入編程脈沖(PROG)。如有必要,可通過(guò)對(duì)特殊功能寄存器(SFR)區(qū)中的8EH單元的D0位置位.可禁止ALE操作。該位置位后,只有一條MOVX和MOVC指令才能將ALE激活,此外,該引腳會(huì)被微弱拉高,單片機(jī)執(zhí)行外部程序時(shí),應(yīng)設(shè)置ALE禁止位無(wú)效。 PSEN:程序儲(chǔ)存允許PSEN輸出是外部程序存儲(chǔ)器的讀選通信號(hào),當(dāng)AT89C52由外部程序存儲(chǔ)器取指令(或數(shù)據(jù))時(shí),每個(gè)機(jī)器周期兩次PSEN有效,即輸出兩個(gè)脈沖。在此期間,當(dāng)訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器,將跳過(guò)兩次PSEN信號(hào)。 EA/VPP:外部訪問(wèn)允許。欲使CPU 僅訪問(wèn)外部程序存儲(chǔ)器(地址為0000H-FFFFH ) , EA端必須保持低電平(接地).需注怠的是:如果加密位LBI被編程,復(fù)位時(shí)內(nèi)部會(huì)鎖存EA端狀態(tài)。 3.最小系統(tǒng) 單片機(jī)最小系統(tǒng)包括時(shí)鐘電路、電源和復(fù)位電路等,是單片機(jī)工作的基本要求。單片機(jī)控制整個(gè)系統(tǒng)的工作,一方面讀取日歷時(shí)鐘芯片中的日期等數(shù)據(jù),檢測(cè)是否需要設(shè)置,并處理相應(yīng)的按鍵。另一方面,控制顯示器的工作,將各種數(shù)據(jù)送到液晶顯示器去顯 80C52型單片機(jī)內(nèi)有一增益反相放大器,振蕩頻率取決于石英晶體的振蕩頻率。范圍可取1。2—12MHZ,C01、C02主要起頻率微調(diào)和穩(wěn)定作用。 (1)復(fù)位電路 單片機(jī)在開(kāi)關(guān)機(jī)時(shí)都需要復(fù)位,以便中央處理器CPU及其他功能部件都RC構(gòu)成處于一個(gè)確定的初始狀態(tài),并從這個(gè)狀態(tài)開(kāi)始工作。80C51的RST引腳是復(fù)位信號(hào)的輸入端。復(fù)位信號(hào)高電平有效,持續(xù)時(shí)間需要24個(gè)時(shí)鐘周期以上。 RC構(gòu)成微分電路,在接電瞬間,產(chǎn)生一個(gè)微分脈沖,其寬度若大于2個(gè)機(jī)器周期,80C51型單片機(jī)將復(fù)位。為保證微分脈沖寬度足夠大,RC時(shí)間常數(shù)應(yīng)大于2個(gè)機(jī)器周期。一般取10uF電容、8.2K歐姆電阻。 4.振蕩器特性: XTAL1和XTAL2分別為反向放大器的輸入和輸出。該反向放大器可以配置為片內(nèi)振蕩器。石晶振蕩和陶瓷振蕩均可采用。如采用外部時(shí)鐘源驅(qū)動(dòng)器件,XTAL2應(yīng)不接。有余輸入至內(nèi)部時(shí)鐘信號(hào)要通過(guò)一個(gè)二分頻觸發(fā)器,因此對(duì)外部時(shí)鐘信號(hào)的脈寬無(wú)任何要求,但必須保證脈沖的高低電平要求的寬度。 基于51單片機(jī)的數(shù)字電子鐘源碼:(完整代碼和電路圖在附件中)- #include "reg52.h"
- //#include "delay.h"
- #include "ds1302.h"
- #include "lcd1602.h"
- #include "ds18b20.h"
- //#include "stdio.h"
- #define uint unsigned int
- #define uchar unsigned char
- sbit K1=P3^3; //選擇
- sbit K2=P3^4; //加
- sbit K3=P3^5; //減
- sbit K4=P3^6; //確定
- sbit BUZZER=P1^0; //蜂鳴器
- uchar RTC_flag=0;
- char RTC_NYRSFM[14]={0};
- code char RTC_set_state[6]={'N','Y','R','S','F','M'};
- code char Ping_Run_Year[12]={31,28,31,30,31,30,31,31,30,31,30,31};
- code char Tab[]={0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02,//年
- 0x0F,0x09,0x0F,0x09,0x0F,0x09,0x0B,0x11,//月
- 0x1F,0x11,0x11,0x1F,0x11,0x11,0x1F,0x00};//日
- /*
- 函數(shù)作用:將時(shí)間進(jìn)行加一或減一后返回(DA指令轉(zhuǎn)換)
- 函數(shù)形參:
- DateTime:要轉(zhuǎn)化的時(shí)間
- n :時(shí)間的進(jìn)制
- x :1表示加1,0表示減1
- y :0表示起始數(shù)值是0,1表示起始數(shù)值是1
- 返回值 :轉(zhuǎn)化好的時(shí)間
- */
- uchar DA_DateTime(uchar DateTime,uchar n,uchar x,uchar y)
- {
- uchar a;
- a=(DateTime>>4)*10+(DateTime&0x0f);
- if(x)//加
- {
- if(y) a=(a%n)+1;//起始為0
- else a=(++a)%n;
- }
- else//減
- {
- if(y) a=(a+n-1)%n;//起始為0
- else a=((a+n-2)%n)+1;
- }
- return ((a/10)*16+a%10);
- }
- /*
- 函數(shù)作用:刷新星期(2000年~2099年星期算法)
- 函數(shù)形參:
- y:年
- m:月
- d:日
- 返回值 :
- */
- void RefreshWeekDay(uchar y,uchar m,uchar d)
- {
- if(m==1||m==2)
- {
- m+=12;
- y--;
- }
- TIME[5]=((d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7);
- }
- /*
- 函數(shù)作用:顯示屏顯示從DS1302讀出的時(shí)鐘
- 函數(shù)形參:
- 返回值 :
- */
- void Lcd_1602_Display(void)
- {
- RefreshWeekDay((TIME[6]>>4)*10+(TIME[6]&0x0f),(TIME[4]>>4)*10+(TIME[4]&0x0f),(TIME[3]>>4)*10+(TIME[3]&0x0f));
-
- L1602_char(1,1,TIME[6]/16+'0');
- L1602_char(1,2,(TIME[6]&0x0f)+'0');//年
- L1602_char(1,3,0x00);//自定義漢字年
- L1602_char(1,4,TIME[4]/16+'0');
- L1602_char(1,5,(TIME[4]&0x0f)+'0');//月
- L1602_char(1,6,0x01);//自定義漢字月
- L1602_char(1,7,TIME[3]/16+'0');
- L1602_char(1,8,(TIME[3]&0x0f)+'0');//日
- L1602_char(1,9,0x02);//自定義漢字日
- L1602_char(1,11,((TIME[5]&0x0f)+6)%7+1+'0');//周
- L1602_char(2,1,TIME[2]/16+'0');
- L1602_char(2,2,(TIME[2]&0x0f)+'0');//時(shí)
- L1602_char(2,3,':');
- L1602_char(2,4,TIME[1]/16+'0');
- L1602_char(2,5,(TIME[1]&0x0f)+'0');//分
- L1602_char(2,6,':');
- L1602_char(2,7,TIME[0]/16+'0');
- L1602_char(2,8,(TIME[0]&0x0f)+'0');//秒
- }
- /*
- 函數(shù)作用:天數(shù)加減一
- 函數(shù)形參:x為1加,0減
- 返回值 :
- */
- void RCT_DA_R(uchar x)
- {
- if(((((TIME[6]>>4)*10+(TIME[6]&0x0f))%4==0 && ((TIME[6]>>4)*10+(TIME[6]&0x0f))%100!=0) || (((TIME[6]>>4)*10+(TIME[6]&0x0f))%400==0)) && ((TIME[4]>>4)*10+(TIME[4]&0x0f))==2)//閏年二月
- {
- TIME[3]=DA_DateTime(TIME[3],29,x,1);
- }
- else
- {
- TIME[3]=DA_DateTime(TIME[3],Ping_Run_Year[(TIME[4]>>4)*10+(TIME[4]&0x0f)-1],x,1);
- }
- }
- /*
- 函數(shù)作用:寫入自定義圖形(年月日)
- 函數(shù)形參:
- 返回值 :
- */
- void LCD1602_CustomData()
- {
- uchar i;
- wcmd(0x40);//定義第一個(gè)自定義字符
- for(i=0;i<8*3;i++)
- {
- wdata(Tab[i]);
- }
- }
- void Int1_Init()//設(shè)置INT1
- {
- IT1=1;//跳變沿出發(fā)方式(下降沿)
- EX1=1;//打開(kāi)INT1的中斷允許。
- EA=1;//打開(kāi)總中斷
- }
- void main()
- {
- uchar i;
- BUZZER=0;
- L1602_init();
- Ds1302_Init();
- Int1_Init();
- LCD1602_CustomData();
- while(1)
- {
- if(RTC_flag==0)//正常顯示模式
- {
- Ds1302ReadTime();//DS1302獲取時(shí)間
- if((TIME[1]==0)&&(TIME[0]==0))//分秒為0,整點(diǎn)報(bào)時(shí)
- {
- BUZZER=1;
- }
- else
- {
- BUZZER=0;
- }
- Lcd_1602_Display();//顯示時(shí)間
- L1602_string(1,14,"RTC");
- datapros();
- }
- else//設(shè)置模式
- {
- BUZZER=0;
- if(K1==0)
- {
- while(K1==0);
- L1602_string(1,14,"[ ]");
- for(i=0;i<7;i++)
- {
- if((i+1)==RTC_flag)//顯示設(shè)置的參數(shù)狀態(tài)
- {
- L1602_char(1,15,RTC_set_state[i]);
- }
- }
- }
- else if(K2==0)//加
- {
- while(K2==0);
- switch(RTC_flag)
- {
- case 1:TIME[6]=DA_DateTime(TIME[6],100,1,0);break;
- case 2:TIME[4]=DA_DateTime(TIME[4],12,1,1);break;
- case 3:RCT_DA_R(1);break;
- case 4:TIME[2]=DA_DateTime(TIME[2],24,1,0);break;
- case 5:TIME[1]=DA_DateTime(TIME[1],60,1,0);break;
- case 6:TIME[0]=DA_DateTime(TIME[0],60,1,0);break;
- }
- Lcd_1602_Display();
- }
- else if(K3==0)//減
- {
- while(K3==0);
- switch(RTC_flag)
- {
- case 1:TIME[6]=DA_DateTime(TIME[6],100,0,0);break;
- case 2:TIME[4]=DA_DateTime(TIME[4],12,0,1);break;
- case 3:RCT_DA_R(0);break;
- case 4:TIME[2]=DA_DateTime(TIME[2],24,0,0);break;
- case 5:TIME[1]=DA_DateTime(TIME[1],60,0,0);break;
- case 6:TIME[0]=DA_DateTime(TIME[0],60,0,0);break;
- }
- Lcd_1602_Display();
- }
- else if(K4==0)//確定
- {
- while(K4==0);
- L1602_string(1,14,"RTC");
- Ds1302_Init();//寫進(jìn)時(shí)間
- RTC_flag=0;
- }
- }
- }
- }
- void EX_INT1() interrupt 2
- {
- RTC_flag=(RTC_flag++)%6+1;//N Y R S F M
- }
復(fù)制代碼
全部資料51hei下載地址:
數(shù)字時(shí)鐘.zip
(176.62 KB, 下載次數(shù): 98)
2021-5-31 15:44 上傳
點(diǎn)擊文件名下載附件
源碼+電路圖
|