C51_定时器与中断
关于定时器和延时函数:
延时要占用CPU资源啊,定时器计时过程不影响CPU的运行,计时完毕通过中断通知CPU处理代码。
关于芯片内部的定时器资源:
关于定时器工作原理:
定时器的模式:
关于工作原理,以及最大工作时间(2^16=0~65535):
TH0:Time high 8位
TL0:Time low 8位
外接时钟这里,因为完成一个规定的时间是需要一个时钟(提供脉冲),和一个计数器的
然后现在提供脉冲的时钟变成了外部的,相当于内部只做了计数的功能,所以外接时钟,我们一般默认就是计数器。
常用的定时器流程:
————————————————————————————————————————————————————————————————————————————————————
关于中断系统:
ST89C52有4个优先级和8个中断源
传统8051单片机(简化版中断系统):
2个中断优先级和5个中断源(RX&TX算一个,都属于串口中断)
流程:(寄存器设置)
不可位寻址&可位寻址
P2,就是可位寻址,可以对P2中的任何一位进行单独赋值,例如:P2_1=0;
#include <REGX52.H> void Timer0_Init()//定时器 { // TMOD=0x01;//0000 0001 //TMOD&=0xf0;//只把低4位 置0,而不影响高4位 //TMOD|=0x08; 只把低4位 置1,而不影响高4位 TMOD&=0xf1;//xxxx 0001 只改变低4位,而不影响高4位 TF0=0; TR0=1; /*为什么是64535,因为计数器的范围是0~65535us(2^16),但如果我们想要1s,按原来的65535来算就会除不尽, 所以现在的办法是先按us记1000次数,这就是1ms了,然后再1ms记1000次数,这就是1s了 为了让us记1000次数,所以我们需要赋一个初始值65535-1000=64534,还有为什么是/256和%256,因为TH0是高8位, TL0是低8位*/ TH0=64535/256; TL0=(64535%256)+1;//因为实际上是65536才是溢出,65535只是满了,但并没有溢出 //中断 ET0=1; EA=1; PT0=0; } void main() { Timer0_Init();/*先定时1s,然后时间过了1s之后, 中断目前的主函数,去执行中断函数里的代码,执行完之后再执行主函数*/ while(1) { } } //中断函数 unsigned int countT0; void Timer0_Routine() interrupt 1 { TH0=64535/256; TL0=64535%256; countT0++; if(countT0>=1000)//1ms->1s { countT0=0; P2_0=~P2_0; } }
中断号: