51单片机LED延时闪烁delay(50000); 用定时器延时代替delay(50000)延时怎么样写?

LED闪烁实验 *
实现现象:下载程序后D11指示灯闪烁
注意事项:无
***************************************************************************************/

#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;

sbit led=P0^0; //将单片机的P0.0端口定义为led
sbit led1=p0^1;
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}

/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
while(1)
{
led=0;
delay(50000); //大约延时450ms
led=1;
delay(50000); //大约延时450ms
led1=0;
delay(50000); //大约延时450ms
led1=1;
delay(50000);
}
}
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
以上程序中 delay(50000); 用定时器延时代替delay(50000)延时怎么样写?

//初始化函数:用于初始化各种参数
void init() {
TMOD = 0x01; //设置定时器0,GATE = 0, C/T = 0 , M1M0 = 01(方式1,16位定时器/计数器)
//赋初值
TH0 = THx;
TL0 = TLx;
EA = 1; //中断总闸·开!
ET0 = 1; //定时器0中断·开!
TR0 = 1; //定时器0·运行!
}

//定时器0的中断函数:由定时器中断自动调用,你只需要写好中断后要怎么处理就好
void timeInt_T0 () interrupt 1 {
//每中断一次都要重新赋初值
TH0 = THx;
TL0 = TLx;
//记够20次中断后,刷新显示
if(++counter == 20)
refresh();
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-04-22
U8 a =0;//计中断次数的全局变量
void main()
{
TMOD=0X01;
TH0=(65536-50000)/256;//定时50ms
TL0=(65536-50000)%256;
ET0=1; EA=1;
while(1)
{
led=0;
TR0=1;
while(a!=9); //9 次中断450ms
TR0=0; a=0
led=1;

TR0=1;
while(a!=9); //9 次中断450ms
TR0=0; a=0
led1=0;

TR0=1;
while(a!=9); //9 次中断450ms
TR0=0; a=0
led1=1;

TR0=1;
while(a!=9); //9 次中断450ms
TR0=0; a=0
}
}

中断程序:
void timer0(void) interrupt 1
{
TH0=(65536-50000)/256;//定时50ms
TL0=(65536-50000)%256;
a++;
}
第2个回答  2019-04-22
利用循环处理的方式实现的延时,并不精确。 1、当中断发生时,CPU被打断先执行中断服务。导致执行时间变长。 2、使用高级语言时,编译的结果受优化等级等多方面因素干扰,难以计算。 3、在有MMU和Cache的MCU中,指令的执行速度还会受到缓存的影响。 利用定时器延时: 1、因为定时器累加与CPU无关,即使中断,仍然会保持计数。不受上述问题影响 2、缺点需要占用定时器资源。 3、功耗也会高一些
相似回答