第一篇:基于51單片機電子時鐘設計
基于51單片機的電子時鐘設計
摘要
本電子時鐘以STC89C52單片機作為主控芯片,采用DS12C887時鐘芯片,使用1602液晶作為顯示輸出。該時鐘走時精確,具有鬧鐘設置,以及可同時顯示時間、日期等多種功能。本文將詳細介紹該電子時鐘涉及到的一些基本原理,從硬件和軟件兩方面進行分析。
【關鍵詞】
STC89C52單片機
DS12C887時鐘芯片
1602液晶
蜂鳴器
目錄
一、緒論…………………………………………………………4
1.1 電子時鐘功能…………………………………………1.2設計方案………………………………………………4
二、硬件設計……………………………………………………4
2.151
2.2 單片機部分設計………………………………4
USB供電電路設計………………………………5
2.3 串行通信電路設計………………………………6
2.4DS12C887時鐘芯片電路的設計…………………6
2.51602LCD液晶屏顯示電路設計………………7
2.6
蜂鳴器電路設計………………………………8
2.7
按鍵調整電路設計…………………………8
三、軟件設計…………………………………………9
3.1 系統程序流程圖設計…………………………9
3.2程序設計……………………………………11
四、心得體會………………………………………………22 參考文獻……………………………………………………23
一、緒
論
1.1電子時鐘功能
(1)在1602液晶上顯示年、月、日、星期、時、分、秒,并且按秒實時更新顯示。(2)具有鬧鈴設定即到時報警功能,報警響起時按任意鍵可取消報警。
(3)能夠使用實驗板上的按鍵隨時調節各個參數,四個有效鍵分別為功能選擇鍵、數值增大鍵、數值減小鍵和鬧鐘查看鍵。
(4)每次有鍵按下時,蜂鳴器都以短“滴”聲報警。
(5)利用DS12C887自身掉電可繼續走時的特性,該時鐘可實現斷電時間不停、再次上電時時間仍準確顯示在液晶上的功能。
1.2設計方案
DS12C887時鐘芯片+1602LCD液晶屏
DS12C887時鐘芯片功能豐富、價格適中,能夠自動產生世紀、年、月、日、時、分、秒等時間信息,其內部含有世紀寄存器,從而利用硬件電路解決“千年”問題。DS12C887中自帶鋰電池,外部掉電時,其內部時間信息還能保持10年之久。1602LCD液晶屏可以輸出2行,每行顯示16個字符。1602LCD液晶屏顯示清晰且不會閃爍,由于液晶屏是數字式的,因此和單片機系統的接口簡單,操作方便。
以STC89C52為主控芯片,DS12C887為時鐘芯片,1602LCD液晶屏作為顯示器。程序控制DS12C887時鐘芯片實現小時、分、秒和年、月、日的計時,并在1602LCD液晶屏上顯示出來。當時間走到程序所設定的時間時,蜂鳴器響起,起到鬧鐘功能。
二、硬
件
設
計
2.1 51單片機部分設計
單片機部分如圖2—1所示:
以STC89C52單片機為核心,選用12MHZ的晶振,由于晶振的頻率越高,單片機的運行速度就越快,考慮到單片機的運行速度快會導致對存儲器的要求就會變高,因此12MHZ為最佳選擇。外接電容的值雖然沒有嚴格的要求,但是外接電容的大小會影響振蕩器的頻率高低、振蕩器的穩定性和起振的快速性,因此選用30pF的電容作為起振電容。復位電路為按鍵高電平復位,當按鍵按下,RES端為高電平,當高電平持續4us的時間單片機即復位。
2.2 USB供電電路設計
USB供電電路如下圖2—2所示:
該電子時鐘采用USB端口的方式為單片機供電,LPOW1為電源顯示燈,當按鍵S5按下,電源顯示燈LPOW1亮,表示給單片機供+5V電。
2.3 串行通信電路設計
串行通信電路如下圖2—3所示:
圖中通過MAX232進行RS—232電平與單片機TTL電平之間的轉換,從而為單片機和上位機之間通信提供通道。通信電路的目的就是讓通信雙方的電平匹配,單片機用的是TTL電平,上位機的串口用的是RS—232電平。TTL電平邏輯1的電壓范圍是+3.3V到+5V,邏輯0的電壓范圍是0到+3.3V;RS—232電平的邏輯1的電壓范圍是—15V到—5V,邏輯0的電壓范圍是+5V到+15V。MAX232可以把輸入的+5V電源電壓變換成為RS—232輸出電平所需的+10V電壓。所以采用此芯片接口的串行通信系統只需單一的+5V電源就可以了。對于沒有+12V電源的場合,其適應性更強,2.4 DS12C887時鐘芯片電路的設計
時鐘芯片電路如下圖2—4所示:
DS12C887時鐘芯片共需要13條信號線,分別是并行數據地址復用線AD0~AD7,CS,AS,R/W,DS和IRQ。
MOT—總線操作時序選擇端。它有兩種工作模式,當MOT接
VCC時,選用Motorola模式;當MOT接GND或懸空時,選用Intel模式。NC—空引腳。
AD0~AD7—復用地址數據總線。在總線周期的前半部分,出現在AD0~AD7上的是地址信息,可用以選通DS12C887內的RAM,總線周期的后半部分出現在AD0~AD7上的是數據信息。GND,VCC—系統電源接入端。當
VCC輸入為+5V時,用戶可以訪問DS12C887內RAM的輸入小于+4.25V時,禁止用戶對內部RAM中的數據,并可對其進行讀/寫操作;當
VCC進行讀/寫操作,此時用戶不能正確芯片內的時間信息;當
VCC的輸入小于+3V時,DS12C887會自動的將電源切換到內部自帶的鋰電池上,以保證內部的電路能正常工作。
CS—芯片片選端。
AS—地址選通輸入端。在進行讀/寫操作時,AS的上升沿將AD0~AD7上出現的地址信息鎖存到DS12C887上,而下一個下降沿清除AD0~AD7上的地址信息,不論CS是否有效,DS12C887都將執行該操作。
R/W—讀/寫輸入端。該引接腳有兩種工作模式,當MOT接
VCC時,R/W工作在Motorola模式。此時該引腳的作用是區分讀操作還是寫操作,R/W高電平時為讀操作,R/W為低電平時為寫操作;當MOT接GND時,該引腳工作在Intel模式,此時該引腳為寫允許輸入,此信號的上升沿鎖存數據。
DS—數據選擇或讀輸入腳。該引腳有兩種工作模式,當MOT接
VCC時,選用Motorola模式,此時,每個總線周期后一部分的DS為高電平,稱為數據選通。在讀操作中,DS的上升沿使DS12C887將內部數據送往總線AD0~AD7上,以供外部讀取。在寫操作中,DS的下降沿將使總線AD0~AD7上的數據鎖存在DS12C887中。當MOT接GND時,選用Intel模式,此時該引腳是讀允許輸入引腳。
RESET—芯片復位引腳。
IRQ—中斷請求輸出。用作處理器的中斷申請輸入。只要引起中斷的狀態位置位,并且相應中斷使能位也置位,IRQ將一直保持低電平,處理器程序通常讀取C存儲器來清除IRQ引腳輸出,RESET引腳也會清除未處理的中斷。沒有中斷發生時,IRQ為高阻狀態,可將多個中斷器件接到一條IRQ總線上,只要它們均為漏極開路輸出即可。IRQ引腳為漏極開路輸出,需要使用一個外接上拉電阻與SQW—方波輸出引腳。當供電電壓
VCC相連。
VCC大于4.25V時,SQW引腳可輸出方波。
2.5 1602LCD液晶屏顯示電路設計
1602LCD液晶屏顯示電路如下圖2—5所示:
1602液晶為5V電壓驅動,帶背光,可顯示2行,每行16個字符,不能顯示漢字,內置含128個字符的ASCII字符集字庫,只有并行接口,無串行接口。接口說明如下:(1)液晶1,2端為電源;15,16為背光電源;為防止直接加5V電壓燒壞背光燈,在15腳串接一個1K?電阻用于限流。
(2)液晶3端為液晶對比度調節端,通過一個10K?電位器接地來調節液晶顯示對比度。首次使用時,在液晶上電狀態下,調節至液晶上面一行顯示出黑色小格為止。
(3)液晶4端為向液晶控制器寫數據/寫命令選擇端,接單片機的P3.5口。
(4)液晶5端為讀/寫選擇端,因為我們不從液晶讀取任何數據,只向其寫入命令和顯示數據,因此此端始終選擇為寫狀態,即低電平接地。
(5)液晶6端為使能信號,是操作時必須的信號,接單片機的P3.4口。
2.6 蜂鳴器電路設計
蜂鳴器電路如下圖2—6所示:
蜂鳴器電路接在單片機的P2.3引腳上,當該引腳一個低電平,三極管導通,蜂鳴器發出聲音作為鬧鈴。
2.7 按鍵調整電路設計
按鍵調整電路如下圖2—7所示:
四個獨立鍵盤均采用查詢方式,將按鍵的一端接地,另一端各接一根輸入線直接與STC89C52的I/O口相連。當按鍵閉合時,相當于該I/O口通過按鍵與地相連,變成低電平,單片機通過檢測I/O口的電平狀態,即可識別出按下的鍵。通過四個鍵實現參數的調節,S1為功能選擇鍵,S2為數值增大鍵,S3為數值減小鍵,S4為鬧鐘查看鍵。
三、軟
件
設
計
3.1 系統程序流程圖設計
流程圖1:實驗主程序流程圖
流程圖2:定時中斷程序流程圖
流程圖3:調時功能流程圖
3.2 程序設計
#include
//延時函數 {
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);} void di()
//蜂鳴器報警聲音 {
beep=0;
delay(100);
beep=1;} void
write_com(uchar com)
//寫液晶命令函數
{
rs=0;
lcden=0;
P0=com;
delay(3);
lcden=1;
delay(3);
lcden=0;} void write_data(uchar
data)
//寫液晶數據函數 {
rs=1;
lcden=0;
P0=data;
delay(3);
lcden=1;
delay(3);
lcden=0;} void
init()
//初始化函數 {
uchar
num;
EA=1;
//打開總中斷
EX1=1;
//開外部中斷1
IT1=1;
//設置負跳變沿觸發中斷
flag1=0;
//變量初始化
t0_num=0;
s1num=0;
week=1;
dula=0;
//關閉數碼管顯示
wela=0;
lcden=0;
rd=0;/*以下幾行在首次設置DS12C887時使用,以后不必再寫入
write_ds(0x0A,0x20);
//打開振蕩器
write_ds(0x0B,0x26);
//設置24小時模式,數據二進制格式,開啟鬧鈴中斷
set_time();
//設置上電默認時間
---------------*/
write_com(0x38);
//1602液晶初始化
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<15;num++)
//寫入液晶固定部分顯示
{
write_data(table[num]);
delay(1);}
write_com(0x80+0x40);
for(num=0;num<11;num++)
{
write_data(table1[num]);
delay(1);
} } void write_sfm(uchar add,char data)
{ //1602液晶刷新時分秒函數,4為時,7為分,10為秒
char
shi,ge;
shi=data/10;
ge=data%10;
write_com(0x80+0x40+add);
write_data(0x30+shi);
write_data(0x30+ge);} void
write_nyr(uchar add,char
data)
{
//1602液晶刷新年月日函數,3為年,6為月,9為日
char
shi,ge;
shi=data/10;
ge=data%10;
write_com(0x80+add);
write_data(0x30+shi);
write_data(0x30+ge);void
write_week(char we)
//寫液晶星期顯示函數 {
write_com(0x80+12);
switch(we)
{
case 1:
write_data('M');delay(5);
write_data('O');delay(5);
write_data('N');
break;
case 2:
write_data('T');delay(5);
write_data('U');delay(5);
write_data('E');
break;
case 3:
write_data('W');delay(5);
write_data('E');delay(5);
write_data('D');
break;
case 4:
write_data('T');delay(5);
write_data('H');delay(5);
write_data('U');
break;
case 5:
write_data('F');delay(5);
write_data('R');delay(5);
write_data('I');
break;
case 6:
write_data('S');delay(5);
write_data('A');delay(5);
write_data('T');
break;
case 7:
write_data('S');delay(5);
write_data('U');delay(5);
write_data('N');
break;
} } void keyscan(){ if(flag_ri==1){
//這里用來取消鬧鐘報警,按任意鍵取消報警
if((s1==0)||(s2==0)||(s3==0)||(s4==0))
{
delay(5);
if((s1==0)||(s2==0)||(s3==0)||(s4==0))
{
while(!(s1&&s2&&s3&s&s4));di();
flag_ri=0;
//清除報警標志
}
}
}
if(s1==0)
//檢測s1
{
delay(5);
if(s1==0)
{
s1num++;
//記錄按下次數
if(flag1==1)
if(s1num==4)
s1num=1;
flag=1;
while(!s1);di();
switch(s1num)
{
//光標閃爍點定位
case 1: write_com(0x80+0x40+10);
write_com(0x0f);
break;
case 2: write_com(0x80+0x40+7);
break;
case 3: write_com(0x80+0x40+4);
break;
case 4: write_com(0x80+12);
break;
case 5: write_com(0x80+9);
break;
case 6: write_com(0x80+6);
break;
case 7: write_com(0x80+3);
break;
case 8: s1num=0;
write_com(0x0c);
flag=0;
write_ds(0,miao);
write_de(2,fen);
write_ds(4,shi);
write_ds(6,week);
write_ds(7,day);
write_ds(8,month);
write_ds(9,year);
break;
}
}
}
if(s1num!=0)
//只有當s1按下后,才檢測s2和s3
{
if(s2==0)
{
delay(1);
if(s2==0)
while(!s2);di();
switch(s1num)
{
//根據功能鍵次數調節相應數值
case 1: miao++;
if(miao==60)
miao=0;
write_sfm(10,miao);
write_com(0x80+0x40+10);
break;
case 2: fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+7);
break;
case 3: shi++;
case 4:
case 5:
case 6:
case 7:
}
}
}
if(s3==0)
{
delay(1);
if(shi==24)
shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+4);
break;week++;
if(week==8)
week=1;
write_week(week);
write_com(0x80+12);
break;day++;
if(day==32)
day=1;
write_nyr(9,day);
write_com(0x80+9);
break;month++;
if(month==13)
month=1;
write_nyr(6,month);
write_com(0x80+6);
break;year++;
if(year==100)
year=0;
write_nyr(3,year);
write_com(0x80+3);
break;
if(s3==0)
{
while(!s3);di();
switch(s1num)
{
//根據功能鍵次數調節相應數值
case 1: miao--;
if(miao==-1)
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
break;
case 2: fen--;
if(fen==-1)
fen=59;
write_sfm(7,fen);
write_com(0x80+0x40+7);
break;
case 3: shi--;
if(shi==-1)
shi=23;
write_sfm(4,shi);
write_com(0x80+0x40+4);
break;
case 4: week--;
if(week==0)
week=7;
write_week(week);
write_com(0x80+12);
break;
case 5: day--;
if(day==0)
day=31;
write_nyr(9,day);
write_com(0x80+9);
break;
case 6: month--;
if(month==0)
month=12;
write_nyr(6,month);
write_com(0x80+6);
break;
case 7: year--;
if(year==-1)
year=99;
write_nyr(3,year);
write_com(0x80+3);
break;
}
}
}
}
if(s4==0)
//檢測s4
{
delay(5);
if(s4==0)
{
flag1=~flag1;
while(!s4);di();
if(flag1==0)
{
//退出鬧鐘設置時保存數值
flag=0;
write_com(0x80+0x40);
write_data(' ');
write_data(' ');
write_com(0x0c);
write_ds(1,miao);
write_ds(3,fen);
write_ds(5,shi);
}
else
{
//進入鬧鐘設置
read_alarm();
//讀取原始數據
miao=amiao;
//重新賦值用以按鍵調節
fen=afen;
shi=ashi;
write_com(0x80+0x40);
write_data('R');
//顯示標志
write_data('i');
write_com(0x80+0x40+3);
write_sfm(4,ashi);
//送液晶顯示鬧鐘時間
write_sfm(7,afen);
write_sfm(10,amiao);
}
}
} } void write_ds(uchar add,uchar
data){
//寫12C887函數
dscs=0;
dsas=1;
dsds=1;
dsrw=1;
P0=add;
//先寫地址
dsas=0;
dsrw=0;
P0=data;
//再寫數據
dsrw=1;
dsas=1;
dscs=1;} uchar
read_ds(uchar add){
//讀12C887函數
uchar
ds_data;
dsas=1;
dsds=1;
dsrw=1;
dscs=0;
P0=add;
//先寫地址
dsas=0;
dsds=0;
P0=0xff;
ds_data=P0;
//再讀數據
dsds=1;
dsas=1;
dscs=1;
return ds_data;} /*---首次操作12C887時給予寄存器初始化-----void set_time(){
//首次上電初始化時間函數
write_ds(0,0);
write_ds(1,0);
write_ds(2,0);
write_ds(3,0);
write_ds(4,0);
write_ds(5,0);
write_ds(6,0);
write_ds(7,0);
write_ds(8,0);
write_ds(9,0);}----------------------*/
void
read-alarm(){
//讀取12C887鬧鐘值
amiao=read_ds(1);
afen=read_ds(3);
ashi=read_ds(5);} void main()
//主函數 {
init();
//調用初始化函數
while(1)
{
keyscan();
//按鍵掃描
if(flag_ri==1)
//當鬧鐘中斷時進入這里
{
di();
delay(100);
di();
delay(500);
}
if(flag==0&&flag1==0)
//正常工作時進入這里
{
keyscan();
//按鍵掃描
year=read_ds(9);
//讀取12C887數據
month=read_ds(8);
day=read_ds(7);
week=read_ds(6);
shi=read_ds(4);
fen=read_ds(2);
miao=read_ds(0);
write_sfm(10,miao);
//送液晶顯示
write_sfm(7,fen);
write_sfm(4,shi);
write_week(week);
write_nyr(3,year);
write_nyr(6,month);
write_nyr(9,day);
}
} } void
exter()interrupt 2
//外部中斷1服務程序 {
uchar
c;
//進入中斷表示鬧鐘時間到
flag_ri=1;
//設置標志位,用于大程序中報警提示
c=read_ds(0x0c);
//讀取12C887的C寄存器表示響應了中斷 }
_______________________________________________________________________________ 以下為define.h源代碼:
_______________________________________________________________________________ #define uchar unsigned char #define uint unsigned int sbit dula=P2^6;sbit wela=P2^7;sbit rs=P3^5;sbit lcden=P3^4;sbit s1=P3^0;
//功能鍵 sbit s2=P3^1;
//增大鍵 sbit s3=P3^2;
//減小鍵 sbit s4=P3^6;
//鬧鐘查看鍵 sbit rd=P3^7;sbit beep=P2^3;
//蜂鳴器 sbit dscs=P1^4;sbit dsas=P1^5;sbit dsrw=P1^6;sbit dsds=P1^7;sbit dsirq=P3^3;bit flag1,flag_ri;
//定義兩個位變量
uchar count,s1num,flag,t0_num;
//其他變量定義 char miao,shi,fen,year,month,day,week,amiao,afen,ashi;uchar code
table[]=“201-
”;
//液晶固定顯示內容 uchar code
table1[]=“
:
:
”;
void write_ds(uchar,uchar);
//函數申明 void set_alarm(uchar,uchar,uchar);void read_alarm();uchar read_ds(uchar);void set_time();
四、心
得
體
會
在本次電子時鐘設計中對單片機的內部結構有了一定的了解,熟悉了各個引腳的功能,同時熟知了1602LCD液晶、DS12C887時鐘芯片的使用,以及各種電路的功能。
通過此次課程設計,無論是從軟件方面還是硬件方面,都進一步學習和鞏固了程序的總體設計和單片機的應用。在軟件方面,進一步熟悉了各條指令的功能及用法,定時、中斷的用法,更深一步學習了用C語言編寫實現電子時鐘的功能。在硬件方面,進一步熟悉并使用了keil軟件,在keil中編程,調試,運行;對電路的一些基本結構和設計有了更深一步的了解。在整個設計過程中,雖然出現了很多問題,有時確實叫人很心煩,但在發現問題后努力去解決,并獲得成功,這時會感到無比的快樂和具有成就感。只有自己動手去做,去應用,才能將學到的知識變成自己的。
程序不要光看不寫,一定要自己寫一次。最開始的時候,可能自己啥都不懂,這時可以抄人家的程序過來。但在抄的時候一定要看看每一句是干什么用的,來達到什么目的,運行后有什么后果,看明白了之后,就要自己寫一次。此時會發現,原來看明白別人的程序很容易,但到自己寫的時候卻一句也寫不出來,這就是差距。
單片機提高重在實踐,想要學好單片機,軟件編程必不可少。但是熟悉硬件對于學好單片機也是非常重要的。如何學習好硬件,動手實踐是必不可少的。我們可以通過自己動手做一個自己的電子制作,通過完成它,以提高對一些芯片的了解和熟練運用。這樣我們就可以多了解一些芯片的結構。
我學習的目標是希望在若干年以后能夠獨立設計一個復雜的系統,包括硬件電路和軟件部分。總之,通過這次電子技術設計我學到了許多,似乎離自己的目標又近了一步。
參
考
文
獻
[1]郭天祥.51單片機C語言教程.電子工業出版社.2009 [2]譚浩強.C程序設計.清華大學出版社.1991 [3]孫育才 王榮興
孫華芳.ATMEL新型AT89S52系列單片機及其應用.清華大學出版社.2006 [4]謝維成.單片機原理及應用與51程序設計.清華大學出版社.2006
[5]鮑宏亞.MCS—51系列單片機應用系統設計及實用技術.中國宇航出版社.2005 [6]趙文博
劉文濤.單片機語言C51程序設計.人民郵電出版社.2006 [7]求是科技.8051系列單片機C程序設計.人民郵電出版社.2006
第二篇:單片機課程設計電子時鐘說明書
《電子時鐘》 課程設計說明書
專業班級:
11級自動化<3>班
姓
名: 歐陽明長 李徐軍
陳龍
指導教師:
郭
玉
設計時間:
2013--12--17
物理與電氣工程學院
2013年12月17日
摘要
電子鐘在生活中應用非常廣泛,而一種簡單方便的數字電子鐘則更能受到人們的歡迎。所以設計一個簡易數字電子鐘很有必要。本電子鐘采用STC公司的AT89S52單片機為核心,使用12MHz 晶振與單片機AT89S52 相連接,通過軟件編程的方法實現以24小時為一個周期,同時8位7段LED數碼管(兩個四位一體數碼管)顯示小時、分鐘和秒的要求,并在計時過程中具有定時功能,當時間到達提前定好的時間進行蜂鳴報時。該電子鐘設有四個按鍵S12、S13、S14和S15鍵,進行相應的操作就可實現小時調整、分鐘調整和啟停功能。具有時間顯示、整點報時、校正等功能。走時準確、顯示直觀、運行穩定等優點。
關鍵詞 電子鐘;AT89S52;硬件設計;軟件設計
目錄 設計課題任務、功能要求說明及方案介紹……………………………………3 1.1 設計課題任務………………………………………………………………3 1.2 功能要求說明………………………………………………………………3 1.3 設計總體方案介紹及原理說明……………………………………………3 2 設計課題硬件系統的設計………………………………………………………3 2.1 設計課題硬件系統各模塊功能簡要介紹…………………………………4 3 設計課題軟件系統的設計………………………………………………………4 3.1 設計課題軟件系統各模塊功能簡要介紹…………………………………4 3.2 設計課題軟件系統程序流程框圖…………………………………………4 4 設計結論、仿真結果、誤差分析………………………………………………7 4.1 設計課題的設計結論及使用說明…………………………………………4 4.2 設計課題的誤差分析………………………………………………………7 4.3 設計體會……………………………………………………………………7 參考文獻 ……………………………………………………………………………7 附 錄 ……………………………………………………………………………8 1 設計課題任務、功能要求說明及方案介紹
1.1 設計課題任務
設計一個具有特定功能的電子鐘。具有啟停、時間顯示、報時等功能。并有時間設定,時間調整功能。
1.2 功能要求說明
設計一個具有特定功能的電子鐘。電子鐘上電從12時0分0秒開始運行,按下啟停鍵進入時鐘運行狀態;再按啟停鍵暫停運行,并且再次按下時能夠在原來的時間上繼續計時;運行到整點是能夠自動響鈴,通過外部按鍵可以進行實踐的調整,并且在運行時相應的LED燈等同步亮滅。
1.3 設計課題總體方案介紹及工作原理說明
本電子鐘主要由單片機、4*4獨立鍵盤、顯示接口電路和電源電路構成,設 計課題的總體方案如圖1.1所示:
圖1.1 總體設計方案圖
本電子鐘的所有的程序、參數均存放在AT89S52的內部RAM中。鍵盤采用動態掃描方式。利用單片機定時器產生定時效果通過編程形成數字鐘效果,再利用數碼管動態掃描顯示單片機內部處理的數據,同時通過端口讀入當前外部控制狀態來改變程序的不同狀態,實現不同功能。設計課題硬件系統的設計 2.1 設計課題硬件系統各模塊功能簡要介紹
本設計的硬件系統主要采用以下基本模塊來實現,單片機最小系統模塊,輸入模塊、輸出模塊、電源模塊。
(1)單片機最小系統模塊:包括8位微控制器AT89S52;電源復位電路;晶振電路。本模塊AT89S52系統控制核心,單片機系統復位由電源上電完成。
(2)輸入模塊:本模塊共用到了4個按鍵(S12、S13、S14、S15),分別完成時間的調整、啟停。1個電源開關(具有復位功能)。
(3)輸出模塊:本次設計顯示為8位,采用兩個四位一體數碼管(共陽極)8個PNP三極管驅動,并且還有蜂鳴器模塊。(4)電源模塊:USB供電及下載器。
設計課題軟件系統的設計
3.1 設計課題軟件系統個模塊功能簡要介紹
本設計的軟件系統主要采用以下基本模塊來實現,主程序、中斷服務程序、鍵盤輸入程序模塊、數碼管及其驅動模塊和延時模塊。
主程序:主要是用于對輸入信號的處理、輸出信號的控制和對各個功能程序模塊的控制。
中斷服務程序:主要是用于電子鐘的1S延時。鍵盤輸入程序模塊:主要是用于完成特定時間調整。
數碼管及其驅動模塊:主要是用于驅動數碼管及利用數碼管顯示時間。延時模塊:短延時用于數據的動態顯示,按鍵的判斷。
3.2 設計課題軟件系統程序流程框圖
系統程序采用匯編語言按模塊化方式進行設計,然后通過Keil軟件開發平臺將程序轉變成可燒寫文件。
主循環程序框圖如3.1所示;判斷進位程序如3.2所示; 計時一秒中斷程序如3.3所示; 啟停中斷框圖如3.4所示; 延時子程序框圖如3.5所示; 圖3.1 主循環程序 5
圖3.2 判斷進位子程序
圖3.3 計時一秒中斷
圖3.4 啟停中斷程序
圖3.5 延時子程序 設計結論、運行結果、誤差分析
4.1 設計課題的設計結論及使用說明
本設計為基于單片機的電子鐘的設計。剛開始,我們很多地方理不清頭緒,無從下手,只能從平時的實驗中得到一些方法,但通過認真研究設計課題,找書上網查資料,確定基本設計方案,對所用芯片功能進行查找、調試,設計中有四個按鍵,其中S12為分鐘加1調整,S13為小時加1調整,S14為外部響鈴按鍵,S15為啟停按鍵,另外當整點時間到時,蜂鳴器報警。這樣的結果與設計基本相符,基本上完成了設計任務。
4.2 設計課題的誤差分析
該電子鐘在運行中存在一定的誤差,誤差產生有三種原因,首先是采用的計時利用中斷來實現。而當電子鐘運行時間1秒時,又得去執行中斷程序,這個過程需要幾個機器周期。第二,硬件系統有一定的影響。第三,設計用到12MHz晶振,計算是滿20次為一秒鐘,實際會慢很多。
4.3 設計體會
本次課程設計,讓我們三人受益匪淺,認識到了自己的許多缺點和不足,使我深深的感受到了理論聯系實際的必要性及其重要性。
參考文獻
[1] 李全利.單片機原理與接口技術[M].高等教育出版社.2009.1.[2] 劉文秀.單片機應用系統仿真的研究[J].現代電子技術.2005, 第286 期.[3] 胡學海.單片機原理及應用系統設計[M],北京:電子工業出版社,2005.[4] 李廣第.單片機基礎[M],北京航空航天大學出版社,2006.7.附錄
程序代碼為:
ORG 0000H LJMP START ORG 0003H LJMP INTT0 ORG 0013H LJMP INTT1 ORG 000BH LJMP INTT ORG 0100H START:SETB EA SETB ET0 SETB IT0 SETB EX0 SETB IT0 SETB EX1 SETB IT1 MOV R7,#16 MOV TMOD,#01H MOV TH0,#15536/256 MOV TL0,#15536 MOD 256 MOV R0,#12 MOV R1,#0 MOV R2,#0 MOV R6,0FEH CLR TR0 L1:
LCALL PANDUAN;*****************
;記秒
MOV A,R2
MOV B,#10
DIV AB
MOV P2,#0FDH
LCALL XIANSHI
LCALL DELAY
MOV A,B
MOV P2,#0FEH
LCALL XIANSHI
LCALL DELAY;***************
;調分
JB P3.0,L40 L41:JB P3.0,L42 LJMP L41 L42:INC R1
;計分
L40: MOV A,R1
MOV B,#10
DIV AB
MOV P2,#0EFH
LCALL XIANSHI
LCALL DELAY
MOV A,B
MOV P2,#0F7H
LCALL XIANSHI
LCALL DELAY
MOV P2,#0FBH
MOV P0,#0BFH
LCALL DELAY;******************
;調時
JB P3.1,L45 L47:JB P3.1,L46 LJMP L47 L46:INC R0
;計時
L45: MOV A,R0
MOV B,#10
DIV AB
MOV P2,#07FH
LCALL XIANSHI
LCALL DELAY
MOV A,B
MOV P2,#0BFH
LCALL XIANSHI
LCALL DELAY
MOV P2,#0DFH
MOV P0,#0BFH
LCALL DELAY
;*************************;判斷5分鐘鬧鈴
CJNE R1,#5,L51
CLR P3.5
MOV P1,R6
MOV A,R6
RL A
MOV R6,A
LJMP L52 L51:CJNE R1,#6,L52
SETB P3.5 L52: LJMP L1
;***************;執行1秒鐘
INTT:DJNZ R7,L33
MOV R7,#16
INC R2
MOV P1,R6
MOV A,R6
RL A
MOV R6,A L33:RETI;*********************
;外部中斷
INTT0:CPL P3.5
MOV P1,#0
RETI;***********************
;啟停功能
INTT1:MOV P1,#0
LCALL DELAY
JB P3.3,L97
CPL TR0
L97: RETI;**********************
;顯示子程序
XIANSHI:MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
RET
;**********************
;延時子程序
DELAY:MOV R3,#20
DEL1:MOV R4,#50
DEL2:DJNZ R4,DEL2
DJNZ R3,DEL1
RET
;*******************
;判斷進位子程序
PANDUAN:
CJNE R2,#60,L31
MOV R2,#0
INC R1
L31:CJNE R1,#60,L32
MOV R1,#0
INC R0
L32:CJNE R0,#24,L35
MOV R0,#0
L35:RET
;********************
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,90H
END
第三篇:單片機課程設計報告,單片機電子時鐘
題 目:單片機課程設計報告
目 錄
一、設計目的二、程設計具體要求
三、單片機發展簡史
四、8051單片機系統簡介
五、8051單片機內部定時器/計數器簡介
六、程序電路
七、程序流程
八、程序代碼
九 實驗總結-要求寫出完整的論文以及心得體會
十 參考資料及小結
原 文 :一.目的1. 進一步熟悉和掌握8051單片機的結構及工作原理。
2. 掌握單片機的接口技術及相關外圍芯片的外特性,控制方法。
3. 通過課程設計,掌握以單片機核心的電路設計的基本方法和技術,了解表關電路參數的計算方法。
4. 通過實際程序設計和調試,逐步掌握模塊化程序設計方法和調試技術。
5. 通過完成一個包括電路設計和程序開發的完整過程,使學生了解開發一單片機應用系統的全過程,為今后從事相應打下基礎。
二.課程設計的體要求
a)原理圖設計。
1. 原理圖設計要符合項目的工作原理,連線要正確,端了要不得有標號。
2. 圖中所使用的元器件要合理選用,電阻,電容等器件的參數要正確標明。
3. 原理圖要完整,CPU,外圍器件,擴器接口,輸入/輸出裝置要一應俱全。
b)程序調計
1. 根據要求,將總體項能分解成若干個子功能模塊,每個功能模塊完成一個特定的功能。
2. 根據總體要求及分解的功能模塊,確定各功能模塊之間的關系,設直出完整的程序流程圖。c)程序調試將設計完的程序輸入,匯編,排除語法錯誤,生成*OBJ文件。
1. 按所設計的原理圖,在實驗平臺上連線,檢查無誤。
2. 將匯編后生成的*OBJ文件傳送到實驗裝置的,執行該程序,檢查該程序、是否達到設計要求,若未達
到,修改程序,直到達到要求為止,d)說明書
1. 原理圖設計說明
簡要說明設計目的,原理圖中所使用的元器件功能及在圖中的作用,各器件的工作過程及順序。
2. 程序設計說明
對程序設計總體功能及結構進行說明,對各子模塊的功能以及各子模塊之間的關系作較詳細的描述。
3. 畫出工作原理圖,程序流程圖并給出程序清單。
目前,單片機已廣泛應用到圖民經濟建設和日常生活的許多領域,成為測控技術現代化必不可少的重要工具。
單片機電子時鐘
作者:佚名來源:本站原創點擊數:
491更新時間:2007年06月27日
DS1302是Dallas公司生產的一種實時時鐘芯片。它通過串行方式與單片機進 行數據傳送,能夠向單片機提供包括秒、分、時、日、月、年等在內的實時時間
信息,并可對月末日期、閏年天數自動進行調整;它還擁有用于主電源和備份電源的雙電源引腳,在主電源關閉的情況下,也能保持時鐘的連續運行。另外,它還能提供31字節的用于高速數據暫存的RAM。鑒于上述特點,DS1302已在許多單片機系統中得到應用,為系統提供所需的實時時鐘信息。
一、DS1302的主要特性
1.引腳排列
500)this.width=500 border=0>
圖1DS1302引腳排列圖
DS1302的引腳排列如圖1所示,各引腳的功能如下:
X1,X2——32768Hz晶振引腳端;
RST——復位端;
I/O——數據輸入/輸出端;
SCLK——串行時鐘端;
GND——地;
VCC2,VCC1——主電源與后備電源引腳端。
2.主要功能
DS1302時鐘芯片內主要包括移位寄存器、控制邏輯電路、振蕩器、實時時鐘電路以及用于高速暫存的31字節RAM。DS1302與單片機系統的數據傳送依靠RST,I/O,SCLK三根端線即可完成。其工作過程可概括為:首先系統RST引腳驅動至高電平,然后在作用于SCLK時鐘脈沖的作用下,通過I/O引腳向DS1302輸入地址/命令字節,隨后再在SCLK
時鐘脈沖的配合下,從I/O引腳寫入或讀出相應的數據字節。因此,其與單片機之間的數據傳送是十分容易實現的。
二、時鐘的產生及存在的問題
(1)在實際使用中,我們發現DS1302的工作情況不夠穩定,主要表現在實時時間的傳送有時會出現誤差,有時甚至整個芯片停止工作。我們對DS1302的工作電路進行了分析,其與單片機系統的連接如圖2所示。從圖中可以看出,DS1302的外部電路十分簡單,惟一外接的元件是32768Hz的晶振。通過實驗我們發現:當外接晶振電路振蕩時,DS1302計時正確;當外接晶振電路停振時,DS1302計時停止。因此,我們認為32768Hz晶振是造成 DS1302工作不穩定的主要原因。
500)this.width=500 border=0>
圖2DS1302與單片機系統的連接圖
(2)DS1302時鐘的產生基于外接的晶體振蕩器,振蕩器的頻率為32768Hz。該晶振通過引腳X1、X2直接連接至DS1302,即DS1302是依靠外部晶振與其內部的電容配合來產生時鐘脈沖的。由于DS1302在芯片本身已經集成了6pF的電容,所以,為了獲得穩定可靠的時鐘,必須選用具有6pF負載電容的晶振。
然而,許多人在選用晶振時僅僅注意了晶振的額定頻率值,而忽視了晶振的負載電容大小,甚至連許多經銷商也不能提供所售晶振的負載電容。所以即使在使用中選用了符合32768Hz的晶振,但如果該晶振的負載電容與DS1302提供的6pF不一致時,就會影響晶振的起振或導致振蕩頻率的偏移,出現上述在應用中的問題。
三、利用輔助電容實現負載匹配
(1)當所選的晶振負載電容不是6pF時,可以采用增加輔助電容的方法提高或降低DS1302振蕩器的電容性負載,使之與晶體所需的電容值匹配。如果已知晶體的負載電容為CI,若CI<6pF,則可以增加一個并聯電容CS以產生所需的總負載電容CI,即CI=6pF+CS;若CI>6pF,則可以在晶體的一端增加一個串聯電容CS,以產生所需的負載電容CI,即1/CI=1/6pF+1/CS,通過計算即可得出應增加的輔助電容大小。輔助電容的接法如圖3所示。
圖3CS連接電路圖
(2)在使用前對晶體的負載電容并不知道的情況下,通過測定晶體振蕩頻率的方法可以確定該晶體的負載電容。
對于晶體振蕩器來說,其振蕩頻率與負載電容之間的關系是確定的。以本文討論的DS1302使用的32768Hz晶振為例:當它工作于所要求的負載電容時,能較準確地產生 32768Hz的頻率;當它的負載電容小于6pF時,其振蕩頻率會正向偏移;當它的負載電容大于6pF時,其振蕩頻率就會負向偏移。因此,對于未知負載電容的晶體應首先采用實驗的方法,在其兩端加入輔助電容使晶體起振,然后用頻率計測出振蕩頻率。若測得頻率大于32768Hz,說明負載電容偏小;若測得頻率小于32768Hz,說明負載電容偏大。對輔助電容逐步調整,最終使振蕩頻率盡可能接近32768Hz,則此時晶體端所接負載電容的總和就是適合該晶體的負載電容。
結論
以上方法經我們在實際工作中多次使用,證明確實有效。它放寬了DS1302在使用中對晶振的條件要求,增強了DS1302在工作中的穩定性,對DS1302更廣泛地應用具有積極的意義。
華東交大理工學院_2007-2008 _學年第_ 一 學期
課程設計安排計劃
班級:_05應電__課程:_單片機原理及接口技術_
一、課程設計題目:數碼管時鐘電路的設計
二、設計內容及要求:
LED數碼管時鐘電路24小時計時方式,時、分、秒用6位數碼管顯示。選用AT89C2051單片機,12MHZ晶振,6位共陽數碼管,要求有調時功能,其他功能學生可自由發揮。
三、設計方法與步驟:
1.設計硬件原理電路,選擇元器件、確定其參數。
2.設計印刷電路板電路(用面包板做)、焊接硬件電路。
3.設計匯編語言程序,調試硬件電路和程序。
4.編寫課程設計報告。
四、設計時間安排:
1.第十九周:周一、二,設計硬件原理電路,選擇元器件、確定其參數。
周三、四、五,設計印刷電路板電路(用面包板做)、焊接硬件電路。
2.第二十周:周一、二,設計匯編語言程序。
周三、四,燒錄程序,調試硬件電路和程序。
周五,編寫課程設計報告。
指導老師: 楊威
時間: 2007、1
第四篇:單片機電子時鐘課程設計報告
青島理工大學琴島學院 課題名稱:單片機原理及應用課程設計學院:
專業班級:
學號:
學生:
指導教師:
設 計 報 告
第五篇:基于單片機的時鐘控制器設計
時鐘控制器設計任務書
1.設計目的與要求
設計出一個用于數字時鐘的控制器,準確地理解有關要求,獨立完成系統設計,要求所設計的電路具有以下功能:
(1)顯示: 可以顯示時、分和秒
(2)調時功能:時(0-24)、分和秒(0-60)可以連續可調(3)時間日誤差< 2秒(4)增加整點報時功能(5)增加鬧鐘任意設定功能 2.設計內容
(1)畫出電路原理圖,正確使用邏輯關系;(2)確定元器件及元件參數;(3)進行電路模擬仿真;(4)SCH文件生成與打印輸出;(5)PCB文件生成與打印輸出; 3.編寫設計報告
寫出設計的全過程,附上有關資料和圖紙,有心得體會。4.答辯
在規定時間內,完成敘述并回答問題。
目錄
1.引言…………………………………………………………………………-1-2 總體設計方案………………………………………………………………-1-2.1 設計思路…………………………………………………………………-1-2.2 方案確立…………………………………………………………………-1-2.3 設計方框圖………………………………………………………………-2-3 設計原理分析………………………………………………………………-2-3.1 系統硬件電路設計 ……………………………………………………-2-3.2 主控器件AT89S51 ………………………………………………………-2-3.3 譯碼器74HC245 …………………………………………………………-3-3.4 顯示電路 …………………………………………………………………3-3.5 按鍵電路…………………………………………………………………-4-3.6 復位電路…………………………………………………………………-4-3.7 蜂鳴電路…………………………………………………………………-5-3.8 時鐘電路…………………………………………………………………-5-3.9 總體原理圖………………………………………………………………-5-3.10程序框圖…………………………………………………………………-5-4 結束語………………………………………………………………………-7-參考文獻………………………………………………………………………-8-附錄 1 電路總原理圖 ………………………………………………………-9-附錄 2 總程序………………………………………………………………-10-
基于單片機控制的時鐘控制器
摘要:本設計以Atmel公司的AT89S51單片機為控制系統的核心,模型采用單片機作為主控制器,以匯編語言為程序設計的基礎,設計的一個用兩個四位一體數碼管串口顯示的時鐘控制電路,包含了時鐘控制電路的基本功能:數碼顯示,時間調整,鬧鐘設定,秒表顯示等,按照二十四小時循環,具有調節方便,簡單實用,可靠性強的優點,有很高的利用價值。關鍵詞:單片機 AT89C51 74LS245 數碼管 引言
數字鐘是采用數字電路實現對時、分、秒及數字顯示的計時裝置,廣泛用于個人家庭、車站、碼頭、辦公室等公共場所,成為人們日常生活中不可少的必需品,由于數字集成電路的發展和石英晶體振蕩器的廣泛應用,使得數字鐘的精度,遠遠超過老式鐘表,鐘表的數字化給人們生產生活帶來了極大的方便,而且大大地擴展了鐘表原先的報時功能。諸如定時自動報警、按時自動打鈴、時間程序自動控制、定時廣播、自動起閉路燈、定時開關烘箱、通斷動力設備、甚至各種定時電氣的自動啟用等,所有這些,都是以鐘表數字化為基礎的。因此,研究數字鐘及擴大其應用,有著非常現實的意義。為了適應時代的潮流,本設計采用AT89S51單片機為核心,使得計時的精度有了很大的提高,而且調節也變的簡單實用,采用數字顯示也跟加的直觀方便。總體設計方案
2.1 設計思路
本設計采用AT89S51單片機為控制核心,產生精確的時鐘震蕩,來控制數碼管顯示電路來進行數碼顯示,外圍電路主要有復位電路,震蕩電路,按鍵電路,顯示電路,蜂鳴電路組成;復位電路可及時的對單片機進行復位,恢復到初始的狀態,震蕩電路主要用于計數,定時,產生合適的波特率,按鍵電路主要是給人們提供一個合適的人機對話的界面,方便人們進行實時的調節,顯示電路主要用于數碼的顯示,蜂鳴電路用于鬧鈴設定等輔助功能。2.2 方案確立
本設計主要有包含了時鐘電路,按鍵掃描,顯示電路等幾個部分。由單片機實現時鐘功能單片機內部具有定時器,可方便實現定時功能。按鍵電路:鍵盤分為矩陣式鍵盤掃描電路和獨立式按鍵電路。。矩陣式鍵盤電路,此類鍵盤是采用行列掃描方式,優點是當按鍵較多時可以降低占用單片機的I/O口數目,缺點是電路復雜且會加大編程難度。獨立按鍵電路,每個鍵單獨占有一根I/O接口線,每個I/O口的工作狀態互不影響,此類鍵盤采用端口直接掃描方式。缺點是當按鍵較多時占用單片機的I/O數目較多,優點是電路設計簡單,且編程極其容易。由于該系統采用了常規鐘表式的校對方式,用鍵較少,系統資源足夠用,故采用了獨立按鍵電路。顯示電路分為:靜態顯示法與動態顯示法,由于靜態顯示法需要數據鎖存器等硬件,接口復雜一些,又考慮到時鐘顯示只有6位,且系統沒有其它復雜的處理任務,所以決定采用動態顯示法。2.3 硬件設計方框圖
電路的設計以AT89S51單片機為核心,包含了按鍵電路,復位電路,震蕩電路,數 碼顯示電路,整點報時電路等一系列獨立環節,下面介紹一下電路設計過程中的總體框圖,如圖1所示。
圖1 時鐘電路總體框圖 設計原理分析
用AT89S51單片機控制的數字時鐘電路,外接震蕩電路,按鍵電路,顯示電路,蜂鳴電路等:用單片機電路P0口來輸出7段碼數據,P2.0~P2.5口作列掃描輸出;按鍵用P1口控制,分別用于調節時,分,以及秒表和鬧鐘的設定;P1.7口接5V的小蜂鳴器,用于按鍵發音以及定時提醒,整點報時提醒等;采用74HC245作為數碼管的段碼驅動,為了提供共陽LED數碼管的列掃描驅動電壓,用三極管8550做電源的驅動輸出;采用12MHZ晶振,可提高秒計時的精確性;在軟件設計方面,應完成時鐘控制電路的各項要求。
3.1 系統硬件電路設計
系統硬件電路主要組成:主控制器AT89S52、譯碼器74HC245、顯示電路、蜂鳴器電路,復位電路時鐘電路。3.2 主控器件AT89C51 AT89S51是一款低功耗,高性能CMOS 8位單片機,片內含4k Bytes ISP(In-system programmable)的可反復擦寫1000次的Flash只讀程序存儲器,器件采用ATMEL公司的高密度、非易失性存儲技術制造,兼容標準MCS-51指令系統及80C51引腳結構,芯片內集成了通用8位中央處理器和ISP Flash存儲單元,AT89S51在眾多嵌入式控制應用系統中得到廣泛應用。管腳如圖2所示。
圖2 DIP-40封裝89C51引腳圖
3.3譯碼器74LS245 74LS245是我們常用的芯片,用來驅動led或者其他的設備,它是8路同相三態雙向總線收發器,可雙向傳輸數據。74LS245還具有雙向三態功能,既可以輸出,也可以輸入數據。當89S51單片機的P0口總線負載達到或超過P0最大負載能力時,必須接入74LS245等總線驅動器。當片選端/CE低電平有效時,DIR=“0”,信號由 B 向 A 傳輸;(接收)DIR=“1”,信號由 A 向 B 傳輸;(發送)當CE為高電平時,A、B均為高阻態。P0口與74LS245輸入端相連,E端接地,保證數據線暢通。管腳如圖3所示。
圖3 74LS245管腳圖
3.4 顯示電路
LED顯示塊是由發光二極管顯示字段的顯示器件。這種顯示塊有共陰與共陽兩種結構。共陰極LED顯示塊的發光二極管陰極共地,當某個發光二極管的陽極為高電平時,發光二極管點亮。共陽極LED顯示塊的放光二極管陽極并接。顯示塊與單片機接口非常容易,只要將一個8位并行輸出口語顯示塊的發光二極管引腳相連即可(AT89S51需要加上拉電阻)。此次電路采用2個4位共陽LED數碼管,從P0口輸出段碼,列掃描用P2.0~P2.7來實現。如圖4所示。
圖4 74LS245驅動段碼顯示電路圖
3.5 按鍵電路
按鍵調節電路有四個獨立的按鍵接到P1口的P1.0—P1.3端口,控制著電路的調時,調分以及秒表功能和鬧鐘的設定。具體電路如下圖5所示。
圖5 按鍵電路圖
3.6 復位電路
AT89S51單片機的復位電路,如圖5所示中左邊電路。在RESET輸入端出現高電平時實現復位和初始化。在震蕩器運行的情況下,要實現復位操作,必須使RST引腳至少 保持兩個機器周期的高電平。在CPU在第二個機器周期內執行內部復位操作,以后每一個機器周期重復一次,直至RST端電平變低復位期間不產生ALE信號。當RST引腳返回低電平以后,CPU從0地址開始執行程序。3.7 蜂鳴電路
蜂鳴器是廣泛應用于各種電子產品的一種元器件,它用于提示、報警、音樂等許多應用場合。三極管8550作蜂鳴器的驅動,增加了蜂鳴器的驅動電流。蜂鳴器的正極性的一端接到三極管的集電極,另一端連接到地,三極管的基極由單片機的P1.7管腳控制,底電平時蜂鳴器響,高電平時不響。另外,蜂鳴器的聲音大小及音調可以通過調整P1.7管腳的置低時間及輸出的波形進行控制。蜂鳴器的連接電路的原理圖如圖5所示。3.8 時鐘電路
AT89S51內部片內有一個由反相放大器構成的振蕩電路,XTAL1和XTAL2分別為震蕩電路的輸入端和輸出端。時鐘可以由內部方式產生或外部方式產生。在XTAL1和XTAL2引腳上外接定時元件,內部震蕩電路就產生自己震蕩。定時元件通常采用石英晶體和電容組成的并聯諧振回路。外部方式的時鐘電路,XTAL1接地,XTAL2接外部振蕩器。一般要求輸入方波信號的頻率低于33Mhz。本文設計的系統采用的是內部方式的時鐘電路。如圖6所示。
圖6 時鐘電路原理圖
3.9 總體原理圖
見附錄1 3.10程序框圖
主程序如圖7所示首先是初始化部分,主要是計時單元清零,中斷初始化,啟動定時器工作,然后是調用顯示子程序,接著是判斷有無按鍵。無按鍵則回到調用顯示子程序處;有按鍵,則執行按鍵處理子程序,執行完后回到調用顯示子程序處,重復循環。定時器T0中斷如圖8所示
圖7 主程序流程圖
圖8 中斷程序流程圖 結束語
三周實習很快就過去了,通過自行設計、焊接和調試一個單片機系統,我熟悉了單片機基本的開發流程和單片機的深入學習。在完成這個設計的同時,我復習了書本上的許多相關內容,受益匪淺。因此我在獲得理論知識的同時,實踐中也獲得了許多書本上沒有的東西。提高了調試以及查找并解決問題的能力,我深入了解了焊普通元件與電路元件的技巧、數字時鐘的工作原理及其它各電路元件的作用等。這些知識不僅在課堂上有效,對以后的學習工作有很大的指導意義,在日常生活中更是有著現實意義;也對自己的動手能力是個很大的鍛煉。實踐出真知,縱觀古今,所有發明創造無一不是在實踐中得到檢驗的。沒有足夠的動手能力,就奢談在未來的科研尤其是實驗研究中有所成就。最后,感謝老師對我們這次實習的辛勤指導和幫助。
參考文獻
[1] 李光飛,樓然苗,胡佳文編著.單片機課程設計實例指導.北京:北京航空航天大學出版社.2004 [2] 黃仁欣主編.單片機原理及應用技術.北京: 清華大學出版社.2005.[3] 高吉祥主編.電子技術基礎實驗與課程設計.北京:電子工業出版社.2002 [4] 肖玲妮.印刷電路板設計教程.[M].北京:清華大學出版社,2003.[5] 康華光.電子技術基礎.[M].北京;高等教育出版社,2006.[6] 余小平等.電子系統設計.[M].北京:北京航空航天大學出版社,2007.附錄1: 11 電路總原理圖
附錄2: 總程序
ORG 0000H LJMP START ORG 000BH LJMP INIT0 START: MOV 70H,#0 MOV 71H,#0 MOV 72H,#0 MOV 73H,#0 MOV 74H,#0 MOV 75H,#0 MOV 76H,#0 MOV 77H,#0 MOV 78H,#0 MOV 79H,#0 MOV 7AH,#0 MOV 7BH,#0 MOV 7CH,#0 MOV 7DH,#0 MOV 7EH,#0 MOV 72H,#0AH;對連字符進行裝值
MOV 75H,#0AH MOV 60H,#0 MOV 61H,#0 MOV 63H,#0 MOV 64H,#0 CLR P1.7 MOV TMOD,#01H;選擇定時器/計數器T0的方式1 MOV TL0,#0B0H;對低位賦初值 MOV TH0,#03CH;高位賦初值 SETB EA SETB ET0 SETB TR0 START1: LCALL SCAN LCALL KEYSCAN SJMP START1 DL1MS: MOV R6,#14H;延時1子程序 DL1: MOV R7,#19H DL2: DJNZ R7,DL2 DJNZ R6,DL1 RET DELAY: MOV R6,#10 D1: MOV R7,#30 DJNZ R7,$ DJNZ R6,D1 RET
DL20MS: ACALL SCAN;延時20ms子程序 ACALL SCAN ACALL SCAN RET
;整點報時將秒和分的單元與零比較 SCAN: MOV A,7EH;7F單元的內容為0
CJNE A,79H,NEXT MOV A,7DH
CJNE A,7AH,NEXT SETB P1.7 AJMP NEXT1 NEXT: CLR P1.7 NEXT1:
MOV A,79H
CJNE A,#0,NEXT2 MOV A,78H
CJNE A,#0,NEXT2 SETB P1.7 LJMP NEXT3 NEXT2:CLR P1.7
;數碼管總顯示程序開始分兩部分
;校正時間和數碼管正常工作的顯示程序 NEXT3: MOV A,78H MOV B,#0AH
DIV AB;時間秒的十位送給A,時間秒的個位送B
MOV 71H,A;時間秒要顯示的十位
MOV 70H,B;時間秒要顯示的個位
MOV A,79H MOV B,#0AH
DIV AB;時間分的十位送給A,時間分的個位送B
MOV 74H,A;時間分要顯示的十位送地址
MOV 73H,B;時間分要顯示的個位送地址
MOV A,7AH MOV B,#0AH DIV AB;時間時的十位送給A,時間時的個位送B MOV 77H,A;時間時顯示的十位送地址
MOV 76H,B;時間時要顯示的個位送地址
MOV R1,#70H LCALL DL1MS JB P1.2,LAST HERE3:JNB P1.2,HERE3 INC 7EH MOV A,7EH
CJNE A,#3CH,LOOP3 MOV 7EH,#00H;調制鬧鈴的時間顯示 LOOP3: MOV DPTR,#TAB MOV R5,#0FEH MOV A,7DH MOV R3,#09H
MOV B,#10 SCAN1: MOV A,R5;數碼管正常工作的顯 DIV AB 示程序
MOV 64H,A MOV P2,A MOV 63H,B MOV A,@R1 MOV A,7EH MOV DPTR,#TAB
MOV B,#10 MOVC A,@A+DPTR;對字段表取值 DIV AB 顯示
MOV 61H,A MOV P0,A MOV 60H,B MOV A,R5 MOV P2,#0F7H LCALL DL1MS MOV A,60H INC R1 MOVC A,@A+DPTR MOV A,R5 MOV P0,A RL A LCALL DELAY MOV R5,A MOV P2,#0EFH DJNZ R3,SCAN1 MOV A,61H MOV P2,#00H MOVC A,@A+DPTR MOV P0,#00H MOV P0,A JB P1.3,QQ LCALL DELAY LCALL DL1MS MOV P2,#0DFH JB P1.3,QQ MOV P0,#40H HERE: JNB P1.3,HERE LCALL DELAY SJMP LOOP1 MOV P2,#0BFH
MOV A,63H QQ: LJMP LAST MOVC A,@A+DPTR LOOP1:JB P1.1,LOOP2 MOV P0,A LCALL DL1MS LCALL DELAY JB P1.1,LOOP2 MOV P2,#07FH HERE1:JNB P1.1,HERE1 MOV A,64H INC 7DH MOVC A,@A+DPTR MOV A,7DH
MOV P0,A CJNE A,#18H,LOOP2 LCALL DELAY MOV 7DH,#00H JB P1.3,LOOP4 LOOP2:JB P1.2,LOOP3 LCALL DL1MS 14 JB P1.3,LOOP4 HERE4:JNB P1.3,HERE4 LJMP LAST LOOP4:LJMP LOOP1 LAST: RET;“0~9”和“-”的字段表 TAB:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H
;定時/計數器T0中斷程序 INIT0: PUSH ACC PUSH PSW CLR ET0 CLR TR0 MOV TL0,#0B0H MOV TH0,#03CH SETB TR0 INC 7BH MOV A,7BH CJNE A,#14H,OUTT0;50ms是否到20次,沒有到就繼續執行50ms的延時
MOV 7BH,#00 INC 78H MOV A,78H CJNE A,#3CH,OUTT0;一秒的延時是否計到60次,沒有就繼續執行
MOV 78H,#00 INC 79H MOV A,79H CJNE A,#3CH,OUTT0 MOV 79H,#00 INC 7AH MOV A,7AH CJNE A,#18H,OUTT0;60分鐘的延時是否計到24次,沒有就繼續執行程序 MOV 7AH,#00 OUTT0: SETB ET0;啟動定時器T0 POP PSW POP ACC RETI;按鍵處理程序 KEYSCAN:CLR EA
JNB P1.0,KEYSCAN0;P1.0有按鍵按下則跳轉到子程序
JNB P1.1,KEYSCAN1;P1.1有按鍵按下則跳轉到子程序
JNB P1.2,KEYSCAN2;P1.2有按鍵按下則跳轉到子程序
KEYOUT: SETB EA RET
KEYSCAN0:LCALL DL20MS;20ms的延時消抖
JB P1.0,KEYOUT WAIT0: JNB P1.0,WAIT0;判斷按鍵是否松手,松手就往下執行程序 INC 7CH MOV A,7CH CLR ET0 CLR TR0
CJNE A,#04H,KEYOUT;按下第一次和第二次對時、分選定
MOV 7CH,#00;按下第三次時就啟動計時
SETB ET0 SETB TR0 LJMP KEYOUT
KEYSCAN1:LCALL DL20MS;按鍵加一的程序
JB P1.1,KEYOUT WAIT1: JNB P1.1,WAIT1 MOV A,7CH
CJNE A,#03H,KSCAN11;如果功能鍵按下則對時加一調整 INC 78H MOV A,78H
CJNE A,#60,KEYOUT MOV 78H,#00 LJMP KEYOUT
KSCAN11: CJNE A,#02H,KSCAN12 INC 79H MOV A,79H
CJNE A,#60,KEYOUT;如果加到60則清零
MOV 79H,#00 LJMP KEYOUT KSCAN12:CJNE A,#01H,KEYOUT INC 7AH;如果功能鍵是按下第二次則對分進行加一調整
MOV A,7AH CJNE A,#18H,KEYOUT MOV 7AH,#00 LJMP KEYOUT KEYSCAN2:LCALL DL20MS;延時消抖程序 JB P1.2,KEYOUT WAIT2: JNB P1.2,WAIT2;判斷是否放開按鍵
MOV A,7CH;如果功能鍵是按下第一次對時進行減一 CJNE A,#03H,KSCAN22 DEC 78H MOV A,78H CJNE A,#00H,KEYOUT MOV 78H,#3BH LJMP KEYOUT KSCAN22:CJNE A,#02H,KSCAN23 DEC 79H MOV A,79H CJNE A,#00H,KEYOUT1 MOV 79H,#3BH LJMP KEYOUT KSCAN23:CJNE A,#01H,KEYOUT1 DEC 7AH MOV A,7AH;如果功能鍵是按下第二次則對分進行減一 CJNE A,#00H,KEYOUT1 MOV 7AH,#17H LJMP KEYOUT1 KEYOUT1: SETB EA RET END