数字钟课程设计报告书.docx
《数字钟课程设计报告书.docx》由会员分享,可在线阅读,更多相关《数字钟课程设计报告书.docx(22页珍藏版)》请在冰豆网上搜索。
![数字钟课程设计报告书.docx](https://file1.bdocx.com/fileroot1/2023-1/21/15b9b6c9-34f2-47df-b25a-7781af187af3/15b9b6c9-34f2-47df-b25a-7781af187af31.gif)
数字钟课程设计报告书
目录
一、设计任务与要求3
1设计目的3
2设计要求3
2.1任务及要求............................................................................3
2.2系统功能说明........................................................................3
2.3软件研制方面........................................................................4
2.4硬件研制方面........................................................................4
二、总体方案设计4
1电路的总体原理框图4
2实现时钟计时的基本方法5
3总体方案介绍5
3.1计时方案................................................................................5
3.2控制方案................................................................................5
三、数字钟的硬件设计6
1.1最小系统..................................................................................6
1.2时钟电路..................................................................................8
1.3单片机复位电路.......................................................................9
2、数码显示模块设计....................................................................10
3、仿真实现(电路连接图).........................................................11
4、实验板运行结果.......................................................................12
四、系统软件设计.13
1、源程序流程图...........................................................................13
2、时间显示流程图........................................................................13
3、源程序清单............................................................................13
五、设计总结20
1、设计过程中遇到的问题及解决方法20
2、设计体会21
参考文献22
一、设计任务与要求
1、设计目的
(1)通过对课题设计方案的分析、选择、比较、熟悉单片机用系统开发、研制的过程,软硬件设计的方法、内容及步骤。
(2)培养针对课题需要,选择和查阅有关手册、图表及文献资料的自学能力,提高组成系统、编程、调试的动手能力;
(3)提高综合及灵活运用所学知识解决工业控制的能力,培养动手能力和实际应用能力。
2、设计内容
2.1任务及要求
①通过单片机内定时器控制走时,准确持续走时。
②在六个LED七段数码管上显示时、分、秒。
③具有通过键盘调整时、分、秒的功能。
2.2系统功能说明
数字钟的格式为:
HH:
MM:
SS,由左向右分别为:
时、分、秒。
完成显示由秒01一直加1至59,再恢复为00;分加1,由00至01,一直加1至59,再恢复00;时加1,时由00加至23之后秒、分、时全部清清零。
该数字钟使用T0作50ms的定时中断。
走时调整:
走时过程中,按下“暂停/继续”键可暂停、继续计时,按下“调时按键”键对“时”显示进行调整(每按一次加1);按下“调分按键”键对“分”显示进行调整(每按一次加1);按下“调秒按键”键“秒”显示进行调整(每按一次加1)。
2.3软件研制方面
1.采用模块化程序结构设计软件,首先将整个软件分成若干功能模块;
2.根据流程图,编写源程序;
3.上机调试各模块程序;
4.与硬件一起联调,最后完成全部调试工作。
2.4硬件研制方面
1.将整个硬件系统划分为若干功能单元电路,绘出整个系统原理电路图,注明各交单元电路间接口信号;
2.搭建硬件电路,完成各单元电路设计,包括选择合适的各类元器件和电路板设计(元件布局和走线)。
二、总体方案设计
1.电路的总体原理框图
根据以上的电子时钟的设计要求可以分为以下的几个硬件电路模块:
单片机模块、数码显示模块与按键模块,模块之间的关系图如下面得方框电路
时钟电路
复位电路单
片数码管显示
机
调整键盘
2.实现时钟计时的基本方法
利用STC系列单片机的可编程定时/计数器、中断系统来实现时钟定时。
(1)计数初值计算:
把定时器设为工作方式1,定时时间为50ms,则计数溢出20次即得时钟计时最小单位秒。
假设使用T/C0,方式1,50ms定时,fosc=11.0592MHz。
则初值N满足N×1/11.0592MHz×12μs=50000μs=50ms
N=46080。
(2)采用中断方式进行溢出次数累计,计满20次为秒计时(1秒);
(3)从秒到分和从分到时的计时是通过累加和数值比较实现。
3、总体方案介绍
3.1计时方案
利用STC89C52单片机内部的定时/计数器进行中断时,配合软件延时实现时、分、秒的计时。
该方案节省硬件成本,且能使读者在定时/计数器的使用、中断及程序设计方面得到锻炼与提高,对单片机的指令系统能有更深入的了解,从而对学好单片机技术这门课程起到一定的作用。
3.2控制方案
STC89C52的P0口外接2个74HC573锁存器,其中一个锁存器接由六个LED数码管(LED6~LED1)构成的显示器,作LED的段码输出线,另一个锁存器作六个LED数码管的位控输出线,P2.6接段选锁存器,P2.7接位选锁存器,P3.4~P3.7口外接四个按键,构成键盘电路。
STC89C52是一种低功耗,高性能的CMOS8位微型计算机。
它带有8KFlash可编程和擦除的只读存储器(EPROM),该器件采用ATMEL的高密度非易失性存储器技术制造,与工业上标准的80C51和80C52的指令系统及引脚兼容,片内Flash集成在一个芯片上,可用与解决复杂的问题,且成本较低。
简易电子钟的功能不复杂,采用其现有的I/O便可完成,所以本设计中采用此的设计方案。
3、数字钟的硬件设计
1.1最小系统
STC89C52单片机引脚图如下:
MCS-51单片机是标准的40引脚双列直插式集成电路芯片,其各引脚功能如下:
XTAL1(19脚)和XTAL2(18脚):
为振荡器输入输出端口。
当使用芯片内部时钟时,此二引线端用于外接石英晶体和微调电容;当使用外部时钟时,用于接外部时钟脉冲信号。
RST(9脚):
为复位输入端口,外接电阻电容组成的复位电路。
VCC(40脚)和GND(20脚):
为供电端口,分别接+5V电源的正负端。
P0口
P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。
作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。
在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P1口
P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
作输入口使用时,因为内部存在上拉 电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
与AT89C51不同之处是,P1.0和P1.1还可分别作为定时/计数器2的外部计数输入(P1.0/T2)和输入(P1.1/T2EX)。
Flash编程和程序校验期间,P1接收低8位地址。
P2口
P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。
在访问8位地址的外部数据存储器(如执行MOVX@RI指令)时,P2口输出P2锁存器的内容。
Flash编程或校验时,P2亦接收高位地址和一些控制信号。
P3口
P3口是一组带有内部上拉电阻的8位双向I/O口。
P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻 辑门电路。
对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。
此时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。
P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,P3口还接收一些用于Flash闪速存储编程和程序校验的控制信号。
具体第二功能如表所示
P3引脚
兼用功能
P3.0
串行通讯输入(RXD)
P3.1
串行通讯输出(TXD)
P3.2
外部中断0(INT0)
P3.3
外部中断1(INT1)
P3.4
定时器0输入(T0)
P3.5
定时器1输入(T1)
P3.6
外部数据存储器写选通WR
P3.7
外部数据存储器写选通RD
RST
复位输入。
当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。
ALE/PROG
当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。
一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。
要注意的是:
每当访问外部数据存储器时将跳过一个ALE脉冲。
PSEN
程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C52由外部程序存储器取指令(或数 据)时,每个机器周期两次PSEN有效,即输出两个脉冲。
在此期间,当访问外部数据存储器,将跳过两次PSEN信号。
EA/VPP
外部访问允许。
欲使CPU仅访问外部程序存储器(地址为0000H—FFFFH),EA端必须保持低电平(接 地)。
需注意的是:
如果加密位LB1被编程,复位时内部会锁存EA端状态。
如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。
Flash存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。
1.2时钟电路
下图所示为时钟电路原理图,在AT89C52芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2。
而在芯片内部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。
时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。
1.3单片机复位电路
复位电路由两部分组成,电容和电阻。
此复位电路称上电复位。
上电瞬间,电容充电电流最大,电容相当于短路,RST端为高电平,自动复位;电容两端的电压达到电源电压时,电容充电电流为零,电容相当于开路,RST端为低电平,程序正常运行。
通常,我们还会在电容器两端并接一个按钮开关,如下图所示,此按钮开关就是一个手动的Reset开关。
2、数码显示模块设计
显示器普遍地用于直观地显示数字系统的运行状态和工作数据,按照材料及产品工艺,单片机应用系统中常用的显示器有:
发光二极管LED显示器、液晶LCD显示器、CRT显示器等。
LED显示器是现在最常用的显示器之一,如下图所示。
共阴极共阳极
发光二极管(LED)由特殊的半导体材料砷化镓、磷砷化镓等制成,可以单独使用,也可以组装成分段式或点阵式LED显示器件(半导体显示器)。
分段式显示器(LED数码管)由7条线段围成8字型,每一段包含一个发光二极管。
外加正向电压时二极管导通,发出清晰的光。
只要按规律控制各发光段亮、灭,就可以显示各种字形或符号。
LED数码管有共阳、共阴之分。
系统采用动态显示方式,用P0口来控制LED数码管的段控线和位控线。
动态显示通常都是采用动态扫描的方法进行显示,即循环点亮每一个数码管,这样虽然在任何时刻都只有一位数码管被点亮,但由于人眼存在视觉残留效应,只要每位数码管间隔时间足够短,就可以给人以同时显示的感觉。
3、仿真实现(电路连接图)
4、实验板运行结果
四、系统软件设计
1、源程序流程图
初始化
清数码管显示
定时器赋初值
否
是否有键按下?
是
键盘调整时间
显示时间并计时
2、时间显示流程图
3、源程序清单
//==声明区=====================================================//
#include
#defineuintunsignedint//宏定义
#defineucharunsignedchar
uchartt,ff,ee,dd,cc,bb,aa;//分别定义定时器变量和时、分、秒的六位变量
sbitdula=P2^6;//定义段选位
sbitwela=P2^7;//定义位选位
sbitkey1=P3^4;//定义调时按键
sbitkey2=P3^5;//定义调分按键
sbitkey3=P3^6;//定义调秒按键
sbitkey4=P3^7;//定义暂停/继续计时按键
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,0x66,//0~9的七段LED共阴极数码表
0x6d,0x7d,0x07,0x7f,0x6f};
voidkey01();//声明调时按键子程序
voidkey02();//声明调分按键子程序
voidkey03();//声明调秒按键子程序
voidkey04();//声明暂停/继续计时按键子程序
voiddisplay(ucharff,ucharee,uchardd,ucharcc,ucharbb,ucharaa);//声明显示子程序
voiddelay(uintz);//声明延时子程序
voidinit();//声明初始化子程序
//==主程序=====================================================//
voidmain()
{
init();//初始化子程序
while
(1)
{
if(key1==0)//键盘扫描
key01();
if(key2==0)
key02();
if(key3==0)
key03();
if(key4==0)
key04();
if(tt==20)
{
tt=0;
aa++;
if(aa==10)
{
aa=0;
bb++;
}
if(bb==6)
{
bb=0;
cc++;
}
if(cc==10)
{
cc=0;
dd++;
}
if(dd==6)
{
dd=0;
ee++;
}
if(ee==10)
{
ee=0;
ff++;
}
if(ff==2&&ee==4)
{
ee=0;
ff=0;
}
}
display(ff,ee,dd,cc,bb,aa);//以24小时方式显示时间
}
}
//==延时子程序=====================================================//
voiddelay(uintz)//延时子程序(约zms)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//==初始化子程序===================================================//
voidinit()//
{
ff=0;//数码管显示清零
ee=0;
dd=0;
cc=0;
bb=0;
aa=0;
tt=0;//定时变量清零
wela=0;//位选清零
dula=0;//段选清零
TMOD=0x01;//定时器0工作于方式1
TH0=(65536-46080)/256;//定时器赋初值
TL0=(65536-46080)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//开定时器0
}
//==定时器0=====================================================//
voidtimer0()interrupt1//定时50ms
{
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
tt++;
}
//==显示子程序===================================================//
voiddisplay(ucharff,ucharee,uchardd,ucharcc,ucharbb,ucharaa)//显示子程序
{
dula=1;
P0=table[bb];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delay
(1);
dula=1;
P0=table[aa];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
delay
(1);
dula=1;
P0=table[dd];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay
(1);
dula=1;
P0=table[cc];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay
(1);
dula=1;
P0=table[ff];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay
(1);
dula=1;
P0=table[ee];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay
(1);
}
//==调时按键=======================================================//
voidkey01()//调时按键
{
if(key1==0)
{
delay(5);//消抖
if(key1==0);
while(!
key1);
delay(5);//松手检测
while(!
key1);
TR0=0;
ee++;
if(ee==10)
{
ee=0;
ff++;
}
if(ff==2&&ee==4)
{
ee=0;
ff=0;
}
display(ff,ee,dd,cc,bb,aa);
}
}
//==调分按键=======================================================//
voidkey02()//调分按键
{
if(key2==0)
{
delay(5);//消抖
if(key2==0);
while(!
key2);
delay(5);//松手检测
while(!
key2);
TR0=0;
cc++;
if(cc==10)
{
cc=0;
dd++;
}
if(dd==6)
dd=0;
display(ff,ee,dd,cc,bb,aa);
}
}
//==调秒按键======================================================//
voidkey03()//调秒按键
{
if(key3==0)
{
delay(5);//消抖
if(key3==0)
while(!
key3);
delay(5);//松手检测
while(!
key3);
TR0=0;
aa++;
if(aa==10)
{
aa=0;
bb++;
}
if(bb==6)
bb=0;
display(ff,ee,dd,cc,bb,aa);
}
}
//==暂停/继续计时按键=============================================//
voidkey04()//暂停/继续计时按键
{
if(key4==0)
{
delay(5);//消抖
if(key4==0);
while(!
key4);
del