怎样用51单片机实现小时级延时

STC89C52RC,晶振频率24M,C语言,谢谢!

  51单片机的机器周期是晶振的12分频的倒数。所以你24Mhz的机器周期是T=12/12M=0.5us。
  假设你要定时的数是M,则初值等于M/机器周期(表示执行多少个机器周期)。
  若初值小于65536
  TH0=(65536-初值)%256
  TL0=(65536-初值)/256
  51在24MHZ的最大定时是65536*T=0.032768s,远小于一小时。
  所以为了方便计算,我们假设定时0.01s,然后执行3600/0.01次。
  M=0.01/T=20000
  TH0=(65536-初值)%256=0xB1
  TL0=(65536-初值)/256=0x7F
  用这个数一次定时精确值是0.0100485s。执行360000次精确值是3617.46s。

  中断程序是:
  timer0() interrupt 1
  {
  TR0=0;
  ET0=0;
  TH0=0xB1;
  TL0=0x7F;
  if(delay_1hour)
  {
  if(j) //如果j大于0
  {
  TR0=1;j--; //说明还没到3600次
  }
  else
  {
  if(i) 就算j等于0了,i大于0,说明还没到100次
  {
  TR=1;j=3600;
  }
  else
  {
  flag_1hour=0; //循环了3600000次10ms,关闭延时标志位。。
  }
  }
  }
  ET0=1;
  }

  调用程序:
  void delay1hour()
  {
  delay_1hour=1;i=100;j=3600;TR0=1;
  }//在任意你想开始延时一小时的地方加这个函数。

在延时期间,单片机还可以干其他指令。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-08-12
这个纯粹靠寄存器的级联
定义定时器定时方式1,(16位)模式,因为你24M晶振,所以定时值最大也就30几毫秒。所以你定时值可以选为25ms,然后定义个MS寄存器每40次中断对应1秒
在定义个SEC每60次为1分钟,定义一个MIN 每60次为1小时,定义个HOU,这个就看你延时几个小时了。这些定义放在主程序前面,为全局变量8位的即可
unsigned char MS,SEC,MIN,HOU;
然后定时器中断加入以下代码
{
MS++;
if(MS==40)
{
MS=0;
SEC++;
if(SEC==60)
{
SEC=0;
MIN++;
if(MIN==60)
{
MIN=0; //其实到这就已经是1小时了
HOU++;这个就是看您计数到几个小时了,8位寄存器最大255你懂的)
}
}
}
第2个回答  2013-08-12
添加#include "intrins.h"
然后#define Nop() _nop_()
在程序中就可以直接用Nop();进行一个机器周期的延时了。
--------------------------------------------------------------------------------
刚刚看错了不好意思,同意楼上的观点,用定时器来做,添加几个定时变量,当计到的总数达到1个小时时就执行对应的操作即可。也可以使用外部的带中断输出的RTC来完成,精度更高点。
第3个回答  2013-08-12
使用定时器啊,设置一个标志位,1小时候取反就行了追问

请给出具体的程序好吗,谢谢!

追答

你的要求不具体,只能给出一部分:
#include
#define uchar unsigned char
#define uint unsigned int
uchar i; //标志位
void init() //初始化
{
TMOD=0x01; //定时器0工作方式1
EA=1; //开总中断
ET0=1; //开定时器0中断
TH0=(65536-50000)/256; //定时器装初值,溢出为25ms
TL0=(65536-50000)%256;
TR0=1; //开定时器0
}
void t0() interrupt 1
{
i=~i; //这里根据你的实际需要是每小时变化一次还是只执行一次
}
void main()
{
init();
while(1)
{
if(i==0)
{/**这里就是你延时1小时候做的事情**/}
}
}

追问

对不起,我实际需要精确延时4h。。。。。。

第4个回答  推荐于2018-02-12
void delay(uchar ms)//延时1ms
{
uchar i,j;
for(i=ms;i--;i>0)
for(j=110;j--;j>0);
}
delay(60000);//1h=1*60*1000=60000;本回答被提问者和网友采纳

