TH和TL定时换算:
定时器说白了倒数的,时间到了触发一次中断,那么必须设置倒数时间,
TH0和TL0就是高八位和第八位
假设定时1ms一次,那么2的16次方等于65536,定时1ms,就等于65536-1000=64536,再把十进制换成十六进制,如下图的例子。
代码:
#include <reg51.h>
sbit LED=P2^0; //等下要用到,会看到LED闪烁,闪烁一次说明定时器中断触发了100次
typedef unsigned char u8;//typedef关键字的作用是自己重定义数据类型
typedef unsigned int u16;
u16 i=0; //定义一个全局变量,有的时候一个函数会被执行很多次,如果要让变量的值保存或者累加,则不要定义局部变量。
//配置定时器的基本操作
void time0_init(void)
{
TMOD|=0X01;//选择为定时器0模式,工作方式1
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
}
void main(void)
{
time0_init(); //初始化定时器
while(1)
{
}
}
void time0(void) interrupt 1 //中断服务函数
{
TH0=0xFC; //这里为什么重新赋值呢。因为已经触发了一次,TH0和TL0已经变成了0,想要再次实现定时器中断,必须重新赋值
TL0=0x18;
i++;
if(i==1000) //假设触发了一千次,也就是1s,LED就闪烁一次
{
i=0;
LED=!LED;
}
}
运行结果:
因为不能上传视频,所以拍两个图片,效果就是1秒左右闪烁一次。