怎样用51单片机实现小时级延时
这个可以做到,如果晶振是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秒,如果再精确的话,再加一点延时就可以了。
DELAY_20S: ;Total=19.960603s
MOV R2,# ;1
DLY1:
MOV R3,#200 ;1*200
DLY2:
MOV R4,#248 ;1**200*200
DJNZ R4,$ ;2**248*200*200
DJNZ R3,DLY2 ;2*200*200
DJNZ R2,DLY1 ;2*200
RET ;2
用中断
用子程序(扫描的方式进行..类似于按键扫描)
做的时候用多个变量相乘,可以节省空间
假设你要定时的数是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,(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你懂的)
}
}
}
添加#include "intrins.h"
然后#define Nop() _nop_()
在程序中就可以直接用Nop();进行一个机器周期的延时了。
--------------------------------------------------------------------------------
刚刚看错了不好意思,同意楼上的观点,用定时器来做,添加几个定时变量,当计到的总数达到1个小时时就执行对应的操作即可。也可以使用外部的带中断输出的RTC来完成,精度更高点。
使用定时器啊,设置一个标志位,1小时候取反就行了
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单片机实现小时级延时
51单片机的机器周期是晶振的12分频的倒数。所以你24Mhz的机器周期是T=12\/12M=0.5us。假设你要定时的数是M,则初值等于M\/机器周期(表示执行多少个机器周期)。若初值小于65536 TH0=(65536-初值)%256 TL0=(65536-初值)\/256 51在24MHZ的最大定时是65536*T=0.032768s,远小于一小时。所以为了...
mcs-51单片机怎么编一个延时一小时的程序
首先你要加一个时钟中断,不知道51机里有没有。然后在时钟里加一个计数器就行了,这个计数器要够大.在程序的其它地方可以这样做:long a a=count+1000*60*60;\/\/count就是时钟里的计算器 \/\/上面的计数器频率为每秒1000次 while(a!=count);
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秒,如果再精确的话,再加一点延时...
单片机怎么设置延时一个小时
用定时器做最精确,用延时程序的话,误差较大。以下用定时器来做一个。include<reg51.h> define uchar unsigned char uchar sec,min,cnt;sbit key=P1^0;sbit led=P1^4;void t0isr() interrupt 1 { TH0=(65536-50000)\/256;TL0=(65536-50000)%256;cnt++;if(cnt>20){ cnt=0;sec++;if(s...
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单片机中怎么得到精确延时?
51单片机的几种精确延时实现延时通常有两种方法:一种是硬件延时,要用到定时器\/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。1 使用定时器\/计数器实现精确延时 单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生...
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单片机)那个大佬给讲解一下这个延时函数
这个过程会重复执行直到`i`减至0,循环结束,整个过程就是一次延时。需要注意的是,延时的时间长短取决于循环体内代码的执行速度,如果循环体内的操作越多,延时时间就越长。因此,我们可以通过调整循环体内的操作来控制延时的长短。总结来说,通过利用循环来实现延时,是C51编程中常见的技术手段之一。
单片机延时计算方法?
单片机延时计算方法 用延时函数就可以实现;首先,设置定时器工作方式,也就是TMOD,在设置TH0\/1,TL0\/1的初值,也就是定时时间的设置,然后设置中断允许,并开中断就可以;参考例子如下:include<reg51.h> void main(){ TMOD=0X01;TH0=0X3C;TL0=0XB0;EA=1;ET0=1;TR0=1;while(1);} void ...
请帮忙写一个单片机C51一个延时50ms的函数例题
延时实际上就是让CPU暂停当前的任务,去执行一些空操作或其他任务.当然去执行其他任务所花的时间你必须要能够确定.不然可能会影响当前任务.常用的都是让它执行空操作.用C来实现就是给一个或几个变量让它再那里自增或自减.下面就是最基本的一个例子 void delay50ms(){ unsigned int i;for(i=50000;...