怎么用定时器写延时函数?
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
延时函数,怎么用定时器做呀?
能像上面的例子一样,能输入延时值的函数?
想做一个精确一点的,方便调用。
首先设置定时器工作方式 也就是TMOD 在设置TH0/1,TL0/1的初值 也就是定时时间的设置 然后设置中断允许 ,并开中断
我也知道流程是这样的,但具体怎么写呀?
还有定义一个变量,可以输入数值的。
没人会吗?
#include<reg51.h>
void main()
{
TMOD=0X01;
TH0=0X3C;
TL0=0XB0;
EA=1;
ET0=1;
TR0=1;
while(1);
}
void timer0() interrupt 1
{
TH0=0X3F;
TL0=0XB0;
}
我也是新手啊,刚刚学的,还不熟练,多多指教。
程序没编译,肯能有点错啊
不能像delay那样输入数值得呀~~~
不能像delay那样输入数值得呀~~~
帮顶,我也想想看
小编可以考虑用汇编语言写,相对简单一些。用C的话,上面那个人写的差不多,但是不能在delay中写值的那样。
小编可以考虑用汇编语言写,相对简单一些。用C的话,上面那个人写的差不多,但是不能在delay中写值的那样。
我觉得小编先搞清楚什么是定时器,你要实在想那样去做的话,设置好每次中断的时间,并在main函数中定义一个变量count,每次进T0中断后count++。 主函数中去判断count的大小,所以你要的精确定时=每次中断的时间*count
按照你的意思,写了如下三个函数。在初始化定时器0后(调用InitTimer0()),你可以调用DelayNms(unsigned int t)这个函数来达到你想要的要的延时效果。
unsigned int count;//定义全局变量用于计时
/*----------------------------------------
函数名 :DelayNms(unsigned char t)
功能 : 延时n毫秒
输入参数 : t ,延时长度
输出参数 : 无
-------------------------------------------*/
void DelayNms(unsigned int t)
{
count=t;
while(count);
}
/*----------------------------------------
函数名 : InitTimer0
功能 : 定时器0初始化
输入参数 : 无
输出参数 : 无
-------------------------------------------*/
void InitTimer0()
{
TMOD |= 0x01;//定时器0,工作方式1
TH0=(65536-1000)/256;//定时1ms
TL0=(65536-1000)%256;
ET0 = 1;//打开定时器0中断
EA = 1;//打开总中断
TR0 = 1;//打开定时器0
}
/*----------------------------------------
函数名 :IsrTimer0
功能 :定时器0终端服务,间隔1ms将计数变量减一。
输入参数 : 无
输出参数 : 无
-------------------------------------------*/
void IsrTimer0() interrupt 1
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
count--;
}
写的很好,恐怕你是第一次这样拿定时器这样做延时吧。
这个延时函数,有强大的后盾啊
貌似存在问题哦,当需要定时1ms时 若执行 count=t; 定时器计数是无法保证刚好在65536-1000的,因此如果定时tms 那么 (t-1)ms<实际<=tms,而且每次都不经相同。
这样改下如何:即使有误差,误差应该也是确定的
void DelayNms(unsigned int t)
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
count=t;
while(count);
}
哈哈,楼上是正解,原来程序的确有问题,会有小于1ms的误差。
还是不怎么理解定时中断怎么调用的
不错不错,
