一、系統(tǒng)功能介紹電子時(shí)鐘是一種利用數(shù)字電路來顯示秒、分、時(shí)的計(jì)時(shí)裝置,與傳統(tǒng)的機(jī)械鐘相比,它具有走時(shí)準(zhǔn)確、顯示直觀、無機(jī)械傳動裝置等優(yōu)點(diǎn),因而得到廣泛應(yīng)用。隨著人們生活環(huán)境的不斷改善和美化,在許多場合可以看到數(shù)字電子鐘。
電子鐘亦稱數(shù)字顯示鐘,是一種用數(shù)字電路技術(shù)實(shí)現(xiàn)時(shí)、分、秒計(jì)時(shí)的裝置,與機(jī)械時(shí)鐘相比,直觀性為其主要顯著特點(diǎn),且因非機(jī)械驅(qū)動,具有更長的使用壽命,相較石英鐘的石英機(jī)芯驅(qū)動,更具準(zhǔn)確性。
利用單片機(jī)和數(shù)碼管顯示電路呈現(xiàn)出設(shè)計(jì)要求,4位數(shù)碼管前兩位顯示小時(shí)00-23,后兩位顯示分鐘00-69,一秒鐘閃爍一次,閃爍60次為一分鐘。K1是功能鍵調(diào)節(jié)時(shí)間并移位選擇,K2是加數(shù)鍵,K3是減數(shù)鍵。將程序下載到單片機(jī)內(nèi),給單片機(jī)上電,由于初始值設(shè)的是0x00,所以數(shù)碼管顯示0000,并且后兩位數(shù)碼管每一秒閃爍一下。按K1鍵暫停閃爍并開始選擇數(shù)碼管,按下K2、K3鍵校準(zhǔn)時(shí)間。
二、原理介紹(1)以STC15W4K32S4_PDIP40單片機(jī)為控制核心,用單片機(jī)內(nèi)部定時(shí)器為時(shí)鐘源,設(shè)計(jì)電子時(shí)鐘,使用4位數(shù)碼管顯示時(shí)、分,后兩位數(shù)碼管(分)的閃爍顯示秒。
(2)顯示格式為:“XXXX”
(3)用3個(gè)功能鍵操作來進(jìn)行對時(shí),用K1--K3鍵定義描述功能即:
K1--功能鍵,默認(rèn)0是執(zhí)行時(shí)鐘程序,按一下調(diào)整秒,按第二次是調(diào)整分,按第三次是調(diào)整時(shí),再按一下變成0執(zhí)行默認(rèn)時(shí)鐘程序;
K2--加一鍵,如果功能鍵按的是調(diào)整秒的,秒就加一;如果功能鍵按的是調(diào)整分的,分就加一;如果功能鍵按的是調(diào)整時(shí)的,時(shí)就加一;
K3--減一鍵,如果功能鍵按的是調(diào)整秒的,秒就減一;如果功能鍵按的是調(diào)整分的,分就減一;如果功能鍵按的是調(diào)整時(shí)的,時(shí)就減一;
三、模塊設(shè)計(jì)(核心器件介紹、電路設(shè)計(jì)、程序設(shè)計(jì))
1、核心器件介紹STC15W4K32S4_PDIP40單片機(jī):
(1)STC15W4K32S4系列單片機(jī)中包含中央處理器(CPU)、程序存儲器(Flash)、數(shù)據(jù)存儲器(SRAM)、定時(shí)器/計(jì)數(shù)器、內(nèi)部掉電喚醒專用定時(shí)器、I/O口、比較器、看門狗、高速異步串行通信端口UART,高速同步串行端口SPI,片內(nèi)高精度R/C時(shí)鐘及高可靠復(fù)位等模塊。STC15W4K32S4系列的單片機(jī)集成了一組(各自獨(dú)立6路)增強(qiáng)型的PWM波形發(fā)生器。PWM波形發(fā)生器內(nèi)部有一個(gè)15位的PWM計(jì)數(shù)器供6路PWM使用,用戶可以設(shè)置每路PWM的初始電平。另外,PWM波形發(fā)生器為每路PWM又設(shè)計(jì)了兩個(gè)用于控制波形翻轉(zhuǎn)的計(jì)數(shù)器T1/T2,可以非常靈活的每路PWM的高低電平寬度,從而達(dá)到對PWM的占空比以及PWM的輸出延遲進(jìn)行控制的目的。由于6路PWM是各自獨(dú)立的,且每路PWM的初始狀態(tài)可以進(jìn)行設(shè)定,所以用戶可以將其中的任意兩路配合起來使用,即可實(shí)現(xiàn)互補(bǔ)對稱輸出以及死區(qū)控制等特殊應(yīng)用。
(2)STC15W4K32S4系列增強(qiáng)型PWM輸出端口定義如下:
[PWM2:P3.7, PWM3:P2.1, PWM4:P2.2, PWM5:P2.3, PWM6:P1.6, PWM7:P1.7]
每路PWM的輸出端口都可使用特殊功能寄存器位CnPINSEL分別獨(dú)立的切換到第二組
[PWM2_2:P2.7, PWM3_2:P4.5, PWM4_2:P4.4, PWM5_2:P4.2, PWM6_2:P0.7, PWM7_2:P0.6]
(3)優(yōu)點(diǎn):
①增強(qiáng)型 8051 CPU,1T,單時(shí)鐘/機(jī)器周期,速度比普通8051快8-12倍。
②大容量4096(4K)字節(jié)片內(nèi)RAM數(shù)據(jù)存儲器
③內(nèi)部高可靠復(fù)位,ISP編程時(shí)8級復(fù)位門檻電壓可選,可徹底省掉外部復(fù)位電路。
④工作頻率范圍:0MHz ~ 28MHz,相當(dāng)于普通8051的0MHz~336MHz。

