【单片机】含有闹钟的时钟设计
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1 = P3^2; //手动控制数码管1,2位
sbit key2 = P3^3; //手动控制数码管4,5位
sbit key3 = P3^4; //手动控制数码管7,8位
sbit key5 = P1^6; //手动切换数码管显示(可显示三种情况:时钟,日期,闹钟时间)
sbit key6 = P1^7; //停止闹钟音乐
sbit alarm = P1^4; //闹钟
uchar count,hour,minute,second; // 时钟时间 时分秒
uchar i;
uchar h,s,m; //闹钟时间 时分秒
uchar pattern=0; //工作模式 (0:时钟模式 1;日期模式 2:闹钟模式)
uint year,month,day; //日期时间 年月日
uchar code led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管段码
uchar num;
uchar code SONG[] ={ //祝你平安
0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,
0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,
0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,
0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,
0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,
0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,
0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,
0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,
0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,
0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,
0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,
0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00};
/*定时器1中断:用于闹钟音乐播放*/
void Time0_Int() interrupt 3
{
TH1= 0xD8;
TL1= 0xEF; //计入初值,10毫秒定时
num++; //长度加1
}
/*功能:1MS延时子程序*/
void Delay_xMs(uint x) //音乐播放所需延时
{
unsigned int i,j;
for( i =0;i < x;i++ )
{
for( j =0;j<3;j++ );
}
}
/* 延时子程序:时钟显示所需*/
void delay(uint time) //延时
{
uchar j=5;
for(; time>0 ; time--)
for(;j>0;j--);
}
void wait(uchar n) //延时
{
for(i=0 ; i<n ; i++)
delay(100);
}
/*功能:闹钟歌曲播放子程序*/
void Play_Song()
{
unsigned char Temp1,Temp2;
unsigned int Addr;
num = 0; //中断计数器清0
Addr = 0; //SONG下标
while(1)
{
Temp1 = SONG[Addr++];
if(key6!=1) //判断key6键按下
{
delay(100); //硬件防抖
if(key6!=1)
{
Temp1=0x00;
}
}
if ( Temp1 == 0x00 ) //歌曲结束符
{
return;
}
else
{
Temp2 = SONG[Addr++];
TR1 = 1;
while(1)
{
alarm= ~alarm;
Delay_xMs(Temp1);
if ( Temp2 == num )
{
num = 0;
break;
}
}
}
}
}
void INT_T() interrupt 1 //中断子程序,时间,日期自动进位
{
TH0=0x3c;
TL0=0xb0;
count++;
if(count==20)
{
count=0;
second++; //秒自增
if(second==60)
{
second=0;
minute++; //分自增
if(minute==60)
{
minute=0;
hour++; // 时自增
if(hour==24)
{
hour=0;
day++; // 日自增
if(((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&day==32)||
((month==4||month==6||month==9||month==11)&&day==31)||
((month==2&&(year%400==0||(year%100!=0&&year%4==0)))&&day==30)||
((month==2&&year%4!=0)&&day==29) )
{
day=1;
month++;
if(month==13)
{
month=1;
year++;
if(year==100)
year=0;
}
}
}
}
}
}
}
void main() //主函数
{
TMOD=0X11; //定时器1方式1;定时器0方式1
TH0=0x3c;
TL0=0xb0; //计入初值,定时50毫秒
EA=1; //总中断允许
ET0=1; //定时器中断允许
ET1=1;
TR0=1; //允许计数
hour=0;
minute=0;
second=0; //时钟初值
year=2017;
month=12;
day=12; //日期初值
h=8;
m=0;
s=0; //闹钟初值
while(1)
{
alarm=0; //闹钟关闭
if(pattern==0) //pattern=0,时钟显示
{
P2=0x7f;
P0=led[hour/10];
wait(1);
P2=0xbf;
P0=led[hour%10];
wait(1);
P2=0xdf;
P0=0x40;
wait(1);
P2=0xef;
P0=led[minute/10];
wait(1);
P2=0xf7;
P0=led[minute%10];
wait(1);
P2=0xfb;
P0=0x40;
wait(1);
P2=0xfd;
P0=led[second/10];
wait(1);
P2=0xfe;
P0=led[second%10];
wait(1); //各位赋值
if(key1!=1) //按键1,时+1
{
delay(100); //硬件防抖
if(key1!=1)
hour++;
delay(100);
while(key1==0);
}
if(key2!=1) //按键2,分+1
{
delay(100);
if(key2!=1)
minute++;
delay(100);
while(key2==0);
}
if(key3!=1) //按键3,秒+1
{
delay(100);
if(key3!=1)
second++;
delay(100);
while(key3==0);
}
if(key5!=1) //按键5,切换工作模式
{
delay(100);
if(key5!=1)
pattern++;
if(pattern==3)
pattern=0;
delay(100);
while(key5==0);
}
}
if (hour==h && minute==m && second==s) //到达闹钟时间点
{
Play_Song();
}
if(pattern==1) //pattern=1,日期显示
{
P2=0x7f;
P0=led[year/1000];
wait(1);
P2=0xbf;
P0=led[year%1000/100];
wait(1);
P2=0xdf;
P0=led[year%100/10];
wait(1);
P2=0xef;
P0=led[year%10];
wait(1);
P2=0xf7;
P0=led[month/10];
wait(1);
P2=0xfb;
P0=led[month%10];
wait(1);
P2=0xfd;
P0=led[day/10];
wait(1);
P2=0xfe;
P0=led[day%10];
wait(1);
if(key1!=1) //年+1
{
delay(100);
if(key1!=1)
year++;
delay(100);
while(key1==0);
}
if(key2!=1) //月+1
{
delay(100);
if(key2!=1)
month++;
delay(100);
while(key2==0);
}
if(key3!=1) //日+1
{
delay(100);
if(key3!=1)
day++;
delay(100);
while(key3==0);
}
if(key5!=1) //切换工作模式
{
delay(100);
if(key5!=1)
pattern++;
if(pattern==3)
pattern=0;
delay(100);
while(key5==0);
}
if (hour==h && minute==m && second==s)
{
Play_Song();
}
}
if(pattern==2) //pattern=2,闹钟显示
{
P2=0x7f;
P0=led[h/10];
wait(1);
P2=0xbf;
P0=led[h%10];
wait(1);
P2=0xdf;
P0=0x40;
wait(1);
P2=0xef;
P0=led[m/10];
wait(1);
P2=0xf7;
P0=led[m%10];
wait(1);
P2=0xfb;
P0=0x40;
wait(1);
P2=0xfd;
P0=led[s/10];
wait(1);
P2=0xfe;
P0=led[s%10];
wait(1);
if(key1!=1) //小时+1
{
delay(100); //进位规则 时
if(key1!=1)
h++;
if(h==24)
h=0;
delay(100);
while(key1==0);
}
if(key2!=1)
{ //分
delay(100);
if(key2!=1)
m++;
if(m==60)
{
m=0;
h++;
}
delay(100);
while(key2==0);
}
if(key3!=1) //秒
{
delay(100);
if(key3!=1)
s++;
if(s==60)
{
s=0;
m++;
}
delay(100);
while(key3==0);
}
if (hour==h && minute==m && second==s)
{
Play_Song();
}
if(key5!=1) //切换
{
delay(100);
if(key5!=1)
pattern++;
if(pattern==3)
pattern=0;
delay(100);
while(key5==0);
}
}
if(hour==24) hour=0; //手动更改时间时期时进位规则
if(minute==60)
{
hour++;
minute=0;
}
if(second==60)
{
minute++;
second=0;
}
if(year==100) year=0;
if(month==13)
{
year++;
month=1;
}
if(((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&day==32)||
((month==4||month==6||month==9||month==11)&&day==31)||
((month==2&&(year%400==0||(year%100!=0&&year%4==0)))&&day==30)||
((month==2&&year%4!=0)&&day==29))
{
day=1;
month++;
}
}
}
解释一下:这段代码很简单,涉及到的硬件只有几个按键作为输入以及蜂鸣器与数码管输出,也就是说你只要把稍微改一改输入输出那块,把相应的输入输出对应到你的硬件上,或者把代码中关于时钟实现的那部分逻辑代码摘出来放到你的代码里面去。
就OK了。
可能你要问了,它的内部是如何实现计时的呢?很简单,纯代码逻辑实现,不然你以为delay()和wait()干什么用的,
那它的中间过程有用到什么不可或缺的硬件(比如硬件计时器)了吗? 抱歉,没有。中间的硬件完全不重要,一小时60分,一分60秒,这完全是逻辑问题,我只要实现了秒,那么,分,时,月,年就很容易换算了。
重要的是输入以及输出。懂?
年代久远,东西都忘得差不多了,所以就不要问电路图什么的了,我真不知道!
你只需要稍微改一改程序,把输入输出对应上,然后……烧就完事了。
【单片机】含有闹钟的时钟设计相关推荐
- keil c语言 1602时钟代码,基于单片机的LCD1602电子时钟设计.doc
基于单片机的LCD1602电子时钟设计 设计任务和目的 1.1.设计任务 (1):用单片机设计基于LCD1602的电子时钟,显示时间和日期: (2):误差精度控制在1s/天: (3):具有时间和日期的 ...
- 基于单片机定时器/计数器的时钟设计及计数设计
基于单片机定时器/计数器的时钟设计以及计数设计 第一部分 前言 第二部分 定时器/计数器的原理 MCS-51定时器/计数器的结构 定时器/计数器相关特殊功能寄存器 定时器/计数器工作方式 第三部分 定 ...
- 闹钟定时设计c语言编程,单片机定时闹钟(课程设计).docx
单片机定时闹钟(课程设计) PAGE \* MERGEFORMAT10 绪 论 摘要: 单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM.只读 ...
- 【C51】基于C51单片机的LCD电子时钟设计(含代码,电路图,拿去直接用)
学校的一个课设 可以去"链接"直接打包下载 1 LCD电子时钟设计 1. 制作一个基于LCD显示的电子钟,在LCD显示器上显示当前时间. 2. 使用字符型LCD显示器显示时间. 3 ...
- 基于单片机的LCD1602电子时钟设计(代码)
博主福利:100G+电子设计学习资源包! http://mp.weixin.qq.com/mp/homepage?__biz=MzU3OTczMzk5Mg==&hid=7&sn=ad5 ...
- 数字电子计算机处理信号shi,余洪伟 基于单片机数字电子时钟设计(led显示).doc...
余洪伟 基于单片机数字电子时钟设计(led显示) 沈阳航空航天大学 课 程 设 计 (论文) 题目 基于单片机的数字电子时钟设计 (LED显示) 班 级 学 号 2013040701060 学 生 姓 ...
- 基于单片机病房呼叫系统数码管显示房号设计-基于单片机工业生产现场的光照强度控制设计-基于单片机多功能智能台灯设计-基于单片机二维码LCD显示设计-基于单片机多功能时钟闹钟万年历控制系统设计【毕设分享】
1641基于单片机病房呼叫系统数码管显示房号设计 设计思路:此设计实现的功能通过按键模拟房号,当按键按下时会将房号编号发送到数目管上进行显示,并通过声光进行提示.包含的电路有:数码管显示电路.按键电路 ...
- 基于微型计算机系统的实时时钟设计,基于单片机的DS12C887时钟芯片应用研究
摘 要: 新型时钟芯片DS12C887具有计时精确.断电情况下运行十年以上不丢失资料等优点,在单片机计时系统中有着广泛应用.本文分析了DS12C887的功能特性,介绍了DS12C887与AT89C51 ...
- 万年历设计单片机c语言,数字万年历设计(80c51单片机、时钟芯片ds1320).pdf
数字万年历设计(80c51单片机.时钟芯片ds1320) 德州科技职业学院青岛校区 2006 级毕业论文 多功能数字万年历设计 摘 要 : 本设计是一种基于 AT89C52 单片机控制的数字万年历设计 ...
最新文章
- Xilinx 在文档中所用的 LC(logic cells) 与 LUT之间的换算关系
- oracle判断修改,【数据库】Oracle实现判断条件批量修改功能
- Python多进程之构建进程池
- java运行效率优化_如何优化JAVA代码及提高执行效率
- java图像处理之图像融合
- mysql怎么刷题_面试刷题mysql1:一条sql语句是如何经过mysql的体系结构的?
- php板块模板,有没有办法制作模板,但没有在板块php渲染它
- HTML5之webSocket使用
- 批处理命令无法连续执行
- 润乾报表 数据集ds1中,数据源xmglxt_x3无数据库连接,且未设定数据连接工厂,请检查数据源设定:...
- php多线程是什么意思,多线程是什么意思
- 数据库安全之数据掩码:SQL新功能之动态数据掩码(SQL2016AZURE SQL)
- 如果使用SQLExpress 2005时要求'sp_configure 'User instances enabled''
- win7 安装SQL Server 2005 开发版 图文教程
- Web安全漏洞介绍及防御-文件上传漏洞
- SSLOJ 买装备 5月11日提高B组 T1
- node_redis 中文文档及node_redis 注释笔记(中文版)
- bzoj5369: [PKUSC2018]最大前缀和 (状压dp)
- facebook登陆接入
- 【安卓Android】VibratorService分析