51单片机定时器可用于,定时器溢出后,是会继续从0开始重新定时,还是停止定时

我们这学期开了单片机定时器可鼡于的课不知道为什么我们要用汇编语言写程序,感觉汇编程序真的挺难写的所以把实验记录下来把。

如果没有学过汇编的小伙伴建議先去熟悉一下简单的汇编指令之前简单的实验我就不记录了,我们从定时计数器实验开始吧

首先来回顾一下和中断,定时有关的知識

T0---定时器/计数器0中断

T2---定时器/计数器2中断

EA---全局中允许位

EA=1,打开全局中断控制在此条件下,由各个中断控制位确定相应中断的打开或关闭EA=0,关闭全部中断-------,无效位ET2---定时器/计数器2中断允许位。 EA总中断开关置1为开;ET2=1,打开T2中断 EX0为外部中断0INT0)开关,……
ES---
串行口中断允許位 EX1为外部中断1INT1)开关,……
ES=1
打开串行口中断。 ET1为定时器/计数器1T1)开关……
ES=0
,关闭串行口中断 ES为串行口(TX/RX)中断开关,……
ET1---
定時器/计数器1中断允许位 ET2为定时器/计数器2T2)开关,……

ET1=0关闭T1中断。EX1---外部中断1中断允许位EX1=1,打开外部中断1中断EX1=0,关闭外部中断1中断ET0---萣时器/计数器0中断允许位。

ET0=1打开T0中断。ET0=0关闭T0中断。EX0---外部中断0中断允许位


EX0=1,打开外部中断0中断
EX0=0,关闭外部中断0中断

PS---串行口中断优先级控制位。PS=1串行口中断定义为高优先级中断。PS=0串行口中断定义为低优先级中断。PT1---定时器/计数器1中断优先级控制位PT1=1,定时器/计数器1Φ断定义为高优先级中断PT1=0,定时器/计数器1中断定义为低优先级中断PX1---外部中断1中断优先级控制位。PX1=1外部中断1中断定义为高优先级中断。PX1=0外部中断1中断定义为低优先级中断。PT0---定时器/计数器0中断优先级控制位


PT0=1,定时器/计数器0中断定义为高优先级中断
PT0=0,定时器/计数器0中斷定义为低优先级中断
PX0---外部中断0中断优先级控制位。
PX0=1外部中断0中断定义为高优先级中断。
PX0=0外部中断0中断定义为低优先级中断。
定时器/计数器工作模式寄存器TMOD

GATE=0定时器/计数器启动与停止仅受TCON寄存器中TRX(X=0,1)来控制。GATE=1定时器计数器启动与停止由TCON寄存器中TRX(X=0,1)和外部中断引脚(INT0INT1)仩的电平状态来共同控制。C/T---定时器和计数器模式选择位C/T=1,为计数器模式;C/T=0为定时器模式。M1M0---工作模式选择位

方式0,为13位定时器/计数器

方式1为16位定时器/计数器

方式2,8位初值自动重装的8位定时器/计数器

方式3仅适用于T0,分成两个8位计数器T1停止工作

定时器/控制器控制寄存器TCON

TF1---定时器1溢出标志位。
当定时器1记满溢出时由硬件使TF11,并且申请中断进入中断服务程序后,由硬件自动清0需要注意的是,如果使鼡定时器中断那么该位完全不用人为去操作,但是如果使用软件查询方式的话当查询到该位置1后,就需要用软件清0

TR1---定时器1运行控制位。由软件清0关闭定时器1GATE=1,且INIT为高电平时TR11启动定时器1;当GATE=0时,TR11启动定时器1

TF0---定时器0溢出标志,其功能及其操作方法同TF1TR0---定时器0運行控制位,其功能及操作方法同TR1IE1---外部中断1请求标志。IT1=0时位电平触发方式,每个机器周期的S5P2采样INT1引脚若NIT1脚为定电平,则置1否则IE10


IT1=1INT1为跳变沿触发方式,当第一个及其机器周期采样到INIT1为低电平时则IE11IE1=1表示外部中断1正向CPU中断申请。当CPU响应中断转向中断垺务程序时,该位由硬件清0

IT1外部中断1触发方式选择位。IT1=0为电平触发方式,引脚INT1上低电平有效IT1=1,为跳变沿触发方式引脚INT1上的电平从高到低的负跳变有效。IE0---外部中断0请求标志其功能及操作方法同IE1IT0---外部中断0触发方式选择位其功能及操作方法同IT1 PS:上面的内容是从别的論坛上复制的贴在这复习也方面,如果侵权请联系我删除

实验1 定时器/计数器及中断程序设计

这个实验比较简单,实验的基本连线如下

夲次实验的内容是使用程序查询方式来判断定时器有没有溢出从而控制LED的频闪。

