电子时钟系统设计.docx
《电子时钟系统设计.docx》由会员分享,可在线阅读,更多相关《电子时钟系统设计.docx(23页珍藏版)》请在冰豆网上搜索。
![电子时钟系统设计.docx](https://file1.bdocx.com/fileroot1/2023-1/1/1c228acc-d2ea-4677-8bc8-80ba08937673/1c228acc-d2ea-4677-8bc8-80ba089376731.gif)
电子时钟系统设计
课程设计任务书
题目电子时钟系统设计
专业、班级电信11-02学号541101030218姓名李瑞
主要内容、基本要求、主要参考资料等:
一、主要内容:
熟悉单片机应用系统的设计方法和规范,达到综合的目的。
学习文件检索和查找数据手册的能力、
学习protel软件的使用。
学会整理和总结设计文档报告。
二、基本要求:
以MCS-51系列单片机为核心,组成一个电子时钟系统、
系统显示由6位数码管显示组成,分别显示时间值的时、分、秒。
能够随时对当前时间进行调整。
能够随时输入定时(闹钟)时间。
定时(闹钟)时间到,发出闹钟提醒信号。
闹钟提醒信号的声音为断续形式,最长不超过1分钟。
三、主要参考资料:
张毅坤等单片微型计算机原理及应用西安西安电子科技大学出版社
李建忠编著单片机原理及应用西安西安电子科技大学出版社
完成期限:
2015年1月17日
指导教师签名:
课程负责人签名:
2015年1月4日
摘要
单片机自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硬件接线及设计
图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主函数流程图
图7主函数程序流程图
3、2定时器T0中断服务程序流程图
图8定时器T0中断服务程序流程图
3。
3闹钟响应程序流程图
图9闹钟响应程序流程图
3、4键盘扫描程序流程图
图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〈reg51、h〉
#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;//显示闹钟时间
}
}
}
if(p3==0XF7)//key_confirm键
{
delay(10);
if(p3==0XF7)
{
confirm();
}
while(p3==0XF7)//key_confirm键按下到弹起期间
{
p3=P3;
switch(moshi)
{
case0:
show();break;//显示正常走时
case1:
show1();break;//显示设置时间
case2:
show2();break;//显示闹钟时间
}
}
}
}
//******************调时调脑钟增数程序***********************
voidadd(void)
{
//模式1,调时模式,调时增数
if(moshi==1&&mov==0)
{sec1++;}
if(moshi==1&&mov==1)
{min1++;}
if(moshi==1&&mov==2)
{hour1++;}
//模式2,闹钟设定模式,闹钟增数
if(moshi==2&&mov==0)
{sec2++;}
if(moshi==2&&mov==1)
{min2++;}
if(moshi==2&&mov==2)
{hour2++;}
}
//******************确认键服务函数***************************
voidconfirm(void)
{
if(moshi==1)//模式1,调时环境下校正时间
{
t=TF0=0;
sec=sec1;
min=min1;
hour=hour1;
sec1=