AT89C51单片机,如何实现延迟一秒 10

用C语言延迟一秒,我是用循环,然后到虚拟仿真中查sec值变化...在C语言中用中断\定时器好像不行用汇编又怎么实现麻烦高手一一帮我解答... 用C语言延迟一秒,我是用循环,然后到虚拟仿真中查sec值变化...
在C语言中用中断\定时器好像不行
用汇编又怎么实现

麻烦高手一一帮我解答
展开
 我来答
love21307
2008-07-31 · TA获得超过430个赞
知道小有建树答主
回答量:295
采纳率:0%
帮助的人:272万
展开全部
其实可以用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()这样的程序会影响程序运行速度的,使用中断就不会)
光派通信
2024-09-03 广告
对光传输设备进行调试和维护,需要掌握以下关键点:1. **熟悉设备性能**:深入了解OTN/DWDM等光传输产品的性能特点,确保能够熟练使用设备。2. **按规范操作**:依据产品说明书和维护手册进行调试和维护,确保操作步骤正确无误。3. ... 点击进入详情页
本回答由光派通信提供
cocoguojia
2008-07-31 · TA获得超过4519个赞
知道小有建树答主
回答量:1097
采纳率:100%
帮助的人:548万
展开全部
用tmer1中断,在中断里也设置一个计数器变量即可。即第N次中断时时间为1S
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
certionly
2008-07-31
知道答主
回答量:23
采纳率:0%
帮助的人:8万
展开全部
用延时程序只是大约的计算时间,我这里有个延时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计时。但是延时程序用定时器没必要……
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
硅谷野狼
2008-08-06 · TA获得超过427个赞
知道小有建树答主
回答量:417
采纳率:0%
帮助的人:0
展开全部
/*-----------------------------------------------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);
````````
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式