圖一 電路圖
2、電路設(shè)計(jì)


圖二 按鍵部分 圖三 復(fù)位電路
(1)按鍵部分(圖二):
K1--功能鍵:默認(rèn)0是執(zhí)行時(shí)鐘程序,按一下調(diào)整秒,按第二次是調(diào)整分,按第三次是調(diào)整時(shí),再按一下變成0執(zhí)行默認(rèn)時(shí)鐘程序;
K2--加一鍵:如果功能鍵按的是調(diào)整秒的,秒就加一;如果功能鍵按的是調(diào)整分的,分就加一;如果功能鍵按的是調(diào)整時(shí)的,時(shí)就加一;
K3--減一鍵:如果功能鍵按的是調(diào)整秒的,秒就減一;如果功能鍵按的是調(diào)整分的,分就減一;如果功能鍵按的是調(diào)整時(shí)的,時(shí)就減一;
(2)復(fù)位電路(圖三):
包括上電自動復(fù)位和按鍵復(fù)位兩種方式。上電瞬間,RC電路充電,RST引線端出現(xiàn)正脈沖,只要RST端保持10ms以上的高電平,就能使單片機(jī)有效地復(fù)位。其中R1選擇10KΩ的電阻,電容器一般選擇10μF。 按下K4鍵時(shí)鐘設(shè)置歸零。

圖四 1602液晶部分
此電路中1602LCD采用標(biāo)準(zhǔn)的14腳(無背光)接口,各引腳接口說明如下表所示:
引腳接口說明:
第1腳:VSS為地電源;
第2腳:VDD接5V正電源;
第3腳:VL為液晶顯示器對比度調(diào)整端,接正電源時(shí)對比度最弱,接地電源時(shí)對比度最高,對比度過高時(shí)會 產(chǎn)生“鬼影”,使用時(shí)可以通過一個(gè)10K的電位器調(diào)整對比度。
第4腳:RS為寄存器選擇,高電平時(shí)選擇數(shù)據(jù)寄存器、低電平時(shí)選擇指令寄存器。
第5腳:R/W為讀寫信號線,高電平 時(shí)進(jìn)行讀操作,低電平時(shí)進(jìn)行寫操作。當(dāng)RS和R/W共同為低電平時(shí)可以寫入指令或者顯示地址,當(dāng)RA為低電平R/W為高電平時(shí)可以讀忙信號,當(dāng)RS為高電平R/W為低電平時(shí)可以寫入數(shù)據(jù)。
第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時(shí)讀取信息,液晶模塊執(zhí)行命令。
第7~14腳:D0~D7為8位雙向數(shù)據(jù)線。

圖五 晶振電路
單片機(jī)內(nèi)部的振蕩電路是一個(gè)高增益反向放大器,引線X1和X2分別是放大器的輸入端和輸出端。單片機(jī)內(nèi)部雖然有振蕩電路,但要形成時(shí)鐘,外部還需附加電路。他的時(shí)鐘產(chǎn)生方式有兩種:內(nèi)部時(shí)鐘電方式和外部時(shí)鐘方式。由于外部時(shí)鐘方式用于多片單片機(jī)組成的系統(tǒng)中,所以此處選用內(nèi)部時(shí)鐘方式。即利用其內(nèi)部的振蕩電路在X1和X2引線上外接定時(shí)元件,內(nèi)部振蕩電路產(chǎn)生自激振蕩。
四、總結(jié)經(jīng)過此次單片機(jī)作業(yè)的設(shè)計(jì),通過完成一個(gè)電子時(shí)鐘設(shè)計(jì)的過程,我學(xué)到了很多東西!
這樣實(shí)戰(zhàn)的設(shè)計(jì)過程是培養(yǎng)學(xué)生綜合運(yùn)用所學(xué)知識、發(fā)現(xiàn)、提出、分析、和解決實(shí)際問題。鍛煉實(shí)踐能力的重要環(huán)節(jié),是對學(xué)生實(shí)際工作能力的具體訓(xùn)練和考察。此次設(shè)計(jì)的過程中發(fā)現(xiàn)了很多自己知識方面的欠缺,通過查找資料等方式去彌補(bǔ)。隨著科學(xué)技術(shù)發(fā)展的日新月異,單片已經(jīng)成為當(dāng)今計(jì)算機(jī)應(yīng)用中空前活躍的領(lǐng)域,在生活中可以說是無處不在,因此作為二十一世紀(jì)的大學(xué)生來說掌握單片機(jī)的開發(fā)技術(shù)是十分重要的。以前課程設(shè)計(jì)是一個(gè)組設(shè)計(jì)一個(gè)課題,當(dāng)自己通過查資料詢問等方式完成一個(gè)自己的課題時(shí)感覺真的很充實(shí)。
單片機(jī)源碼:
- #include <reg51.h>
- #include <stdio.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit RS=P2^0;
- sbit RW=P2^1;
- sbit E=P2^2;
- sbit k1=P1^0;
- sbit k2=P1^1;
- sbit k3=P1^2;
- uchar shuzhu[]={"beijing time"};//定義字符串
- uchar shuzhu3[]={"2017"};//定義字符串
- uchar shuzhu2[]={"xx:xx:xx"};//時(shí)鐘數(shù)組一共8個(gè)字符,程序的重點(diǎn)
- uchar q,fla,num,x;
- signed char m,f,s;
- void delay(uchar x)//延時(shí)函數(shù)
- {
- uchar a,b;
- for(a=0;a<x;a++)
- for(b=0;b<120;b++);
- }
- void key(void)//按鍵掃描
- {
- if(k1==0)//模式
- {
- delay(5);
- if(k1==0)
- {
- num++;//num是功能鍵的變量,默認(rèn)是0執(zhí)行時(shí)鐘程序,按一下調(diào)整秒,按第二次是調(diào)整分,按第三次調(diào)整時(shí),再按一下變成0執(zhí)行默認(rèn)時(shí)鐘程序
- if(num>3)
- num=0;
- while(k1==0);
- }
- }
- if(k2==0)//判斷加一的按鍵有無按下
- {
- delay(5);
- if(k2==0)
- {
- if(num==1)//如果功能鍵按的是調(diào)整秒的,秒就加一
- {
- m++;
- if(m==60)
- {
- m=0;
- }
- }
- if(num==2)//如果功能鍵按的是調(diào)整分的,分就加一
- {
- f++;
- if(f==60)
- {
- f=0;
- }
- }
- if(num==3)//如果功能鍵按的是調(diào)整時(shí)的,時(shí)就加一
- { s++;
- if(s==24)
- s=0;
- }
- while(k2==0);
- }
- }
- if(k3==0)//判斷減一的按鍵有無按下
- {
- delay(5);
- if(k3==0)
- {
- if(num==1)//同上
- {
- m--;
- if(m<0)
- m=59;
- }
- if(num==2)
- {
- f--;
- if(f<0)
- f=59;
- }
- if(num==3)
- {
- s--;
- if(s<0)
- s=23;
- }
- while(k3==0);
- }
- }
- }
- void write_command(uchar x)//寫指令函數(shù)
- {
- RS=0;
- RW=0;
- P0=x;
- E=1;
- delay(5);
- E=0;
- }
- void write_data(uchar x)//寫數(shù)據(jù)函數(shù)
- {
- RS=1;
- RW=0;
- P0=x;
- E=1;
- delay(5);
- E=0;
- }
- void init()//初始化1602函數(shù)
- {
- write_command(0x38);
- write_command(0x08);
- write_command(0x01);
- write_command(0x06);
- write_command(0x0c);
- }
- void pos(uchar x,uchar y)//要寫入的位置函數(shù)
- {
- x&=0x0f;
- if(y==1)
- write_command(0x80+x);
- if(y==2)
- write_command(0x80+0x40+x);
- }
- void xssz(void)//把時(shí)間賦給顯示數(shù)組
- {
- shuzhu2[0]=s/10+'0';//加‘0’是為了把時(shí)間的數(shù)變成ASCII碼
- shuzhu2[1]=s%10+'0';
- shuzhu2[3]=f/10+'0';
- shuzhu2[4]=f%10+'0';
- shuzhu2[6]=m/10+'0';
- shuzhu2[7]=m%10+'0';
- }
- void main(void)//主函數(shù)
- {
- uchar k,a,b;
- EA=1;
- ET0=1;
- ET1=1;
- TMOD=0X11;
- TH0=(65535-50000)/256;
- TL0=(65535-50000)%256;
- TH1=(65535-50000)/256;
- TL1=(65535-50000)%256;
- TR0=1;
- fla=1;//閃爍標(biāo)志位
- init();//初始化1602
- pos(2,1);//設(shè)置顯示位置
- for(k=0;k<12;k++)
- {
- write_data(shuzhu[k]);//固定顯示16個(gè)字符beijing time
- }
- pos(0,2);//設(shè)置顯示位置
- for(a=0;a<4;a++)
- {
- write_data(shuzhu3[a]);//固定顯示4個(gè)字符2016
- }
- while(1)//無限循環(huán)
- {
- key();//判斷有誤按鍵按下
- pos(7,2);//設(shè)置顯示位置
- for(b=0;b<8;b++)
- {
- write_data(shuzhu2[b]); //讓1602顯示時(shí)鐘數(shù)組里的內(nèi)容
- }
- switch(num)//判斷功能鍵按下所對應(yīng)的功能
- {
- case 0 : TR0=1;TR1=0;//默認(rèn)無按下狀態(tài)num值是0,正常的時(shí)鐘功能。
- xssz();
- if(fla==0)
- shuzhu2[5]=' ';//修改時(shí)鐘數(shù)組的內(nèi)容讓分號:的閃爍
- if(fla==1)
- shuzhu2[5]=':'; //修改時(shí)鐘數(shù)組的內(nèi)容讓分號:的閃爍
- break;
- case 1 : TR0=0;TR1=1; //當(dāng)功能鍵按的第一下,把定時(shí)器0關(guān)掉,開啟定時(shí)器1,讓秒閃爍
- shuzhu2[5]=':'; //恒定顯示分號:
- if(fla==1)
- {
- shuzhu2[6]=' '; //在時(shí)鐘數(shù)組秒的位置寫入空格,讓秒的位置閃爍
- shuzhu2[7]=' ';//
- }
- if(fla==0)
- xssz();
- break;
- case 2 : TR0=0; TR1=1; //當(dāng)功能鍵按的第二下,把定時(shí)器0關(guān)掉,開啟定時(shí)器1,讓分閃爍
- shuzhu2[5]=':';
- if(fla==1)
- {
- shuzhu2[3]=' '; //在時(shí)鐘數(shù)組分的位置寫入空格,讓分的位置閃爍
- shuzhu2[4]=' ';
- }
- if(fla==0)
- xssz();
- break;
- case 3 : TR0=0; TR1=1; //當(dāng)功能鍵按的第三下,把定時(shí)器0關(guān)掉,開啟定時(shí)器1,讓時(shí)閃爍
- shuzhu2[5]=':';
- if(fla==1)
- {
- shuzhu2[0]=' '; //在時(shí)鐘數(shù)組時(shí)的位置寫入空格,讓時(shí)的位置閃爍
- shuzhu2[1]=' ';
- }
- if(fla==0)
- xssz();
- break;
- } //switch的括號
- }//while的括號
- }//main函數(shù)的括號
- void ds0() interrupt 1//秒自增
- {
- TH0=(65535-50000)/256;
- TL0=(65535-50000)%256;
- q++;
- if(q==10)//閃爍標(biāo)志位
- fla=!fla;
- if(q==20)
- {
- q=0;
- m++;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
全部資料51hei下載地址:
http://www.zg4o1577.cn/bbs/dpj-120295-1.html