基于单片机的数字电子钟.docx
- 文档编号:11722268
- 上传时间:2023-03-31
- 格式:DOCX
- 页数:12
- 大小:290.35KB
基于单片机的数字电子钟.docx
《基于单片机的数字电子钟.docx》由会员分享,可在线阅读,更多相关《基于单片机的数字电子钟.docx(12页珍藏版)》请在冰豆网上搜索。
基于单片机的数字电子钟
班级电科081班
姓名龚浪
学号080712110073
实验名称基于单片机的数字电子钟
指导教师李良荣
理学院
时间:
2011年6月20日
基于单片机的数字电子钟
一.实验目的
1.掌握单片机的工作原理
2.了解单片机几个中断的工作条件
3.能将单片机用于简单的控制
二.实验内容及要求
设计一个电子钟,让它具有以下几个功能:
1.准确显示当前时间
2.具有校时功能(能调整时、分)
3.能设定闹铃
三.实验原理
单片机内部有两个定时器,它以晶体振荡器频率经12分频后作为计数脉冲,能够比较准确的定时。
因此可以用它产生电子钟的秒,然后利用定时器串联的方式,就可以产生分钟。
再加以适当的软件控制来产生小时,这样就可以组成一个完整的电子钟了。
具体电路如图4-1所示。
图4-1电子钟原理图
它的工作原理为:
1.时钟工作部分
(1)让单片机的T0以定时器方式工作并且工作在方式一(16位定时器,因定时时间较长,故选用方式一),T1工作在计数器方式,它的输入脉冲为T0产生的进位。
(2)让T0产生50ms的定时,并设置一个变量,让它在每计满50ms时加1,当计满20次时,即为1s。
此时将产生一个进位脉冲,T1就会对此脉冲计数,计满60次时,让秒变量清零同时让分钟变量加1。
当分钟变量加到60时,将分钟变量清零同时小时变量加1,小时计满24就清零。
2.校时部分
校时部分的设计也是利用中断实现的
(1)当校时开关置高电平时,每产生一个校时脉冲或校分脉冲将使小时或分钟加1。
(2)当校时开关置低电平时,每产生一个校时脉冲或校分脉冲将使小时或分钟减1。
3.闹铃部分
(1)当闹铃设置开关(set_clock)打开时,电子钟处于闹铃设置状态,此时利用校时开关就可设定闹铃。
(2)若已经设置了闹铃,且闹铃启动开关处于打开状态,则当电子钟时间到达闹铃所设定的时间时,将产生提示信号,此处为闹铃指示灯亮,也可以外接一轰鸣器使其发出声音。
4.程序代码
#include
#defineDATEP0//数据口
#defineSELECP2//位选口
sbitset_clock=P1^6;//设置闹铃开关
sbitopen_clock=P1^7;//是否启动闹铃
sbitled_clock=P3^7;//闹铃指示灯
sbitcout=P3^0;//产生脉冲送分进位
sbitchange=P3^6;//change=1,校时、分功为加。
change=0,校时、分功为减。
voidinti(void);//初始化函数
voiddisplay(void);//显示函数
voiddelay(unsignedtt);//延时函数
voiddisp_clock(void);
unsignedchart,hour=0,minute=0,
second=0,set_hour=0,set_minute=0;
unsignedintt_table[]={0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90,0xBF};//字形表
//*******************************
//主函数
//*******************************
voidmain()
{
inti();
while
(1)
{
if(t==20)//已中断20次,时间为20*50ms=1s
{t=0;second++;cout=0;cout=1;}//给T1计数器1个脉冲
if(minute==60)//已满1小时
{minute=0;hour++;}
if(hour==24)
{hour=0;}
display();
if(!
set_clock)
{
while(!
set_clock)
{set_hour=hour;set_minute=minute;disp_clock();}//设置闹铃时间
hour=0;minute=0;second=0;
}
if(open_clock==0&&set_hour==hour&&set_minute==minute)
{led_clock=0;}//闹铃指示灯亮
}
}
//********************************
//显示函数
//********************************
voiddisplay()
{
unsignedcharhour1,hour2,minute1,minute2,second1,second2,i;
hour1=hour/10;hour2=hour%10;//将小时分为高位hour1和低位hour2
minute1=minute/10;minute2=minute%10;
second1=second/10;second2=second%10;
for(i=0;i<2;i++)
{
SELEC=0x01;DATE=t_table[hour1];delay(200);//动态扫描显示“小时”高位
SELEC=0x02;DATE=t_table[hour2];delay(200);//显示“小时”低位
SELEC=0x04;DATE=t_table[10];delay(100);//显示间隔符“-”
SELEC=0x08;DATE=t_table[minute1];delay(200);//动态扫描显示“分钟”高位
SELEC=0x10;DATE=t_table[minute2];delay(200);//显示“分钟”低位
SELEC=0x20;DATE=t_table[10];delay(100);//显示间隔符“-”
SELEC=0x40;DATE=t_table[second1];delay(200);//动态扫描显示“秒”高位
SELEC=0x80;DATE=t_table[second2];delay(200);//显示“秒”低位
}
}
//********************************
//设置闹铃时的显示函数
//********************************
voiddisp_clock()
{
unsignedcharhour1,hour2,minute1,minute2,i;
hour1=set_hour/10;hour2=set_hour%10;//将小时分为高位hour1和低位hour2
minute1=set_minute/10;minute2=set_minute%10;
for(i=0;i<2;i++)
{
SELEC=0x01;DATE=t_table[hour1];delay(200);//动态扫描显示“小时”高位
SELEC=0x02;DATE=t_table[hour2];delay(200);//显示“小时”低位
SELEC=0x04;DATE=t_table[10];delay(100);//显示间隔符“-”
SELEC=0x08;DATE=t_table[minute1];delay(200);//动态扫描显示“分钟”高位
SELEC=0x10;DATE=t_table[minute2];delay(200);//显示“分钟”低位
}
}
//*************************************
//延时函数
//*************************************
voiddelay(unsignedtt)
{
while(tt)
tt--;
}
//*************************************
//初始化函数
//*************************************
voidinti(void)
{
EA=1;
TMOD=0X61;
ET0=1;TR0=1;TH0=0X3C;TL0=0XAF;//定时器T0初始化设置
ET1=1;TR1=1;TH1=0XC4;TL1=0XC4;//定时器T1初始化设置
EX0=1;IT0=1;//外中断0初始化设置
EX1=1;IT1=1;//外中断1初始化设置
}
//*************************************
//外中断0中断函数
//功能:
实现校时、分,按下INT0对应的按键
//将使时、分加1.
//*************************************
voidextern0()interrupt0
{
if(change==1)
hour++;
if(change==0)
{
if(hour==0)
hour=24;
hour--;
}
}
//************************************
//外中断1中断函数
//功能:
实现校时、分,按下INT0对应的按键
//将使时、分减1.
//************************************
voidextern1()interrupt2
{
if(change==1)
minute++;
if(change==0)
{
if(minute==0)
minute=60;
minute--;
}
}
//*************************************
//定时器T0中断函数
//功能:
定时,一次中断为50ms。
//************************************
voidtimer0()interrupt1
{
TH0=0X3C;
TL0=0XAF;
t++;
}
//**************************************
//计数器T1中断函数
//功能:
定时,一次中断为60s即1分钟
//**************************************
voidtimer1()interrupt3
{
second=0;minute++;
}
//**************************************
四.实验结果
1.正常显示时间演示如图4-2所示:
图4-2电子钟时间显示
2.校时演示
如图4-3所示:
图4-3电子钟校时演示
3.闹铃设置演示
设置闹铃时间为22:
50,如图4-4所示:
图4-4电子钟闹铃设置
当时间为22:
49:
52时,由于还未到闹铃时间,因此指示灯未亮,如图4-5所示:
图4-5闹铃指示灯未亮演示
当时间为22:
50:
00时,闹铃时间已到,因此指示灯亮。
图4-6闹铃指示灯亮演示
五.器件清单
七段数码管
8个
LED灯
1个
AT89C52单片机
1片
脉冲开关
2个
8路开关
1个
导线及电阻
若干
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 数字 电子钟