期末设计.doc
《期末设计.doc》由会员分享,可在线阅读,更多相关《期末设计.doc(32页珍藏版)》请在冰豆网上搜索。
考查课程报告
课程名称:
单片机
设计题目:
数字钟
学院:
信息工程与自动化学院
专业:
计算机科学与技术
年级:
2010级
学生姓名:
指导教师:
江虹
日期:
2012-12-25至2013-1-1
教务处
目录
目录…………………………………………………….....................1
摘要…………………………………………………….....................2
1、实验内容……………………………………………………………………2
2、实验目的…………………………………………………………2
3、实验设备(软件),以及设计图.....................................................2
4、实验原理……………………………………………………………………7
5、实验方法、步骤(程序代码)……………………………………………10
6、实验结果………………………………………………………..27
7、实验分析(实验中遇到的问题及解决方法)…………………29
8、实验总结………………………………………………………..30
9、参考文献…………………………………………………………31
摘要
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。
忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。
但是,一旦重要事情,一时的耽误可能酿成大祸。
目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。
下面是单片机的主要发展趋势。
单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。
从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。
这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。
单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。
数字钟是采用数字电路实现对时,分,秒数字显示的计时装置,广泛用于个人家庭,车站,码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
因此,研究数字钟及扩大其应用,有着非常现实的意义。
1实验内容
利用89C51单片机平台,实现一个数字钟:
1.1具有显示时、分、秒及其日期的功能
1.2能自由调整时、分、秒的变换
1.3设计要点:
使用单片机作为数字钟的控制中心,通过编程进行数字累加计算,通过晶振将振荡信号传入单片机进行计算,并通过数码管以时间格式的显示出来。
2实验目的
2.1熟悉利用KeiluVision2软件
2.2了解和掌握89C51单片机平台
2.3认识数字钟的内部结构和实现过程
2.4掌握单片机C程序中的函数调用方法和功能:
比如延时程序等
2.5实现数字钟
3实验设备(软件),以及设计图
3.1PC机一台、KeiluVision2软件、以及实验板一块;89C51单片机为平台,利用C语言编程,并充分利用单片机的优势中断技术,设计并研究了单片机数字钟的设计方法。
3.2实验设计图:
图189C51引脚图
图2内部结构图
图3系统硬件图
图4数字流
其核心部件是89C51单片机,由89C51单片机内部定时器及循环延时确定时间,并且通过扫描驱动8位数码管来显示计数器时间,还可以通过外部中断校对时间和设置闹钟,并且检测闹钟开关,如果闹钟时间到,则驱动蜂鸣器。
晶体振荡器电路晶体振荡器电路晶体振荡器电路晶体振荡器电路晶体振荡器电路给数字钟提供一个频率稳定准确的12MHz的方波信号,可保证数字钟的走时准确及稳定.不管是指针式的电子钟还是数字显示的电子钟都使用了晶体振荡器电路。
给单片机提供时钟的电路图有如下两种:
由于我本次设计主要是针对数字钟的设计,并且外部时钟源不好加到电路中,精度又不是特别高,所以我选用内部时钟方式。
图5晶体振荡器电路
蜂鸣器驱动电路蜂鸣器驱动电路蜂鸣器驱动电路蜂鸣器驱动电路。
为了能在设置的闹钟时间很方便的提示我们,需要通过蜂鸣器的报警来提醒,由于单片机输出的方波驱动能力太弱,要使蜂鸣器发出的声音更亮些,需要加上驱动电路。
驱动电路我采用PNP管9012,具体电路图如下所示:
图6蜂鸣器驱动电路
复位电路分两种方式,分别是上电自动复位和按键手动复位。
上电自动复位电路是在加电瞬间电容通过充电来实现的,其电路图如下所示。
在通电瞬间,电容C通过电阻R充电,RST端出现正脉冲,用以复位。
只要电源VCC的上升时间不超过1ms,就可以实现自动上电复位,即接通电源就完成了系统的复位初始化。
手动复位是指通过一按钮开关,使单片机进入复位状态。
系统上电运行后,若需要复位,一般是通过手动复位来实现的。
通常采用手动复位和上电自动复位组合,其电路如下图所示。
图7复位电路图
位选及数码管驱动电路位选及数码管驱动电路位选及数码管驱动电路位选及数码管驱动电路。
为了让数码管的显示更清晰,我选用74HC573锁存器来驱动数码管。
由于8位数码管的显示是经过一位一位显示的,当它的扫描频率在50Hz~100Hz之间时,我们就不会看出它的位显示,并且显示的亮度正好合适,数码管的位选我通过3-8译码器74HC138,具体连接关系如下图所示:
图8位选及数码管驱动电路图
单片机最小系统单片机最小系统单片机最小系统单片机最小系统。
单片机的最小系统由4部分构成,分别是:
单片机、振荡电路、复位电路、RAM和ROM。
具体组成如下所示:
电源电路电源电路电源电路电源电路。
单片机正常工作是+5V电压,本次设计不做电源部分,采用USB供电,由于USB供电较为稳定,所以不需要稳压部分,直接给单片机供电,这样就减少了7805稳压模快。
具体电路如下所示:
4实验原理
编程设计数字钟大家可能最常用的就是采用单片机中的定时器定时的方法,由于定时器不能一次定时1s,所以需采用定时一定的时间,循环叠加的方法,加到一秒后,将其显示的秒加一,然后判断分和时是否加一,这样就完成了数字钟的最基本制作。
我在此次设计中采用的方法完全不同于上面的常规方法,主要是受到了EDA中并行的影响,当然,单片机中是不可能实现并行的,但我们可以用串行的方式模拟并行,实现数码管的扫描及采用延时粗略计算出1s的延时,这样很多人可能认为不准确,但我们可以分好多的延时,这样在校时时不会出现改一个数字出现大的变化的情况。
程序设计框图如下:
开始
扫描显示时间
I++
总延时1s
i=0秒加一
秒=60
秒=00时加一
分=60
分=00时加一
时=24
时=00
正常走时流程图
下面是设置闹钟
开始
给十分秒6位数分配6字节静态存储空间
中断优先级设计
开外中断
设置闹钟?
防抖延时
设置闹钟?
开定时器0,定时50s
延时正常走时
闹钟设置流程图
定时器中断?
计数器m++
将当前时分秒保存到静态空间
时分秒全置0
扫描显示
是否外中断?
设置闹钟?
保存时间
取出时间,结束
中断服务,对时及设置闹钟,相应的时分加一
注意事项:
(1)为数码管显示可调且可定时钟表,用到TX-1C开发板中矩阵键盘的上三排与第四排前两个按键。
(2)若要更改时钟初始值(即时钟校准),可先按下矩阵键盘中的S16键(第三排第三列),此时时钟会暂停。
(3)然后按S6--S15中的键修改矫正当前值,S6--S15分别先后对应数字0到9。
(4)矫正完后,按下S17(第三排最后一个),时钟可继续工作。
(5)若要设置定时时间,可先按下S18(第四排第一个),然后按数字键S6--S15(6)设置定时时间(设置顺序是由高位到低位的顺序),
(7)设置完定时后,按下S17可恢复到正常计时状态
(8)定时时间到,蜂鸣器会持续响一分钟报时。
(9)若要取消定时,或者蜂鸣器响时想对其关闭,可以按下S19功能键,注意晶振需为11.0592M。
(10)若为其他数值晶振,请合理改变TH0与TL0参数值,否则计时会有很大误差。
5实验步骤(程序代码)
****************************设计1**************************
#include
#defineucharunsignedchar
sbitdula=P2^6;
sbitwela=P2^7;
sbitbeep=P2^3;
unsignedcharj,k,a1,a0,b1,b0,c1,c0,s,f,m,key=10,temp,qq;
ucharshi20,shi10,fen20,fen10,miao20,miao10,ok=1,wei,dingshi,change,yidingshi;
ucharbaoshi,baoshijieshu;
unsignedintpp;
unsignedcharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
voiddelay(unsignedchari)
{
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
voiddisplay(ucharshi2,ucharshi1,ucharfen2,ucharfen1,ucharmiao2,ucharmiao1)
{
dula=0;
P0=table[shi2];
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(10);
P0=table[shi1]|0x80;
dula=1;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(10);
P0=table[fen2];
dula=1;
dula=0;
P0=0xfb;
wela=1