基于单片机电子时钟设计.docx
《基于单片机电子时钟设计.docx》由会员分享,可在线阅读,更多相关《基于单片机电子时钟设计.docx(18页珍藏版)》请在冰豆网上搜索。
基于单片机电子时钟设计
单片机原理与应用
课程设计与实现
实训报告
专业:
自动化年级/班级:
姓名:
实训时间:
实训地点:
指导教师:
一、实训题目:
基于51单片机电子时钟设计设计要求:
(1)可设定时间;
(2)可显示当时时间;(3)每小时振铃响一次,并且振铃铃声响次数与时间一致。
二、实训目的:
(1).学习8051定时器时间计时处理、按键扫描及LED数码管显示的设计方法。
(2).设计任务及要求利用实验平台上6个LED数码管,设计带有闹铃功能的数字时钟。
三、所用器件工作原理及控制方法:
1.89s52
AT89S52是一种低功耗、高性能CMOS位微控制器,使用ATMEL公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
并具有以下标准功能:
8k字节Flash,256字节RAM32位I/O口线,看门狗定时器,
2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工
串行口,片内晶振及时钟电路。
另外,AT89S52可降至0Hz静态逻辑操作,支
持2种软件可选择节电模式。
空闲模式下,CPU亭止工作,允许RAM定时器/
计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻
结,单片机一切工作亭止,直到下一个中断或硬件复位为止。
2.定时
软件方法,利用单片机本身的定时计数功能,节省成本,提高稳定性。
3.显示
采用LED8段数码管,具有耗电低、配置灵活、线路简单、安装方便、耐转动、价格低廉且寿命长等优点。
4.74LS244
74LS244为3态8位缓冲器,一般用作总线驱动器。
74LS244没有锁存的功能。
地址锁存器就是一个暂存器,它根据控制信号的状态,将总线上地址代码暂存起来。
8086/8088数据和地址总线采用分时复用操作方法,即用同一总线既传输数据又传输地址。
5.简介
当微处理器与存储器交换信号时,首先由CPU发出存储器地址,同时发出允许锁存信号ALE给锁存器,当锁存器接到该信号后将地址/数据总线上的地址锁存在总线上,随后才能传输数据。
74IS244图例
锁存器是一个很普通的时序电路。
一般的,它在时钟上升沿或者下降沿来的时候锁存输入,然后产生输出,在其他的时候输出都不跟随输入变化,这就是所谓边缘触发的D触发器。
通常用作单片机的地址锁存器的芯片有74LS3738282、74LS273
74HC373等。
用途
它主要用于三态输出,作为地址驱动器、时钟驱动器、总线驱动器和定向发送器等。
其真值表如下:
74LS244真值表
Inputs
Output
G
A
Y
L
L
L
L
H
H
H
X
Z
74LS244真值表:
L表示低电平
H表示高电平
X表示不定状态
Z表示咼阻态
74LS244技术参数
最小
典型
最大
VCC
4.25V
5V
5.25V
高电平输出电流
-15mA
低电平输出电流
24mA
工作温度n
「0C]
「70C
四、软硬件设计
1.显示模块
(1)硬件设计
(2)流程图
(3)软件设计
voidled_dispiay()
{
wx_0=0;wx_仁0;//
ledbit=smg[time1s/10];
wx_仁1;
delay();
wx_仁0;
Iedbit=smg[time1s%10];//wx_0=1;
delay();
wx_0=0;
wx_2=0;wx_3=0;
ledbit=smg[time1f/10];
wx_3=1;
小时位选
//十位显示
个位显示
//分钟显示
//十位显示
delay();
wx_3=0;
ledbit=smg[time1f%10];//
wx_2=1;
delay();
wx_2=0;
wx_4=0;wx_5=0;
ledbit=smg[time1x/10];
wx_5=1;
delay();
wx_5=0;
ledbit=smg[time1x%10];//
wx_4=1;
delay();
wx_4=0;
}
2.定时模块
(1)流程图
(2)软件设计
voidtime1()interrupt1
{
time50ms++;
if(time50ms==20)//
{
time50ms=0;
time1s++;
if(time1s==60)
{
time1s=0;
time1f++;
if(time1f==60)
{
time1f=0;
time1x++;
if(time1x==24)
{
time1x=0;
个位显示
//分钟显示
//十位显示
个位显示
计数20个50ms为1s
}
}
}
}
TH0=0x3c;
TL0=0xb0;
}
3.键盘控制模块
(1)硬件设计
(3)软件设计voidshezhi_diaplay(){
if
(1)
if(yiwei==0)delayms(66);
if(yiwei==0)
TR0=0;
++num;
}
/*秒调整*/
if(num==1&jia==0)
delayms(70);
if(num==1&jia==0)
time1s++;
if(num==1&sub==0)
delayms(70);
if(num==1&sub==0)
time1s--;
//led_dispiay();
/*分钟调整*/
if(num==2&jia==0)
delayms(70);
if(num==2&jia==0)
time1f++;
if(num==2&sub==0)
delayms(70);
if(num==2&sub==0)
time1f--;
//led_dispiay();
/*小时调整*/
if(num==3&jia==0)
delayms(70);
if(num==3&jia==0)
time1x++;
if(num==3&sub==0)delayms(70);
if(num==3&sub==0)
time1x--;
//led_dispiay();
if(num>=4)
{
num=0;
TR0=1;
}
}
}
4.总设计电路图
nd
门口
s
B
s
s
-'7s->I
i
..
L:
五、实训总结:
经过两周的单片机课程设计,我组基本完成课题要求。
虽然还是存在很多不足,但是功能上基本达标。
时钟显示功能,精确度完全可以满足日常生活显示时间的需要;调时功能,方便快捷。
硬件设施合乎要求,软件设计可以配合硬件实现要求功能。
但是由于时间比较短,出现部分不足:
初期时钟不显示数字,经检查是由于硬件连接不完善,存在漏焊,虚焊和错焊等问题。
不过,我们相信,如果时间充足,将软件改进,我们完全可以很好实现所有功能。
另外,在本次设计的过程中,我们发现很多的问题,虽然以前没有做过这样的设计但通过这次设计我学会了很多东西,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我们觉的写好一个程序并不是一件简单的事,比如写一个程序看其功能很少认为编写程序简单,但到编的时候才发现一些细微的知识或低级错误经常犯做不到最后常常失败,所
以有些东西只有学精弄懂并且要细心才行,只学习理论有些东西是很难理解的,更谈不上掌握。
从这次的课程设计中,我们真正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的练习的过程中才能提高,我想这就是我们在这次课程设计中的最大收获。
最后非常感谢王老师的悉心指导!
六、
附件:
附1:
程序代码
#inelude#includevintrins.h>
[***********
#defineucharunsignedchar#defineuintunsignedintvoidshezhi_display(void);voidled_display(ucharm);voidzhengdian(void);
voiddelay(void);
voiddelayms(ucharms);
uchartime1s=0,time50ms;//定时1s计数器
uchartime1f=0,time1x=0;
uchara,b,k,m,num=0;
#defineledbitP0//P0.0-P0.7--A~G
externucharcodesmg[]={//共阳极0-9显示代码
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
********************************************************
/函数名:
led_display()
/功能:
数码管显示数据,驱动芯片74LS244
/输入:
dat---8位数据
/输出:
无
/说明:
输入十进制数。
I********************************************************
voidled_dispiay()
{
wx_0=0;wx_1=0;ledbit=smg[time1s/10];wx_1=1;
delay();
wx_1=0;
ledbit=smg[time1s%10];
wx_0=1;
delay();
wx_0=0;
wx_2=0;wx_3=0;
ledbit=smg[time1f/10];
wx_3=1;
delay();
wx_3=0;
ledbit=smg[time1f%10];
wx_2=1;
delay();
wx_2=0;
wx_4=0;wx_5=0;
ledbit=smg[time1x/10];
wx_5=1;
delay();
wx_5=0;
ledbit=smg[time1x%10];
wx_4=1;
//
//
//
//
//
//
//
//
//
小时位选
十位显示
个位显示
分钟显示十位显示
个位显示
分钟显示十位显示
个位显示
delay();wx_4=0;
}
***************
voidtime1()interrupt1{time50ms++;
if(time50ms==20)//计数20个50ms为1s{
time50ms=0;time1s++;
if(time1s==60)time1s=0;
time1f++;if(time1f==60)
{time1f=0;time1x++;
if(time1x==24)
{time1x=0;
}
}
}
}TH0=0x3c;TL0=0xb0;
}
voidshezhi_diaplay()
{
if
(1)
{if(yiwei==0)delayms(66);if(yiwei==0)
{
TR0=0;++num;
}
/*秒调整*/
if(num==1&jia==0)delayms(70);if(num==1&jia==0)time1s++;
if(num==1&sub==0)delayms(70);
if(num==1&sub==0)
time1s--;
//led_dispiay();
/*分钟调整*/
if(num==2&jia==0)delayms(70);
if(num==2&jia==0)time1f++;
if(num==2&sub==0)delayms(70);
if(num==2&sub==0)time1f--;
//led_dispiay();
/*小时调整*/
if(num==3&jia==0)
delayms(70);
if(num==3&jia==0)
time1x++;
if(num==3&sub==0)delayms(70);
if(num==3&sub==0)
time1x--;
//led_dispiay();
if(num>=4)
{
num=0;
TR0=1;
}
}
}
voidzhengdian(void)
{
if(time1s==0&time1f==0)
{
uchark;
for(k=0;k<5;k++)
{
zd=0;
delayms(10);
delayms(10);
delayms(10);
delayms(10);
zd=1;
delayms(10);
}
}
}
voidmain()
{
init();//初始化
while
(1)
shezhi_diaplay();
led_dispiay();//显示
//zhengdian();
}
}
附2:
实物图:
正面
背面
元器件清单:
AT89C52
1片
SEG共阴)
6片
PNPE极管
6个
22山电解电容
1个
30pf磁片电容
2个
1K电阻
16个
330欧姆电阻
9个
4.7k欧姆电阻
8个
100欧姆电阻
8个
12M晶振
1个
使用仪器:
硬件:
万用表一个,焊锡丝若干,烙铁一个
PC机一台,下载线一个
软件:
KEIL软件,protel软件,下载程序软件参考文献
[1]王明亮.关于中国学术期刊标准化数据库系统工程的进展.
[2]彭伟.单片机C语言程序设计实训100例一一基于8051+Proteus仿真(工学版),电子工业出版社,2009/6/1
[3]谢宜仁.单片机硬件接口电路及实例解析.电子工业出版社,2009/4/1.
[4]谢维成,杨加国主编,董秀成主审,单片机原理与应用及C51程序设计。
清华大学出版社.2006/8/1
[5]童诗白,华成英主编,模拟电子技术基础,高等教育出版社,2006/5.
[6]李朝青编著.单片机原理及接口技术(第3版)北京航空航天大学出版
社.2005/5.