基于51单片机的数字钟设计
(仿真+程序+原理图+设计报告)
功能介绍
具体功能:
1.自动计时,显示24小时制时间,由6位LED显示器显示时、分、秒。
2.自动计时,显示24小时制时间,由6位LED显示器显示时、分、秒。
3.具备校准功能,可以直接由按键设置当前时间。
4.具有调整闹钟功能、整点报时功能。
演示视频:
基于51单片机的数字钟设计
/***************51单片机数字钟 设计*************
*********************原创设计******************/
#include <REGX52.H>
#define uint unsigned int
#define uchar unsigned char
/***************定义 数码管*****************/
#define SMG_XS P0 //数码管数据显示
#define SMG_KZ P2 //数码管控制显示
#define Speak P3_7 //定义蜂鸣器接口
#define LED1 P3_4 //定义LED1接口(走时提示指示灯)
#define LED2 P3_5 //定义LED2接口(闹钟指示灯亮)
#define LED3 P3_6 //定义LED3接口(整点报时指示灯)
#define Key1 P1_0 //时间调整允许 按键
#define Key2 P1_1 //时、分加 按键
#define Key3 P1_2 //时、分减 按键
#define Key4 P3_1 //闹钟时间调整允许 按键
#define Key5 P3_2 //开/关闹钟 按键
#define Key6 P3_3 //开/关整点报时 按键
uchar code Data[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF};//没有小数点
//定义数组 数码管 0 1 2 3 4 5 6 7 8 9 -
uchar code Data1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x3F};//带小数点
//定义数组 数码管 0 1 2 3 4 5 6 7 8 9 -
uchar hour=12,min=0,sec=0; //系统上电默认时间是 12.00.00
uchar hour1=6,min1=0,sec1=0; //系统上电默认闹铃是 06.00.00
char num=0; //时间基数 num
uint t=3; //数码管动态扫描延时时间基数 源数据3
uchar flag=0; //显示标志位(0:走时正常 1:调整时钟 2:调整分钟)
uint i=0;j=0; //循环变量i,j
bit nao_z=0; //闹钟标志位(0:关闭闹钟 1:开启闹钟)
uchar flag_nao_z=0; //闹钟显示模式(0:显示正常走时时间 1:显示闹钟时间 2:调整闹钟时钟 3:调整闹钟分钟)
bit bao_shi=0; //整点报时标志位(0:不允许整点报时 1:允许整点报时)
void delay(uint time) //扫描延时函数
{
uint x,y;
for(x=time;x>0;x--)
for(y=110;y>0;y--);
}
void delay_fmq(uint time) //延时函数(蜂鸣器)
{
uint x,y;
for(x=time;x>0;x--)
for(y=5;y>0;y--);
}
void fmq() //蜂鸣器函数(按键提示)
{
for(i=0;i<100;i++)
{
Speak=0;
delay_fmq(10);
}
Speak=1;
}
void Time0_init() //定时器0初始化函数
{
TMOD=0x01; //定时器0为方式1
TL0=(65536-50000)%256;
TH0=(65536-50000)/256; //12M晶振 定时时间50ms
ET0=1; //开定时器0中断
EA=1; //开总中断
TR0=0; //先不启动定时器0
}
void Time0() interrupt 1 //定时器0中断服务函数
{
TH0=(65536-50000)/256; //重新载装初值,设置50ms中断一次
TL0=(65536-50000)%256;
num++; //时间基数加1
while(num==20) //1秒时间到
{
num=0; //num清0
sec++; //秒加1
if(flag_nao_z!=0) //闹钟显示模式不等于0(不显示正常走时时间,即显示闹钟时间)
{
LED1=~LED1; //指示灯按照2Hz频率闪烁(在调整闹钟时间时,提示正在走时)
}
else //否则闹钟显示模式等于0(显示正常走时时间)
{
LED1=1; //在正常走时的时候,指示灯不亮
}
if(nao_z==1) //当闹钟标示位为1:开启闹钟
{
LED2=0; //闹钟指示灯亮
if(hour==hour1&min==min1) //当时,分和闹钟时,分相同
{
Speak=~Speak; //蜂鸣器接口取反(2Hz频率响)
}
else //否则时,分和闹钟时,分不相同
{
Speak=1; //关闭蜂鸣器
}
}
else //否则关闭闹钟
{
LED2=1; //闹钟指示灯不亮
}
}
while(sec==60) //1分时间到
{
sec=0; //秒清0
min++; //分加1
}
while(min==60) //1小时时间到
{
min=0; //分清0
hour++; //时加1
}
while(hour==24) //24小时到
{
hour=0; //时清0
}
}
void disp(hour,min,sec) //数码管正常显示模式
{
SMG_XS=Data[hour/10]; //小时十位
SMG_KZ=0xdf; //控制第1个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data1[hour%10]; //小时个位
SMG_KZ=0xef; //控制第2个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[min/10]; //分十位
SMG_KZ=0xf7; //控制第3个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data1[min%10]; //分个位
SMG_KZ=0xfb; //控制第4个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[sec/10]; //秒十位
SMG_KZ=0xfd; //控制第5个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[sec%10]; //秒个位
SMG_KZ=0xfe; //控制第6个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
}
void disp1(hour,min,sec) //数码管模式1:调小时模式(时钟在数码管上闪烁)
{
j++; //j加1
while(j==40) {j=0;} //j为40时,j清0
if(j<20) //j小于20 时,分,秒 都显示
{
SMG_XS=Data[hour/10]; //小时十位
SMG_KZ=0xdf; //控制第1个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data1[hour%10]; //小时个位
SMG_KZ=0xef; //控制第2个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[min/10]; //分十位
SMG_KZ=0xf7; //控制第3个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data1[min%10]; //分个位
SMG_KZ=0xfb; //控制第4个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[sec/10]; //秒十位
SMG_KZ=0xfd; //控制第5个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[sec%10]; //秒个位
SMG_KZ=0xfe; //控制第6个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
}
else //否则20<j<40 时不显示;分,秒 都显示
{
SMG_XS=Data[hour/10]; //小时十位
SMG_KZ=0xff; //控制第1个数码管不亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data1[hour%10]; //小时个位
SMG_KZ=0xff; //控制第2个数码管不亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[min/10]; //分十位
SMG_KZ=0xf7; //控制第3个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data1[min%10]; //分个位
SMG_KZ=0xfb; //控制第4个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[sec/10]; //秒十位
SMG_KZ=0xfd; //控制第5个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[sec%10]; //秒个位
SMG_KZ=0xfe; //控制第6个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
}
}
void disp2(hour,min,sec) //数码管模式2:调分钟模式(分钟在数码管上闪烁)
{
j++; //j加1
while(j==40) {j=0;} //j为40时,j清0
if(j<20) //j小于20 时,分,秒 都显示
{
SMG_XS=Data[hour/10]; //小时十位
SMG_KZ=0xdf; //控制第1个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data1[hour%10]; //小时个位
SMG_KZ=0xef; //控制第2个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[min/10]; //分十位
SMG_KZ=0xf7; //控制第3个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data1[min%10]; //分个位
SMG_KZ=0xfb; //控制第4个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[sec/10]; //秒十位
SMG_KZ=0xfd; //控制第5个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[sec%10]; //秒个位
SMG_KZ=0xfe; //控制第6个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
}
else //否则20<j<40 时显示,分不显示,秒显示
{
SMG_XS=Data[hour/10]; //小时十位
SMG_KZ=0xdf; //控制第1个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data1[hour%10]; //小时个位
SMG_KZ=0xef; //控制第2个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[min/10]; //分十位
SMG_KZ=0xff; //控制第3个数码管不亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data1[min%10]; //分个位
SMG_KZ=0xff; //控制第4个数码管不亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[sec/10]; //秒十位
SMG_KZ=0xfd; //控制第5个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[sec%10]; //秒个位
SMG_KZ=0xfe; //控制第6个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
}
}
void disp3(hour1,min1,sec1) //数码管模式3(显示闹钟时间)
{
SMG_XS=Data[hour1/10]; //闹钟 时十位
SMG_KZ=0xdf; //控制第1个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data1[hour1%10]; //闹钟 时个位
SMG_KZ=0xef; //控制第2个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[min1/10]; //闹钟 分十位
SMG_KZ=0xf7; //控制第3个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data1[min1%10]; //闹钟 分个位
SMG_KZ=0xfb; //控制第4个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[sec1/10]; //闹钟 秒十位
SMG_KZ=0xfd; //控制第5个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[sec1%10]; //闹钟 秒个位
SMG_KZ=0xfe; //控制第6个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
}
void disp4(hour1,min1,sec1) //数码管模式4: 调整闹钟时钟(闹钟时钟在数码管上闪烁)
{
j++; //j加1
while(j==40) {j=0;} //j为40时,j清0
if(j<20) //j小于20 闹钟 时,分,秒 都显示
{
SMG_XS=Data[hour1/10]; //闹钟 时十位
SMG_KZ=0xdf; //控制第1个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data1[hour1%10]; //闹钟 时个位
SMG_KZ=0xef; //控制第2个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[min1/10]; //闹钟 分十位
SMG_KZ=0xf7; //控制第3个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data1[min1%10]; //闹钟 分个位
SMG_KZ=0xfb; //控制第4个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[sec1/10]; //闹钟 秒十位
SMG_KZ=0xfd; //控制第5个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[sec1%10]; //闹钟 秒个位
SMG_KZ=0xfe; //控制第6个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
}
else //否则20<j<40 闹钟 时不显示,分显示,秒显示
{
SMG_XS=Data[hour1/10]; //闹钟 时十位
SMG_KZ=0xff; //控制第1个数码管不亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data1[hour1%10]; //闹钟 时个位
SMG_KZ=0xff; //控制第2个数码管不亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[min1/10]; //闹钟 分十位
SMG_KZ=0xf7; //控制第3个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data1[min1%10]; //闹钟 分个位
SMG_KZ=0xfb; //控制第4个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[sec1/10]; //闹钟 秒十位
SMG_KZ=0xfd; //控制第5个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[sec1%10]; //闹钟 秒个位
SMG_KZ=0xfe; //控制第6个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
}
}
void disp5(hour1,min1,sec1) //数码管模式5: 调整闹钟分钟(闹钟分钟在数码管上闪烁)
{
j++; //j加1
while(j==40) {j=0;} //j为40时,j清0
if(j<20) //j小于20 闹钟 时,分,秒 都显示
{
SMG_XS=Data[hour1/10]; //闹钟 时十位
SMG_KZ=0xdf; //控制第1个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data1[hour1%10]; //闹钟 时个位
SMG_KZ=0xef; //控制第2个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[min1/10]; //闹钟 分十位
SMG_KZ=0xf7; //控制第3个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data1[min1%10]; //闹钟 分个位
SMG_KZ=0xfb; //控制第4个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[sec1/10]; //闹钟 秒十位
SMG_KZ=0xfd; //控制第5个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[sec1%10]; //闹钟 秒个位
SMG_KZ=0xfe; //控制第6个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
}
else //否则20<j<40 闹钟 时显示,分不显示,秒显示
{
SMG_XS=Data[hour1/10]; //闹钟 时十位
SMG_KZ=0xdf; //控制第1个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data1[hour1%10]; //闹钟 时个位
SMG_KZ=0xef; //控制第2个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[min1/10]; //闹钟 分十位
SMG_KZ=0xff; //控制第3个数码管不亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data1[min1%10]; //闹钟 分个位
SMG_KZ=0xff; //控制第4个数码管不亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[sec1/10]; //闹钟 秒十位
SMG_KZ=0xfd; //控制第5个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
SMG_XS=Data[sec1%10]; //闹钟 秒个位
SMG_KZ=0xfe; //控制第6个数码管亮
delay(t); //延时一下(消隐)
SMG_KZ=0xff;
}
}
void key_cl() //按键处理(调整时间)
{
if(Key1==0) //当时间调整允许 按键按下
{
delay(5); //延时去抖
if(Key1==0) //再判断时间调整允许 按键是否按下
{
TR0=0; //关闭定时器0
num=0; //时间基数清0
sec=0; //秒清零
TL0=(65536-50000)%256;
TH0=(65536-50000)/256; //12M晶振 定时时间50ms
flag++; //显示标志位加1(0:走时正常 1:调整时钟 2:调整分钟)
if(flag==3) //当flag为3
{
flag=0; //flag清0
}
}
SMG_KZ=0xff; //关闭数码管显示
fmq(); //按键提示音
while(Key1==0); //等待按键松开
}
if(flag==1) //当flag为1 (调整时钟)
{
if(Key2==0) //当时、分加 按键按下
{
delay(5); //延时去抖
if(Key2==0) //再判断时、分加 按键是否按下
{
hour++; //时加1
while(hour==24) {hour=0;} //当hour为24,hour清0
}
SMG_KZ=0xff; //关闭数码管显示
fmq(); //按键提示音
while(Key2==0); //等待按键松开
}
if(Key3==0) //当时、分减 按键按下
{
delay(5); //延时去抖
if(Key3==0) //再判断时、分减 按键是否按下
{
hour--; //时减1
while(hour==-1) {hour=23;} //当hour为-1,hour设置为23
}
SMG_KZ=0xff; //关闭数码管显示
fmq(); //按键提示音
while(Key3==0); //等待按键松开
}
}
if(flag==2) //当flag为2 (调整分钟)
{
if(Key2==0) //当时、分加 按键按下
{
delay(5); //延时去抖
if(Key2==0) //再判断时、分加 按键是否按下
{
min++; //分加1
while(min==60) {min=0;} //当min为60,min清0
}
SMG_KZ=0xff; //关闭数码管显示
fmq(); //按键提示音
while(Key2==0); //等待按键松开
}
if(Key3==0) //当时、分减 按键按下
{
delay(5); //延时去抖
if(Key3==0) //再判断时、分减 按键是否按下
{
min--; //分减1
while(min==-1) {min=59;} //当min为-1,min设置为59
}
SMG_KZ=0xff; //关闭数码管显示
fmq(); //按键提示音
while(Key3==0); //等待按键松开
}
}
}
void key_cl1() //按键处理1(闹钟设置)
{
if(Key4==0) //当闹钟时间调整允许 按键按下
{
delay(5); //延时去抖
if(Key4==0) //再判断闹钟时间调整允许 按键是否按下
{
flag_nao_z++; //闹钟显示模式加1(0:显示正常走时时间 1:显示闹钟时间 2:调整闹钟时钟 3:调整闹钟分钟)
if(flag_nao_z==4) {flag_nao_z=0;} //当flag_nao_z为4,flag_nao_z清0
}
SMG_KZ=0xff; //关闭数码管显示
fmq(); //按键提示音
while(Key4==0); //等待按键松开
}
if(flag_nao_z==2) //当进入调整闹钟时钟
{
if(Key2==0) //当 时、分加 按键按下
{
delay(5); //延时去抖
if(Key2==0) //再判断时、分加 按键是否按下
{
hour1++; //闹钟时钟加1
while(hour1==24) {hour1=0;} //当闹钟时钟为24,闹钟时钟清0
}
SMG_KZ=0xff; //关闭数码管显示
fmq(); //按键提示音
while(Key2==0); //等待按键松开
}
if(Key3==0) //当 时、分减 按键按下
{
delay(5); //延时去抖
if(Key3==0) //再判断时、分减 按键是否按下
{
hour1--; //闹钟时钟减1
while(hour1==-1) {hour1=23;} //当闹钟时钟为-1,闹钟时钟设置为23
}
SMG_KZ=0xff; //关闭数码管显示
fmq(); //按键提示音
while(Key3==0); //等待按键松开
}
}
if(flag_nao_z==3) //当进入调整闹钟分钟
{
if(Key2==0) //当 时、分加 按键按下
{
delay(5); //延时去抖
if(Key2==0) //再判断时、分加 按键是否按下
{
min1++; //闹钟分钟加1
while(min1==60) {min1=0;} //当闹钟分钟为60 闹钟分钟清0
}
SMG_KZ=0xff; //关闭数码管显示
fmq(); //按键提示音
while(Key2==0); //等待按键松开
}
if(Key3==0) //当 时、分减 按键按下
{
delay(5); //延时去抖
if(Key3==0) //再判断时、分减 按键是否按下
{
min1--; //闹钟分钟减1
while(min1==-1) {min1=59;} //当闹钟分钟为-1 闹钟分设置为59
}
SMG_KZ=0xff; //关闭数码管显示
fmq(); //按键提示音
while(Key3==0); //等待按键松开
}
}
}
void key_cl2() //按键处理2(闹钟,整点报时按键处理)
{
if(Key5==0) //当闹钟 按键按下
{
delay(5); //延时去抖
if(Key5==0) //再判断闹钟 按键是否按下
{
nao_z=~nao_z; //闹钟标志位取反(0:关闭闹钟 1:开启闹钟)
}
SMG_KZ=0xff; //关闭数码管显示
fmq(); //按键提示音
while(Key5==0); //等待按键松开
}
if(Key6==0) //当整点报时 按键按下
{
delay(5); //延时去抖
if(Key6==0) //再判断整点报时 按键是否按下
{
bao_shi=~bao_shi; //整点报时标志位取反(0:不允许整点报时 1:允许整点报时)
}
SMG_KZ=0xff; //关闭数码管显示
fmq(); //按键提示音
if(bao_shi==1) //当整点报时标志位为1:允许整点报时
{
LED3=0; //整点报时指示灯亮
}
else //否则整点报时标志位为0:不允许整点报时
{
LED3=1; //整点报时指示灯不亮
}
while(Key6==0); //等待按键松开
}
}
void SMG_disp() //数据显示(时 分 秒)
{
if(flag==0) //显示标志位为0(0:走时正常 1:调整时钟 2:调整分钟)
{
disp(hour,min,sec); //数码管正常显示模式
}
if(flag==1) //显示标志位为1(0:走时正常 1:调整时钟 2:调整分钟)
{
disp1(hour,min,sec);//数码管模式1:调小时模式(时钟在数码管上闪烁)
}
if(flag==2) //显示标志位为2(0:走时正常 1:调整时钟 2:调整分钟)
{
disp2(hour,min,sec);//数码管模式2:调分钟模式(分钟在数码管上闪烁)
}
}
void SMG_disp1() //数据显示1(闹钟 时 分 秒)
{
if(flag_nao_z==1) //闹钟显示模式为1(0:显示正常走时时间 1:显示闹钟时间 2:调整闹钟时钟 3:调整闹钟分钟)
{
disp3(hour1,min1,sec1); //数码管模式3: 显示闹钟时间
}
if(flag_nao_z==2) //闹钟显示模式为2(0:显示正常走时时间 1:显示闹钟时间 2:调整闹钟时钟 3:调整闹钟分钟)
{
disp4(hour1,min1,sec1); //数码管模式4: 调整闹钟时钟(闹钟时钟在数码管上闪烁)
}
if(flag_nao_z==3) //闹钟显示模式为3(0:显示正常走时时间 1:显示闹钟时间 2:调整闹钟时钟 3:调整闹钟分钟)
{
disp5(hour1,min1,sec1); //数码管模式5: 调整闹钟分钟(闹钟分钟在数码管上闪烁)
}
}
void bao_shi_cl() //整点报时处理(0:不允许整点报时 1:允许整点报时)
{
if(bao_shi==1) //开启整点报时
{
if(TR0==1) //当TR0为1(表示正常走时的时候)
{
if(min==0&sec==0) //分为0 秒为0
{
SMG_KZ=0xff; //关闭数码管显示
fmq(); //提示音
while(sec==0); //当秒为0,继续等待
}
}
}
}
硬件设计
使用元器件:
单片机:STC89C52;
(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)
USB接头(母头);自锁开关;
电解电容10u;电阻10K;
瓷片电容30P;晶振12M;
电阻4.7K;电阻470(贴片);
三极管8550;4位共阳数码管;
2位共阳数码管;LED(红发红);
有源蜂鸣器;DIP40;
按键;9*15CM万能板;
USB公对公线;排针2P;
导线:若干;
流程图:
设计资料
01 仿真图
本设计使用proteus7.8和proteus8.7两个版本设计,向下兼容,无需担心!具体如图!
02 原理图
本系统原理图采用Altium Designer19设计,具体如图!
03 程序
本设计使用软件keil4和keil5两个版本编程设计,无需担心!具体如图!
04 设计报告
一万四千字设计报告,具体如下!
05 设计资料
全部资料包括仿真源文件 、程序(含注释)、AD原理图、参考论文、流程图等。具体内容如下,全网最全! !
资料获取请观看前面演示视频!
点赞分享一起学习成长。