仿真版本:Proteus8.6及以上版本
程序編譯:Keil5 C51
編程語言:C語言
設(shè)計(jì)編號:【I05】
1.? 簡介
? 本文提出了一種基于51單片機(jī)的電子時(shí)鐘系統(tǒng)。該系統(tǒng)由單片機(jī)系統(tǒng)、數(shù)碼管顯示系統(tǒng)、鍵盤、蜂鳴器等組成,通過單片機(jī)自身的定時(shí)計(jì)數(shù)器溢出標(biāo)志產(chǎn)生最小計(jì)時(shí)單元,經(jīng)過變量的累加和判斷后,將數(shù)據(jù)送入數(shù)碼顯示屏顯示。通過按鍵來控制單片機(jī)實(shí)現(xiàn)數(shù)字時(shí)鐘的時(shí)分秒、鬧鐘等功能,并通過P0口的輸出在數(shù)碼管上顯示。
2.? 主要功能
a.通過數(shù)碼管顯示時(shí)分秒、鬧鐘,初始狀態(tài):11:59:50。
b.通過獨(dú)立按鍵設(shè)置時(shí)和分、鬧鐘。
c.通過蜂鳴器顯示鬧鐘狀態(tài)。
3.? 源程序(Keil5)
本設(shè)計(jì)采用keil5 C51軟件(內(nèi)附安裝包)實(shí)現(xiàn)程序設(shè)計(jì)。如需用keil4打開程序,可自行通過.c和.h文件新建工程即可。
#include<reg52.h>
unsigned char led[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00}; //用一維數(shù)組定義0-9、橫杠、全滅
unsigned char a[8];
unsigned char second=50,minute=59,hour=11;
unsigned char minute1=0,hour1=12;
unsigned char b[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //掃描
unsigned char k=0; unsigned int temp; // 記錄毫秒為秒的變量
unsigned char M,S_flag; //M是模式,更新時(shí)間的種模式加上正常模式 S_flag閃爍標(biāo)志
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
sbit BEEP=P3^3;
void delay(unsigned n) //0.2毫秒
{
int x,y;
for(x=0;x<n;x++)
for(y=0;y<24;y++);
}
void time1()
interrupt 3 //定時(shí)器中斷函數(shù)
{
TH1=0xfc; //定時(shí)ms
TL1=0x18;
temp++;
if(temp==1000) //配合定時(shí)器定時(shí)s
{
temp=0;
second++;
}
if(second==59)
{
second=0;
if(minute<59)
minute++;
else
{
minute=0;
hour++;
hour%=24;
}
}
if(hour1==hour&&minute1==minute&&second<5) //鬧鐘時(shí)間到
{
if(M==0)
BEEP=!BEEP;
}
if(temp%250==0) //每ms
S_flag=!S_flag; //閃爍標(biāo)志位取反
if(k==8)
k=0;
P0=a[k];
P2=b[k++];
delay(1);
P2=0xff;
}
void display()
{
switch(M)
{
case 0:
{
a[0]=led[hour/10];
a[1]=led[hour%10];
a[2]=led[10];
a[3]=led[minute/10];
a[4]=led[minute%10];
a[5]=led[10];
a[6]=led[second/10];
a[7]=led[second%10];
}
break;
case 1:
{
if(S_flag==1)
{
a[0]=led[hour/10];
a[1]=led[hour%10];
}
else
{
a[0]=led[11];
a[1]=led[11];
}
a[2]=led[10];
a[3]=led[minute/10];
a[4]=led[minute%10];
a[5]=led[10];
a[6]=led[second/10];
a[7]=led[second%10];
}
break;
case 2:
{
a[0]=led[hour/10];
a[1]=led[hour%10];
a[2]=led[10];
if(S_flag==1)
{
a[3]=led[minute/10];
a[4]=led[minute%10];
}
else
{
a[3]=led[11];
a[4]=led[11];
}
a[5]=led[10];
a[6]=led[second/10];
a[7]=led[second%10];
}
break;
case 3:
{
if(S_flag==1)
{
a[0]=led[hour1/10];
a[1]=led[hour1%10];
}
else
{
a[0]=led[11];
a[1]=led[11];
}
a[2]=led[10];
a[3]=led[minute1/10];
a[4]=led[minute1%10];
a[5]=led[11];
a[6]=led[11];
a[7]=led[11];
}break;
case 4:
{
a[0]=led[hour1/10];
a[1]=led[hour1%10];
a[2]=led[10];
if(S_flag==1)
{
a[3]=led[minute1/10];
a[4]=led[minute1%10];
}
else
{
a[3]=led[11];
a[4]=led[11];
}
a[5]=led[11];
a[6]=led[11];
a[7]=led[11];
}
}
}
4.? 仿真proteus8.6
? 本設(shè)計(jì)采用proteus8.6軟件(內(nèi)附安裝包)實(shí)現(xiàn)仿真設(shè)計(jì),如下圖所示。proteus軟件一般存在高低版本兼容問題,該仿真是通過proteus8.6導(dǎo)出的,所以請盡量使用proteus8.6打開文件,低于proteus8.6的版本不能夠正常使用,高于proteus8.6的版本除了proteus8.8/8.9理論上可以正常使用。
初始界面:
鬧鐘設(shè)置:
5.? 設(shè)計(jì)報(bào)告
設(shè)計(jì)報(bào)告主要包括硬件電路、軟件設(shè)計(jì)、仿真調(diào)試等等,僅供參考。
6.? 資料清單
設(shè)計(jì)資料主要包括C程序+仿真+設(shè)計(jì)報(bào)告+使用說明+元件清單+操作視頻等。
百度網(wǎng)盤下載鏈接:【I05】百度網(wǎng)盤下載鏈接
更多單片機(jī)仿真設(shè)計(jì)合集:單片機(jī)仿真設(shè)計(jì)合集