第一篇:單片機課程設(shè)計電子鐘
課程設(shè)計任務(wù)書
(指導(dǎo)教師填寫)
課程設(shè)計名稱電子技術(shù)課程設(shè)計學(xué)生姓名專業(yè)班級設(shè)計題目數(shù)字鐘
一、課程設(shè)計的任務(wù)和目的任務(wù):設(shè)計一臺能顯示“時”、“分”、“秒”的數(shù)字鐘,周期為24小時;具有校時、正點報時功能。
目的:培養(yǎng)學(xué)生綜合運用所學(xué)知識的能力,綜合設(shè)計能力,培養(yǎng)動手能力及分析問題、解決問題的能力。
二、設(shè)計內(nèi)容、技術(shù)條件和要求
1.數(shù)字鐘可顯示“時”、“分”、“秒”,且“時”、“分”、“秒”分別用兩個數(shù)碼管顯示,計滿23小時60分鐘60秒,則全部清零。
2.具有校時功能,時、分校時用1HZ的信號進(jìn)行,而秒較時用2HZ時鐘信號進(jìn)行。
3.整點能自動報時。要求報時聲響為四低一高,最后一響為整點,前四聲用500HZ信號讓喇叭發(fā)聲,最后一聲用1000HZ信號。
4.根據(jù)上述要求,畫出電路總框圖,簡述各部分工作原理。
5.進(jìn)行各部分電路的設(shè)計,要求有分析過程、原理圖表示。
6.對原理圖進(jìn)行仿真。
7.在實驗箱上組裝、調(diào)試。
8.撰寫設(shè)計總結(jié)報告。
三、時間進(jìn)度安排
第一周:理論設(shè)計。
周一上午布置設(shè)計任務(wù),講解設(shè)計要求,安排答疑、實驗時間;
周三、周四下午課程設(shè)計答疑,其他時間學(xué)生查資料,做初步理論設(shè)計;
周五交設(shè)計初稿,由指導(dǎo)教師審查;
第二周:仿真和安裝調(diào)試、撰寫設(shè)計總結(jié)報告
周一、二學(xué)生進(jìn)實驗室做仿真實驗,并根據(jù)實驗情況修正設(shè)計圖;
周三至周五做插接線實驗,最后根據(jù)實驗情況總結(jié)、撰寫設(shè)計說明書。
四、主要參考文獻(xiàn)
1.各種版本的數(shù)字電子技術(shù)基礎(chǔ)教材
2.各種版本的電子技術(shù)課程設(shè)計指導(dǎo)書
3.集成電路手冊
指導(dǎo)教師簽字:年月日
第二篇:單片機課程設(shè)計電子鐘設(shè)計
單片機課程設(shè)計電子鐘設(shè)計
目錄
一、摘要
二、設(shè)計任務(wù)
三、基本原理
數(shù)碼管顯示可以用靜態(tài)顯示或動態(tài)顯示方法。靜態(tài)顯示需要數(shù)據(jù)鎖存器等硬件,接口復(fù)雜,時鐘顯示用四個數(shù)碼管。動態(tài)顯示相對簡單,但需動態(tài)掃描,掃描頻率要大于人視覺暫留頻率,信息看起來才穩(wěn)定。譯碼方式可分為軟件譯碼和硬件譯碼,軟件譯碼通過譯碼程序查的顯示信息的字段碼;硬件譯碼通過硬件譯碼器得到顯示信息的字段碼,實際中通常采用軟件譯碼。
在具體處理時,定時器計數(shù)器采用中斷方式工作,對時鐘的形成在中斷服務(wù)程序中實現(xiàn)。在主程序中只需對定時器計數(shù)器初始化、調(diào)用顯示子程序和控制子程序。另外,為了使用便,設(shè)計了簡單的按鍵,可以通過按鍵實現(xiàn)時、分的調(diào)整,這樣在主程序中就加入了按鍵設(shè)置子程序。
四、編程算法思路
五、程序流程圖
六、硬件單元設(shè)計
七、軟件單元設(shè)計
八、調(diào)試結(jié)果分析
九、設(shè)計總結(jié)及心得體會
十、參考文獻(xiàn)
一設(shè)計任務(wù)
1、基本任務(wù):利用定時器/計數(shù)器中斷和靜態(tài)顯示或動態(tài)顯示,實現(xiàn)電子時鐘的時分秒精確走時和校準(zhǔn)
。時間顯示用四個數(shù)碼管分別顯示時、分、秒用點表示,在時和分的中間閃動,時間顯示格式(18:49)
時間校準(zhǔn)用2個鍵實現(xiàn):一個鍵K1作移位選擇(選中要修改的位,選中的位用閃爍指示),一個鍵K2做加1(對選中的位進(jìn)行加1修改)。
2、功能增強型任務(wù):在基本任務(wù)的基礎(chǔ)上加上日歷功能、準(zhǔn)時報時功能和跑表功能
(1)日歷功能:能實現(xiàn)時、分、秒和年、月、日計時,增加1個按鍵控制分3屏例如顯開始的第1屏默認(rèn)顯示“時、分、秒”四位+秒點,按下K3鍵顯示“月和日”四位,再按下課K3鍵顯示“年份”四位,再按下K3鍵顯示“時、分、秒”,依次類推。程序要能處理閏年、閏月功能。
(2)準(zhǔn)點報時功能:可以在增加一個按鍵K4設(shè)計具有鬧鐘功能,實現(xiàn)定點報時。具體操作是:按下
K4鍵,進(jìn)入鬧鐘設(shè)置功能,再通過K1、K2鍵來完成定點報警時間的設(shè)置。
(3)跑表功能:再增加一個按鍵K5設(shè)計跑表功能,實現(xiàn)啟動毫秒計數(shù),相當(dāng)與田徑運動比賽的跑
表工作。
三基本原理
軟件時鐘時利用單片機內(nèi)部的定時器/計數(shù)器來實現(xiàn)的,它的過程如下:首先定單片機內(nèi)部的一個定時器/計數(shù)器工作于定時方式,對機器周期形成基準(zhǔn)時間,然后用另一個定時器/計數(shù)器或軟件計數(shù)的方法對基準(zhǔn)時間計數(shù)形成秒,秒計60次形成分,分計60次形成小時,小時計24次則計滿一天。然后通過數(shù)碼管把它們的內(nèi)容在相應(yīng)位置顯示出來即可。
四編程算法思路
1、主程序的設(shè)計:串行口工作方式0,定時器/計數(shù)器1工作在方式1進(jìn)行初始化,然后通過循環(huán)(調(diào)用顯示子程序)等待定時中斷的到來。
2、按鍵的控制:KEY1控制時的調(diào)節(jié),kEY2控制分的調(diào)節(jié),KEY3控制時、分定型
3、中斷服務(wù)程序的設(shè)計:中斷服務(wù)程序主要功能是實現(xiàn)時、分、秒的計時處理。
4、時、分、秒計時的實現(xiàn):秒計時時采用中斷方式進(jìn)行溢出次數(shù)的累計得到的。從秒到分,從分到時可通過軟件的累加和比較到位方法來實現(xiàn)。要求每滿1秒,則“秒”單元中的內(nèi)容加1;“秒”單元每滿60,則“秒”單元清0,同時“分”單元中的內(nèi)容加1;“分”單元每滿60,則“分”單元清0,同時“時”單元加1。“時”單元每滿24,則將“時”單元清0。
5、顯示子程序:采用數(shù)碼管靜態(tài)顯示來顯示時鐘的走動
6,延時子程序:用來實現(xiàn)按鍵操控延時和實現(xiàn)整點12時報時
五程序流程圖
六硬件單元設(shè)計
1、電路總設(shè)計圖
2、AT89C51芯片
七軟件單元設(shè)計
1、資源分配:定時器T1,P1.6為調(diào)整時鐘,P1.5為調(diào)整分鐘,P1.4為控制調(diào)整
30H秒顯示單元,31H分顯示單元,32H時顯示單元,08H放分調(diào)整標(biāo)
志,09H放時調(diào)整標(biāo)志,0AH放閃爍標(biāo)志
2、程序清單(加注釋)
八調(diào)試結(jié)果分析
在實驗操作過程中,將所寫好的程序打入計算機內(nèi),通過編譯檢查其是否有錯誤,如有錯誤將其改正,直至無誤后下載仿真器,實現(xiàn)運行。觀察實驗箱上的數(shù)碼管顯示,判斷其是否為所需結(jié)果,如果與所要求的有差別,需繼續(xù)調(diào)試,重新修改程序,檢查硬件設(shè)施不斷地調(diào)試,不斷地檢查直至得到所要的結(jié)果。在調(diào)試過程中,開始運行時能夠?qū)崿F(xiàn)時鐘的顯示,但是無法實現(xiàn)其閃爍功能,后經(jīng)不斷調(diào)試修改及同學(xué)的幫助最終實現(xiàn)該功能,能夠達(dá)到時鐘顯示調(diào)節(jié)的基本要求,還可以實現(xiàn)整點報時。但在增加其功能顯示年月時又出現(xiàn)一定的問題,未能實現(xiàn)該功能,程序存在一定的不足性,需繼續(xù)完善,實現(xiàn)更多的功能
九設(shè)計總結(jié)及心得體會
經(jīng)過兩天的單片機課程設(shè)計,終于完成了我的電子時鐘的設(shè)計,雖然沒有完全達(dá)到設(shè)計要求,但從心底里說,還是高興的,畢竟這次設(shè)計把一些基本功能都做了出來,只是一些增強型功能未能實現(xiàn)。
在本次設(shè)計的過程中,我發(fā)現(xiàn)很多的問題,雖然以前還做過一些實驗但這次設(shè)計真的讓我長進(jìn)了很多單片機課程設(shè)計重點就在于軟件算法的設(shè)計,需要有很巧妙的程序算法,雖然以前寫過幾次程序,但我覺的寫好一個程序并不是一件簡單的事,要有通篇的全局思想考慮問題。在操作的過程中,出現(xiàn)許多錯誤,都是在連接處不能夠上下連貫正確運行,還需繼續(xù)努力。有好多的東西,只有我們?nèi)ピ囍隽?,才能真正的掌握,只學(xué)習(xí)理論有些東西是很難理解的,更談不上掌握。
從這次的課程設(shè)計中,我真真正正的意識到,在以后的學(xué)習(xí)中,要理論聯(lián)系實際,把我們所學(xué)的理論知識用到實際當(dāng)中,學(xué)習(xí)單機片機更是如此,程序只有在經(jīng)常的寫與讀的過程中才能提高,這就是我在課程設(shè)計中的最大收獲,同時,要把所學(xué)只是靈活應(yīng)用才能真正領(lǐng)悟其中的意義,加深對它的理解與掌握。還有,通過此次的操作也使我的實踐操作能力得到了進(jìn)一步的提高。
十參考文獻(xiàn)
【1】張毅剛,彭喜元,董繼成。單片機原理及應(yīng)用。北京:高等教育出版社,2003
【2】周航慈。單片機應(yīng)用程序設(shè)計技術(shù)(修訂版)。北京:北京航空航天大學(xué)出版社,2002
【3】萬光毅等。單片機實驗與實踐教程。北京:北京航空航天大學(xué)出版社,2003
【4】何立民,I2C總線應(yīng)用系統(tǒng)設(shè)計。北京:北京航空航天大學(xué)出版社,2002
【5】周航慈,朱兆優(yōu),李躍忠。智能儀器原理與設(shè)計。北京:北航大學(xué)出版社,2005
第三篇:單片機課程設(shè)計-電子鐘-完整
單片機課程設(shè)計
題目
專業(yè) 通信工程 班級 11級1班 學(xué)號 姓名
電 子 鐘 設(shè) 計
單片機原理與應(yīng)用課程設(shè)計
電子鐘設(shè)計
功能要求:
1、設(shè)計一個電子時鐘,要求可以顯示時、分、秒,用戶可以設(shè)置時間。
2、實現(xiàn)秒表功能。
功能描述
(1)
時鐘。初始界面是時鐘顯示,按鍵S1是調(diào)時選位,按鍵S2是加數(shù)。根據(jù)不同的閃爍位置進(jìn)行調(diào)節(jié)。
(2)
年與日,星期。在初始狀態(tài)下,按下S2,則跳轉(zhuǎn),顯示年月日,5S后跳回初始界面。若在年月日界面再次按下S2,則再次跳轉(zhuǎn),顯示星期,幾秒后跳轉(zhuǎn)回初始界面。
(3)
秒表。在初始界面下,按下S3,則跳轉(zhuǎn),進(jìn)入秒表。秒表功能鍵如下:S1 退出秒表;S2 停止開始計時;S3 秒表清零。
(4)
鬧鐘。在設(shè)置中設(shè)置好時間,最高位設(shè)為“1”則打開鬧鐘。最高位設(shè)為“0”則關(guān)閉鬧鐘。在鬧鐘響是,按S3進(jìn)行關(guān)鬧鐘。
工作原理 ? 硬件
采用80C51系列單片機作為CPU,P0口作為數(shù)據(jù)線,通過鎖存器進(jìn)行段選和位選,是數(shù)碼管不斷地顯示數(shù)字。數(shù)碼管的顯示是掃描式。(1)
本電子鐘用的單片機型號是STC89C516RD+。P0口作為段選和位選的數(shù)據(jù)線。P10口為段選寄存器的使能端。P11口為位選寄存器的使能端。晶振采用的12MHz晶振。要求頻率穩(wěn)定。
(2)
本電子鐘用的是共陰極數(shù)碼管。從左到右,第1,2位是秒位;第4,5位是分位;第7,8位是時位。第3,6位是“--”。
(3)
通過單片機的P0口,先對數(shù)碼管進(jìn)行位選,即在位鎖存器使能是將P0口數(shù)據(jù)進(jìn)行鎖存。再通過段鎖存器將P0口送來的段數(shù)據(jù)進(jìn)行鎖存。此時數(shù)碼管的第一位顯示數(shù)字。同樣的步驟進(jìn)行第二位顯示。以非常快的速度進(jìn)行,由于人眼的余輝效應(yīng),會看到8位數(shù)碼管一起亮。即可以顯示時間。通過單片機的內(nèi)部TO,T1的計數(shù)。即可以實現(xiàn)時鐘,秒表等功能。(4)電路圖如下:
? 軟件
程序代碼包括三部分:1.bujian(部件庫)2.main(主函數(shù))3.H(頭文件庫)。一 .bujian(部件庫)(1)xianshi.c #include
//數(shù)碼管秒個位
P0=t[s%10];p11=0;P0=0xff;delay(m);p10=1;p10=0;p11=1;P0=0xbf;p11=0;
//消隱
P0=t[s/10];
//消隱 //數(shù)碼管秒十位
P0=0xff;delay(m);} void led_f(unsigned int s){ p10=1;// P0=t[s%10];p10=0;p11=1;P0=0xef;
p11=0;
P0=0xff;delay(m);p10=1;
P0=t[s/10];p10=0;p11=1;P0=0xf7;p11=0;
P0=0xff;delay(m);} void led_h(unsigned int s){
// p10=1;P0=t[s%10];p10=0;p11=1;P0=0xfd;
p11=0;// P0=0xff;delay(m);p10=1;
P0=t[s/10];p10=0;p11=1;P0=0xfe;p11=0;
數(shù)碼管分個位 //消隱
//數(shù)碼管分十位
//消隱
數(shù)碼管時個位
消隱
//數(shù)碼管時十位
//消隱
P0=0xff;delay(m);}
void line(void){ p10=1;P0=0x40;p10=0;p11=1;P0=0xfb;delay(m);p11=0;
p10=1;P0=0x40;p10=0;p11=1;P0=0xdf;p11=0;delay(m);}
//消隱
P0=0xff;
//數(shù)碼管“---”
//消隱
P0=0xff;
//數(shù)碼管“---”
(2)miaobiao.c #include
#include
{ while(!s3){led_s(mms);led_f(ms);line();led_h(mf);} TR1=0;mms=0;ms=0;mf=0;} } }
(3)Delay.c #include
void delay(unsigned int a)
{ unsigned char l;
while(a--)
{for(l=0;l<100;l++);} }
(4)gongneng.c #include
#include
if(s2==0){ delay(3);if(s2==0)while(!s2){ led_s(s);delay(1);line();led_f(f);delay(1);led_h(h);delay(1);}
// while(1){ led_s(r);delay(2);led_f(y);delay(2);line();led_h(nian);delay(2);aa++;if(s2==0)
{ while(!s2)
{
led_s(r);delay(1);line();led_f(y);delay(1);led_h(nian);delay(1);}
//星期顯示
while(1)
{led_f(xing);delay(2);
bb++;
if(bb==100){bb=0;break;}
日期顯示 }
}
if(aa==100)
line();led_f(y);delay(1);led_h(nian);delay(1);
} } if(s1==0){ delay(3);if(s1==0){
switch(x){ case 1 : if(shanshuo==1){led_s(s);} line();led_f(f);delay(2);led_h(h);delay(2);break;case 2 :led_s(s);if(shanshuo==1){led_f(f);} delay(2);line();led_h(h);delay(2);break;case 3 : led_s(s);led_f(f);delay(2);line();if(shanshuo==1){led_h(h);} delay(2);break;case 4 : if(shanshuo==1){led_s(r);} led_f(y);delay(2);line();led_h(nian);delay(2);break;case 5 : led_s(r);if(shanshuo==1){led_f(y);} delay(2);line();led_h(nian);delay(2);break;case 6 :led_s(r);led_f(y);delay(2);line();if(shanshuo==1){led_h(nian);} delay(2);break;case 7 :if(shanshuo==1){led_f(xing);delay(5);} break;case 8 :if(shanshuo==1){led_s(nf);} line();led_f(nh);delay(2);led_h(ns);delay(2);break;case 9 :led_s(nf);if(shanshuo==1){led_f(nh);} delay(2);line();led_h(ns);delay(2);break;case 10:led_s(nf);led_f(nh);delay(2);line();if(shanshuo==1){led_h(ns);} delay(2);break;default : break;}
aa++;if(s2==0){ while(!s2){if(x==1||x==2||x==3){ led_s(s);delay(1);line();led_f(f);delay(1);led_h(h);delay(1);} if(x==4||x==5||x==6){ led_s(r);delay(1);line();led_f(y);delay(1);led_h(nian);delay(1);} if(x==7){ led_f(xing);} if(x==8||x==9||x==10){led_s(nf);led_f(nh);delay(2);line();led_h(ns);delay(2);} }
switch(x)
{ case 1 : s++;if(s>59)s=0;break;
while(!s1);while(1)
{ if(x==1||x==2||x==3)TR0=0;else TR0=1;if(aa==20){shanshuo=!shanshuo;aa=0;}
{ break;} { led_s(r);delay(1);
} if(s1==0)
case 2 :
}
f++;if(f>59)f=0;break;
case 3 : h++;if(h>23)h=0;break;case 4 : r++;if(r>31)r=1;break;case 5 : y++;if(y>12)y=1;break;case 6 : case 7 :
nian++;if(nian>20)nian=10;break;xing++;if(xing>7)xing=1;break;
case 8 : nf++;if(nf>59)nf=0;break;case 9 : nh++;if(nh>23)nh=0;break;case 10: ns=!ns;break;
default: break;{while(!s1){if(x==1||x==2||x==3){ led_s(s);delay(1);line();led_f(f);delay(1);led_h(h);delay(1);} if(x==4||x==5||x==6){ led_s(r);delay(1);line();led_f(y);delay(1);led_h(nian);delay(1);} if(x==7){ led_f(xing);} if(x==8||x==9||x==10){led_s(nf);led_f(nh);delay(2);line();led_h(ns);delay(2);} }
x++;if(x>10){ x=0;TR0=1;break;} } } } } } } 二.H(頭文件庫)(1)Delay.h #ifndef _DELAY_H__
void led_s(unsigned int s);void led_h(unsigned int s);#define _DELAY_H__ void delay(unsigned int a);#endif(2)xianshi.h #ifndef _XIANSHI_H__ #define _XIANSHI_H__
void led_f(unsigned int s);void line(void);#endif(3)gongneng.h
#ifndef _DONGNENG_H__ #define _GONGNENG_H__ void gongneng(void);#endif(4)miaobiao.h
#ifndef _MIAOBIAO_H__ #define _MIAOBIAO_H__ void miaobiao(void);#endif(5)dingyi.h #ifndef _DINGYI_H__ #define _DINGYI_H__ sbit s1=P2^4;
sbit s2=P2^5;
sbit s3=P2^6;sbit p10=P1^0;sbit p11=P1^1;sbit p12=P1^2;#endif
//流水燈使能端 //按鍵1 //按鍵2 //按鍵3 sbit p37=P3^7;//蜂鳴器時能
三.Main(主函數(shù))(1)main.c #include
ET0=1;TH0=6;TR0=1;
//關(guān)閉流水燈
ET1=1;TH1=(65535-5000)/256;TL1=(65535-5000)%256;TR1=0;while(1){ if((s3==0)&&(ns==0)){while(!s3);miaobiao();} if(s1==0||s2==0)gongneng();else { led_s(s);line();led_f(f);line();led_h(h);} if((f==nf)&&(h==nh)&&(ns==1))ll=1;else ll=0;} } void zhongduan(void)interrupt 1 {
if((ll==1)&&(ns==1))
{ p37=!p37;if((s3==0)&&(ns==1)){ while(!s3)ns=0;p37=1;} } n++;if(n==5000){n=0;s++;if(s==60){ s=0;f++;} if(f==60){ f=0;h++;}
if(h==24){ h=0;r++;xing++;} switch(r){ case 29 : if(nian/4==0){if(y==2)r=0;} y++;case 31 : if(y==4||y==6||y==9||y==11){ } if(xing>7)xing=1;if(y==13){ y=1;nian++;} } } default : break;
break;case 30 : if((nian/4)!=0){if(y==2){ r=0;y++;}} break;
r=0;y++;} break;case 32 : if(y==1||y==3||y==5||y==7||y==8||y==10||y==12){r=0;y++;} break;void zhongduan1(void)interrupt 3
{
TH1=(65535-5000)/256;
m++;TL1=(65535-5000)%256;if(m==2){mms++;m=0;if(mms>=100){ mms=0;ms++;} if(ms==60){ ms=0;mf++;} if(mf==60){ mf=0;} } }
參考文獻(xiàn):
單片機中級教程(第2版)、單片機語言C51程序設(shè)計(趙文博)感想: 這次課程設(shè)計整體來說是成功的,但我也發(fā)現(xiàn)了自己許多錯漏和不足之處。譬如,最簡單的程序沒寫好就想著寫更復(fù)雜的程序,做事還是缺乏耐性和細(xì)心,當(dāng)有時遇到問題時,總覺得無從下手,對于課本上的知識不能很好的組織起來。在編寫各功能程序時,特別是后來增添的比較復(fù)雜的程序
第四篇:單片機課程論文設(shè)計-電子鐘課程設(shè)計
單片機課程論文設(shè)計 ——電子鐘
一 課程設(shè)計的主要內(nèi)容 1 設(shè)計思想 1.1硬件設(shè)計思想 1.1.1電路設(shè)計思想
電路原理圖見圖1,由動態(tài)數(shù)碼顯示組成時、分、秒的顯示。把“單片機系統(tǒng)”區(qū)域中的P1.0-P1.7端口用8芯排線連接到“動態(tài)數(shù)碼顯示”區(qū)域中的A-H端口上;把“單片機系統(tǒng):區(qū)域中的P3.0-P3.7端口用8芯排線連接到“動態(tài)數(shù)碼顯示”區(qū)域中S-S8端口上;“單片機系統(tǒng)”區(qū)域中的P0.0/AD0、P0.1/AD1、P0.2/AD2端口分別用導(dǎo)線連接到“獨立式鍵盤”區(qū)域中的SP3、SP2、SP1端口上。
1.1.2鍵盤設(shè)計思想
鍵盤是微機的主要設(shè)備,按鍵的讀取容易引起錯誤動作??刹捎密浖ザ秳拥姆椒ㄌ幚?,軟件的觸點在閉合和斷開的時候會產(chǎn)生抖動,這時觸點的邏輯電平是不穩(wěn)定的,如不采取妥善處理的話,將引起按鍵命令錯誤或重復(fù)執(zhí)行,在這里采用軟件延時的方法來避開抖動,延時時間20ms.1.2軟件設(shè)計思想
本系統(tǒng)的主程序主要完成時間顯示和修改時間的功能。而時間單元進(jìn)位,時間設(shè)定時,調(diào)定時間設(shè)定時等功能全部在中斷服務(wù)程序中完成。
1.2.1數(shù)據(jù)與代碼轉(zhuǎn)換
由前述可知,從P2口輸出位選碼,從P0口輸出段選碼,LED就會顯示出數(shù)字來。但P0口的輸出的數(shù)據(jù)是要BCD碼,各存儲單元存儲的是二進(jìn)制數(shù),也就是和要顯示出的字符表達(dá)的含義是不一致的??梢?,將要顯示的存儲單元的數(shù)據(jù)直接送到P0口去驅(qū)動LED數(shù)碼管顯示是不能正確表達(dá)的,必須在系統(tǒng)內(nèi)部將要顯示的數(shù)據(jù)經(jīng)過BCD碼行轉(zhuǎn)換后,將各個單元數(shù)據(jù)的段選代碼送入P0口,給CD4511譯碼后去驅(qū)動數(shù)碼管顯示。具體轉(zhuǎn)換過程如下:
我們先將要顯示的數(shù)據(jù)裝入累加器A中,再將A中的數(shù)據(jù)轉(zhuǎn)換成高低兩位 的BCD碼,再放回A中,然后將A中的值輸出。如:有一個單元存儲了45這樣一位數(shù),則需轉(zhuǎn)換成四位的BCD碼:(0100)(0101)然后放入A中。A中BCD碼,高位四位代表?4?低四位代表?5?同時送給兩個譯碼器中,譯碼后? 45? 字就在兩個LED中顯示出來。
1.2.2計時功能的實現(xiàn)與中斷服務(wù)程序
時間的運行依靠定時中斷子程序?qū)r鐘單元數(shù)值進(jìn)位調(diào)整來實現(xiàn)的。計數(shù)器T0打開后,進(jìn)入計時,滿100毫秒后,重裝定時。中斷一次,滿一秒后秒進(jìn)位,滿60秒后即為1分鐘,分鐘單元進(jìn)位,60分到了后,時單元進(jìn)位。得到時、分、秒存儲單元的值,并經(jīng)譯碼后,通過掃描程序送LED中顯示出來,實現(xiàn)時鐘計時功能。累加是用指令I(lǐng)NC來實現(xiàn)的。進(jìn)入中斷服務(wù)程序以后,執(zhí)行PUSH PSW和PUSH A將程序狀態(tài)寄存器PSW的內(nèi)容和累加器A中的數(shù)據(jù)保存起來,這便是所謂的? 保護(hù)現(xiàn)場?.以保護(hù)現(xiàn)場和恢復(fù)現(xiàn)場時存取關(guān)鍵數(shù)據(jù)的存儲區(qū)叫做堆棧。在軟件的控制之下,堆棧可在片內(nèi)RAM中的任一區(qū)間設(shè)定,而堆棧的數(shù)據(jù)存取與一般的RAM存取又有區(qū)別,對它的操作,要遵循? 后進(jìn)先出? 的原則。
1.2.3時間控制功能與比較指令
系統(tǒng)的另一功能就是實現(xiàn)對執(zhí)行設(shè)備的定時開關(guān)控制,其主要控制思想是這樣的:先將執(zhí)行設(shè)備開啟的時間和關(guān)閉時間置入RAM某一單元,在計時主程序當(dāng)中執(zhí)行幾條比較指令,如果當(dāng)前計時時間與執(zhí)行設(shè)備的設(shè)定開啟時間相等,就執(zhí)行一條CLR指令,將對應(yīng)的那路P3置為高電位,開啟;如果當(dāng)前計時時間與執(zhí)行設(shè)備設(shè)定的關(guān)閉時間相等,就執(zhí)行SETB對應(yīng)的P3置低電位,二極管截止。實現(xiàn)此控制功能用到的比較指令為CJNE A,#direct,rel,其轉(zhuǎn)移條件是累加器A中的值與立即數(shù)不等則轉(zhuǎn)移。
二 課程設(shè)計的目的
實現(xiàn)的功能:
①開機時,電子鐘從12:00:00開始自動計時。②設(shè)置按鍵,能對時、分、秒進(jìn)行調(diào)整。
三設(shè)計方案的論證
3.1電路原理與電路圖 3.1.1電路原理
電路原理圖見圖1,由動態(tài)數(shù)碼顯示管組成時、分、秒的顯示。P0口的8條數(shù)據(jù)線P0.0至P0.7分別與兩個CD4511譯碼的ABCD口相接,P2口的P2.0至P2.2分別通過電阻R10至R13與VT1至VT3的基極相連接。這樣通過P0口送出一個存儲單元的高位、低位BCD顯示代碼,通過P2口送出掃描選通代碼輪流點亮LED1至LED6,就會將要顯示的數(shù)據(jù)在數(shù)碼管中顯示出來。從P0口輸出的代碼是BCD碼,從P2口輸出的就是位選碼。這是掃描顯示原理。
電路原理圖
C130pFU1X119CRYSTAL18XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD*********617S-0S-1S-2S-3S-4S-5S-6S-7C230pFXTAL2R210kR310kR410kR110k9RSTC310uF293031PSENALEEARP1987654321RESPACK-***78P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51時分秒S-7S-6S-5S-4S-3S-2S-1S-001234567
圖 1 電路原理圖
3.2 流程圖與算法描述 3.2.1流程圖
3.3軟件設(shè)計
SECOND
EQU 30H;MINITE EQU 31H;HOUR
EQU 32H;HOURK
BIT P0.2 MINITEK BIT P0.1 SECONDK BIT P0.0 DISPBUF EQU 40H DISPBIT EQU 48H 流程圖
秒寄存器
分寄存器
時寄存器 圖
T2SCNTA
EQU 49H
T2SCNTB EQU 4AH TEMP
ORG 00H;
程序執(zhí)行開始EQU 4BH 地址
LJMP
START;
執(zhí)行
ORG
0BH;T0
LJMP
INT_T0;
;主程序
START: MOV
SECOND,#00H;
得單元
MOV
MINITE,#00H
MOV
HOUR,#12
MOV
DISPBIT,#00H
MOV
T2SCNTA,#00H
MOV
T2SCNTB,#00H
MOV
TEMP,#0FEH
LCALL
DISP;
子程序
MOV
TMOD,#01H
MOV
TH0,#(65536-2000)/ 256;
MOV
TL0,#(65536-2000)/ 256
SETB
TR0;
SETB
ET0;
SETB
EA;
WT:
跳轉(zhuǎn)到標(biāo)號START
中斷程序入口
跳至IN-T0執(zhí)行
清0存放秒分時值
在2KB范圍內(nèi)長調(diào)用 顯示2毫秒
允許TO中斷
開啟T0定時器
總中斷開放
按鍵掃描子程序及校時調(diào)整
JB
SECONDK, NK1;SECONDK為1(sp1建按下)時跳到
LCALL
DELY10MS
JB
SECONDK,NK1
INC
SECOND;
對計數(shù)器加1
MOV
A,SECOND
CJNE
A,#60, NS60;沒到60秒返回,到60秒清0;判斷計數(shù)器是否滿59
MOV
SECOND,#00H NS60:
LCALL
DISP
JNB
SECONDK,$;
NK1: JB
MINITEK,NK2;
LCALL
DELY10MS
JB
MINITEK,NK2;
INC
MINITE
MOV
A,MINITE
CJNE
A,#60, NM60
MOV
MINITE,#00H NM60:
LCALL DISP
JNB
MINITEK, $;
NK2:
JB
HOURK,NK3
LCALL
DELY10MS
JB
HOURK,NK3
INC
HOUR
MOV
A, HOUR
CJNE
A, #24,NH24
MOV
HOUR,#00H
不滿60秒就循環(huán)執(zhí)行 分控制鍵按下時跳轉(zhuǎn)
分控制鍵按下時跳轉(zhuǎn)
不滿60分就循環(huán)執(zhí)行
NH24:
LCALL
DIS
JNB
HOURK,$;
不滿24小時就循環(huán)執(zhí)行
NK3 LJMP
WT DELY10MS:;
延時1毫秒的子程序
MOV D1:
MOV
;顯示子程序
DISP:
;
地址
MOV
ADD
DEC
MOV
MOV
MOV
DIV
MOV
DEC
MOV
MOV
DEC
MOV
MOV
DEC
MOV R6, #10 R7, #248 DJNZ
R7, $ DJNZ
R6, D1 RET
A, #DISPBUF;
A, #8 A R1, A A, HOUR;
B, #10;
AB @R1, A;
R1 A, B @R1, A R1;A, #10 @R1, A R1 A, MINITE;
將得出的時間存入40H(DISPBUF)之后的將temp中的十六進(jìn)制數(shù)轉(zhuǎn)換成10進(jìn)制 時送A
10進(jìn)制/10=10進(jìn)制 累加器送內(nèi)部RAM單元
分送A
MOV B, #10
DIV
AB;
十進(jìn)制調(diào)整
MOV @R1, A
DEC
R1
MOV
A, B
MOV
@R1, A
DEC
R1
MOV
A, #10
MOV
@R1,A
DEC
R1
MOV
A, SECOND;
MOV
B, #10
DIV
AB;
MOV @R1, A
DEC
R1
MOV A, B
MOV @R1, A
DEC
R1
RET INT_T0:;T0
MOV TH0,#(65536-2000)/ 256;
MOV TL0,#(65536-2000)/ 256
MOV A, #0FFH
MOV P3, A
MOV A, #DISPBUF
ADD
A, DISPBIT;
MOV R0, A
MOV A, @R0;
MOV DPTR, #TABLE;
MOVC A,@A+DPTR;
秒送A
十進(jìn)制調(diào)整 TIME子程序 2毫秒 地址加,并將時間的各位送到p1 取顯示數(shù)據(jù)到A 取段碼表地址
查顯示數(shù)據(jù)對應(yīng)段碼
中斷服務(wù)子程序,即計時
MOV
P1, A;
分十位送P1口顯示
MOV
A, DISPBIT
MOV
DPTR, #TAB;
表地址送數(shù)據(jù)指針
MOVC A,@A+DPTR
MOV
P3, A
INC
DISPBIT
MOV A, DISPBIT
CJNE A, #08H, KNA
MOV
DISPBIT, #00H KNA:
INC
T2SCNTA;
MOV A, T2SCNTA
CJNE
A, #100, DONE
MOV T2SCNTA, #00H
INC T2SCNTB
MOV A, T2SCNTB
CJNE A, #05H, DONE
MOV T2SCNTB,#00H
INC
SECOND;秒加一
MOV A, SECOND;
CJNE A, #60, NEXT;
MOV SECOND, #00H;
INC
MINITE;分加1
MOV A, MINITE;
CJNE A, #60, NEXT;
MOV
MINITE, #00H;
INC
HOUR;
時加1
MOV A, HOUR
CJNE A, #24, NEXT;
MOV
HOUR, #00H
時間的增加與進(jìn)位 到60秒了嗎? 到60秒清0 到60分了嗎? 到60分清0 到24小時了嗎?
NEXT:
LCALL
DISP DONE:
RETI TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H TAB:
DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07F
四 系統(tǒng)調(diào)試
系統(tǒng)由AT89C51、SEG數(shù)碼管、按鍵、電容、晶振、電阻等部分構(gòu)成,能實現(xiàn)時間的調(diào)整、時間校對、定時時間的設(shè)定,輸出等功能。系統(tǒng)的功能選擇由按鍵‘時’、‘分’、‘秒’、完成。開機時,顯示12:00:00的時間開始計時;按鍵P0.0/AD0控制“秒”的調(diào)整,每按一次加1秒;P0.1/AD1控制“分”的調(diào)整,每按一次加1分;P0.2/AD2控制“時”的調(diào)整,每按一次加1個小時;系統(tǒng)的主程序主要完成時間顯示和定時輸出判斷功能。而時間單元進(jìn)位,時間設(shè)定時,調(diào)定時間設(shè)定時等功能全部在中斷服務(wù)程序中完成。該電子鐘的精確度在仿真軟件中效果良好。
五 心得體會
計算機控制技術(shù)是一門很綜合的課程。任何一個計算機系統(tǒng)都是一個復(fù)雜的整體,學(xué)習(xí)計算機控制技術(shù)是要涉及到整體的每一部分。討論某一部分原理時又要涉及到其它部分的工作原理。這樣一來,不僅不能在短時間內(nèi)較深入理解計算機的工作原理,而且也很難孤立地理解某一部分的工作原理。所以,在循序漸進(jìn)的課堂教學(xué)過程中,我總是處于“學(xué)會了一些新知識,弄清了一些原來保留的問題,又出現(xiàn)了一些新問題”的循環(huán)中,直到課程結(jié)束時,才把保留的問題基本搞清楚。
學(xué)習(xí)該門課程知識時,其思維方法也和其它課程不同,該課程偏重于工程思維,靈活知識運用,具體地說,在了解了計算機編程后,剩下的是如何將它們用于實際系統(tǒng)中,其創(chuàng)造性勞動在于如何用計算機的有關(guān)技術(shù)和廠家提供的各種芯片,設(shè)計實用的電路和系統(tǒng),再配上相應(yīng)的應(yīng)用程序,完成各種實際應(yīng)用項目。
這次課程設(shè)計較為綜合,主要的困難來自對程序的編寫和校對,功夫不負(fù)有心人,經(jīng)過我的虛心求學(xué)和查找資料,最終對實驗的原理有了較清晰的認(rèn)識。但是仍然存在很多的不足,今后需要加強的地方還是很多,所以在今后的求學(xué)路上我會更加努力。望老師批評改正。
六 參考文獻(xiàn):
[1].潘新民,王燕芳編著.微型計算機控制技術(shù)[M].北京:電子工業(yè)出版社,2003 [2].何立民.單片機應(yīng)用技術(shù)選編(1)[M].北京:北京航空航天大學(xué)出版社,1995,6 [3].劉國榮,梁景凱.計算機控制技術(shù)與應(yīng)用[M] .北京:機械工業(yè)出版社,1999,5 [4].齊維毅,丁言鎂,齊振國.單片機原理及應(yīng)用設(shè)計實驗[M] .沈陽:遼寧大學(xué)出版社,2006,5 [5].李華.MCS-51系列單片機實用接口技術(shù)[M].北京:北京航空航天大學(xué)出版社,1993,8 [6].潘新民,王燕芳編著.單片微型計算機實用系統(tǒng)設(shè)計[M].北京:人民郵電出版社,1992
第五篇:單片機課程設(shè)計電子鐘源程序
ORG0000H
LJMPMAIN
ORG001BH
LJMPLOOP
ORG0100H
MAIN:MOV21H,#17H
MOV22H,#3AH
MOV23H,#00H;設(shè)定時間初值
MOV36H,#10
MOV39H,#10
MOVR7,#14H;循環(huán)20次50*20=1000msMOVDPTR,#0F003H
MOVA,#10000000B;8255命令口地址MOVX@DPTR,A
MOVTMOD,#10H
MOVTH1,#3CH
MOVTL1,#0B0H;設(shè)定計時初值
MOVIE,#88H;設(shè)定中斷運行位
SETBTR1
LOP:LCALLSTART
LCALLDSN;調(diào)用顯示程序
LJMPLOP
LOOP:MOVTH1,#3CH;重裝時間初值
MOVTL1,#0B0H
DJNZR7,LOOP1;循環(huán)結(jié)束
MOVR7,#14H
INC23H
MOVA,23H
CJNEA,#3CH,LOOP1
MOV23H,#00H
INC22H
MOVA,22H
CJNEA,#3CH,LOOP1
MOV22H,#00H
INC21H
MOVA,21H
CJNEA,#18H,LOOP1
MOV21H,#00H
MOV22H,#00H
MOV23H,#00H
LOOP1: RETI
START: MOVR1,#21H;將小時放在兩個位地址中MOVA,@R1
MOVB,#0AH
DIVAB
MOV3BH,A
MOV3AH,B
INCR1
MOVA,@R1
MOVB,#0AH
DIVAB
MOV38H,A
MOV37H,B
INCR1
MOVA,@R1
MOVB,#0AH
DIVAB
MOV35H,A
MOV34H,B
RET
DSN:MOVR0,#34H;顯示子程序;顯示數(shù)據(jù)緩沖區(qū)首址送R0
MOVR3,#7FH;使顯示器最左邊位亮
LP1:MOVDPTR,#0F000H;數(shù)據(jù)指針指向A口
MOVA,R3
MOVX@DPTR,A;送掃描值
INCDPTR;數(shù)據(jù)指針指向B口MOVA,@R0;取欲顯示數(shù)據(jù)的字形碼表位
PUSHDPH
PUSHDPL;顯示查表指令地址偏移量
MOVDPTR,#TAB
MOVCA,@A+DPTR;取出字形碼
POPDPL
POPDPH
MOVX@DPTR,A;送出顯示
ACALLDELAY;調(diào)用延時子程序
INCR0;指向下一個顯示緩沖區(qū)地址MOVA,R3
JNBACC.0,LP2;掃描到第八個顯示器?
RRA;未到,掃描碼右移一位
MOVR3,A
AJMPLP1
LP2:RET
TAB:DB0FCH,60H,0DAH,0F2H,66H,0B6H
DB0BEH,0E0H,0FEH,0F6H,02H,0DFH
DELAY: MOVR5,#05H;延時子程序
DL1:MOVR6,#0FFH
DL2:DJNZR6,DL2
DJNZR5,DL1RET
END