ob体育竞彩 _欧宝体育在线链接 學習網站

AT89C51單片機為核心的時鍾電路的程序設計

時間:2018-06-05 08:38 來源:ob体育竞彩

AT89C51單片機為核心的時鍾電路的程序設計
1.主程序設計及係統主流程圖
設計中采用定時器T0中斷完成,其餘狀態循環調用顯示子程序。係統主流程圖如圖所示

2.時鍾電路的時鍾和鬧鈴程序設計及流程圖
時鍾采用11.0256MHZ的脈衝控製, 鬧鈴采用整點報時功能。

3 時鍾電路的顯示程序設計及流程圖
碼管顯示的數據存放在內存單元70H-75H中,其中70H~71H存放秒數據,72H~73H存放分數據,74H~75H存放時數據,每一地址單元內均為十進製BCD碼。由於采用軟件動態掃描實現數據顯示功能,顯示用十進製BCD碼數據的對應段碼存放在ROM表中。顯示時,先取出70H~75H某一地址中的數據,然後查的對應的顯示段碼從P1口輸出。P3口將對應的數碼管選中,就是顯示該地址單元的數據值,每個LED數碼管亮1MS時間再逐位循環。

4.時鍾電路的鍵盤程序設計及流程圖
P0口輸出段碼數據,P1.0-P1.2口作掃描輸出,P0.1—P0.4口接按鈕開關S1,S2,S3,S4,S5,rest 接S6複位按鍵。P0.0控製秒的調整,每按一次加1秒;P0.1控製分的調整,每按一次加1分;P0.2控製時的調整,每按一次加1個小時。

5.仿真圖及程序


單片機四位時鍾電路設計方案(二)
通過S1、S2、S3和S4四個按鍵,對時間進行修改和鬧鍾的設置,S0控製鬧鍾的啟動和停止。按下S4鍵顯示鬧鍾,鬆開後顯示時間;按下S1鍵進入時間修改模式,再按S1鍵時間的時加1,按S3分加1,調整結束後按下S4恢複正常顯示;按下S2鍵進入鬧鍾修改模式,再按S3鍵鬧鍾的時加1,按S3分加1,調整結束後按下S4恢複正常顯示。在按鍵按下和放開時會出現抖動現象。通過延時程序,可以進行去抖動設計。

Proteus仿真電路

單片機四位時鍾電路設計方案(三)
通過4位數碼管來顯示時間,係統晶振11.0592MHZ,仿真圖中用二極管代替時鍾冒號閃爍,非門代替三極管,讓仿真速度與真實速度達到一致,本設計用了6個按鈕來對時間及鬧鍾時間的調節、關閉,p3.2接時間分加1按鈕,p3.3接時間時加1按鈕,p3.4接鬧鍾時間與當前時間切換按鈕,按住不放顯示鬧鍾的時間,鬧鍾初始化為00:00,放開按鈕則顯示當前時間,p3.5接鬧鍾加1按鈕,p3.6接鬧鍾時加1按鈕,p3.7接關閉鬧鍾按鈕。

程序源代碼:
org 0000h
ajmp main ;調至主程序
org 000bh ;T0中斷入口地址
ljmp inTI0
org 001bh ;T1中斷入口地址
ljmp inTI1
org 0030h
main:mov tmod,#11h ;設T0、T1為模式1
mov ie,#8ah ;開T0、T1中斷允許
mov th0,#4ch ;賦T0 50ms初值
mov tl0,#00h
mov th1,#4ch ;賦T1 50ms初值
mov tl1,#00h
mov sp,#60h ;設置堆棧指針
mov r0,#20 ; T0 50ms計數20次
mov 31h,#00 ;時間秒初始化
mov 32h,#00 ;時間分初始化
mov 33h,#00 ;時間時初始化
mov 38h,#00 ;鬧鍾分初始化
mov 39h,#00 ;鬧鍾時初始化
setb tr0 ;啟動T0
setb tr1 ;啟動T1
loop:lcall display ;調用時間顯示子程序
lcall key ;調用時間調節按鍵子程序
lcall keynz ;調用鬧鍾按鍵子程序
ajmp loop
inTI0:push psw ;保護現場
push acc
clr ea ;關中斷
mov th0,#4ch ;重賦50ms初值
mov tl0,#00h
djnz r0,out ;對50ms計數判斷
mov r0,#20 ;重賦50ms計數值
inc 31h ;秒加1
cpl p2.2 ;P2.2取反輸出
mov a,31h
cjne a,#60,out ;判秒是否加到60,沒有加到中斷返回
mov 31h,#00 ;秒加到60,對秒清零
inc 32h ;分加1
mov a,32h
cjne a,#60,out ;判分是否加到60,沒有加到就中斷返回
mov 32h,#00 ;分加到60,對分清零
inc 33h ;時加1
mov a,33h
cjne a,#24,out ;判時是否加到24,沒有就中斷返回
mov 33h,#00 ;時加到24,對時清零
out: setb ea ;開中斷
pop acc ;恢複現場
pop psw
reTI ;中斷返回
inti1:push psw ;保護現場
push acc
clr ea ;關中斷
mov th1,#4ch ;賦50ms初值
mov tl1,#00h
inc 3ah
mov a,3ah
cjne a,#20,out1 ;判斷50ms計數是否到20,沒到就中斷返回
mov 3ah,#00 ;50ms計數到20,將計數單元清零
mov a,32h
cjne a,38h,out1 ;鬧鍾分與時間分判斷
mov a,33h
cjne a,39h,out1 ;鬧鍾時與時間時判斷
clr p1.0 ;相等就清p1.0輸出
out1: setb ea ;開中斷
pop acc ;恢複現場
pop psw
reti ;中斷返回
單片機四位時鍾電路設計方案(四)

