标题:
简易单片机电子钟时钟 AD格式电路图+仿真+代码
[打印本页]
作者:
jill110
时间:
2019-1-6 10:44
标题:
简易单片机电子钟时钟 AD格式电路图+仿真+代码
可用于单片机学习
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(19.07 KB, 下载次数: 32)
下载附件
2019-1-12 18:55 上传
0.png
(39.3 KB, 下载次数: 27)
下载附件
2019-1-12 18:55 上传
单片机源程序如下:
/************************************************************
作品名字:简易声光报时时钟
功能:六位数码管显示时分秒,整点半点报时 ,夜间只有灯光提醒
二十四小时制
到整点时长鸣1次,LED闪烁10次
到半点时短促鸣响1次,LED闪烁5次
制作说明:P0接数码管段选,P2低6位接数码管位
**************************************************************/
#include<reg52.h> //头文件
#define uc unsigned char //宏定义
#define ui unsigned int //宏定义
sbit LED=P3^3;//定义LED
sbit key1=P3^4;//定义调小时
sbit key2=P3^5;//定义调分钟
sbit key3=P3^6;//定义秒清零
sbit beep=P3^7;//设蜂鸣器
uc min,hour,sec,led,num; //无符号字符型变量
bit bdata hourLED,halfLED,hourbeep,halfbeep; //位变量
uc code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};/*0,1,2,3,4,5,6,7,8,9,.*///共阴极编码
void delay(ui x)//1ms延时函数
{
ui i,j;
for(i=0;i<x;i++)
for(j=0;j<121;j++);
}
void display()//扫描显示函数,高位到低位
{
P0=tab[hour/10];//给小时的十位送形
P2=0xdf;//11011111 //位选
delay(1); //延时动态扫描
P2=0xff; //关闭位选
P0=(tab[hour%10])|0x80;//给第二位后加“点
P2=0xef;//11101111
delay(1);
P2=0xff;
P0=tab[min/10];
P2=0xf7;//11110111
delay(1);
P2=0xff;
P0=(tab[min%10])|0x80;//给第四位后加“点”
P2=0xfb;//11111011
delay(1);
P2=0xff;
P0=tab[sec/10];
P2=0xfd;//11111101
delay(1);
P2=0xff;
P0=tab[sec%10];
P2=0xfe;//11111110
delay(1);
P2=0xff;
}
void keyscan()//键盘扫描,开关接地
{
if(key1==0) //如果小时加按键按下
{
delay(5); //延时去抖
if(key1==0) //确定是否按键
{
hour++; //小时加一
if(hour==24) //如果小时等于24
hour=0; //小时归零
}
while(!key1) display();//判断是否松开
}
if(key2==0) //如果分钟加按键按下
{
delay(5); //延时去抖
if(key2==0) //确定是否按键
{
min++; //分钟加一
if(min==60)// 如果分钟等于60
min=0; //分钟归零
}
while(!key2) display();//判断是否松开
}
if(key3==0)//判断调整秒按键
{
delay(5); //延时去抖
if(key3==0) //确定是否按键
{sec=0;} //秒清零
while(!key3) display();//判断是否松开
}
}
void strike()//报时函数
{
if((hour>6)&&(hour<22))//判断大于6点并且小于22点
{
if(sec==0)//以下判断是否整点
{
if(min==0)//如果秒和分都等于0
{
hourbeep=1; //那么蜂鸣器和小灯位开启
hourLED=1;
}
else if(min==30)//如果分钟等于30
{
if(num<10) //闪5下响一声
halfbeep=1;
halfLED=1;
}
}
}
else //小于6点和大于22点的时候
{
if(sec==0)//以下判断是否整点
{
if(min==0)//如果分钟等于0
hourLED=1; //led位开
else if(min==30)//如果分钟=0
halfLED=1;//进行半点报时
}
}
}
void init()//初始化函数
{
sec=0;//一通电,显示12:30:00,蜂鸣器响一下
min=30;
hour=12;
TMOD=0x01;//设置定时器为定时器0工作方式为1
TH0=(65536-50000)/256; //赋初值
TL0=(65536-50000)%256; //赋初值
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
void main()//主函数
{
init();//初始化
while(1) //主循环
{
display(); //显示
keyscan();//扫描是否有键按下
strike();//报时函数
}
}
void time0() interrupt 1 //定时器中断
{
TH0=(65536-50000)/256;//重赋初值
TL0=(65536-50000)%256;//重赋初值
num++;
if((num%10==0)&&(hourLED==1)) //整点报时
{
led++;
LED=~LED;//取反实现闪烁
if(led==20) //闪10次
{
led=0; //之后关闭闪烁
LED=1;
hourLED=0;
}
}
else if((num%10==0)&&(halfLED==1))//半点报时
{
led++;
LED=~LED; //取反实现闪烁
if(led==10)//闪5次
{
led=0; //关闭闪烁
LED=1;
halfLED=0;
}
}
if(hourbeep==1) //蜂鸣器响标志位
{
if(num==1)
beep=0;
if(num==20) //长响次之后
{
beep=1; //关闭
hourbeep=0;
}
}
else if(halfbeep==1) //蜂鸣器响标志位
{
if(num<10)
beep=0;
if(num==10) //短响之后
{
beep=1; //关闭
halfbeep=0;
}
}
if(num==20) //计时20次为1s时间
{
num=0;
sec++; //秒加一
if(sec==60)//如果秒等于60
{
sec=0; //秒归零
min++; //分钟加一
if(min==60)//如果分钟等于60
{
min=0; //分钟归零
hour++; //小时加一
if(hour==24) //如果小时等于24
{hour=0;}//小时归零
}
}
}
}
复制代码
所有资料51hei提供下载:
简易时钟.7z
(218.54 KB, 下载次数: 28)
2019-1-12 18:57 上传
点击文件名下载附件
简易时钟 电子钟
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1