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

如题所述

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
    }
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-02
这么长的延时,不用循环延时,没实际意义 。单片机在这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本回答被网友采纳
第2个回答  2011-11-02
首先不知兄弟你玩单片机玩了多久,用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
第3个回答  2011-11-04
参考
http://hi.baidu.com/小雕lns/blog/item/27b4fb5208ec6d0b0df3e373.html
第4个回答  2011-11-03
你 用KEIL进行调下就行了