附:源程序
/***************************************************************************
標題: 定時器中斷 24小時時鍾程序
效果: 數碼管顯示24小時製時鍾(具有調時功能)
說明: 使用12M晶振 ,key1=P3^7; key2=P3^6; key3=P3^5; key4=P3^4; 數碼管位選P1.0~P1.3 ,段選P0,共陽數碼管
******************************************************************************/
#include《reg52.h》
#define uchar unsigned char; #define uint unsigned int;
uchar position; uchar tt; uchar second; uchar minute; uchar hour;
uchar code table[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0--9
sbit smg_q = P1^0; //數碼管千位引腳 sbit smg_b = P1^1; sbit smg_s = P1^2; sbit smg_g = P1^3;
sbit key1=P3^7; //按鍵定義 sbit key2=P3^6; sbit key3=P3^5; sbit key4=P3^4;
void keyscan(); //函數聲明
void display(unsigned char hour,unsigned char minute); void delay(unsigned int timer); void init();
/***********************************************************
主函數
***********************************************************/
void main() {
init(); while(1) {
if(tt==20) { tt=0; second++;
if(second==60) {
second=0; minute++;
if(minute==60) {
minute=0; hour++;
if(hour==24) hour=0; } } }
keyscan();
display(hour,minute); delay(1); } }
/***********************************************************
調時
***********************************************************/ void keyscan() {
if(key1==0) //小時加1 {
TR0=0; hour++;
if(hour==24) hour=0; delay(200) ; TR0=1; }
if(key2==0) // 小時減 {
TR0=0; hour--;
if(hour《0) hour=23; delay(200) ; TR0=1; }
if(key3==0) // 分鍾加 {
TR0=0; minute++;
if(minute==60) minute=0; delay(200) ; TR0=1; }
if(key4==0) // 分鍾減 {
TR0=0;
minute--;
if(minute《0)
minute=59; delay(200) ; TR0=1; } }
/***********************************************************
初始化
***********************************************************/ void init() {
tt=0;
position=0; second=0; minute=0; hour=0; smg_q=1; smg_b=1; smg_s=1; smg_g=1; key1=1; key2=1;
TMOD=0X01;
TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; }
/***********************************************************
定時器TO中斷
***********************************************************/ void t0() interrupt 1 {
TH0=(65536-50000)/256; TL0=(65536-50000)%256; tt++; }
/***********************************************************
顯示
***********************************************************/
void display(unsigned char hour,unsigned char minute) {
P0=0XFF; switch(position) {
case 0: smg_g=1; smg_q=0;
P0=table[hour/10]; break;
case 1:
smg_q=1; smg_b=0;
P0=table[hour%10];
if(tt》=10)
P0&=0x7f; //小數點以半秒的時間閃爍 break;
case 2:
smg_b=1; smg_s=0; P0=table[minute/10]; break;
case 3: smg_s=1; smg_g=0;
P0=table[minute%10]; break; }
position++; if(position》3) position=0; }
/***********************************************************
延時
***********************************************************
/ void delay(unsigned int time) {
unsigned int x,y; for(x=time;x》0;x--) for(y=110;y》0;y--);

    看過《AT89C51單片機為核心的時鍾電路的程序設計》的人還看了以下文章
    初學單片機從51入門的好處 初學單片機從51入門的好處
    51單片機是一款已經出現很久的單片機,它的出現可以說是劃時代的。同時期出現的其它單片機都已經逐漸退出曆史的舞台,而它卻依舊出現在某些專業的教材上。從這點來看,它依舊有其學習的意義。下麵說說初學單片機從51入門的好處。 51單片機的學習資源非常多...
    如何使用C語言控製硬件 如何使用C語言控製硬件
    C語言的應用編程在單片機的領域占了很大一部分,使用的比較多的51單片機和STM32單片機都可以使用MDK軟件編寫固件。 單片機燒寫了固件後可以點亮LED燈,可以驅動ADC檢測電壓,也可以驅動蜂鳴器發聲,這就是簡單地控製硬件。稍微複雜一點的,可以驅動NRF2401進...
    c語言怎麼讀取一個變量的二進製文件內容 c語言怎麼讀取一個變量的二進製文件內容
    C語言是一種高級語言,很多設置都為了符合我們程序員的理解做了相應的調整。機器對於變量的理解是基於電路,也就是所謂的高低電平。也是因為這個出現了一個二進製。 而人類的計數更喜歡使用十進製,有專家說是因為是人類當初計數使用的手指,這樣十進製比較...
    單片機為啥叫單片機 單片機為啥叫單片機
    1、MCU 我一般在工作計劃和原理圖的說明上,就直接將STM32或者STC89的單片機,標注為MCU。 無論是理解為Micro CPU,還是Microcontroller Unit,我認為都行,也沒有仔細去區分去過。自從32位單片機出來後,一些單片機設計的係統確實是具備部分電腦的功能。 你...
    16位單片機低端打不過8位高端打不過32位怎麼看 16位單片機低端打不過8位高端打不過32位怎
    有時間去了解一下TI的MPS係列的單片機,它的低功耗和8位的51還有32位的STM32還是有一定的區別度的。 就比如MSP430係列,一些醫療的應用也少不了它,其各種低功耗的應用和例子一抓一大把。 也許從價格上來說,感覺,8位的便宜好買;從性能上來說,感覺,32位的...
    Baidu
    map