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