怎样用51单片机实现小时级延时
delay_1hour=1;i=100;j=3600;TR0=1;}\/\/在任意你想开始延时一小时的地方加这个函数。在延时期间,单片机还可以干其他指令。

51单片机中怎么得到精确延时?
51单片机的几种精确延时实现延时通常有两种方法:一种是硬件延时,要用到定时器\/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。1 使用定时器\/计数器实现精确延时 单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生...

51单片机用c语言怎么写延时函数?
120次对吧。所以一个简单的延时功能就诞生了,我们只需要自减120次,就可以延时1ms,如果我们要延时50ms呢,那就自减50*120=6000次。那么在程序上如何表达呢?我们可以用两套for循环 void delay(int i){ int x,y;for(x=i;x>0;x--){ for(y=120;y>0;y--)} } 参数 i 代表该函...

51单片机编写延时1分钟、1小时的子程序
include <reg51.h> unsigned char time_1m=120;unsigned char time_1h=60;\/\/timer init void initTimer(void) \/\/1Mhz晶振 { TMOD=0x1;TH0=0x5d;TL0=0x3e;} \/\/timer0\/counter0 interrupt void timer0(void) interrupt 1 \/\/ 500MS 中断一次 { TH0=0x5d;TL0=0x3e;time_1m--;if(...

51单片机怎么延时程序
最容易让人忽略的是计算循环外的那部分延时,在对时间要求不高的场合,这部分对程序不会造成影响。500ms延时子程序程序:(晶振12MHz,一个机器周期1us。)void delay500ms(void){ unsigned char i,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for(k=81;k>0;k--);} ...

如何使用51单片机定时器实现定时功能
2)闹钟:在电子时钟电路中,通过定时器的工作模式,实现小时、分、秒的计时及时钟的闹铃功能。3)PWM 波形的生成:单片机中的 PWM 波形可用于直流电机的调速、灯光亮度的控制、温度控制等各种场合。通过定时器和 PWM 的结合,就可以实现的波形生成和调制。总之,51单片机定时器在单片机系统中的应用非常...

51单片机中,定时器怎么做延时函数用,比如说,要精确延时1s,该怎么写...
void main(){ while(1){ Delay1ms(1000);\/\/1s延时;} } void Delay1ms(unsigned int a)\/\/0~65535 { unsigned long b;\/\/0~0xffffffff b = TimeTickCount;\/\/记下及时器初始值 while((TimeTickCount-b<a)||(0xffffffff+TimeTickCount-b...

51单片机,求用汇编语言编写延时1小时的子程序,要精确到秒级别
这个可以做到,如果晶振是12M的话,一下方法可以实现延时1小时,精确度在秒级别。DELAY1H:MOV R7,#180 ;1\/1000000 DLY1H:LCALL DELAY_20S ;180*19.960603s +2*180 DJNZ R7,DLY1H ;2*180\/1000000 RET 2\/1000000 共延时时间:3592.9s误差为7.1秒,如果再精确的话,再加一点延时...

请帮忙在51系列单片机系统中,编写一个延时1ms的子程序。谢谢。。_百...
1、首先,在电脑中打开keil软件,创建好工程,然后添加c文件,如下图所示。2、然后添加c文件,接下来输入代码,先输入一个头文件命令。3、然后,进行宏定义,代码如图所示。4、然后声明P1口,如下图所示。5、最后,将延时语句全部添加进去,代码按照图中所示的直接敲入即可。6、最后,点击编译,生成HEX...

怎么用51单片机定时1个小时 好像是循环,具体汇编程序是怎样的
你先开启个定时器,根据你选用的 晶振 ,计算出你要用定时器定时的基准时间,就假设是10毫秒吧。然后给定时器的THx,TLx写入初值,开启中断,进行定时。然后就等待中断。在你响应中断的程序中,再次给单片机送入初值,由于是10毫秒中断一次,因此我们设置几个“软件计数器”比如每此中断,软甲计数器+1,...

相似回答