仿真版本:Proteus8.6及以上版本
程序编译:Keil5 C51
编程语言:C语言
设计编号:【I05】
1. 简介
本文提出了一种基于51单片机的电子时钟系统。该系统由单片机系统、数码管显示系统、键盘、蜂鸣器等组成,通过单片机自身的定时计数器溢出标志产生最小计时单元,经过变量的累加和判断后,将数据送入数码显示屏显示。通过按键来控制单片机实现数字时钟的时分秒、闹钟等功能,并通过P0口的输出在数码管上显示。
2. 主要功能
a.通过数码管显示时分秒、闹钟,初始状态:11:59:50。
b.通过独立按键设置时和分、闹钟。
c.通过蜂鸣器显示闹钟状态。
3. 源程序(Keil5)
本设计采用keil5 C51软件(内附安装包)实现程序设计。如需用keil4打开程序,可自行通过.c和.h文件新建工程即可。
#include<reg52.h>
unsigned char led[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00}; //用一维数组定义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是模式,更新时间的种模式加上正常模式 S_flag闪烁标志
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 //定时器中断函数
{
TH1=0xfc; //定时ms
TL1=0x18;
temp++;
if(temp==1000) //配合定时器定时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) //闹钟时间到
{
if(M==0)
BEEP=!BEEP;
}
if(temp%250==0) //每ms
S_flag=!S_flag; //闪烁标志位取反
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
本设计采用proteus8.6软件(内附安装包)实现仿真设计,如下图所示。proteus软件一般存在高低版本兼容问题,该仿真是通过proteus8.6导出的,所以请尽量使用proteus8.6打开文件,低于proteus8.6的版本不能够正常使用,高于proteus8.6的版本除了proteus8.8/8.9理论上可以正常使用。
初始界面:
闹钟设置:
5. 设计报告
设计报告主要包括硬件电路、软件设计、仿真调试等等,仅供参考。
6. 资料清单
设计资料主要包括C程序+仿真+设计报告+使用说明+元件清单+操作视频等。
百度网盘下载链接:【I05】百度网盘下载链接
更多单片机仿真设计合集:单片机仿真设计合集