电子时钟系统设计.docx
- 文档编号:8739443
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:23
- 大小:253.77KB
电子时钟系统设计.docx
《电子时钟系统设计.docx》由会员分享,可在线阅读,更多相关《电子时钟系统设计.docx(23页珍藏版)》请在冰豆网上搜索。
电子时钟系统设计
课程设计任务书
题目电子时钟系统设计
专业、班级学号姓名
主要内容、基本要求、主要参考资料等:
一、主要内容:
①熟悉单片机应用系统的设计方法和规范,达到综合的目的。
②学习文件检索和查找数据手册的能力。
③学习protel软件的使用。
④学会整理和总结设计文档报告。
二、基本要求:
①以MCS-51系列单片机为核心,组成一个电子时钟系统。
②系统显示由6位数码管显示组成,分别显示时间值的时、分、秒。
③能够随时对当前时间进行调整。
④能够随时输入定时(闹钟)时间。
⑤定时(闹钟)时间到,发出闹钟提醒信号。
⑥闹钟提醒信号的声音为断续形式,最长不超过1分钟。
三、主要参考资料:
①张毅坤等单片微型计算机原理及应用西安西安电子科技大学出版社
②李建忠编著单片机原理及应用西安西安电子科技大学出版社
完成期限:
指导教师签名:
课程负责人签名:
2013年12月22日
目录
摘要1
1设计方案选择2
1.1单片机选型2
1.2按键模块2
1.3显示模块2
1.4计时参考模块3
1.5显示器驱动模块3
1.6闹钟响铃模块4
1.7电源模块4
2硬件接线及设计4
2.1单片机晶振配置5
2.2复位电路设计5
2.3按键电路设计6
2.4蜂鸣器驱动电路设计6
2.5显示模块电路设计7
3软件部分7
3.1主函数流程图7
3.2定时器T0中断服务程序流程图8
3.3闹钟响应程序流程图9
3.4键盘扫描程序流程图10
4系统综述11
4.1上电界面11
4.2调时界面11
4.3闹钟设定界面11
4.4正常走时界面12
4.5闹钟响应12
附录1总体设计电路图15
附录2PCB图16
附录3元件清单17
附录4总程序18
摘要
单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广泛、发展很快。
Intel公司生产的MCS-8051系列单片机是各单片机中最为典型和最有代表性的一种。
本次设计以MCS-8051芯片为核心,辅助以必要的外围电路,设计了一个结构简单功能齐全的数值时钟。
在硬件方面,单片机外接12MHz芯片进行驱动。
通过数码管能够准确明亮的显示时、分、秒;四个简单的按键实现对时间的调整;蜂鸣器实现闹钟响铃功能;软件方面采用c语言编程。
整个电子钟系统能完成时间的显示、调试和一组定时闹钟的功能。
关键词:
51单片机,定时器,闹钟,数码管
1设计方案选择
1.1单片机选型
根据选题芯片采用MCS-8051单片机,Intel公司生产的51系列8位单片机,凭借其成熟的技术标准和很高的性价比得到了广泛的普及与应用,其功能强大,用来做电子表硬件易实现,编程规范。
1.2按键模块
方案一:
4×4行列式键盘
如果选择此方案,那么在修改时钟或设置闹铃时间时就可以直接从键盘输入,方便、快捷。
缺点也很明显,一是浪费按键,用全键盘来实现设定时间的小功能不免大材小用;二是从实用性考虑,全键盘体积大,明显不经济不方便。
故放弃。
方案二:
独立式按键
如果设置过多按键,将会占用较多I/O口,而且会给布线带来不便,同时浪费按键,不高效,程序繁琐。
本次设计适用于按键较少的情况。
为了尽量实现按键的高效性,此次设计采用四个独立式按键,分别定义为key_mode、key_add、key_move,key_confirm,依次是模式键、加数键、移位键、确认键。
1.3显示模块
方案一:
液晶显示器LCD
如果选择此方案,将会降低系统的功耗,可以用电池供电,便于携带,但液晶显示器的驱动电路复杂,使用起来有一定的难度。
方案二:
数码管LED
数码管的驱动电路简单,使用方便,如果选择了此方案,那么在夜间看时间的时候就不需要有光源,非常方便。
其缺点是功耗较大。
按照此次任务书设计要求,选择两个4位一体七段数码管用于显示。
1.4计时参考模块
方案一:
专用时钟芯片
如果使用时钟芯片,系统就不怕掉电且时间精确,但这种芯片比较贵,浪费资源不经济。
方案二:
单片机内部定时/计数器
由于本次设计本主要是为了学习单片机程序的编写和调试,以及设计硬件电路的一些方法,因此采用软件的方法来计时。
本次设计用单片机内部定时/计数器T0作为电子时钟参考。
1.5显示器驱动模块
由于通过数码管公共极的电流较大,单片机I/O口驱动能力是不够的,故LED驱动模块必不可少。
为避免过多地使用分立元件,本次设计采用一片74LS245来驱动位码,用P2口进行位选扫描。
图174LS245元件封装图
74LS245是常用来驱动LED或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据,74LS245还具有双向三态功能。
片选端
,接低电平时传输数据,接高电平时A、B均为高阻态。
方向选择端AB/
,接高电平时信号由A向B传输(发送),接低电平时信号由B向A传输(接收)。
1.6闹钟响铃模块
通过三极管放大后驱动蜂鸣器工作,单片机I/O接三极管基极。
1.7电源模块
本系统采用了数码管作为显示器,功耗较大,不便于使用电池供电。
况且本系统的体积较大,即使使用电池供电也不便于随身携带,因此用5V外部稳压电源来供电。
2硬件接线及设计
8位七段LED显示器
MCS-8051
段码驱动
晶振
复位电路
位码驱动
按键
蜂鸣器
图2系统硬件框图
2.1单片机晶振配置
图3单片机晶振配置和复位电路
晶振选择12MHz,接到如图所示引脚。
2.2复位电路设计
图4复位电路
复位电路兼具上电复位功能以及按键复位功能,接到如图所示引脚。
2.3按键电路设计
图5按键电路
采用4个独立按键配以4个上拉电阻实现对时钟和闹钟的设定及修改。
四个独立式按键分别定义为key_mode、key_add、key_move、key_confirm,依次是模式键、调时加键、调时移位键、确认键。
2.4蜂鸣器驱动电路设计
图6蜂鸣器驱动电路
蜂鸣器采用NPN三极管放大电路驱动,接到如图所示引脚。
2.5显示模块电路设计
显示设备为共阳7段数码管(LED),用单片机P0口作为LED段选控制端,用单片机P2口作为LED位选控制端,并采用集成块74LS245作为位驱动模块。
片选端
接地,方向选择端AB/
接电源。
3软件部分
3.1主函数流程图
开始
初始化
定时器T0循环中断计时
主循环
键盘扫描
闹钟判定
显示响应
闹钟响应
结束
图7主函数程序流程图
开始
3.2定时器T0中断服务程序流程图
T0重装初值
t+1
t=20?
t=0,sec+1
sec=60?
?
sec=0,min+1
min=60?
?
min=0,hour+1
hour=24?
?
hour=0
结束
图8定时器T0中断服务程序流程图
3.3闹钟响应程序流程图
开始
闹钟判定
闹钟定时到?
闹钟打开?
key_confirm按下?
响铃一分钟
关闭蜂鸣器
结束
图9闹钟响应程序流程图
3.4键盘扫描程序流程图
开始
键盘扫描
有键按下?
键盘抖动?
key_confirm
key_move
key_add
key_mode
confirm();
mov+1
add();
moshi+1
moshi>2?
mov>2?
moshi=0
mov=0
结束
图10键盘扫描程序流程图
4系统综述
4.1上电界面
电子表上电后自动初始化,接着从00-00-00开始走时,显示正常走时界面,此时闹钟默认关掉。
按下key_mode键,可依次切换到调时界面、调闹钟界面、正常走时界面,如此循环往复。
上电初始化后,调时初值为0000-00,闹钟初值为00-0000。
4.2调时界面
调时界面,从左至右依次显示时、分、秒,数字右下角小点代表调整位到达位置。
在调时界面下,按下key_move键可以移动调整位,数字下标小点用以指示当前操作的数位,按下key_add键可以对调整位进行加数操作。
当且仅当在调时界面下,按下key_confirm键可确认设定,电子表按设定时间更新并走时,同时自动清零设定时间。
此时再按key_mode键切换回正常走时界面即能看到时间已经更新。
如果调时后没有按下key_confirm键确认,而是直接按key_mode键切换回正常走时界面,则设置时间被保存,当前时间并不更新。
4.3闹钟设定界面
闹钟设定界面,从左至右依次显示时、分、秒,数字右下角小点代表调整位到达位置。
在闹钟设定界面下,按下key_move键可以移动调整位,数字下标小点用以指示当前操作的数位,按下key_add键可以对调整位进行加数操作。
闹钟设置好后直接按key_mode键返回正常正常走时界面即可,无需按key_confirm键确认,闹钟设定值会自动保存。
4.4正常走时界面
正常走时界面,从左至右依次显示时、分、秒,小点亮灭代表闹钟开闭。
在正常走时界面下,按下key_add键和key_move键不产生操作,LED显示无变化;按下key_confirm键可循环开闭闹钟,LED显示对应变换提示闹钟的开闭;按下key_mode键可依次切换到调时模式、闹钟设定模式、正常走时模式,循环往复。
4.5闹钟响应
当正常走时到达闹铃设定值后,闹铃响应,正常情况下持续蜂鸣一分钟后自动关闭蜂鸣器。
闹铃响铃过程中,若按下key_confirm键可立刻关闭蜂鸣器。
闹铃响应后自动等待下次响应。
总结
在这次课程设计中,运用到了很多以前的专业知识,虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的一大收获。
另外,要做好一个课程设计,就必须做到:
在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常德,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的课程设计结束了,但是从中学到的知识会让我受益终身。
发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。
设计过程,好比是我们人类成长的历程,常有一些不如意,但毕竟这是第一次做,难免会遇到各种各样的问题。
在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,不能灵活运用。
参考文献
[1] 郑君里,应启珩,杨为理.信号与系统(第二版)上册[M].高等教育出版社,2000
[2] 郑君里,应启珩,杨为理.信号与系统(第二版)下册[M].高等教育出版社,2000
[3] 谭浩强.C程序设计(第二版)[M].清华大学出版社,2003
[4]于京. 51系列单片机C程序设计与应用案例[M].北京:
中国电力出版社,2006.
[5]孙育才. ATMEL新型AT89S52系列单片机及其应用[M].北京:
清华大学出版社,2005.
[6] 吴坚,刘高平.基于GPRS网络的点对点图像传输方案[J].计算机应用研究,2004,
附录
附录1总体设计电路图
附录2PCB图
附录3元件清单
序号
元件名称
规格型号/参数
数量(个)
1
单片机
AT89C51
1
2
显示驱动三极管
Q1
1
3
晶振
12MHz
1
4
电容
33pF
2
10μF
1
5
按键
S1
1
6
排阻
102
1
7
电阻
10K
1
4.7K
1
8
蜂鸣器
LS1
1
9
数码管
4BIT_8SEG_LED
2
10
驱动芯片
74LS245
1
附录4总程序
//****************头文件及宏定义*******************************
#include
#defineucharunsignedchar
#defineuintunsignedint
//****************软件延时程序*********************************
voiddelay(uintii)
{while(--ii);}
//****************定义数码管驱动码******************************
ucharduan[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,
0XBF,0XFF,0X7F};//段选,0123456789-灭.
ucharwei[]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};//位选,共阳,从右至左
//****************定义变量**************************************
uchart=0,sec=0,min=0,hour=0;//正常走时时间变量
ucharsec1=0,min1=0,hour1=0;//时间设定值变量
ucharsec2=0,min2=0,hour2=0;//闹钟设定值变量
ucharalarm_en=0;//闹钟开关变量
ucharalarm_flag=0;//闹钟定时到达标志变量
ucharp3=0,moshi=0,mov=0;//P3口查询,模式值,调整位
//显示缓冲区,依次为正常、调时、闹钟设定、调整位带点标记
uchartemp[8],temp1[8],temp2[8],temp3[8];
//****************函数声明*************************************
voidinitialize(void);//初始化
voidshow(void);//正常走时显示
voidshow1(void);//时间设定显示
voidshow2(void);//闹钟设定显示
voidshow3(void);//调整位标记
voidshow4(void);//闹钟开关标记
voidkeyscan(void);//键盘扫描
voidadd(void);//调时调闹钟加数程序
voidconfirm(void);//调时确认,闹钟开关
voidalarm_judge(void);//闹钟定时到达判定
voidbeep(void);//闹钟响铃程序
//******************主函数***************************
voidmain()
{
initialize();
while
(1)
{
keyscan();
alarm_judge();
switch(moshi)
{
case0:
show();show4();break;//显示正常走时
case1:
show1();show3();break;//显示设置时间
case2:
show2();show3();break;//显示闹钟时间
}
if(alarm_flag==1&&alarm_en==1)//定时时间到达且闹钟打开
{beep();}
}
}
//*****************定时器初始化**************************
voidinitialize(void)
{
TMOD=0x01;
TH0=0X3C;
TL0=0XB0;//50ms
ET0=1;
EA=1;
TR0=1;
P1=0X7F;//初始化时关掉蜂鸣器
alarm_flag=alarm_en=0;
}
//*****************定时器T0中断服务程序****************
voidTimer0(void)interrupt1
{
TL0=0XB0;
TH0=0X3C;
t++;
if(t==20)//(50ms*20=1s)
{t=0;sec++;}
if(sec==60)//秒为60,则清零,分加1
{sec=0;min++;}
if(min==60)//分为60,则清零,时加1
{min=0;hour++;}
if(hour==24)//时为24,则清零
{hour=0;}
if(sec1==60)
{sec1=0;min1++;}
if(min1==60)
{min1=0;hour1++;}
if(hour1==24)
{hour1=0;}
if(sec2==60)
{sec2=0;min2++;}
if(min2==60)
{min2=0;hour2++;}
if(hour2==24)
{hour2=0;}
}
//******************正常时间显示程序*******************
voidshow(void)
{
uchari=0;
temp[0]=sec%10;
temp[1]=sec/10;
temp[2]=10;
temp[3]=min%10;
temp[4]=min/10;
temp[5]=10;
temp[6]=hour%10;
temp[7]=hour/10;
for(i=0;i<8;i++)
{
P2=wei[i];
P0=duan[temp[i]];
delay(100);
}
}
//******************调时模式显示程序*******************
voidshow1(void)
{
uchari=0;
temp1[0]=sec1%10;
temp1[1]=sec1/10;
temp1[2]=10;
temp1[3]=min1%10;
temp1[4]=min1/10;
temp1[5]=11;
temp1[6]=hour1%10;
temp1[7]=hour1/10;
for(i=0;i<8;i++)
{
P2=wei[i];
P0=duan[temp1[i]];
delay(100);
}
}
//******************闹钟设定模式显示程序*******************
voidshow2(void)
{
uchari=0;
temp2[0]=sec2%10;
temp2[1]=sec2/10;
temp2[2]=11;
temp2[3]=min2%10;
temp2[4]=min2/10;
temp2[5]=10;
temp2[6]=hour2%10;
temp2[7]=hour2/10;
for(i=0;i<8;i++)
{
P2=wei[i];
P0=duan[temp2[i]];
delay(100);
}
}
//******************调整位标记显示程序*******************
voidshow3(void)
{
ucharmovv=0;
switch(mov)
{
case0:
movv=0;break;
case1:
movv=3;break;
case2:
movv=6;break;
}
P2=wei[movv];
P0=duan[12];
delay(100);
}
//*********************闹钟开闭显示程序*******************
voidshow4(void)
{
if(alarm_en==1)
{
P2=wei[2]+wei[5];
P0=duan[12];
delay(100);
}
}
//******************键盘扫描程序***********************
voidkeyscan(void)
{
P3=0XFF;
p3=P3;
if(p3==0XFF)return;
if(p3==0XFE)//key_mode键
{
delay(10);
if(p3==0XFE)
{
moshi++;
if(moshi>=3)moshi=0;
}
while(p3==0XFE)//key_mode键按下到弹起期间
{
p3=P3;
switch(moshi)
{
case0:
show();break;//显示正常走时
case1:
show1();break;//显示设置时间
case2:
show2();break;//显示闹钟时间
}
}
}
if(p3==0XFD)//key_add键
{
delay(10);
if(p3==0XFD)
{
add();
}
while(p3==0XFD)//key_add键按下到弹起期间
{
p3=P3;
switch(moshi)
{
case0:
show();break;//显示正常走时
case1:
show1();break;//显示设置时间
case2:
show2();break;//显示闹钟时间
}
}
}
if(p3==0XFB)//key_move键
{
delay(10);
if(p3==0XFB)
{
mov++;
if(mov>=3)mov=0;
}
while(p3==0XFB)//key_move键按下到弹起期间
{
p3=P3;
switch(moshi)
{
case0:
show();break;//显示正常走时
case1:
show1();break;//显示设置时间
case2:
show2();break;//显示闹钟时间
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子 时钟 系统 设计