数字时钟设计开发项目报告doc.docx
《数字时钟设计开发项目报告doc.docx》由会员分享,可在线阅读,更多相关《数字时钟设计开发项目报告doc.docx(27页珍藏版)》请在冰豆网上搜索。
![数字时钟设计开发项目报告doc.docx](https://file1.bdocx.com/fileroot1/2022-11/27/9820af72-3c3e-4f7a-b393-1c6b8899b9b3/9820af72-3c3e-4f7a-b393-1c6b8899b9b31.gif)
数字时钟设计开发项目报告doc
常州工程职业技术学院计算机技术系
项目工作报告
课程
名称
单片机与接口技术(C51)
班级
计算机1213
学号
姓名
项目序号
项目一
项目名称
数字时钟设计开发
实训日期/时间
2014.2~2014.5
地点
指导教师
同组成员
仪器设备
(参考资料)
计算机、KeiluVision2、ProteusISIS
实训内容
(任务安排)
1-1需求分析、硬件设计方案确定
1-2软件开发与实现
1-3软硬件联调
1-4项目验收总结
1、项目概述
以单片机STC89C52RC作为主控芯片,利用按键、数码管显示模块,结合中断、定时器功能,构成一个数字时钟,通过项目实训掌握单片机基本输入输出系统的设计与应用。
2、项目要求
针对每个项目,教师给出所需背景知识、参考资料、师生交流平台、项目要求、相关案例、开发流程、注意事项等指导学生。
根据项目开发流程组成学生开发团队,创建协作学习环境。
每个团队由6-8人组成,分别担当不同角色。
这种模拟教学法的做法模拟了企业中真实开发情景,使学生在学习过程中感受到公司工作的气氛。
具体要求如下:
1、能够简单分析实际项目的功能需求;
2、能够进行IO接口电路设计与元器件选型;
3、能够使用Proteus绘制电路原理图并仿真;
4、能用C51设计应用程序;
5、能够对系统进行测试与优化;
6、能够编制规范的技术文档;
7、能对系统软硬故障进行检测与排除;
8、培养自主学习能力、收集分析、处理信息能力、团队协作能力;
9、培养职业道德素质、心理素质、沟通、组织和执行任务的能力;
10、培养汇报发言时,条理清晰,表达清楚,体现出认真细致、全面的思维习惯。
11、培养学生良好的工作设计习惯。
12、培养实事求是、客观公正的评价自己,体现在社会交往中的承受挫折与迎接挑战的意识。
3、系统设计
1、框图设计
AT89C51
晶振电路
数码管
复位按键
时分秒按键
2、知识点
1)单片机型号的选择
89C51是最理想的电子时钟开发芯片。
89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器,而且它与MCS-51兼容,且具有4K字节可编程闪烁存储器和1000写/擦循环,数据保留时间为10年等特点,是最好的选择。
2)数码管显示工作原理
数码管是一种把多个LED显示段集成在一起的显示设备。
有两种类型,一种是共阳型,一种是共阴型。
共阳型就是把多个LED显示段的阳极接在一起,又称为公共端。
共阴型就是把多个LED显示段的阴极接在一起。
阳极即为二极管的正极,又称为正极,阴极即为二极管的负极,又称为负极。
通常的数码管又分为8段,即8个LED显示段,这是为工程应用方便如设计的,分别为A、B、C、D、E、F、G、DP,其中DP 是小数点位段。
而多位数码管,除某一位的公共端会连接在一起,不同位的数码管的相同端也会连接在一起。
数码管显示方法可分为静态显示和动态显示两种。
静态显示就是数码管的8段输入及其公共端电平一直有效。
动态显示的原理是,各个数码管的相同段连接在一起,共同占用8 位段引管线;每位数码管的阳极连在一起组成公共端。
利用人眼的视觉暂留性,依次给出各个数码管公共端加有效信号,在此同时给出该数码管加有效的数据信号,当全段扫描速度大于视觉暂留速度时,显示就会清晰显示出来
3)键盘电路设计
该设计用到了个键盘,实现的功能比较完善,减少了硬件资源的损耗,该键
盘可以实现小时和分钟的调节以及复位的控制。
直接按下不松开,则可以通过按键实现分钟的累加,每按一次分钟加一;而连续两次按下按键不放松,则可实现小时的调节,同样每按一次小时加一。
达到时间调节的目的。
4)晶振振荡器电路
单片机系统里都有晶振,在单片机系统里晶振作用非常大,全程叫晶体振荡器,他结合单片机内部电路产生单片机所需的时钟频率,单片机晶振提供的时钟频率越高,那么单片机运行速度就越快,单片接的一切指令的执行都是建立在单片机晶振提供的时钟频率。
在通常工作条件下,普通的晶振频率绝对精度可达百万分之五十。
高级的精度更高。
有些晶振还可以由外加电压在一定范围内调整频率,称为压控振荡器(VCO)。
晶振用一种能把电能和机械能相互转化的晶体在共振的状态下工作,以提供稳定,精确的单频振荡。
单片机晶振的作用是为系统提供基本的时钟信号。
通常一个系统共用一个晶振,便于各部分保持同步。
有些通讯系统的基频和射频使用不同的晶振,而通过电子调整频率的方法保持同步。
晶振通常与锁相环电路配合使用,以提供系统所需的时钟频率。
如果不同子系统需要不同频率的时钟信号,可以用与同一个晶振相连的不同锁相环来提供。
下面我就具体的介绍一下晶振的作用以及原理,晶振一般采用如图1a的电容三端式(考毕兹)交流等效振荡电路;实际的晶振交流等效电路如图1b,其中Cv是用来调节振荡频率,一般用变容二极管加上不同的反偏电压来实现,这也是压控作用的机理;把晶体的等效电路代替晶体后如图1c。
其中Co,C1,L1,RR是晶体的等效电路。
分析整个振荡槽路可知,利用Cv来改变频率是有限的:
决定振荡频率的整个槽路电容C=Cbe,Cce,Cv三个电容串联后和Co并联再和C1串联。
可以看出:
C1越小,Co越大,Cv变化时对整个槽路电容的作用就越小。
因而能“压控”的频率范围也越小。
实际上,由于C1很小(1E-15量级),Co不能忽略(1E-12量级,几PF)。
所以,Cv变大时,降低槽路频率的作用越来越小,Cv变小时,升高槽路频率的作用却越来越大。
这一方面引起压控特性的非线性,压控范围越大,非线性就越厉害;另一方面,分给振荡的反馈电压(Cbe上的电压)却越来越小,最后导致停振。
通过晶振的原理图你应该大致了解了晶振的作用以及工作过程了吧。
采用泛音次数越高的晶振,其等效电容C1就越小;因此频率的变化范围也就越小。
微控制器的时钟源可以分为两类:
基于机械谐振器件的时钟源,如晶振、陶瓷谐振槽路;RC(电阻、电容)振荡器。
一种是皮尔斯振荡器配置,适用于晶振和陶瓷谐振槽路。
另一种为简单的分立RC振荡器。
用万用表测量晶体振荡器是否工作的方法:
测量两个引脚电压是否是芯片工作电压的一半,比如工作电压是51单片机的+5V则是否是2.5V左右。
另外如果用镊子碰晶体另外一个脚,这个电压有明显变化,证明是起振了的。
晶振的类型有SMD和DIP型,即贴片和插脚型。
5)单片机的复位电路
在上电或复位过程中,控制CPU的复位状态:
这段时间内让CPU保持复位状态,而不是一上电或刚复位完毕就工作,防止CPU发出错误的指令、执行错误操作,也可以提高电磁兼容性能。
无论用户使用哪种类型的单片机,总要涉及到单片机复位电路的设计。
而单片机复位电路设计的好坏,直接影响到整个系统工作的可靠性。
许多用户在设计完单片机系统,并在实验室调试成功后,在现场却出现了“死机”、“程序走飞”等现象,这主要是单片机的复位电路设计不可靠引起的。
基本的复位方式单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。
89系列单片机的复位信号是从RST引脚输入到芯片内的施密特触发器中的。
当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,则CPU就可以响应并将系统复位。
单片机系统的复位方式有:
手动按钮复位和上电复位
6)中断
中断就是一个资源面对多项任务的处理方式,由于资源有限,面对多项任务同时要处理时,就会出现资源竞争的现象。
中断技术就是为了解决资源竞争的一个可行的方法,采用中断技术可使多项任务共享一个资源。
CPU正在执行原程序,突然,被意外事情打断,转去执行新程序。
CPU执行新程序结束后,又回到原程序中继续执行。
这样的过程就叫中断。
首先来了解程序的格式:
void函数名()interruptm[usingn]
{}
关键字interruptm[usingn]表示这是一个中断函数
m为中断源的编号,有五个中断源,取值为0,1,2,3,4,中断编号会告诉编译器中断程序的入口地址,执行该程序时,这个地址会传个程序计数器PC,于是CPU开始从这里一条一条的执行程序指令。
n为单片机工作寄存器组(又称通用寄存器组)编号,共四组,取值为0,1,2,3中断号中断源
0外部中断0
1定时器0
2外部中断1
3定时器1中断
4串行口中断
这5个中断源的中断入口地址为:
(在上一篇文章中讲到的ROM前43个存储单元就是他们,这40个地址用来存放中断处理程序的地址单元,每一个类中断的存储单元只有8B,显然不是中断处理的程序,而是存放着中断处理程序的真正地址)
INT0:
0003H0
T0:
000BH1
INT1:
0013H2
T1:
001BH3
串口:
0023H4
中断向量(中断入口地址)=中断号x8+3
前面m意思很清楚,不同的m值表示这个函数是针对不同的中断源,比如m为1是表示它是定时器0的中断函数,
如voidtime0()interrupt1{}
那么后面的usingn又是什么意思呢?
在正在执行一个特定任务时,有更紧急的事情需要CPU来处理,涉及到中断优先权。
高优先权中断低优先权正在处理的程序,所以最好给每个优先程序分配不同的寄存器组。
CPU正在处理某个事件,突然另外一个事件需要处理,于是进入中断后,
而你不想将现在执行的程序的各寄存器状态入栈,那么可以把这个中断程序放入另一个寄存器组,如切换到1组,然后退出中断时,再切回到0组(原来的程序在0组)。
为了更好的了解这里意思,你可以看看工作寄存器组的作用是什么。
下面的注意事项
(1)中断函数不能进行参数传递
(2)中断函数没有返回值
(3)在任何情况下都不能直接调用中断函数
(4)中断函数使用浮点运算要保存浮点寄存器的状态。
(5)如果在中断函数中调用了其它函数,则被调用函数所使用的寄存器必须与中断函数相同,被调函数最好设置为可重入的。
(6)C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容,具体如下:
在程序开始处对ACC、B、DPH、DPL和PSW入栈,结束时出栈。
中断函数未加usingn修饰符的,开始时还要将R0~R1入栈,结束时出栈。
如中断函数加usingn修饰符,则在开始将PSW入栈后还要修改PSW中的工作寄存器组选择位。
(7)C51编译器从绝对地址8m+3处产生一个中断向量,其中m为中断号,也即interrupt后面的数字。
该向量包含一个到中断函数入口地址的绝对跳转。
(8)中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明。
防止其它程序调用。
(9)在设计中断时,要注意的是哪些功能应该放在中断程序中,哪些功能应该放在主程序中。
一般来说中断服务程序应该做最少量的工作,这样做有很多好处。
首先系统对中断的反应面更宽了,有些系统如果丢失中断或对中断反应太慢将产生十分严重的后果,这时有充足的时间等待中断是十分重要的。
其次它可使中断服务程序的结构简单,不容易出错。
中断程序中放入的东西越多,他们之间越容易起冲突。
简化中断服务程序意味着软件中将有更多的代码段,但可把这些都放入主程序中。
中断服务程序的设计对系统的成败有至关重要的作用,要仔细考虑各中断之间的关系和每个中断执行的时间,特别要注意那些对同一个数据进行操作的ISR.
7)定时器
实质是计数器,脉冲每一次下降沿,计数寄存器数值将加1。
计数的脉冲如果来源于单片机内部的晶振,由于其周期极为准确,这时称为定时器。
计数的脉冲如果来源于单片机外部的引脚,由于其周期一般不准确,这时称为计数器。
定时器/计数器的结构
定时器/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成。
TMOD是定时器/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。
定时器/计数器的工作原理
计数器输入的计数脉冲源
系统的时钟振荡器输出脉冲经12分频后产生;
T0或T1引脚输入的外部脉冲源。
计数过程
每来一个脉冲计数器加1,当加到计数器为全1(即FFFFH)时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON中TF0或TF1置1,向CPU发出中断请求(定时器/计数器中断允许时)。
如果定时器/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。
定时应用
用作定时器:
此时设置为定时器模式,加1计数器是对内部机器周期计数(1个机器周期等于12个振荡周期,即计数频率为晶振频率的1/12)。
计数值N乘以机器周期Tcy就是定时时间t。
计数运用
用作计数器:
此时设置为计数器模式,外部事件计数脉冲由T0或T1引脚输入到计数器。
每来一个外部脉冲,计数器加1。
但单片机对外部脉冲有基本要求:
脉冲的高低电平持续时间都必须大于1个机器周期。
工作方式寄存器(TMOD)
GATE:
门控位。
GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时器/计数器工作;(即需要一个启动条件)
GATE=1时,要用软件使TR0或TR1为1,同时外部中断引脚也为高电平时,才能启动定时器/计数器工作,即需要两个启动条件。
C/T:
定时/计数模式选择位。
C/T=0为定时模式;C/T=1为计数模式。
M1M0:
工作方式设置位。
计数器工作方式选择
M1M0工作方式功能说明
00方式013位计数器
01方式116位计数器
10方式2自动重装8位计数器
11方式3定时器0:
分成两个8位
定时器1:
停止计数
定时器/计数器的控制
控制寄存器TCON
TCON的低4位用于控制外部中断,已在前面介绍。
TCON的高4位用于控制定时器/计数器的启动和中断申请。
其格式如下:
TF1(TCON.7):
T1溢出中断请求标志位。
T1计数溢出时由硬件自动置TF1为1。
CPU响应中断后TF1由硬件自动清0。
TR1(TCON.6):
T1起/停控制位。
1:
启动0:
停止
TF0(TCON.5):
T0溢出中断请求标志位,其功能与TF1类同。
TR0(TCON.4):
T0起/停控制位。
1:
启动0:
停止
定时器/计数器的工作方式
方式0
方式0为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。
方式1
方式1的计数位数是16位,由TL0(TL1)作为低8位、TH0(TH1)作为高8位,组成了16位加1计数器。
方式2
方式2为自动重装初值的8位计数方式。
在方式2下,当计数器计满255(FFH)溢出时,CPU自动把TH的值装入TL中,不需用户干预。
因此特别适合于用作较精确的脉冲信号发生器。
方式3
方式3只适用于定时器/计数器T0,定时器T1方式3时相当于TR1=0,停止计数。
工作方式3将T0分成为两个独立的8位计数器TL0和TH0。
扩展阅读:
计数器/定时器的C编程
8)最小化系统
单片机要正常运行,必须具备一定的硬件条件,其中最主要的就是三个条件:
(1)电源正常;
(2)时钟正常;
(3)复位正常。
在AT89C51单片机的40个引脚中,电源引脚两根,晶振引脚4根,可编程输入输出引脚32根。
(1)工作电源电源是单片机工作的动力源泉,对应的接线方法为:
40引脚(VCC)电源引脚,工作是接+5V电源,20引脚(GND)为接地线。
(2)时钟电路时钟电路为单片机产生时序脉冲,单片机所有运算与控制过程都是在同一时序脉冲的驱动下进行的,时钟电路就好比人的心脏一样重要。
当采用内部时钟时,在晶振XTAL(19引脚)和XTAL(18引脚)之间接入一个晶振,两个引脚对地分别接入一个电容可产生所需的时钟信号,电容的容量一般取30pf。
(3)复位电路在复位引脚(9引脚)持续出现24个振荡器脉冲周期(即2个机器周期)的高平信号将使单片机复位。
电容C和电阻R构成了单片机上电自动复位电路。
复位后,单片机从0000H单元开始执行程序,并初始化一些专用寄存器为复位状态值,受影响的专用寄存器如表所示。
(4)控制引脚EA接法EA/VPP(31引脚)为内外程序存储器选择控制引脚,当EA为低电位时,单片机从外部存储器取指令;当EA接高电平时,从单片机内部程序存储器取指令。
AT89C51单片机内部有4KB可反复擦写1000次以上的程序存储器,因此要把EA接+5V高电平,让单片机运行内部的程序,这样就可以反复来验证程序了。
这就是AT89C51单片机最小化系统的连接,只要把编写好的程序烧写到单片机内部,并接上5V电源就可以正常运行了,在17引脚上街上的发光二极管可以用来验证系统是否正常。
9)C语言
单片机产生于19世纪70年代,80年代人们开始使用C语言作为单片机的开发语言,在1985年许多公司都推出51系列单片机的C语言编辑器,我们把面向51单片机的C语言简称为C51。
目前C51软件中最为流行的就是KeilC。
一、C语言编程与汇编语言编程相比的优势
[1]编程调试灵活方便。
因为它是一门高级语言,高级语言的特点就是编程方式灵活,同时,当前所有的单片机都有相应的C语言级别的仿真调试系统,使得它的调试十分方便。
[2]生成的代码编译效率高。
尤其是用于较为复杂的单片机系统,用C语言开发更具明显优势,当前较好的C语言编辑系统的编译效率已经基本达到中高级程序人员的开发水平。
[3]完全模块化。
C语言的基本构成单位是函数,其本身就是模块化的开发方式。
程序的模块化可以最大程度地实现资源共享,十分有利于多人协作,进行大系统项目的开发。
[4]可移植性好。
当对C语言程序进行移植时,只需将部分与硬件相关的地方进行适度修改,如:
头文件。
完全是算法类的程序无需修改就可以直接从一种单片机移植到另外一种单片机上。
[5]便于项目维护管理。
用C语言开发的代码便于开发小组计划项目、灵活管理、分工合作以及后期维护,基本上可以杜绝因开发人员变化而给项目进度或后期维护或升级所带来的影响,从而保证了整个系统的高品质、高可靠性及可升级性。
二、与ANSIC的区别
[1]C51针对的是硬件系统,所以在程序的最开始应加载关于该系列芯片的头文件,如reg51.h或reg52.h,头文件中定义了各种SFR和SFR中可寻址位的信息。
[2]从数据类型上讲,C51多了一种位类型,可以使得单片机的位操作更加方便。
[3]从数据的存储类型上说,C51可分为data、code、bdata、idata、pdata、xdata等类型,不同的数据存储类型有着不同的执行效率。
[4]由于单片机系统资源有限,所以编译系统不允许有太多的程序嵌套。
[5]C51不支持扩展16位字符,同时不支持递归特性。
[6]printf和scanf函数在C51中不再是用于屏幕打印和接收字符,而是用于串行口通信时数据的收发。
三、C51的关键字
关键字是编程语言保留的特殊标识符,在程序中不允许另做他用。
ANSIC中有32个关键字,C51在此基础上又扩展了20个,包括_at_,alien,bdata,bit,code,compact,data,idata,interrupt,large,pdata,_priority_,reentrant,sbit,sfr,sfr16,small,_task_,using,xdata。
四、C51的数据类型
ANSIC包括的数据类型有char、int、short、long、float、double、指针型,在C51中,short等同于int,double等同于float,除此之外,还增加了bit、sfr、sfr16、sbit这些特殊的数据类型。
char(1B)、int(2B)、long(4B)、float(4B)。
bit用于定义一个位标量,该位标量的值不是0就是1,类似某些高级语言中的Boolean类型数据。
sfr可以访问51单片机内所有的SFR,用于声明一个8位的SFR。
如sfrP1=0x90;
sfr16用于定义存在于51单片机内部RAM的16位的特殊功能寄存器。
如sfr16T0=0x8c;
sbit用于访问位地址空间中的可寻址位或SFR中的可寻址位。
如:
sbitOV=0xD2;
sbitCY=0XD7;
*********************
sfrSCON=0x98;
sbitRI=SCON^0;
sbitRB8=SCON^2;
************************
sbitOV=0xD0^2;
五、数据的存储器类型
data存储在可直接寻址的片内低128B的RAM中,访问速度最快。
bdata存储在可位寻址的内部RAM中(20H-2FH),允许位和字节混合访问。
idata存储在可间接寻址的片内RAM的256B。
允许访问全部片内地址。
pdata存储在可分页寻址的外部RAM的256B空间内,相当于MOVX@Ri指令。
xdata存储在可寻址的片外RAM的全部64KB空间,相当于MOVX@DPTR指令。
code存储在全部64KB的程序存储区,相当于MOVC@A+DPTR指令。
六、绝对地址的访问方法
[1]使用指针。
chardata*dp;
dp=0x61;
*dp=0x23;
[2]使用预定义宏(需包含absacc.h)
CBYTEDBYTEPBYTRXBYTR
CWORDDWORDPWORDXWORD
例如:
val2=XBYTE[0x7fdd];
[3]使用关键字_at_
unsignedcharxdatacom8255_at_0xffef;
com8255=0x90;
七、中断服务程序
格式:
void函数名()interruptn[usingm]
n是中断号,取值为0~4,usingm指明该中断服务程序对应的工作寄存器组,取值范围:
0~3。
使用C51编写中断服务程序,无需关心ACC、B、DPH、DPL、PSW等寄存器的保护,C51会自动增加入栈和出栈对这些寄存器进行保护。
八、C51的运算符和表达式
[1]赋值运算符:
=
[2]算术运算符:
+-*/%
[3]关系运算符:
><>=<===!
=
[4]逻辑运算符:
&&||!
[5]位运算符:
&|^~<<>>
[6]复合运算符:
+=>>=%=&=等
[7]指针和地址运算符:
*&
九、C51库函数:
[1]本征函数
注意:
调用这些函数时,需包含intrins.h
_crol_(x,n);_cror_(x,n);
_iror_(x,n);_irol_(x,n);
_lrol_(x,n);_lror_(x,n);
_nop_();
_testbit_(bitbar);
_chkfloat_(fltbar);
[2]非本征函数
reg51.h或reg52.h,其