仿真版本:Proteus8.6及以上版本
程序編譯:Keil5 C51
編程語(yǔ)言:C語(yǔ)言
設(shè)計(jì)編號(hào):【I08】
1.? 簡(jiǎn)介
? 本文提出了一種基于51單片機(jī)的電子時(shí)鐘系統(tǒng)。該系統(tǒng)由單片機(jī)系統(tǒng)、數(shù)碼管顯示系統(tǒng)、獨(dú)立鍵盤(pán)、蜂鳴器等組成,通過(guò)單片機(jī)自身的定時(shí)計(jì)數(shù)器溢出標(biāo)志產(chǎn)生最小計(jì)時(shí)單元,經(jīng)過(guò)變量的累加和判斷后,將數(shù)據(jù)送入數(shù)碼顯示屏顯示。通過(guò)按鍵來(lái)控制單片機(jī)實(shí)現(xiàn)數(shù)字時(shí)鐘的年月日、時(shí)分秒、鬧鐘等功能,并通過(guò)P0口的輸出在數(shù)碼管上顯示。
2.? 主要功能
a.通過(guò)數(shù)碼管顯示年月日、時(shí)分秒、鬧鐘,初始狀態(tài):11-59-50。
b.通過(guò)獨(dú)立按鍵設(shè)置年月日、時(shí)分秒、鬧鐘。
c.通過(guò)蜂鳴器顯示鬧鐘狀態(tài)。
3.? 源程序(Keil5)
本設(shè)計(jì)采用keil5 C51軟件(內(nèi)附安裝包)實(shí)現(xiàn)程序設(shè)計(jì)。如需用keil4打開(kāi)程序,可自行通過(guò).c和.h文件新建工程即可。
#include<reg51.h>
#define uChar unsigned char
#define uInt unsigned int
uChar a[]={~0x3f,~0x06,~0x5b,~0x4f,~0x66,~0x6d,~0x7d,~0x07,~0x7f,~0x6f}; //數(shù)碼管段選碼,0——9
uChar b[]={~0xfe,~0xfd,~0xfb,~0xf7,~0xef,~0xdf,~0xbf,~0x7f}; //數(shù)碼管位選碼,高——低
uChar second=50,minute=59,hour=11,month=6,day=1,count; uInt year=2024;
uChar f_nao=0,s_nao=12; //鬧鐘分計(jì)數(shù),鬧鐘時(shí)計(jì)數(shù)
uChar wave=0; //定時(shí)器1對(duì)0.1ms定時(shí)時(shí)間進(jìn)行計(jì)數(shù),控制蜂鳴器響的頻率
bit flag_nao; //控制鬧鐘開(kāi)關(guān)變量 flag_nao= 0-off;1--on
sbit Key1 = P3^6; //減
sbit Key2 = P3^4; //設(shè)置
sbit Key3 = P3^5; //加
sbit Key4 = P3^7; //切換時(shí)-分-秒、年-月-日
sbit BEEP = P2^2; //蜂鳴器端口
//函數(shù)聲明
void Delayms(uInt t); //長(zhǎng)延時(shí)函數(shù)
void Dispaly1(uChar second,uChar minute,uChar hour); //時(shí)-分-秒顯示
void Dispaly2(uChar day,uChar month,uInt year); //年-月-日顯示
void Keyscan1(); //按鍵Key4按下次數(shù)為雙數(shù)時(shí)(按鍵Key1~3控制時(shí)-分-秒)
void Keyscan2(); //按鍵Key4按下次數(shù)為單數(shù)時(shí)(按鍵Key1~3控制年-月-日)
void Keyscan3();
void nao_judge(); //判斷鬧鐘
/*************時(shí)-分-秒、年-月-日閃爍函數(shù)聲明*********************/
void delay(uInt t); /***/
void Bright1(uChar second,uChar minute,uChar hour); /***/
void Hour_flicker(uChar second,uChar minute,uChar hour); /***/
void Minute_flicker(uChar second,uChar minute,uChar hour); /***/
void Second_flicker(uChar second,uChar minute,uChar hour); /***/
void Bright2(uChar day,uChar month,uInt year); /***/
void Year_flicker(uChar day,uChar month,uInt year); /***/
void Month_flicker(uChar day,uChar month,uInt year); /***/
void Day_flicker(uChar day,uChar month,uInt year); /***/
/*************時(shí)-分-秒、年-月-日閃爍函數(shù)聲明*********************/
//主函數(shù)
void main()
{
TMOD=0x11; //置T0、T1都為工作方式1
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TR0=1; //開(kāi)啟T0
ET0=1; //打開(kāi)T0中斷允許位
IT1=1; //設(shè)置外部中斷1為下降沿觸發(fā)
IT0=0; //設(shè)置外部中斷0為低電平觸發(fā)
EX1=1; //打開(kāi)外部中斷1允許位
EX0=1; //打開(kāi)外部中斷0允許位
PT0=1; //設(shè)置內(nèi)部定時(shí)中斷優(yōu)先級(jí)大于外部中斷優(yōu)先級(jí)
EA=1; //打開(kāi)中斷總允許位
BEEP=1;
flag_nao=0;
while(1)
{
static uChar h=0;
nao_judge();
if(Key4==0)
{
Delayms(10);
if(Key4==0)
while(!Key4); //空操作,等待按鍵釋放
h++;
if(h >= 3)
{
h = 0;
}
}
if(h==1)
{
Dispaly2(day,month,year);
Keyscan2();
}
if(h==0)
{
Dispaly1(second,minute,hour);
nao_judge();
Keyscan1();
}
if(h==2)
{
Dispaly1(0,f_nao,s_nao);
Keyscan3();
}
}
}
4.? 仿真proteus8.6
? 本設(shè)計(jì)采用proteus8.6軟件(內(nèi)附安裝包)實(shí)現(xiàn)仿真設(shè)計(jì),如下圖所示。proteus軟件一般存在高低版本兼容問(wèn)題,該仿真是通過(guò)proteus8.6導(dǎo)出的,所以請(qǐng)盡量使用proteus8.6打開(kāi)文件,低于proteus8.6的版本不能夠正常使用,高于proteus8.6的版本除了proteus8.8/8.9理論上可以正常使用。
初始界面:
年月日界面:
鬧鐘界面:
5.? 設(shè)計(jì)報(bào)告
設(shè)計(jì)報(bào)告主要包括硬件電路、軟件設(shè)計(jì)、仿真調(diào)試等等,僅供參考。
6.? 資料清單
設(shè)計(jì)資料主要包括C程序+仿真+設(shè)計(jì)報(bào)告+使用說(shuō)明+元件清單+操作視頻等。
7.? 資料獲取鏈接
百度網(wǎng)盤(pán)下載鏈接:【I08】百度網(wǎng)盤(pán)下載鏈接
更多單片機(jī)仿真設(shè)計(jì)合集:單片機(jī)仿真設(shè)計(jì)合集