51单片机-51单片机12M晶振实现1s的精确延时

之前去面试一家单片机小公司,其中一道笔试大题是关于使用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状态取反
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值