點擊鏈接獲取Keil源碼與Project Backups仿真圖:
https://download.csdn.net/download/qq_64505944/87695258?spm=1001.2014.3001.5503
源碼獲取
主要內(nèi)容:
1.設(shè)計出電子數(shù)字鐘的電路,并用protus進(jìn)行仿真畫出對應(yīng)的電路圖
2.設(shè)計出電子數(shù)字鐘的源程序,并用Keil進(jìn)行編輯生成HEX文件
3.在protus中進(jìn)行測試。
基本要求:
1、電子數(shù)字鐘電路設(shè)計圖;
2、電子數(shù)字鐘設(shè)計源程序;
2、keil運(yùn)行源程序;
3、protus中仿真;
4、運(yùn)行結(jié)果分析。
主要參考資料:
[1] 譚浩強(qiáng).C.程序設(shè)計.北京:清華大學(xué)出版社,2002
[2] 王為青,程國剛.單片機(jī) Keil Cx51 應(yīng)用技術(shù)開發(fā),北京:人民郵電大學(xué)出版社,2007
[3] 馬忠梅等.單片機(jī)的C語言應(yīng)用程序設(shè)計.北京航空航天大學(xué)出版社,2003.
完 成 期 限:12 月 11 日 - 12 月 26 日
指導(dǎo)教師簽名:
課程負(fù)責(zé)人簽名:
摘 要
隨著科技的發(fā)展,時代的進(jìn)步,數(shù)字電子鐘成為了我們生活當(dāng)中的必需品,數(shù)字鐘是采用數(shù)字電路實現(xiàn)對 .時, 分,秒.數(shù)字顯示的計時裝置 ,廣泛用于個人家庭 ,車站, 碼頭辦公室等公共場所 ,成為人們?nèi)粘I钪胁豢缮俚谋匦杵?, 由于數(shù)字集成電路的發(fā)展和石英晶體振蕩器的廣泛應(yīng)用 , 使得數(shù)字鐘的精度, 遠(yuǎn)遠(yuǎn)超過老式鐘表 , 鐘表的數(shù)字化給人們生產(chǎn) 生活帶來了極大的方便,而且大大地擴(kuò)展了鐘表原先的報時功能。諸如定時自動報警、按時 自動打鈴、時間程序自動控制、定時廣播、自動起閉路燈、定時開關(guān)烘箱、通斷動力設(shè)備、 甚至各種定時電氣的自動啟用等,所有這些,都是以鐘表數(shù)字化為基礎(chǔ)的。因此,研究數(shù)字鐘及擴(kuò)大其應(yīng)用,有著非?,F(xiàn)實的意義。
與傳統(tǒng)的機(jī)械鐘相比,電子鐘具有更突出的優(yōu)點。由于電子鐘采用數(shù)字集成電路的發(fā)展和采用了先進(jìn)的石英技術(shù),使電子鐘具有走時準(zhǔn)確、性能穩(wěn)定、攜帶方便等優(yōu)點,電子鐘用于定時自動報警、按時自動打鈴、時間程序自動控制、定時廣播及自動控制等各個領(lǐng)域。本次課程設(shè)計將采用protus進(jìn)行電路的仿真模擬,使用Keil完成對程序的編程。最終實現(xiàn)數(shù)字電子鐘的模擬
關(guān) 鍵 詞:protus;Keil;1602數(shù)字電子鐘;
目錄
摘 要 I
目錄 II
-
1602數(shù)字電子鐘開發(fā)方法 1
1.1開發(fā)背景 1
1.2開發(fā)平臺 1
1.3 設(shè)計目的 2
1.4 設(shè)計要求 2 -
系統(tǒng)設(shè)計 3
2.1功能設(shè)計 3
2.2 電路設(shè)計 3
2.3 單片機(jī)控制系統(tǒng) 3
2.4 LM016L顯示器 4 -
電路整體設(shè)計 6
3.1 顯示模塊設(shè)計 6
3.2按鍵模塊設(shè)計 6
3.3復(fù)位電路模塊設(shè)計 7
3.4蜂鳴器設(shè)計 8
3.5 電路整體設(shè)計 8 -
程序設(shè)計 10
4.1 程序整體設(shè)計 10
5.測試與運(yùn)行 24
5.1 電子鐘顯示測試 24
5.2 時間調(diào)節(jié)測試 24
5.3 設(shè)定鬧鐘測試 26 -
總結(jié) 27
參考文獻(xiàn) 28 -
1602數(shù)字電子鐘開發(fā)方法
1.1開發(fā)背景
1602數(shù)字電子時鐘是人們?nèi)粘I钪胁豢苫蛉钡谋匦杵冯娮隅娭饕抢矛F(xiàn)代電子技術(shù)將時鐘電子化數(shù)字化與傳統(tǒng)的機(jī)械鐘相比具有時鐘精確顯示直觀無機(jī)械傳動裝置等優(yōu)點因而得到廣泛應(yīng)用另外在生活和工農(nóng)業(yè)生產(chǎn)中人們對電子鐘的功能又提出了諸多要求報時鬧鐘日歷溫度顯示這就需要電子時鐘的多功能性與傳統(tǒng)的機(jī)械鐘相比,電子鐘具有更突出的優(yōu)點。由于電子鐘采用數(shù)字集成電路的發(fā)展和采用了先進(jìn)的石英技術(shù),使電子鐘具有走時準(zhǔn)確、性能穩(wěn)定、攜帶方便等優(yōu)點,電子鐘用于定時自動報警、按時自動打鈴、時間程序自動控制、定時廣播及自動控制等各個領(lǐng)域。
1.2開發(fā)平臺
(1)本次數(shù)字電子鐘開發(fā)所用的平臺是proteus,Proteus軟件是英國Lab Center Electronics公司出版的EDA工具軟件。它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機(jī)及外圍器件。它是比較好的仿真單片機(jī)及外圍器件的工具。雖然國內(nèi)推廣剛起步,但已受到單片機(jī)愛好者、從事單片機(jī)教學(xué)的教師、致力于單片機(jī)開發(fā)應(yīng)用的科技工作者的青睞。
Proteus是英國著名的EDA工具(仿真軟件),從原理圖布圖、代碼調(diào)試到單片機(jī)與外圍電路協(xié)同仿真,一鍵切換到PCB設(shè)計,真正實現(xiàn)了從概念到產(chǎn)品的完整設(shè)計。是世界上唯一將電路仿真軟件、PCB設(shè)計軟件和虛擬模型仿真軟件三合一的設(shè)計平臺,其處理器模型支持8051、HC11、PIC10/12/16/18/24/30/DSPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列處理器,并持續(xù)增加其他系列處理器模型。在編譯方面,它也支持IAR、Keil和MATLAB等多種編譯器。
(2)Keil C51是美國Keil Software公司出品的51系列兼容單片機(jī)C語言軟件開發(fā)系統(tǒng),與匯編相比,C語言在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢,因而易學(xué)易用。Keil提供了包括C編譯器、宏匯編、鏈接器、庫管理和一個功能強(qiáng)大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過一個集成開發(fā)環(huán)境(μVision)將這些部分組合在一起。運(yùn)行Keil軟件需要WIN98、NT、WIN2000、WINXP等操作系統(tǒng)。如果你使用C語言編程,那么Keil幾乎就是你的不二之選,即使不使用C語言而僅用匯編語言編程,其方便易用的集成環(huán)境、強(qiáng)大的軟件仿真調(diào)試工具也會令你事半功倍。
(3)Windows 11是由微軟公司(Microsoft)開發(fā)的操作系統(tǒng),應(yīng)用于計算機(jī)和平板電腦等設(shè)備。于2021年6月24日發(fā)布,2021年10月5日發(fā)行。
Windows 11提供了許多創(chuàng)新功能,增加了新版開始菜單和輸入邏輯等,支持與時代相符的混合工作環(huán)境,側(cè)重于在靈活多變的體驗中提高最終用戶的工作效率。
1.3 設(shè)計目的
通過本次課程設(shè)計,運(yùn)用《單片機(jī)微型計算機(jī)原理及應(yīng)用》的知識,設(shè)計出一個簡單的1602電子鐘,從而將課堂上所講的理論知識與實際的操作給結(jié)合在一起,已達(dá)到對知識的復(fù)習(xí),提高自己的動手能力。
1.4 設(shè)計要求
設(shè)計一個單片機(jī)系統(tǒng),利用Keil來進(jìn)行程序的書寫與編程并且用proteus軟件完成系統(tǒng)軟硬件的設(shè)計及模擬調(diào)試。要求以AT89C51為控制系統(tǒng),LM016為顯示器,便且能夠通過按鈕來調(diào)整時鐘的時間的一個建議的電子數(shù)字鐘。最后能夠在顯示器上正常的顯示時間,并且可以調(diào)節(jié)時間。
2.系統(tǒng)設(shè)計
2.1功能設(shè)計
1、設(shè)計一個有“時”,“分”,“秒”(23小時59分59秒)顯示且可以調(diào)節(jié)時間的電子鐘。
2、用中小規(guī)模集成電路組成電子鐘。
2.2 電路設(shè)計
想做好一個單片機(jī)系統(tǒng),首先必須想好應(yīng)該用什么樣子的電路,并且把需要的用的電路元件給拿出來,如圖2-1電路設(shè)計流程圖所示:
圖2-1控制系統(tǒng)
2.3 單片機(jī)控制系統(tǒng)
本次實現(xiàn)1602數(shù)字鐘采用的控制系統(tǒng)是AT89C51。AT89C51是一種帶4K字節(jié)閃爍可編程可擦除只讀存儲器(FPEROM—FalshProgrammable and Erasable Read Only Memory )的低電壓,高性能CMOS8位微處理器,俗稱單片機(jī)。AT89C2051是一種帶2K字節(jié)閃爍可編程可擦除只讀存儲器的單片機(jī)。單片機(jī)的可擦除只讀存儲器可以反復(fù)擦除100次。該器件采用ATMEL高密度非易失存儲器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡版本。AT89C51單片機(jī)為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價廉的方案。該控制系統(tǒng)如圖2-2所示:
圖2-2 控制系統(tǒng)
2.4 LM016L顯示器
LM016L液晶模塊采用HD44780控制器,hd44780具有簡單而功能較強(qiáng)的指令集,可以實現(xiàn)字符移動,閃爍等功能,LM016L與單片機(jī)MCU通訊可采用8位或4位并行傳輸兩種方式,hd44780控制器由兩個8位寄存器,指令寄存器(IR)和數(shù)據(jù)寄存器(DR)忙標(biāo)志(BF),顯示數(shù)RAM(DDRAM),字符發(fā)生器ROMA(CGOROM)_字符發(fā)生器RAM(CGRAM),地址計數(shù)器RAM(AC)IR用于資存指令碼,只能寫入丕能讀出;DR用于資存數(shù)據(jù)。數(shù)據(jù)由內(nèi)部操作自動寫入 DDRAM和CGRAM,或者暫存從 DDRAM和CGRAM讀出的數(shù)據(jù), BF為1時,液品模塊處于內(nèi)部模式,不響應(yīng)外部操作指令和接受數(shù)據(jù),DDTAM用來存儲顯示的字符,能存儲80個字符碼,CGROM由8位字符碼生成57點陣字符160中和510點陣字符32種.8位字符編碼和字符的對應(yīng)關(guān)系,CGRAM 是為用戶編寫特殊字符留用的,它的容量僅64字節(jié),可以自定義8個57點陣字符或者4個510點陣字符,AC可以存儲DDRAM和CGRAM的地址,如果地址碼隨指令寫入R,則R自動把地址碼裝入AC,同時選擇 DDRAM或CGRA,LM016L液品模塊的引腳功能如圖2-3所示:
圖2-3 LM016L顯示器
- 電路整體設(shè)計
3.1顯示模塊設(shè)計
本次課程設(shè)計采用的是LM016L為顯示器,以及使用RESPACK-8和3214G-1-104E組成顯示模塊,顯示器模塊圖如圖3-1所示:
圖3-1 LM016L顯示器模塊
3.2按鍵模塊設(shè)計
因為要求時鐘可以調(diào)節(jié)時間,因此按鍵模塊需要使5個按鍵來調(diào)節(jié)時間。用五個調(diào)整按鍵調(diào)整時間﹐分別為KI·K2·K3·K4·K5,其中K1鍵為功能選擇鍵﹐可以調(diào)節(jié)時或分﹔K2為數(shù)值加一鍵﹔K3為數(shù)值減一鍵,K4為確認(rèn)鍵,K5為調(diào)節(jié)鬧鐘的按鍵。按鍵模塊設(shè)計如圖3-2所示:
圖3-2 按鍵模塊設(shè)計
3.3復(fù)位電路模塊設(shè)計
單片機(jī)在啟動時都需要復(fù)位,以使CPU及系統(tǒng)各部件處于確定的初始狀態(tài),并從初態(tài)開始工作。89系列單片機(jī)的復(fù)位信號是從RST引腳輸入到芯片內(nèi)的施密特觸發(fā)器中的。當(dāng)系統(tǒng)處于正常工作狀態(tài)時,且振蕩器穩(wěn)定后,如果RST引腳上有一個高電平并維持2個機(jī)器周期(24個振蕩周期)以上,則CPU就可以響應(yīng)并將系統(tǒng)復(fù)位。復(fù)位電路如圖3-3所示:
圖3-3 復(fù)位電路模塊設(shè)計
3.4蜂鳴器設(shè)計
單片機(jī)SOUNDER是什么,sounder是數(shù)字蜂鳴器元件。蜂鳴器是一種一體化結(jié)構(gòu)的電子訊響器,采用直流電壓供電,廣泛應(yīng)用于計算機(jī)、打印機(jī)、復(fù)印機(jī)、報警器、電子玩具、汽車電子設(shè)備、電話機(jī)、定時器等電子產(chǎn)品中作發(fā)聲器件。蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。蜂鳴器的設(shè)計如圖3-4所示:
圖3-4 蜂鳴器設(shè)計
3.5 電路整體設(shè)計
單片機(jī)的電子電路設(shè)計中要求能夠滿足單一操作的要求,即能夠通過簡單的操作就完成電子設(shè)備的系統(tǒng)功能。但是電子電路設(shè)計在功能作用中卻要求能夠?qū)崿F(xiàn)綜合化發(fā)展。當(dāng)前單片機(jī)在電子設(shè)備系統(tǒng)中的應(yīng)用,其能夠起到完善電子設(shè)備系統(tǒng)安全功能、顯示功能、預(yù)警功能等輔助功能,更好地推動電子設(shè)備系統(tǒng)的智能化,精細(xì)化發(fā)展。電路的整體設(shè)計關(guān)乎此次課程設(shè)計的成功與否,是本次課程設(shè)計的重中之重。
該1602電子數(shù)字鐘的整體的電路設(shè)計圖如圖3-5所示:
圖3-4 電路整體設(shè)計
- 程序設(shè)計
4.1 程序整體設(shè)計
完成了電路的設(shè)計,想要將該電路運(yùn)行起來,當(dāng)然離不開程序的設(shè)計,只有程序設(shè)計的符合電路的工作條件,與電路結(jié)合在一起才能使該電路運(yùn)行起來,因此,該電子時鐘的程序設(shè)計的代碼如下所示:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^6;
sbit RW=P2^5;
sbit E=P2^7;
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
sbit K5=P1^4;
sbit BEEP=P3^0;
unsigned char cishu=0;
unsigned char mode_flag;//狀態(tài)標(biāo)志位 0表示正處于正常,1設(shè)置時間,2設(shè)置鬧鐘
unsigned char Current_Time[]={"Current Time "}; //正常運(yùn)行模式
unsigned char Set_time[]={"Set New Time..."}; //設(shè)置時間模式
unsigned char Set_nao[]={"Set nao Time..."}; //設(shè)置鬧鐘模式
unsigned char show_time[]={">00:00:00"};
unsigned char now_shi=12,now_fen=30,now_miao;//運(yùn)行時的時間變量
unsigned char temp_shi,temp_fen,temp_miao;//調(diào)時間的時間變量
unsigned char nao_shi=13,nao_fen=30,nao_miao;//鬧鐘的時間變量
unsigned char flag_sf; //0表示設(shè)置時,1表示設(shè)置分
//歌曲音調(diào)編碼
uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,159,169,190,119,119,126,159,142,159,0};
//歌曲長音節(jié)
uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0};
void display_mode();
void display_time(unsigned char shi,unsigned char fen,unsigned char miao);
void keyscan();
void PlayMusic();
void lcd_w_cmd(unsigned char com);
void lcd_w_dat(unsigned char dat);
void lcd_int ();
void delay1(unsigned int i);
unsigned char lcd_r_start();
void been(unsigned int time);
void main()
{
lcd_int (); //初始化lcd
mode_flag=0;//運(yùn)行
display_mode(); //調(diào)用顯示模式函數(shù)
TMOD=0x01; //初始化定時器
EA=1; //打開總中斷
TH0=(65536-50000)/256; //賦初值
TL0=(65536-50000)%256;
ET0=1; //打開定時器T0中斷標(biāo)志位
TR0=1; //啟動T0
while(1){
if(mode_flag==0)display_time(now_shi,now_fen,now_miao); //狀態(tài)標(biāo)志位mode_flag=0表示正處于時間正常運(yùn)行
else display_time(temp_shi,temp_fen,temp_miao); //否則mode_flag為1時設(shè)置時間,為2時設(shè)置鬧鐘
keyscan(); //調(diào)用按鍵開關(guān)控制函數(shù)
if(now_shi==nao_shi&&now_fen==nao_fen&&now_miao==nao_miao) PlayMusic(); //如果正在運(yùn)行的時間為鬧鐘的時間,則鬧鈴響(此為音樂)
}
}
void display_mode()//第一行模式的顯示,有三種模式:(1)正在運(yùn)行的顯示Current_Time[]字符串(2)設(shè)置時間的顯示Set_time[]字符串 (3)設(shè)置鬧鐘的顯示Set_nao[]字符串
{
unsigned char i;
lcd_w_cmd(0x82); //設(shè)置顯示地址(第一行)
if(mode_flag==0) //狀態(tài)標(biāo)志位mode_flag=0表示正處于時間正常運(yùn)行
{
for(i=0;Current_Time[i]!='\0';i++) //此處顯示Current_Time[]字符串,字符串結(jié)束符為‘0’
{
lcd_w_dat(Current_Time[i]);
}
}
else if(mode_flag==1)
{
for(i=0;Set_time[i]!='\0';i++) //此處顯示Set_time[]字符串,字符串結(jié)束符為‘0’
{
lcd_w_dat(Set_time[i]);
}
}
else if(mode_flag==2)
{
for(i=0;Set_nao[i]!='\0';i++) //此處顯示Set_nao[]字符串,字符串結(jié)束符為‘0’
{
lcd_w_dat(Set_nao[i]);
}
}
}
void display_time(unsigned char shi,unsigned char fen,unsigned char miao)//第二行的數(shù)字顯示
{
unsigned char i;
if(mode_flag==0)show_time[0]=' '; //如果mode_flag=0,第二行第0位顯示' '
else show_time[0]='>'; //否則第二行第0位顯示'>'
show_time[1]=shi/10+0x30; //第一位顯示時的十位數(shù)
show_time[2]=shi%10+0x30; //第二位顯示時的個位數(shù)
show_time[4]=fen/10+'0'; //第四位顯示分的十位數(shù)
show_time[5]=fen%10+'0'; //第五位顯示分的個位數(shù)
show_time[7]=miao/10+'0'; //第七位顯示秒的十位數(shù)
show_time[8]=miao%10+'0'; //第八位顯示秒的個位數(shù)
lcd_w_cmd(0xC3); //更改顯示位置用
for(i=0;show_time[i]!='\0';i++) //此處顯示show_time[]字符串,字符串結(jié)束符為‘0’
{
lcd_w_dat(show_time[i]);
}
}
void keyscan() //按鍵控制,k1調(diào)時或分,k2加時或分,k3減時或分,k4確定調(diào)好的時間,k5調(diào)鬧鐘
{
if(K1==0)
{
delay1(1000);
if(K1==0)
{
if(mode_flag==0) //正在運(yùn)行的時間要進(jìn)入調(diào)時間的狀態(tài)
{
been(300);
temp_shi=now_shi;
temp_fen=now_fen;
temp_miao=now_miao;
mode_flag=1;
}
else{
been(300);
flag_sf=~flag_sf; //切換狀態(tài),flag_sf=0調(diào)時鐘 flag_sf=1調(diào)分鐘
}
display_mode();
while(!K1); //松手檢測
}
}
if(K2==0) //加時或分
{
delay1(1000);
if(K2==0)
{
if(mode_flag!=0)
{
been(300);
if(flag_sf==0) //調(diào)時鐘狀態(tài)
{
temp_shi++;
if(temp_shi==24)temp_shi=0; //如果加時鐘到24就清零
}
else { //調(diào)分鐘狀態(tài)
temp_fen++;
if(temp_fen==60)temp_fen=0; //如果加分鐘到60就清零
}
}
while(!K2); //松手檢測
}
}
if(K3==0) //減時或分
{
delay1(1000);
if(K3==0)
{
if(mode_flag!=0)
{
been(300);
if(flag_sf==0) //調(diào)時鐘狀態(tài)
{
if(temp_shi==0)temp_shi=24; //如果減時鐘減到最低到0就又回到最高位24
temp_shi--;
}
else { //調(diào)分鐘狀態(tài)
if(temp_fen==0)temp_fen=60; //如果減分鐘減到最低到0就又回到最高位60
temp_fen--;
}
}
while(!K3); //松手檢測
}
}
//確定設(shè)置的時間和調(diào)好鬧鐘的時間
if(K4==0)
{
delay1(1000);
if(K4==0)
{
if(mode_flag==1) //設(shè)置時間 設(shè)置好的時間確定后正常運(yùn)行
{
been(300);
now_shi=temp_shi;
now_fen=temp_fen;
now_miao=temp_miao;
mode_flag=0;
}
if(mode_flag==2) //設(shè)置鬧鐘 設(shè)置好的時間確定好之后定為鬧鐘
{
been(300);
nao_shi=temp_shi;
nao_fen=temp_fen;
nao_miao=temp_miao;
mode_flag=0;
}
while(!K4); //松手檢測
}
display_mode(); //調(diào)用顯示模式函數(shù)
}
if(K5==0) //設(shè)置鬧鐘
{
delay1(1000);
if(K5==0)
{
if(mode_flag==0)
{
been(300);
mode_flag=2;
temp_shi=nao_shi;
temp_fen=nao_fen;
temp_miao=nao_miao;
}
display_mode();
while(!K5); //松手檢測
}
}
}
void been(unsigned int time)
{
unsigned int i;
for(i=0;i<time;i++)
{
BEEP=~BEEP;
delay1(10);
}
}
void delay(uint ms) //鬧鈴的延時函數(shù)
{
char t;
while(ms--) for(t=0;t<120;t++);
}
void PlayMusic()
{
uint i=0,j,k;
while (SONG_LONG[i]!=0||SONG_TONE[i]!=0)
{
for(j=0;j<SONG_LONG[i]*30;j++)
{
BEEP=~BEEP;
for(k=0;k<SONG_TONE[i]/4;k++);
}
delay(10);
i++;
display_time(now_shi,now_fen,now_miao);
}
}
//函數(shù)名:time0
//函數(shù)功能:定時器T0的中斷函數(shù),T0在工作方式1下每50ms產(chǎn)生中斷,執(zhí)行該中斷函數(shù)
void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
cishu++;
if(cishu==20) //一秒時間到后,次數(shù)清零,秒數(shù)加一
{
cishu=0;
now_miao++;
}
if(now_miao==60) //60秒時間到后,秒數(shù)清零,分鐘加一
{
now_miao=0;
now_fen++;
}
if(now_fen==60) //60分鐘時間到后,分鐘清零,時鐘加一
{
now_fen=0;
now_shi++;
}
if(now_shi==24) //24小時到后,時鐘清零
{
now_shi=0;
}
}
//函數(shù)名:lcd_int
//函數(shù)功能:lcd初始化
void lcd_int()
{
lcd_w_cmd(0x3c); //設(shè)置工作方式
lcd_w_cmd(0x0c); //設(shè)置顯示狀態(tài)
lcd_w_cmd(0x01); //清屏
lcd_w_cmd(0x06); //設(shè)置輸入方式
lcd_w_cmd(0x80); //設(shè)置初始顯示位置
}
//函數(shù)名:lcd_w_cmd
//函數(shù)功能:寫命令
//形式參數(shù):命令字已經(jīng)存入com單元中
void lcd_w_cmd(unsigned char com)
{
unsigned char i;
do
{ //查lcd忙狀態(tài)
i=lcd_r_start(); //調(diào)用讀狀態(tài)字函數(shù)
i&=0x80; //“與”操作屏蔽掉低7位
delay1(2);
}while(i!=0); //lcd忙,繼續(xù)查詢,否則退出循環(huán)
RW=0;
delay1(1);
RS=0; //RW=0,RS=0,寫lcd命令字
delay1(1);
E=1; //E端時序以0或1高低波動
delay1(1);
P0=com; //將com中的命令字寫入lcd數(shù)據(jù)口
delay1(1);
E=0;
delay1(1);
RW=1;
delay1(2);
}
void lcd_w_dat(unsigned char dat)
{
unsigned char i;
do
{ //查忙操作
i=lcd_r_start(); //調(diào)用讀狀態(tài)字函數(shù)
i&=0x80; //“與”操作屏蔽掉低7位
delay1(2);
}while(i!=0); //lcd忙,繼續(xù)查詢,否則退出循環(huán)
RW=0;
delay1(1);
RS=1; //RW=0,RS=1,寫lcd命令字
delay1(1);
E=1; //E端時序以0或1高低波動
delay1(1);
P0=dat; //將dat中的顯示數(shù)據(jù)寫入lcd數(shù)據(jù)口
delay1(1);
E=0;
delay1(1);
RW=1;
delay1(2);
}
void delay1(unsigned int i)
{
unsigned int k;
for(k=0;k<i;k++);
}
//函數(shù)名:lcd_r_start
//函數(shù)功能:讀狀態(tài)字
unsigned char lcd_r_start()
{
unsigned char s;
RW=1; //RW=1,RS=0,讀lcd狀態(tài)
delay1(1);
RS=0;
delay1(1);
E=1; //E端時序以0或1高低波動
delay1(1);
s=P0; //從lcd的數(shù)據(jù)口讀狀態(tài)
delay1(1);
E=0;
delay1(1);
RW=0;
delay1(1);
return(s); //返回值s讀取狀態(tài)忙或空閑
}
5.測試與運(yùn)行
5.1 電子鐘顯示測試
完成了電路設(shè)計以及程序設(shè)計后,把程序做成工程后,把生成的HEX文件放入到AT89C51控制器后便可開始測試,開始測試后電子鐘的顯示如圖5-1所示:
圖5-1 電子鐘顯示測試
5.2 時間調(diào)節(jié)測試
完成上述電子鐘的顯示測試后,便要開始進(jìn)行電子鐘的時間調(diào)節(jié)測試,電子鐘是否能夠正常的進(jìn)行調(diào)節(jié),是本次課程設(shè)計的重中之重,只有能夠進(jìn)行時間調(diào)節(jié)的電子鐘,才可以真正的運(yùn)用在生產(chǎn)電子鐘的上面,電子鐘的時間調(diào)節(jié)測試,如圖5-2與5-3所示:
圖5-2 電子鐘時間調(diào)節(jié)測試
圖5-3 電子鐘時間調(diào)節(jié)測試
5.3 設(shè)定鬧鐘測試
完成上述測試后,可以直觀的感受到,該電子鐘是可以正常的進(jìn)行調(diào)節(jié),即可加時間也可以減時間,接下來就要進(jìn)行鬧鐘的設(shè)定,測試結(jié)果如圖5-4所示:
圖5-4 電子鐘設(shè)定鬧鐘測試文章來源:http://www.zghlxwxcb.cn/news/detail-491579.html
完成了上述的所有測試,即可證明該1602數(shù)字電子鐘是可以正常的進(jìn)行運(yùn)作的,既可以調(diào)節(jié)時間,也可以定鬧鐘,蜂鳴器也可以正常的進(jìn)行工作,雖然功能非常有限,但是基本上完成了設(shè)計的要求。文章來源地址http://www.zghlxwxcb.cn/news/detail-491579.html
- 總結(jié)
通過這次的課程設(shè)計作品的制作讓我對單片機(jī)的理論有了更加深入的了解,本次我所設(shè)計的電子數(shù)字鐘,在日常生活中算是一個非常常見的一個物品,但是,真正的在設(shè)計中,我發(fā)現(xiàn)遇到了很多的麻煩,電路的設(shè)計,程序的設(shè)計。都有很多困難,不僅僅是運(yùn)用了課堂上所講的單片機(jī)的知識,就連大一與大二所學(xué)習(xí)的c語言的知識和電路的知識也都運(yùn)用到了里面,同時在具體的制作過程中我們發(fā)現(xiàn)現(xiàn)在書本上的知識與實際的應(yīng)用存在著不小的差距,書本上的知識很多都是理想化后的結(jié)論,忽略了很多實際的因素,或者涉及的不全面,可在實際的應(yīng)用時這些是不能被忽略的,我們不得不考慮這方的問題,這讓我們無法根據(jù)書上的理論就輕易得到預(yù)想中的結(jié)果,有時結(jié)果甚至很差別很大。通過這次實踐使我更深刻的體會到了理論聯(lián)系實際的重要性。
通過這次課程設(shè)計使我懂得了理論與實際相結(jié)合是很重要的,更加加深了我對單片機(jī)理論知識的認(rèn)知,對c語言的使用以及對電路的理解。更加明白了只有理論知識是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識與實踐相合起來,從理論中得出結(jié)論,才能真正為社會服務(wù),從而提升自己的實際動手水平和獨立思考的水平。在設(shè)計的過程中遇到問題,能夠說得是困難重重,但可喜的是最終都得到了解決。
到了這里,關(guān)于基于AT89C51單片機(jī)的電子時鐘設(shè)計的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!