AT89C51单片机,如何实现延迟一秒 10
用C语言延迟一秒,我是用循环,然后到虚拟仿真中查sec值变化...在C语言中用中断\定时器好像不行用汇编又怎么实现麻烦高手一一帮我解答...
用C语言延迟一秒,我是用循环,然后到虚拟仿真中查sec值变化...
在C语言中用中断\定时器好像不行
用汇编又怎么实现
麻烦高手一一帮我解答 展开
在C语言中用中断\定时器好像不行
用汇编又怎么实现
麻烦高手一一帮我解答 展开
4个回答
展开全部
其实可以用C语言实现的,先要定义好定时器的初值
不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期
机器周期=12/n(n指晶振频率),假设你要定时的时间为M
那么定时的初值为:
M/机器周期=初值;
TH0=(65536-初值)%256;
TL0=(65536-初值)/256;
将(65536-初值)所得的值化成16进制,其高位就是TH0的值,低位为TL0的值
例如用12M晶振做1ms定时计算如下:
机器周期=12/12*10^6=1us(微秒)
定时初值=(1*10^-3)/(1*10^-6)=1000;
所以:TH0=(65536-1000)%256;
TL0=(65536-1000)/256;
将65536-1000=64536化为16进制为:0xFC18
TH0=0xFC;
TL0=0X18;
定好初值后要延迟一秒就定一个延时参数,这里使用1000就行了(定时为1ms)中断程序为:
timer0() interrupt 1 // 1ms延时(12.0MHz)
{
TR0=0;
ET0=0;
TH0=0xfc;
TL0=0x18;
if(delayTimes1!=0) delayTimes1--;
TR0=1;
ET0=1;
}
调用程序大致为:
if(delay_flag==0)
{
delay_flag=1;
delayTimes1=1000;
}
if(delayTimes1==0)
{
delay_flag=0;
这里写定时到的操作就行了;
}
(在主程序中使用delay_ms()这样的程序会影响程序运行速度的,使用中断就不会)
不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期
机器周期=12/n(n指晶振频率),假设你要定时的时间为M
那么定时的初值为:
M/机器周期=初值;
TH0=(65536-初值)%256;
TL0=(65536-初值)/256;
将(65536-初值)所得的值化成16进制,其高位就是TH0的值,低位为TL0的值
例如用12M晶振做1ms定时计算如下:
机器周期=12/12*10^6=1us(微秒)
定时初值=(1*10^-3)/(1*10^-6)=1000;
所以:TH0=(65536-1000)%256;
TL0=(65536-1000)/256;
将65536-1000=64536化为16进制为:0xFC18
TH0=0xFC;
TL0=0X18;
定好初值后要延迟一秒就定一个延时参数,这里使用1000就行了(定时为1ms)中断程序为:
timer0() interrupt 1 // 1ms延时(12.0MHz)
{
TR0=0;
ET0=0;
TH0=0xfc;
TL0=0x18;
if(delayTimes1!=0) delayTimes1--;
TR0=1;
ET0=1;
}
调用程序大致为:
if(delay_flag==0)
{
delay_flag=1;
delayTimes1=1000;
}
if(delayTimes1==0)
{
delay_flag=0;
这里写定时到的操作就行了;
}
(在主程序中使用delay_ms()这样的程序会影响程序运行速度的,使用中断就不会)
展开全部
用tmer1中断,在中断里也设置一个计数器变量即可。即第N次中断时时间为1S
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用延时程序只是大约的计算时间,我这里有个延时c程序:
void delay_10us(uchar n)
{
do
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}while(--n);
}
void delay_ms(uint n)
{
do
{
delay_10us(131);
}while(--n);
}
然后在主程序里有延时的地方调用delay_ms(1000);语句就是延时一秒了,不过你要在头文件里加上"include<intrins.h>",实践证明,这个延时程序还比较准。
用定时器当然可以,把定时器设置为定时方式1(我这里比如单片机晶振是12MHZ的),那一次最多能计时65ms,离1s远远不够,你可以把计时器的初值付为50ms中断溢出一次,然后在中断函数中用if语句判断,让它中断20次再变标志位,就是1s计时。但是延时程序用定时器没必要……
void delay_10us(uchar n)
{
do
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}while(--n);
}
void delay_ms(uint n)
{
do
{
delay_10us(131);
}while(--n);
}
然后在主程序里有延时的地方调用delay_ms(1000);语句就是延时一秒了,不过你要在头文件里加上"include<intrins.h>",实践证明,这个延时程序还比较准。
用定时器当然可以,把定时器设置为定时方式1(我这里比如单片机晶振是12MHZ的),那一次最多能计时65ms,离1s远远不够,你可以把计时器的初值付为50ms中断溢出一次,然后在中断函数中用if语句判断,让它中断20次再变标志位,就是1s计时。但是延时程序用定时器没必要……
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
/*-----------------------------------------------a
调用方式:void yanshi(int x)
函数说明:延时x毫秒(晶振为6.0000M)
-----------------------------------------------*/
void yanshi(int x)
{
int a;
char b;
for(a=0;a<x;a++)
{
for(b=0;b<124;b++);
}
}
void main(void)
{
```````
yanshi(1000);
````````
}
调用方式:void yanshi(int x)
函数说明:延时x毫秒(晶振为6.0000M)
-----------------------------------------------*/
void yanshi(int x)
{
int a;
char b;
for(a=0;a<x;a++)
{
for(b=0;b<124;b++);
}
}
void main(void)
{
```````
yanshi(1000);
````````
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询