单片机课程设计数字钟设计Word下载.docx
《单片机课程设计数字钟设计Word下载.docx》由会员分享,可在线阅读,更多相关《单片机课程设计数字钟设计Word下载.docx(21页珍藏版)》请在冰豆网上搜索。
前言:
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。
导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。
更不用说自动控制领域的机器人、智能仪表、医疗器械了。
因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。
数字钟以成为人们日常生活中数字电子钟一般由振荡器,分频器,译码器,显示器等部分组成。
数字钟的应用非常广泛,应用于人家庭以及车站。
码头。
剧场,办公室等公共场所,给人们的生活,学习,工作,娱乐带来极大的方便,由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确,性能稳定,携带方便等特点,它还用于计时,自动报时及自动控制等各个领域。
尽管目前市场上以有现成数字钟集成电路芯片出售,价格便宜这些都是数字电路中最基本的,应用最广的电路。
数字电子钟的基本逻辑功能框图如下:
它是一个将“时”,“分”,“秒”显示于人的视觉器官的计时装置。
这次的课程设计主要是采用51单片机内部时钟信号为系统提供计时信号,可以通过按键修改时间,使其在给定的时间上进行刷新,最后在数码管上显示时间,通过初值直接给数码管初始化这次主要是对时分秒的编程。
还带有闹钟功能设置好时间在时间到时蜂鸣器发出声音。
1、系统方案与论证
1.1方案设计
主要利用AT89C51单片机外接8155扩展单片机IO口,B口、C口控制数码管的位显示,A口控制数码管的段显示,P1口与按键和蜂鸣器相接用于时间的校正和声音提醒,使用27128芯片配置单片机的外部程序容量为16K的ROM空间。
本设计采用一节1.5V干电池为整个系统供电,在设计中引入一个升压电路(从1.5V升至5V),产生+5V电压用于给CPU及显示电路提供工作电压,这是数字时钟正常工作时的总电压。
显示电路将“时”、“分”、“秒”计数器的输出,通过六个八段LED显示器显示出来。
校时电路是直接加一个脉冲信号到时计数器或者分计数器或者秒计数器来对“时”、“分”、“秒”显示数字进行校对调整
图1系统结构图
1.2主要模块方案选择比较与论证
1.2.1单片机的选取
选用AT89C51作为控制器,价格低,性价比高,多个定时器和其他外围功能丰富。
而且运行速度快工作稳定。
1.2.2模式转换的选择:
键盘按键选择模式,方便易于控制。
1.2.3输入方案的选择
通过独立键盘输入数据,通过数据的加减来确定数据,功能齐全且直接输入方便快捷。
1.2.4显示方案的选择
方案一:
使用功能更好的液晶显示,增加显示信息的可读性,看起来更方便。
而12864点阵液晶模块有明显的优点:
微功耗,尺寸小,超薄轻巧,字迹美观,视觉舒适,显示信息量大,大部分功能用不到,造成浪费。
方案二:
时间显示可以用数码管,显示信息少,容易控制。
经比较,故选用方案二进行设计。
2、系统硬件模块
2.1AT89C51单片机
AT89C51是一种带4K字节FLASH存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
2.2复位电路
一般情况下单片机的复位电路有两种,即上电复位和手动复位电路。
如图所示为手动复位电路。
图2复位电路
2.3晶振电路
图3晶振电路
2.4按键调整电路
图4按键调整电路
本系统采用四位按键S4为功能选择键,S3为时分秒选择键,S2、S1为数字加减键。
2.5蜂鸣器电路
由于51单片机管脚功率限制问题,本系统蜂鸣器电路采用一个NPN晶体管驱动,功率大,安全稳定。
图5蜂鸣器电路
2.674LS373芯片电路与管脚图
图674LS373管脚电路图
373为三态输出的八D透明锁存器,共有54S373和74LS373两种线路
373的输出端O0~O7可直接与总线相连。
当三态允许控制端OE为低电平时,O0~O7为正常逻辑状态,可用来驱动负载或总线。
当OE为高电平时,O0~O7呈高阻态,即不驱动总线,也不为总线的负载,但锁存器内部的逻辑操作不受影响。
当锁存允许端LE为高电平时,O随数据D而变。
当LE为低电平时,O被锁存在已建立的数据电平。
当LE端施密特触发器的输入滞后作用,使交流和直流噪声抗扰度被改善400mV。
引出端符号:
D0~D7数据输入端
OE三态允许控制端(低电平有效)
LE锁存允许端
O0~O7输出端
2.727128电路与管脚图
图727128管脚电路图
27128使用了一片用与扩展外部ROM
27128管脚说明
A0到A13为14条地址信号输入线,说明芯片容量为2的14次方,即16K
D0到D7为数据线,表示芯片的每个存储单元存放一个字节(8位二进制数)。
对芯片读数时,作为输出线,对芯片编程时,作为输入线。
CE为输入信号,低电平有效。
(有称作片选信号)
OE为输出允许信号,低电平有效
PGM为编程脉冲输入端,当对芯片编程时,由此端加入编程脉冲信号;
读取数据时PMG的值为1
Vcc和Vpp都是接电源的,正常工作时是+5V
2.8外部并行口扩展8155电路图
图88155管脚电路图
2、8155的地址编码及工作方式 8155各引脚功能说明如下:
RST:
复位信号输入端,高电平有效。
复位后,3个I/O口均为输入方式。
AD0~AD7:
三态的地址/数据总线。
与单片机的低8位地址/数据总线(P0口)相连。
单片机与8155之间的地址、数据、命令与状态信息都是通过这个总线口传送的。
RD:
读选通信号,控制对8155的读操作,低电平有效。
WR:
写选通信号,控制对8155的写操作,低电平有效。
CE:
片选信号线,低电平有效。
IO/M:
8155的RAM存储器或I/O口选择线。
当IO/M=0时,则选择8155的片内RAM,AD0~AD7上地址为8155中RAM单元的地址(00H~FFH);
当IO/M=1时,选择8155的I/O口,AD0~AD7上的地址为8155I/O口的地址。
ALE:
地址锁存信号。
8155内部设有地址锁存器,在ALE的下降沿将单片机P0口输出的低8位地址信息及,IO/的状态都锁存到8155内部锁存器。
因此,P0口输出的低8位地址信号不需外接锁存器。
PA0~PA7:
8位通用I/O口,其输入、输出的流向可由程序控制。
PB0~PB7:
8位通用I/O口,功能同A口。
PC0~PC5:
有两个作用,既可作为通用的I/O口,也可作为PA口和PB口的控制信号线,这些可通过程序控制。
TIMERIN:
定时/计数器脉冲输入端。
TIMEROUT:
定时/计数器输出端。
VCC:
+5V电源。
在单片机应用系统中,8155是按外部数据存储器统一编址的,为16位地址,其高8位由片选线提供,CE=0,选中该片。
当CE=0,IO/M=0时,选中8155片内RAM,这时8155只能作片外RAM使用,其RAM的低8位编址为00H~FFH;
当CE=0,IO/M=1时,选中8155的I/O口,其端口地址的低8位由AD7~AD0确定
2.9六位8段LED数码管显示电路
图10LED数码管电路图
数码管时间显示分为时、分、秒三部分,JP3为秒位采用24进制,JP2为分位,采用60进制,JP1为时位,采用60进制。
3、系统软件调试
3.1程序结构
(1)主程序。
实现初始化与键盘监控,
(2)定时器T0中断服务程序。
时钟电路的设计功能是利用单片机内部的定时/计数器进行中断定时,配合软件延时实现时、分、秒的计时。
利用定时器T0中断服务程序实现计时功能,同时刷新计时缓冲区。
定时器T0每隔100ms益处中断一次(设系统使用12MHZ晶振,定时T0工作方式1)的定时初值为3CBOH(即THO=3CH,TL0=0B0H),每循环中断10次则延时时间为1s,重复60次为1min,分计时60次为1小时,小时计时24次则时间重新回到00:
00:
00。
(3)时间设置与闹钟设置子程序。
实现当前时间及定时启闹钟时间的键盘输入设置。
其功能是用键盘设置子程序将键入的6位时间值送入键盘设置缓冲区,用合字子程序将键盘设置缓冲区中的6位BCD码合并为3位压缩BCD码,送入计时缓冲区或闹钟值寄存区。
若键盘输入的小时值大于23或分和秒值大于59,则不合法,将取消本次设置,清0重新开始计时。
(4)键盘扫描子程序。
判断是否有键按下,无键按下则循环等待,有键按下则求取返回。
(5)显示子程序。
实现显示缓冲区的6位BCD码的动态扫描方式显示。
首先将3字节计时缓冲区中时、分、和秒压缩BCD码拆分为6字节BCD码,由拆字子程序实现。
当按下时间或闹钟设置键后,在6位设置完成之前,应显示键入的数据而不显示当前时间,为此系统设置一个计时显示允许标志位F0,在时间/闹钟设置期间F0=1,不调用拆字子程序。
(6)定时比较子程序。
实现当前时间与预设的启闹钟时间的比较,若二者完全相同时,启动蜂鸣器名叫并置位闹钟标志位。
当重新按下ALM键时,停闹并清0闹钟标志。
(7)其他辅助功能子程序。
①键盘设置子程序:
将键入的6位时间值送入键盘设置缓冲区。
②拆字程序:
将3字节计时缓冲区中时、分和秒压缩BCD码拆分为6字节BCD码并刷新显示缓冲区。
③合字子程序:
将键盘设置缓冲区中6位BCD码合并为3位压缩BCD码,送入计时缓冲区或闹钟值寄存区,同时检测时间值的合法性。
3、2系统软件流程图
3.3源程序见附录Ⅰ
4、设计总结心得体会
在本次课程设计制作过程中,收获颇多。
首先,自学能力大大提高。
由一开始的一无所知到最终设计成功,所需要的知识除了来自课堂,更多的是课外通过上网查询、向老师等多种渠道获得。
其次,在制作过程中遇到很多硬件和软件等各方面的问题,多次修改最终将困难一一解决。
通过这次设计不仅丰富了理论知识,更激发了创新精神,受益终生。
5.参考文献
【1】单片微机原理及应用【M】.清华大学出版社.2005.
【2】黄庆华,张永格.单片机开发技术和实训【M】.
【3】电子技术基础模拟部分(第四版)
【M】.高等教育出版社.1996(2004重印).
【4】全国大学生电子设计竞赛训练教程【M】.电子工业出版社.2005-1.
【5】数字电子技术基础【M】高等教育出版社.1998-12.
【6】模拟电子技术基础【M】高等教育出版社.2006-12.
【7】仪器仪表学报【J】第33卷第六期.2012.
附录Ⅰ源程序
#include<
reg51.h>
intrins.h>
unsignedcharled[14]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x40,0x00,0x76,0x77};
//用一维数组定义0-9、横杠、全灭H和A
unsignedchara[8]={2,3,10,5,9,10,0,0};
//给数码管赋初值
unsignedcharsecond=0,minute=59,hour=23;
unsignedcharminute1=0,hour1=0;
unsignedcharb[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//位选
unsignedchari,k=0;
unsignedinttemp;
unsignedcharM,S_flag,beep_num,ZD_flag;
sbitK1=P3^0;
sbitK2=P3^1;
sbitK3=P3^2;
sbitBEEP=P3^3;
///////////延时函数////////////
voiddelay_10us(unsignedn)//10微秒级延时
{
do
{
_nop_();
}while(--n);
}
voiddelay_ms(unsignedn)//毫秒级延时
dodelay_10us(100);
while(--n);
}
voidinit()
{
M=0;
S_flag=0;
//闪烁标志位
TMOD=0x10;
//定时器1以方式1定时
TH1=0xfc;
TL1=0x18;
EA=1;
//打开总中断
ET1=1;
//允许定时器1中断
TR1=1;
//开启定时器1(开始定时计数)
voidtime1()interrupt3//定时器1中断函数
//定时1ms
temp++;
if(temp==1000)//配合定时器定时1s
{temp=0;
second++;
}
if(second==59)//正常走时时间
{second=0;
if(minute<
59)
minute++;
else{minute=0;
hour++;
hour%=24;
//不使小时数越界
if(hour%12==0)beep_num=24;
//12/24点鸣笛12声
elsebeep_num=hour%12*2;
//其它时间的鸣笛声数
ZD_flag=1;
//整点标志位
}
if(hour1==hour&
&
minute1==minute)//闹钟时间到
beep_num=120;
//闹1min
ZD_flag=1;
}
if(temp%250==0)//每250ms
S_flag=!
S_flag;
//闪烁标志位取反
if(ZD_flag)//有闹时任务
{
beep_num--;
//鸣笛数减1
if(beep_num)
BEEP=!
BEEP;
//鸣笛位取反(1次响1次不响)
else{BEEP=0;
ZD_flag=0;
}
if(k==8)k=0;
P1=a[k];
P2=b[k++];
//先送代码,再打开关,防止余晖效应
delay_10us(20);
//多亮一会儿
P2=0xff;
//熄灭数码管
}
/////////////显示模块///////////
voiddisplay()
a[0]=(M==1)?
((S_flag==1)?
led[hour/10]:
led[11]):
((M==3)?
led[hour1/10]:
(M==4)?
led[hour/10]);
//数码管第一位显示
a[1]=(M==1)?
led[hour%10]:
led[hour1%10]:
led[hour%10]);
a[2]=led[10];
a[3]=(M==2)?
led[minute/10]:
((M==4)?
led[minute1/10]:
(M==3)?
led[minute/10]);
a[4]=(M==2)?
led[minute%10]:
led[minute1%10]:
led[minute%10]);
a[7]=(M==3||M==4)?
led[13]:
led[second%10];
////////按键处理函数////////
voidkey_prc()
if(K1==0)
{
delay_ms
(2);
//延时去抖
if(K1==0)//按K1进行模式切换
{M++;
if(M==5)
}
while(!
K1);
//等待按键释放
}
if(M!
=0)
switch(M)
case1:
//模式1——调时
{
if(K2==0)
{
delay_ms
(2);
//延时去抖
if(K2==0)//加键按下
{
if(hour<
23)
elsehour=0;
}
while(!
K2);
//等待按键释放
}
if(K3==0)
//延时去抖
if(K3==0)//减键按下
{if(hour>
0)
hour--;
elsehour=23;
}
while(!
K3);
}break;
case2:
//模式2——调分
{
//延时去抖
if(K2==0)//加键按下
{
if(minute<
minute++;
elseminute=0;
}
if(K3==0)//减键按下
{if(minute>
0)
minute--;
elseminute=59;
}
}break;
case3:
//模式3——闹钟调时
{
//延时去抖
if(K2==0)//加键按下
if(hour1<
hour1++;
elsehour1=0;
}
}
if(K3==0)//减键按下
{if(hour1>
hour1--;
elsehour1=23;
case4:
//模式4——闹钟调分
{
{
if(minute1<
minute1++;
elseminute1=0;
{if(minute1>
minute1--;
elseminute1=59;
}break;
}
voidmain()
init();
while
(1)
key_pr