基于51单片机时分秒显示.docx
《基于51单片机时分秒显示.docx》由会员分享,可在线阅读,更多相关《基于51单片机时分秒显示.docx(18页珍藏版)》请在冰豆网上搜索。
基于51单片机时分秒显示
福建农林大学金山学院
《电子器件设计与制作》
课程设计报告
设计题目基于51单片机的时分秒显示
专业年级 12电子科学与技术
姓 名
学 号 126711029
成 绩
2015年5月1日
目录
前言1
§1设计要求1
§2总体设计过程1
2.1使用的仪器与器材1
2.1.1电路系统框图2
2.1.2系统硬件概述2
2.2电路图(外设部分)2
2.2.174LS138译码器2
2.2.274LS138译码器工作方式4
2.3数码管的结构与工作原理5
§3工作原理5
§4原理图和PCB图6
§5仿真实验7
§6电路板制作8
§7感想与体会8
§8完成效果图9
§9参考文献10
§9附录11
万年历设计
前言
电子万年历是一种日常计时工具,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能。
数字电子万年历采用直观的数字显示,可以同时显示年、月、日、星期、时、分、秒,还具有时间校准等功能。
本设计要实现硬件与软件两方面的同步设计。
硬件部分主要由AT89C51单片机、74LS138芯片和数码管组成。
AT89C51单片机适合于许多较为复杂控制应用场合,74LS138芯片实现端口扩展和数码管实现显示。
软件方面主要包括时间调整程序和显示程序。
设计中直接采用单片机的定时计数器来提供秒信号,从而实现时、分、秒计数。
程序采用C语言或者汇编语言编写,所有程序编写完成后,首先在KeiluVision3软件中进行调试,然后在Poteus软件中仿真成功,最后通过STC_ISP_V4.80下载到单片机内进行检验,从而完成此次电子万年历的设计。
一、要求
1、设计任务
以AT89C51单片机控制的时钟,在数码管上显示当前的时间。
2、设计要求
2.1使用数码管显示当前时间,显示格式为“时时-分分-秒秒”,并且误差需要在一定范围之内。
2.2在proteus软件中仿真成功。
2.3下载到单片机内现场检验。
2.4熟悉手工制版的过程
二、总体设计过程
1.使用的仪器与器材
51开发板1个,4位八段共阴数码2个,74LS138芯片一个,导线(1梱),排针等。
2.1.1电路系统框图
AT89C52
主控制模块
2.1.2系统硬件概述
本电路是由AT89C51单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作。
设计中直接采用单片机的定时计数器作为秒信号,从而实现对时、分、秒的计时,74LS138芯片扩展51芯片的端口,使得释放出更多的空闲端口和八位数码管完成显示功能。
2.2电路图(外设部分)
2.2.174LS138译码器
图174LS138管脚图
74LS138为3线-8线译码器,共有54/74S138和54/74LS138两种线路结构型式,其工作原理如下:
当一个选通端(S1)为高电平,另两个选通端(/S2)和/S3))为低电平时,可将地址端(A0、A1、A2)的二进制编码在一个对应的输出端以低电平译出。
表13线-8线译码器74LS138的真值表
74LS138译码器的接线图
2.2.274LS138译码器工作方式
(74LS138 为3线-8线译码器)
真值表
1.当S1=1、
时,译码器处于工作状态;当S1=
时,译码器处于禁止状态。
2.A2、A1、A0为二进制译码输入端,
为译码输出端(低电平有效)。
A0,A1,A2来控制Y0到Y7之间哪个引脚提供(高)电平来控制显示哪一个位数
2.3数码管的结构与工作原理
我们选用的是4位8段共阴数码管。
A1到A4给予(低)电平控制需要显示的位数A,b,c,d,e,f,g,给予(高)电平控制单个位数现实的数字Dp给予(高)电平控制小数点的显示
三、电路的工作原理
直接将数码管的8个段选接出,直接由单片机控制,位选由译码器控制
四、原理图和PCB图
4.1原理图:
原理图
4.2PCB图:
PCB图
五、仿真实验
六、电路板的制作
61打印电路板。
将绘制好的电路板用转印纸打印出来滑的一面面向自己,打印两张电路板,即一张纸上打印两张电路板。
在其中选择打印效果最好的制作线路板。
6.2裁剪覆铜板。
将覆铜板裁成电路板的大小,不要过大,以节约材料。
6.3预处理覆铜板。
用细砂纸把覆铜板表面的氧化层打磨掉,以保证在转印电路板时,热转印纸上的碳粉能牢固的印在覆铜板上,打磨好的标准是板面光亮,没有明显污渍。
6.4转印电路板
把印有电路板的一面贴在覆铜板上,对齐好后把覆铜板放入热转印机,放入时保证转印纸没有错位。
一般来说经过6-7次转印,热转印机事先就已经预热,温度设定在160-200摄氏度。
6.5腐蚀线路板
检查一下电路板是否转印完整,若有少数没有转印好的地方可以用黑色油性笔修补。
然后拿一个脸盆,在脸盆中放入适当的三氯化铁粉末,用开水化开三氯化铁液体。
把覆铜放入溶液中腐蚀。
等线路板上暴露的铜膜完全被腐蚀掉时,将线路板从腐蚀液中取出清洗干净。
用砂纸清理覆铜表面碳粉或黑色油性笔笔迹。
6.6线路板钻孔
选择合适的钻针,按稳线路板,用便携式台钻对线路板进行钻孔。
在使用钻机钻孔时,钻机速度不能开的过慢。
七、感想与体会
通过对这款基于89C51的万年历及温度显示器的设计,让我更加了解了单片机89C51、时钟芯片74LS138、数码管的原理及使用,更加深刻体会到单片机的神奇。
单片机的智能化控制,在我们生活周围无处不在,使我们的生活更加智能化、便捷化。
在设计过程中,我查阅了很多的相关资料,对89C51有了更加深刻的认识,同时对于更加深入的研究单片机有了更强的兴趣。
这款基于89C51的万年历,虽然其功能相对而言,可能很简单,但能解决人们现实生活中的实际问题。
在设计过程中,软件设计相对而言,更加的复杂与困难,锻炼了我的逻辑思维能力。
通过查阅资料,培养了我的自学能力,并且引导一种创新思维,把学到的知识应用到日常生活当中。
在设计的过程中,我不断的学习、思考,和同学间的相互讨论,运用科学的分析问题的方法解决遇到的困难。
通过此设计,我掌握了单片机系统一般的开发流程,学会对常见问题的处理方法,积累了一定的设计系统经,充分使教学与实践相结合,提高个人系统开发的综合能力,开拓了思维,为今后能在相应工作岗位上的工作打下了坚实的基础。
八、完成效果图
九、参考文献
[1].谢嘉奎主编《电子线路非线性部分(第四版)》高等教育出版社2000年5月第4版
[2].张肃文陆兆熊编《高频电子线路(第三版)》高等教育出版社
[3]《单片机原理及应用》张毅刚彭善元编著高等教育出版社
[4]DS18B20及高精度温度测量的实现[J]贾振国电子工业出版社
[5] 朱承高.电工及电子技术手册[M].北京:
高等教育出版社,1990
[6] 阎石.数字电子技术基础(第三版)[M].北京:
高等教育出版社,1989
附录
*projectfor80C51八段管点亮
*madebyChen_c
************************/
/*****************************************
*这次的八段管程序设计以“C”语言语法作为根基,
引入了C++的面向性设计思想,把需要的变量,与函数指针作为成员
非指针变量作为成员,函数指针通过初始化指向特定函数,作为结构体的方法
八段管的设计,需要时分秒三个变量,由于80C51的驱动能力有限,又加上我们做的是外设,
所以我引入了其余六个变量防止出现重影
******************************************************/
#include
/*宏定义:
把Open_Light作为IO口P2的使用方法*/
#defineOpen_LightP2
/*吧Light作为P0的使用的接口*/
#defineLightP0
#defineLight_twoP1
/*声明一个结构体*/
structTime_show{
inta,b,c,d,e,f;
intshi;
intfen;
intmiao;
void(*init_struct)(structTime_show(*this));
void(*decide_change)(structTime_show(*this));
void(*change_value)(structTime_show(*this));
};
voidinit_struct(structTime_show(*this));
voidshow_time(structTime_show(*this));
voiddecide_change(structTime_show(*this));
voidchange_value(structTime_show(*this));
voiddelay(void);
voidinit(void);
/*138译码器选择亮哪个灯*/
charxuan[]={0xff,0xfb,0xf7,0xf3,0xef,0xeb,0xe7,0xe3};
/*八段管选择亮的是哪个数字*/
charLight_Show[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*和上面相比多一个小数点*/
charLight_Point_Show[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
//定义一个结构体
structTime_shownew_one;
intshi=23;
intfen=59;
intmiao=50;
inti=0;/*用来计数,一秒钟回0*/
intmain(void)
{
/*中断初始化*/
init();
//给结构体赋值
new_one.init_struct=init_struct;
new_one.decide_change=decide_change;
new_one.change_value=change_value;
/************************************/
/*初始化结构体*/
new_one.init_struct(&new_one);
new_one.change_value(&new_one);
/*循环语句
每次都显示时间*/
while
(1){
show_time(&new_one);
/*如果到大一分钟就清0然后改变结构体内部的值
*/
if(i>=100){
i=0;
new_one.change_value(&new_one);
new_one.decide_change(&new_one);
}
}
return0;
}
//中断程序代码
//晶振的周期是12T
voidexter(void)interrupt1
{
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
i++;
}
/*延时函数*/
voiddelay()
{
intf=100;
while(f--);
}
//改变给赋值的IO口赋值的数据
voidchange_value(structTime_show(*this))
{
this->a=this->fen/10;
this->b=this->fen%10;
this->c=this->miao/10;
this->d=this->miao%10;
this->e=this->shi/10;
this->f=this->shi%10;
this->miao++;
}
//当时分秒达到极限的时候改变
voiddecide_change(structTime_show(*this))
{
if(this->miao>=60){
this->miao=0;
this->fen++;
}
if(this->fen>=60){
this->shi++;
this->fen=0;
}
if(this->shi==24){
this->shi=0;
}
}
//给结构体内部的时分秒成员赋值
voidinit_struct(structTime_show(*this))
{
this->shi=shi;
this->fen=fen;
this->miao=miao;
}
/*给端口赋值,亮灯*/
voidshow_time(structTime_show(*this))
{
Open_Light=xuan[0];
Light=Light_Show[this->e];
Light_two=Light_Show[this->e];
delay();
Open_Light=xuan[1];
Light=Light_Show[this->f];
Light_two=Light_Show[this->f];
delay();
Open_Light=xuan[2];
Light=Light_Show[this->a];
Light_two=Light_Show[this->a];
delay();
Open_Light=xuan[3];
Light=Light_Show[this->b];
Light_two=Light_Show[this->b];
delay();
Open_Light=xuan[4];
Light=Light_Show[this->c];
Light_two=Light_Show[this->c];
delay();
Open_Light=xuan[5];
Light=Light_Show[this->d];
Light_two=Light_Show[this->d];
delay();
Open_Light=xuan[6];
Light=0x40;
delay();
Open_Light=xuan[7];
Light=0x40;
delay();
}
voidinit(void)
{
TMOD=0X01;
TH0=(65535-10000)/256;
TL0=(65535-10000)%256;
EA=1;
ET0=1;
TR0=1;
}