※※※※※※※※※
※※※※※
2011级学生单片机
※ ※ ※
课程设计
※※※※※
※※
单片机课程设计报告书
课题名称 姓 名 学 号 院、系、部 专 业 指导教师
日历时钟的设计
** 1114080308 物理与电子科学系 电子信息科学与技术
**
2013年11月20日
一、设计任务及要求: 设计任务:1、利用MCS-51内部定时器定时T0/T1,编程实现时、分、秒的显示,显示格式为:时分秒: 091235 (24小时制) 2、能按键调整时间的数值(按键数量自定)。 要 求: 首先进行预设计,根据设计的任务要求,先确定设计的硬件电路方案,然后进行硬件电路的初步设计,在计算机上画出硬件电路图,在老师的指导下进行修正硬件电路图,并对所涉及的参数进行计算。 在确定硬件的基础上,要进行软件的总体设计,包括软件主流程的设计以及各子程序的设计,同时,要写出详细的操作说明,如时间的调整方法,显示窗口的时间切换等,以配合软件的设计。 最后进入联机调试,联机调试的原则也要采用分步走的原则,各个功能模块要逐步套入,通过一个再增加一项功能,从而达到设计的总体要求,不要上来编制个最大的程序,最后无法查找错误。 最后写出设计报告。 指导教师签名: 年 月 日 二、指导教师评语: 指导教师签名: 年 月 日 三、成绩 指导教师签名: 年 月 日
目 录
一 绪言........................................................................................................................................... 1 二 方案设计和论证 ....................................................................................................................... 1
2.1总体分析 ............................................................................................................................. 1 2.2 简要论证 ............................................................................................................................ 1 三 系统设计 ..................................................................................................................................... 2
3.1 中断系统 ............................................................................................................................ 2 3.2 定时/计数器....................................................................................................................... 4 3.3主控制程序流程图 ............................................................................................................. 6 四 硬件设计与电路原理 ............................................................................................................... 7
4.1 设计思路 ............................................................................................................................ 7 4.2 显示原理 ............................................................................................................................ 7 4.3 键盘及读数原理 ................................................................................................................ 7 4.4 连击功能的实现 ................................................................................................................ 8 4.5 LED显示器接口原理 ........................................................................................................ 8 4.6 8051单片机及其引脚说明 ................................................................................................ 8 五 软件仿真 ................................................................................................................................... 10
5.1 Protus 仿真电路图 .......................................................................................................... 10 六 结束语..................................................................................................................................... 12 参考文献......................................................................................................................................... 12
附录......................................................................................................................................... 13
一 绪言
单片机是指一个集成在一块芯片上的一个小而完善的计算机系统。它的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件:CPU、RAM、ROM和外部总线系统。单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集以及家用电器等各个领域,单片机往往是作为一个核心部件。本设计是采用单片机控制技术来实现对时钟的控制,基于单片机的定时和控制装置的应用,是数字钟最为基本的应用。在单片机最小系统电路和外围电路外,还要有外部的控制和显示装置,是对单片机的定时器、中断、LED显示和按键的使用。此电路的设计除了可以显示时间外,还可以可以添加整点报时和闹钟的功能。
二 方案设计和论证
2.1总体分析
电子时钟是采用数字电路实现对时、分、秒数字显示的计时装置,主要有时钟运算模块、校时模块和显示模块组成。其中校时模块和时钟运算模块对时、分、秒的数值进行操作。本多功能数字时钟采用单片机内部的定时器不断地进行中断实现定时功能,通过软件计数和软件译码,以动态扫描的方式将时间显示在数码管上。通过按键的检测可以控制单片机的相应动作,来达到调时的目的。
2.2 简要论证
本多功能数字时钟以80C51单片机为核心器件设计,系统由单片机、锁存器74HC573、LED数码管、按键、蜂鸣器等部分构成,能实现比较精确地走时、时间的调整等功能。
1、运算模块:秒信号由单片机内部的定时器产生。每次定时器的定时时间为250μs,对中断进行计数,当实现4000次中断时为1S,秒加1,当秒计数达到60时,秒清零,分加1,当分计满60清零,时加1,当时计满24时,时清零。
2、校时模块:本数字时钟对时、分、秒的调节功能集中于S1、S2、S3三个按键上,按键按下一次,对应的数值加1。
1
3、定时模块:当分计数至60时,调用报时程序,蜂鸣器发出声音。 4、显示模块:显示部分硬件用六只共阴极的数码管显示。为了节省单片机的IO口,通常采用动态扫描的显示方法,将每个数码管的同名段连在一起,分6次向数码管写数据,每次对6个数码管写相同的数据,每次选通一个数码管,完成扫描,通过调整、缩短扫描的时间,由于人眼的视觉暂留作用,使得人们看起来就像同时显示一样,以达到动态显示的目的。
5、组成框图如图所示:
图 1 组成框图
三 系统设计
3.1 中断系统
在单片机中,8051单片机是中断功能较强的一种,它提供了5个中断请求源和两个中断优先级控制。
在计算机运行过程中要处理很多问题,既有主机内部也有外部的,既有预定的也有外设的,面对复杂多变的情况,CPU要从容的完成各种任务,必须有中断功能。中断系统解决了计算机与外围设备交换信息时,慢速工作的外围设备与快
2
速工作的CPU之间的矛盾,设置了中断就可以提高CPU的工作效率,具有实时处理功能,使CPU能很快做出反应解决现场的各种参数和状态的变化,还具有故障处理功能,处理工作时故障的中断服务程序,此外还有实现分时操作、程序调试、多机连接等方面。
运行过程如下:
现行程序 中断 中断断点 服务程序 继续执行
图 2 中断控制过程
不同的单片机的中断源是不同的,在此系统中的单片机有六个中断源,具有四个中断优先级,可以实现二级中断服务程序嵌套。每个中断源可以编程为高优先级或低优先级中断,允许或禁止CPU请求中断。与中断系统有关的特殊功能寄存器有中断允许寄存器IE、中断优先寄存器IP、中断源寄存器(TCON、SCON)。
从中断响应过程可以看出在执行一种中断服务程序时,另一个同级中断不能被响应,必须在执行RET1指令后,在执行一条其他条令,CPU才能响应。利用这一特点,可以实现单步操作。其实现过程如下:设置中断P3.2为电平触发方式,高优先级中断,CPU外部中断0开中断,即应执行以下指令:
CLR IT0,SETB EA,SEB EX0 . 在中断服务程序结尾增加以下指令:
Pause0:jnb P3.2,pause0;P3.2变高前原地等待 Pause1:jb P3.2,pause1;P3.2变低前原地等待 Reti。
若P3.2为低电平就进入外中断0的中断服务。由于上述几条指令的存在,
3
程序将在JNB出原地等待,当P3.2端出现一个正脉冲,程序就往下进行,在执行RET1和返回后的一条其他指令后,又立即进入外部中断P3.2服务程序,以等待P3.2端出现下一个脉冲,这样P3.2端没出现一次正脉冲就执行一条新的指令实现了单步操作。
3.2 定时/计数器
80C51系列单片机内部设置了三个16位可编程的定时/计数器T0和T1,具有定时器方式和计数器方式两种工作方式,可编程控制4中工作模式。80C51定时系统还包括两个定时控制寄存器TCON和TMOD。
3.2.1 寄存器TMOD
寄存器TMOD用于控制和设定定时器的工作方式和4种工作模式,其中低4位用于T0,高4位用于T1。其各定义如下:
D7 T1 GATE C//T M1 M0 D6 D5 D4 D3 T0 GATE C//T M1 M0 D2 D1 DO 1)C//T:该位为定时或计数功能选择位计数功能选择位,当 C//T=1时,定时/计数器工作在计数方式,此时定时/计数器使用外部引脚P3.4、P3.5输入的脉冲作为计数脉冲。当C//T=0时,定时/计数器工作在定时方式,此时定时/计数器使用单片机的机器周期作为计数脉冲。
2)
M1、M0:定时/计数器工作模式选择位,用于设定定时/计数器的4
种工作模式。其对应关系如表1所示。
M1 0 0 1 1 M0 工作模式 0 模式0 1 模式1 0 模式2 1 模式3 功能说明 13位定时/计数器 16位定时/计数器 常数自动装入的定时/计数器 仅适用于T0,分为两个8位定时/计数器,对T1停止计数 表1 定时/计数器工作模式选择
4
3) GATE:定时/计数器门控制位,用于设定定时/计数器的启动是否受外部中断请求信号的控制。GATE=1时,T0和T1的启动分别受芯片引脚/INT0(P3.2)和/INT1(P3.3)的控制。GATE=0时,定时/计数器的启动与引脚/INT0、/INT1无关。
3.2.2 89C51定时/计数器工作模式
89C51单片机的定时/计数器有4种工作模式,由TMOD寄存器的M0、M1两位确定。这些在前边已经提到过了,而本次设计采用的是工作模式1所以在此具体介绍这一种,至于其他几种,由于本次设计用的定时器中断是T1所以不能选用模式3,而模式2的技术值太小,所以一般也不是经常运用,模式0的计数比模式1复杂,技术值也不如它大,所以选用模式1是最好的方案。
将TMOD的M1、M0位分别设为0、1,定时/计数器工作模式1下。此时定时/计数器是一个16位定时/计数器,TLX组成定时/计数器低8位,THX组成定时/计数器的高8位,TLX溢出后向THX进位,最大计数值位65536。以定时/计数器1为例,工作在模式1下定时/计数器的等效逻辑电路如图5-2所示。
12分频OSCC//T=0开关控制TF1TH1(8位)TL1(8位)C//T=1T1TR1&>=11/INT1GATE
图3 定时计数器1在工作模式1下的逻辑电路图
5
3.3主控制程序流程图
主程序是先开始,然后启动定时器,定时器启动后在进行按键检测,检测完后,就可以显示时间。
图4 主程序流程图
6
四 硬件设计与电路原理
4.1 设计思路
本设计是纯粹的应用性设计,主要以实现计时、显示等功能为最终目的。设计以Atmel公司的8051为核心,在最小系统的基础上利用单片机的实时功能和外部中断口P3.2和P3.3以及LCD显示模块,硬件设计简单节约,其功能的实现主要靠软件设计,所以软件在本设计中是最为重要的。
本设计包括硬件设计和软件设计两部分。主要硬件有:8051单片机,LED显示模块 系统框图
8051 P0 单片机 控制器 P2 六位LED显示列驱动
图 5 系统框图
4.2 显示原理
数码管显示模块由8个共阴极的数码管组成时、分、秒的显示。P0口的8条数据线P0.0至P0.7分别与两个CD4511译码的ABCD口相接,P2口的P2.0至P2.2分别通过电阻R10至R13与VT1至VT3的基极相连接。这样通过P0口送出一个存储单元的高位、低位BCD显示代码,通过P2口送出扫描选通代码轮流点亮LED1至LED6,就会将要显示的数据在数码管中显示出来。从P0口输出的代码是BCD码,从P2口输出的就是位选码。这是扫描显示原理。
4.3 键盘及读数原理
键盘是人与微机打交道的主要设备,按键的读取容易引起误动作。可采用软件去抖动的方法处理,软件的触点在闭合和断开的时候会产生抖动,这时触点的
7
逻辑电平是不稳定的,如不采取妥善处理的话,将引起按键命令错误或重复执行,在这里采用软件延时的方法来避开抖动,延时时间20ms。
4.4 连击功能的实现
按下某键时,对应的功能键解释程序得到执行,如操作者没有释放按键,则对应的功能会反复执行,好象连续执行,在这里我采用软件延时250ms,当按键没释放则执行下一条对应程序。利用连击功能,能实现快速调时操作。
4.5 LED显示器接口原理
显示方式分为静态显示和动态显示。在这里只介绍动态显示方式。所谓动态显示就是让各位显示元件分时工作。若刷新的速度太高,显示元件的开关速度却不够高,以致在前一个字符尚未完全熄灭的情况下,后续的字符段就点亮。若刷新的速度太慢时,将发生闪烁。因此刷新频率不要低于 100 HZ ,肉眼观察到的数码的显示情况将是连续的。利用动态显示法可以降低系统功耗,减少成本。 一般来讲,数码显示系统应包括显示器和译码器两部分,为了实现动态显示还增加显示控制电路。
4.6 8051单片机及其引脚说明
8051是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的8051单片机可为您提供许多较复杂系统控制应用场合。 8051芯片的引脚图见图6:
8
图6 8051芯片
8051有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,8051可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
8051有PDIP、PQFP/TQFP及PLCC等三种封装形式,以适应不同产品的需求。 P3口特殊功能见下表:
P3口引脚 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 特殊功能 RXD(串行输入口) TXD(串行输出口) (外部中断0) (外部中断1) T0(定时器0外部输入) T1(定时器1外部输入) 表2 P3口特殊功能
主要功能特性:
9
• 兼容MCS51指令系统
• 8k可反复擦写(>1000次)Flash ROM • 32个双向I/O口 • 256x8bit内部RAM
• 3个16位可编程定时/计数器中断 • 时钟频率0-24MHz • 2个串行中断 • 可编程UART串行通道 • 2个外部中断源 • 共6个中断源
• 2个读写中断口线 • 3级加密位
• 低功耗空闲和掉电模式 • 软件设置睡眠和唤醒功能
五 软件仿真
5.1 Proteus 仿真电路图
用Proteus软件画图:其中不需要时钟芯片,本次设计采用单片机本身的定时、计时功能。
10
图7 初始仿真
按时按钮按键,进入调时状态,每按一次数字钟的小时数加一。效果如下:
图 8 小时数加一仿真
再按分按钮按键,进入调分状态,每按一次数字钟的分钟数加一。效 果图如下:
图 9 分钟数加一仿真
11
软件程序的调试一般可以将重点放在分模块调试上,统调是最后一环。软件调试可以采取离线调试和在线调试两种方式。前者不需要硬件仿真器,可借助于软件仿真器即可;后者一般需要仿真系统的支持。本次设计,通过各个模块程序的单步或跟踪调试,使程序逐渐趋于正确,最后统调程序。
六 结束语
本设计主要采用了单片机技术来实现对电路的控制,采用80C51芯片和LED数码管来控制整个电路。本次设计基于单片机的数字时钟,主要有80C51单片机部分、LED数码管部分和按键控制等部分组成,文中详细介绍了LED时钟的控制电路、程序以及其所用到的芯片,主要是80C51芯片,其中80C51芯片包括中断系统及定时/计数器。在本次设计中我自主的增加了整点报时功能能在老师给的任务下举一反三合理的运用自己的知识完善自己的设计,在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。我通过查阅大量有关资料,并在小组中互相讨论,交流经验和自学,使自己学到了不少知识,也经历了不少艰辛,但收获同样巨大。通过这次课程设计我也发现了自身存在的不足之处,虽然感觉理论上已经掌握,但在运用到实践的过程中仍有意想不到的困惑,经过一番努力才得以解决。
参考文献
[1] 杨宏丽,刘俐 单片机应用技术(C语言版)[M] 电子工业出版社 [2] 谭浩强 C程序设计教程[M] 清华大学出版社
[3] 王建校 《51系列单片机及C51程序设计》[M] 科学出版社,2002. [4] 张靖武《单片机系统的PROTEUS设计与仿真》[M] 电子工业出版社 [5] 周坚《单片机典型模块设计实例导航》[M] 人们邮电出版社
12
附录
由于本设计中的程序比较复杂,所以在次介绍子程序时只重点说明几个重要的复杂的子程序。
初始化变量子程序
uchar num,count,key1num=0;
uchar code table[]=\" ourclock \"; uchar code table1[]=\" - - \"; char miao=00; char fen=59; char shi=23;
中断控制子程序
本设计的程序,定时器1计时中断程序每隔10ms中断一次当作一个计数,计数从100开始,每中断一次则计数减一,当计数100次时,则表示1秒到了,秒变量从60开始计数,当到达1秒时减一,同理在判断是否到了1分钟,在判断是否到了1小时,如果计数到了就将相关的变量恢复为原值。 定时器1计时中断程序每隔10ms中断一次,其程序如下: void time() interrupt 1 {
TH0=0x3c;//重装初值 TL0=0xb0; count++; if(count==20) {
count=0; miao++; if(miao==60) {
miao=0;
13
}
}
fen++; if(fen==60) { }
write_sfm(4,shi); }
write_sfm(7,fen);
fen=0; shi++;
write_sfm(4,shi);
write_sfm(10,miao);
初始化定时器子程序
TMOD=0x01;//设置定时器0工作方式1
TH0=0x3c;//定时器装初值 TL0=0xb0; EA=1;//开总中断 ET0=1;//开定时器中断 TR0=1;//启动定时器
时间设置子程序
设置时间主要由按键完成。主要目的是按动按键时可以使计数加1而且能在LCD显示器上显示出来,因此此子程序是与显示子程序相联系的。 void keyscan() {
if(key1==0)
{
delay(10);
14
}
if(key1==0) { }
while(!key1); key1num++; if(key1num==1) { }
if(key1num==2) { }
if(key1num==3) { }
if(key1num==4) { }
key1num=0; write_com(0x0c); TR0=1;
write_com(0x80+0x40+4); write_com(0x0f); write_com(0x80+0x40+7); write_com(0x0f); TR0=0;
write_com(0x80+0x40+10); write_com(0x0f);
if(key1num!=0)
15
{
if(key3==0) {
delay(10); if(key3==0) {
while(!key3); if(key1num==1) { }
if(key1num==2) { }
if(key1num==3) {
shi--; if(shi==-1)
shi=23; fen--; if(fen==-1)
fen=59; miao--; if(miao==-1)
miao=59;
write_sfm(10,miao); write_com(0x80+0x40+10);
write_sfm(7,fen); write_com(0x80+0x40+7);
write_sfm(4,shi);
16
}
}
}
write_com(0x80+0x40+4);
}
if(key2==0)
{
delay(10); if(key2==0) {
while(!key2); if(key1num==1) { }
if(key1num==2) { }
if(key1num==3) {
fen++; if(fen==60)
fen=00; miao++; if(miao==60)
miao=00;
write_sfm(10,miao); write_com(0x80+0x40+10);
write_sfm(7,fen); write_com(0x80+0x40+7);
17
}
}
}
}
shi++; if(shi==24)
shi=00;
write_sfm(4,shi); write_com(0x80+0x40+4);
显示数据子程序
本设计的主要目的是将时间以功能要求中的格式在LCD显示器上显示出来,因此这是本程序的核心部分。本子程序要考虑到时分秒的不同,要分别更新与设置。
void write_com(uchar com) { }
void write_data(uchar dat) {
//写指令
rs=0; P2=com; delay(5); e=1; delay(5); e=0;
//写数据
rs=1; P2=dat; delay(5); e=1;
18
}
delay(5); e=0;
void write_sfm(uchar add,uchar dat) { }
void init() {
e=0;
write_com(0x38); //设置16x2显示5x7点阵,8位数据口 write_com(0x0c); //设置开显示,不显示光标 write_com(0x06); //写一个字符后地址指针加1 write_com(0x01); //显示清0 delay(10); write_com(0x80);
//写第一行的地址
//显示数组1,日期的
uchar shiwe,gewe; shiwe=dat/10; gewe=dat%10;
write_com(0x80+0x40+add); write_data(0x30+shiwe); write_data(0x30+gewe);
for(num=0;num<15;num++) { write_data(table[num]); }
write_com(0x80+0x40);
delay(5);
//写第二行的地址
for(num=0;num<15;num++) //显示数组2.时间的 {
write_data(table1[num]);
19
}
delay(5);
}
write_sfm(10,miao); write_sfm(7,fen); write_sfm(4,shi); delay(20);
TMOD=0x01;//设置定时器0工作方式1 TH0=0x3c;//定时器装初值 TL0=0xb0; EA=1;//开总中断 ET0=1;//开定时器中断 TR0=1;//启动定时器
对按键进行说明及程序中的定义
1) 按键说明 K1: shi K2: fen K3: miao K4: RESET
2) 程序中的按键定义
按键意义可以在图5-1中看出,与它的连接方式有关。 K1 EQU P1.0 ;按键1引脚定义 K2 EQU P1.1 ;按键2引脚定义 K3 EQU P12 ;按键3引脚定义
20
21
因篇幅问题不能全部显示,请点此查看更多更全内容