【【51单片机定时器和中断-7】】

51单片机定时器

定时器是属于单片机内部的功能
定时器可以用来计时系统或者程序每隔一固定的时间完成一项操作

定时器用来替代长时间的delay ,提高cpu运行效率和处理速度
用了定时器cpu不会像是之前delay一样死等,而是可以处理其他事情,就像给cpu定了一个闹钟
STC89C52的定时器
用法
从单片机手册出发
3个定时器 T0 T1 T2 其中T0和T1与传统51单片机兼容 ,T2是此型号新增加的
定时器就像设定在cpu内部的小闹钟
每隔一个自己设置的时间,计数单元就加一,当计数单元的数值增加到设定的闹钟提醒时间时,计算单元就会向中断系统发出中断申请,产生响铃提醒,使程序跳转到中断服务函数中执行
T0和T1均有四种工作模式
模式0: 13位定时器/计数器
模式1:16位定时器/计数器(最常用)
模式2:8位自动重装模式
模式3:两个8位计数器
我们基本上只用16位 其他的模式用的真的很少
详细介绍一下模式1
最大可以存65535
2个字节 高字节叫TH 低字节叫TL
2个字节就是16位 65535
只能记到65535
我们的单片机时钟可以由系统时钟提供也可以由外部引脚提供
外部给的话,就相当于是一个计数器。每来一个就加1(这其实也不常用)
基本上是用系统时钟提供脉冲频率
系统时钟就是晶振周期 就像是压电陶瓷给的
我的板子晶振频率是11.0592MHz
//中断系统是一个很重要的系统
中断系统是为了cpu处理紧急事件的实时处理能力而设置的
中断的定义就是你正在做一件事情这时候闹钟响了,打断了你当前的工作,这就是中断
中断也分轻重缓急 中断优先级
中断源
优先级区分
中断源就是拿些可以向中断中心发送中断要求
在这里插入图片描述
寄存器是连接软硬件的媒介
一方面在单片机中的寄存器是一个特殊的RAM寄存器,它既可以读写数据,又背后连接着很多的导线,控制着电路的连接方式,寄存器相当于是一个复杂的操作按钮
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
TCON简写下来就是timecontrol
时间控制
TF1 :开始计数到计数到溢出时,给TF1置入1,向CPU请求中断,一直保持到CPU响应中断时。才通过硬件清零TF1
TR1: 定时器T1 的运行控制位,该位由软件置位和清零。当GATE =0时,TR1为1允许计数,TR1等于0禁止T1计数。当GATE=1时,TR1=1且INT1非为高才允许计数
IE1:外部中断源(INT1非)标志位。当IE1=1,外部中断向CPU请求中断
IT1:外部中断1触发方式控制位。IT1=0 低电平触发
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
还有此处的中断允许控制寄存器和中断优先级寄存器
在这里插入图片描述
//TMOD TCON TL0 TL1 TH0 TH1
//我们直接按照需要配置它的寄存器
//先配置TMOD 工作模式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
先把TMOD的低四位(低四位是用来控制定时器1的)设置成0001
表示GATE=0;选择在计数器端,并且是16位
TCON是可位寻址,意思就是里面的每一位我都可以单独出来赋值,就像之前的P2和P2_1这种

TMOD是不可位寻址,只能整体赋值
我们赋值TMOD=0000 0001;
配置TCON
单独配置TF0 TR0 IE0 IT0
TF是中断标志位 这里我们把它赋值为0
在这里插入图片描述
在这里插入图片描述
我们总共可以定义0到65535
相当于65ms
我们怎么设置成我们需要的1s呢
我们先设定1ms直接赋值64535 所以离计数差1000.就是1ms。
小技巧取模和取余能将64535完全分开
64535/256 高位
64535%256低位
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我理解了一个比较深刻问题就是
计时器一旦启动,它并不会停止,而我们在主函数中有一个while,那就更保证了,程序并不会结束,定时器会每隔1微妙进入中断然后经过中段重新,计入count加1,最后经过1ms之后才开始闪一次
///基本完成了用法
现在我们对整个系统进行优化
面对TMOD我们可以与或式赋值法,只操作其中几位而不影响其他位的方法
TMOD=TMOD&0xF0;把低四位清零 高四位保持不变
TMOD=TMOD|0x01; 高四位不变,低四位改
上面的做法其实帮助人去理解
我们在STC-ISP中就直接有对定时器的使用
在这里插入图片描述

void Timer0Init(void)        //1毫秒@11.0592MHz
{
    AUXR &= 0x7F;        //定时器时钟12T模式
    TMOD &= 0xF0;        //设置定时器模式
    TL0 = 0x66;        //设置定时初值
    TH0 = 0xFC;        //设置定时初值
    TF0 = 0;        //清除TF0标志
    TR0 = 1;        //定时器0开始计时
}

我们在复制过来的时候第一句12t可以删去因为我们本来就是12t的状态
最后加上
ET0=1;
EA=1;中断状态
TH0=64535/256;//高位
TL0=64535%256;//低位
其实算完之后我们差了1微妙
以后就不自己算了 复制粘贴他的东西就好了
流水灯
unsigned char a=0x01;
a=crol(a,1); 就是0x02
例如
a=0x80
a=crol(a,1); 就是0x01

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值