用C语言怎么在单片机AT89C51上编写一个延时10秒的程序? 5

 我来答
tattackor
推荐于2017-10-06 · TA获得超过3.5万个赞
知道大有可为答主
回答量:5083
采纳率:94%
帮助的人:892万
展开全部

1、十秒对于单片机来说是很长很长的时间了,单片机十秒的时间什么事都不能做,只在跑这延时程序,那是什么概念,用中断的话,单片机正常运行其他程序,只是时间到了才过来处理延时以后的程序,效率不知道高了多少 。

2、例程:

//假设晶振12MHZ

#include "reg51.h"
unsigned int YSJS=0;
void main(void)
{
    TMOD |= 0X10;                            //定时器1工作于方式1,16位定时器
    TH1 = 0XFF;                              //定时器1定时时间=500uS
    TL1 = 0X06;
    ET1 = 1;                                 //使能定时器1中断
    EA =1;                                   //开总中断
    while(1)
    {
    }
}
void TIMER1(void) interrupt 3                //定时器1中断函数使用默认寄存器组
{
    TH1 = 0XFF;                              //定时器1定时时间=500us
    TL1 = 0X06;
    YSJS++;
    if(YSJS==20000)                           //500uS*20000=10000000us=10s
    {
    P1 = P1 ^ 0X01;                            //P1.0十秒钟翻转一次
    YSJS = 0
    }
}
47okey
2011-11-02 · TA获得超过1.2万个赞
知道大有可为答主
回答量:5900
采纳率:75%
帮助的人:2394万
展开全部
这么长的延时,不用循环延时,没实际意义 。单片机在这10s时间里不能做其它事了。要用定时器中断,定时10s。不是很难的,按常规写法,误差+1.6ms。
#include <reg51.h>
#define uchar unsigned char
sbit LED=P1^0;
uchar time;

void initT0( )
{
TMOD = 0x01; //定时器0,工作方式1
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256; //50ms中断一次
EA = 1;
ET0 = 1;
TR0 = 1;
}

void main(void)
{
initT0();
while(1)
if(time==200) //中断200次,10s
{
time=0;
LED=~LED; //P1.0上的LED10s亮或灭一次
}

}

void T0int( ) interrupt 1
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
time++;
}

如果细调定时初值(包括重装),TH0 = (65536-49993)/256;
TL0 = (65536-49993256;
误差可以减小到+0.3ms
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
thinpov
2011-11-02 · TA获得超过387个赞
知道小有建树答主
回答量:300
采纳率:0%
帮助的人:254万
展开全部
首先不知兄弟你玩单片机玩了多久,用C语言编程的话极难做到精确地延时10ms,不过误差不会大,我下了两个,借鉴下:
1.
void delay(uint cnt) //简单的延时
{
uint a=0,b;
for(a=0;a<cnt;a++)
for(b=0;b<110;b++);这样的延时大约是cnt 毫秒
2./********************************************************************
* 名称 : Delay()
* 功能 : 延时,延时时间为 10ms * del
* 输入 : del
* 输出 : 无
***********************************************************************/
void Delay(uint del)
{
uint i,j;
for(i=0; i<del; i++)
for(j=0; j<1827; j++)
;
}
3.void delay(int a)
{
while(--a);}用12MHZ的话a=10000
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
小雕lns
2011-11-04 · TA获得超过127个赞
知道答主
回答量:100
采纳率:0%
帮助的人:71.9万
展开全部
参考
http://hi.baidu.com/小雕lns/blog/item/27b4fb5208ec6d0b0df3e373.html
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
qq466862016
2011-11-03
知道答主
回答量:47
采纳率:0%
帮助的人:22.5万
展开全部
你 用KEIL进行调下就行了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式