?这一次带来的项目是课程设计级别的基于51单片机的时钟系统,本次的项目共有两种,一种是基础功能时钟,上电后自动从00-00-00开始计时,另一种加上了调时功能,上电后自动从00-00-00开始,当需要调时时,按下需要调整的按键,再按动确定即可增加。两种项目都包含:Proteus仿真、keilC语言代码、altium designer绘制的原理图和PCB,以及项目说明书。资源获取,加我QQ:2430687381
51单片机的定时器中断和精确延迟
?本次项目在定时方面都使用了定时器中断,AT89C51(最基础的51单片机,其他51系列均包含此单片机的功能)共有5个中断,如下表所示。
中断源 | 优先级 | 中断服务号 |
---|
INT0(外部中断0) | 0 | 0 | T0(定时器/计数器0中断) | 1 | 1 | INT1(外部中断1) | 2 | 2 | T1(定时器/计数器1中断) | 3 | 3 | TI/RI(串行口中断) | 4 | 4 |
?在51单片机中,存在中断嵌套,低等级的中断可以被高等级的中断打断。 ?51单片机的定时器中断寄存器有:中断允许控制寄存器 IE、定时器工作方式寄存器 TMOD、定时器控制寄存器 TCON、定时器初值寄存器 THx/TLx
中断允许控制寄存器 IE
?这个寄存器的功能是控制中断的开启与关闭,总共8位,其中6位有效,包含一个全局中断控制位(EA)和5个中断源的控制位,具体如下表所示。
名称 | EA | - | - | ES | ET1 | EX1 | ET0 | EX0 |
---|
作用 | 中断全局 | 无效 | 无效 | 串口 | 定时器1 | 外部中断1 | 定时器0 | 外部中断0 |
?这里各个控制位,均为1有效0无效,当需要打开中断时,首先将EA置为1,需要哪个中断将哪个置为1.
定时器工作方式寄存器 TMOD
?该寄存器的功能是设置定时器/计数器中断的工作方式。如设置定时器模式、计数位的位数。总共8位,前四位和后四位分别对应T1和T0,具体如下表所示。
名称 | GATE | C/T* | M1 | M0 | GATE | C/T* | M1 | M0 |
---|
作用 | 开关选项 | 模式选择 | 工作方式 | 工作方式 | 开关选项 | 模式选择 | 工作方式 | 工作方式 |
?开关选项: 0:仅由运行控制位TRx(x = 0,1)来控制定时器/计数器运行。1:用外中断引脚( INT0或 INT1)上的电平与运行控制位TRx共同来控制定时器/计数器运行。 ?模式选择:0:定时器工作模式,对单片机的晶体振荡器12分频后的脉冲进行计数。1:计数器工作模式,计数器对外部输入引脚T0(P3.4)或T1(P3.5)的外部脉冲(负跳变)计数。 ?工作方式:00(方式0),是13位定时器/计数器,01(方式1),是16位定时器/计数器,10(方式2),8位常数自动装入定时器/计数器,11(方式3),仅适用于T0,这时T0分为两个8位计数器,T1停止计数。
定时器控制寄存器 TCON
?该寄存器用于控制中断,如控制定时器的启动,停止、判断定时器的溢出和中断情况。总共8位,前四位和后四位分别对应T1和T0,具体如下表所示。
名称 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
---|
作用 | 定时器1溢出标志位 | 定时器1运行控制位 | 定时器0溢出标志位 | 定时器0运行控制位 | 外部中断1请求标志 | 外部中断1触发方式选择位 | 外部中断0请求标志 | 外部中断0触发方式选择位 |
定时器初值寄存器 THx/TLx
?TH0代表定时器的高八位,TH0中的H代表High即高的意思,TL0是定时器的低八位,其中L为LOW即低的意思,TH0和TL0两个8位即组成16位定时器;同理,TH1和TL1也是这个意义。这两个寄存器存放单片机定时器中断的数值边界,当超出边界后,会有中断产生。
那么如何获得标准的一秒中延迟?
?一般来说,51单片机的延迟可以通过空函数获得,使用while(i–);或者nop()函数,均可以获得基于单片机时钟(12M或8M)的粗延迟,但是在时钟系统项目中,粗延迟会带来较大误差,不太适合使用。
?使用中断产生精确延迟: ?以定时器T0为例,每当晶振产生一次脉冲,就将该寄存器TL0加一,当TL0加满溢出后,将TL0清空,TH0加一,TH0计满后产生定时中断。即TH0与TL0组成了一个16位的计数器,这个计数器可以从0x0000(0)加到0xFFFF(65535)。
当有12Mhz的晶振时、需要定时1ms:
51单片机为12分频单片机,因此执行一条指令的时间是12×(1/12M) s,即计数器每1us加一。
若定时1ms,则共需要加1000次。
因此将TH0、TL0设置从(65536-1000)= 64536开始计数。64536 的16进制为0xFC18。
因此将TH0设置为0xFC,TL0 设置为0x18。
这样我们就获得了1ms的精确延迟,1000次就是一秒钟。
项目:基于51单片机的时钟系统
Proteus仿真原理图如下,系统上电后,显示00-00-00,然后开始计数。 使用AD绘制原理图和PCB,可以直接打样焊接电路板制作实物,打样也可以找我。
项目:基于51单片机的时钟系统——可调时
在这个项目中,增加了调整时间的功能,使用的则是按键中断,相关内容会在下一篇文章讲解。 依旧是Proteus仿真,和前面不同的是,增加了按键部分。
ad的PCB,相比无按键电路来说,布局并没有增大多少。 资源包括:keilC语言代码+Proteus仿真原理图+ad原理图PCB+产品说明书
|