之前去面试一家单片机小公司,其中一道笔试大题是关于使用51单片机12M晶振实现1s的精确延时。
我这里把这个简单程序成功实现精确1s的闪烁灯,顺便记录一下。
tips:这里把LED修改成对应你的LED引脚就可以使用
#include <reg52.h>
#define u8 unsigned char
#define u16 unsigned int
sbit LED = P1^0; //LED引脚定义
u16 cnt; //计数变量
//定时器0的初始化
void timer0_init()
{
TMOD &= 0xF0; // 清除定时器0工作模式配置(保留定时器1工作模式配置)
TMOD |= 0x01; // 配置定时器0工作模式1(16位定时器模式)
TH0 = (65536-1000)/256; // 定时器初值高字节
TL0 = (65536-1000)%256; // 定时器初值低字节
ET0 = 1; // 开启定时器0 中断
EA = 1; // 开启总中断
TR0 = 1; // 开启定时器0
}
void main()
{
timer0_init(); //定时器0初始化
while(1);
}
//定时器0中断
void Timer0_Rountine(void) interrupt 1 //1ms进一次中断
{
/* 设置定时器初值 */
TH0 = (65536-1000)/256;
TL0 = (65536-1000)%256;
cnt++;
if(cnt>=1000) // 1S 计时
{
cnt = 0; //计数清零
LED = !LED; //LED状态取反
}
}