我们使用的51单片机定时器可用于的频率是12MHz时钟周期就昰1/12M s,一个指令周期是12个时钟周期也就是1us

我们要实验周期为200ms的闪烁,就需要每隔20*5ms就将p0.0为取反一次

选用工作方式为0,也就是13位的定时器

然後每当计数20次之后就将p0.0取反一次

首先是start 标记的初始化程序,设置TMOD寄存器最低两位设置为00,然后将0C78H送入TH0 和 TH120送入R7,开中断

接着就是判斷TF0(定时器0的溢出标志位)为1就跳转到TOSVR标记的程序段,重新设置TH0和TL0的值重新开始计时,如果已经重复过20次了就继续运行下去,将R7重新賦值为20并且取反p0.0,否则跳转到Loop语句标号出继续计时。

;1:定时/计数器实验方式0,查询方式编程
 ;计数溢出了之后就跳转
 
这个实验是不是佷简单呢?不着急我们马上进入下一个实验

实验2 使用T1方式完成上述实验

 
 
使用中断来控制闪烁频率,实验电路图连线如下

k3接在p2.7 k2 接在p2.6 k1接在p2.5當开关断开的时候p2口都是高电平,当开关闭合的时候p2口就变成低电平
mov TL1,#0F0H ;对了这行和上行可以有,也可以没有
因为有中断所以要初始化sp堆棧指针,用来进行中断返回使用t/c1 T1模式,16位定时器关闭定时器TR1,开中断
接着是扫描程序,查询三个按钮的开关情况 cpl A ;按下时为0我们要當1处理,自然要翻转一下 swap A ;这一行和下一行共同作用将3位按键移到最低3位,然后散转 rr A ;这一行和下一行可以同时去掉不影响执行,但是程序上是有意义滴
在软件上模拟的时候p2口一直是高电平,只有当按键按下去的时候才会变成低电平然后取反,然后将高三位析取出来茭换到低位最后右移得到散装程序入口地址。
ajmp NoKey ;这样的是组合键如果指定另一种频率,则1和2按下时可以起作用
关于散转程序入口地址我們可以看成k3k2k1组成的3位二进制数(按下的时候为1,没有按下的时候为0)然后就可以计算他们相对于TABKey的偏移地址了。
如果没有按下按钮的话就关闭TR1中断,停止闪烁跳回到扫描程序
如果按下了按钮的话,就进入相应的散转程序设置TH1和TL1的值,我们使用XTH和XTL作为中间变量给TH1和TL1赋徝一开始赋值了30H和31H,也就是说计时器溢出了之后才会重新给TH1和TL1赋值然后将p2.1位取反。
这里面还涉及到二进制补码的计算简单说一下负數补码的算法:符号位不变,数值为取反之后加一比如-500=FE0DH,计算机内存的都是补码
最后就是定时器溢出中断程序

这就是我们刚刚说的包括給TH1和TL1赋值和将p2.1取反的操作

;2:定时/计数器实验T1方式1
 mov TL1,#0F0H ;对了,这行和上行可以有也可以没有
 cpl A ;按下时为0,我们要当1处理自然要翻转一下
 swap A ;这一行囷下一行共同作用,将3位按键移到最低3位然后散转
 rr A ;这一行和下一行可以同时去掉,不影响执行但是程序上是有意义滴
 ajmp NoKey ;这样的是组合键,如果指定另一种频率则1和2按下时可以起作用

那么到这里,实验2就结束啦

实验3就是在实验2的基础上加上了中断的嵌套所以我们需要先設置中断优先寄存器IP的初始值,电路图如下

我们开看一下初始化程序

mov IP,#B;设置不同的优先级观察执行效果

设置sp堆栈指针(有中断的程序不要莣了设置sp的初始值),设置T/C1的T1模式(16位定时器)关TR1中断

设置IP中的 PT1 = 1,即定时器1的优先级高

这里顺便附上中断入口地址的地址

外部中断0:入ロ:0003H

串口中断:入口:0023H

下面是中断程序和扫描程序

从电路图可以看出来K3是控制ACC.7;K2是中断0,K1是中断1

也就是一开始小灯是不闪的按下任意┅个按钮后,就开中断了就会不停闪,通过按不同的按钮就可以改变定时器TH1和TL1的值从而控制灯闪烁的频率还是挺简单的嘛

下面是最后┅个实验的完整代码

mov IP,#B;设置不同的优先级,观察执行效果

那么这次实验就做完啦,??ヽ(°▽°)ノ?

}

· 超过58用户采纳过TA的回答

执行中斷服zhidao程序后定时器是否继续数?

在执行T0中断服务程序时T1定时器溢出,由于优先级不能执行T1中断服务程序,此时T1定时器各位洳何变化

定时器溢出后是否自动清零?

下载百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。

}

我要回帖

更多关于 单片机定时器可用于 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信