① 51单片机延时一秒函数,晶振12MHZ
我这有个函数自己实验出来的,在KEIL里看差不多就是延时1毫秒
void delay1ms(unsigned int t)
{
unsigned x,y;
for(x=t;x>0;x--)
for(y=124;y>0;y--);
}
把t 改为你要延时的数就可以了,1毫秒就把t改为1 500毫秒就把t改为500
② 单片机1S延时程序
晶振是12M,对于MC-51系统的单片机来说,一个机器周期是1us。
…………………………
MOV R0,#100
LOOP1: MOV R1,#100
LOOP2: MOV R2,#48
DJNZ R2,$
NOP
DJNZ R1,LOOP2
DJNZ R0,LOOP1
…………………………
[(2*48+4)*100+3]*100+1=1000301(个机器周期)即1.000301秒定时。
③ AT89C51单片机,如何实现延迟一秒
其实可以用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()这样的程序会影响程序运行速度的,使用中断就不会)
④ 51单片机中,定时器怎么做延时函数用,比如说,要精确延时1s,该怎么写
unsigned long TimeTickCount;//1ms计时器
void Timer0Configuration();
void Delay1ms(unsigned int a);
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<a));
//当计数器未溢出只须用 计数器实时变化的值-其初始值
//当计数器溢出则须用 计时器上限值+计数器实时变化的值-其初始值
}
void Timer1Configuration()
{
TMOD=0X10;//选择为定时器模式,工作方式1。
TH1=0Xfc; //给定时器赋初值,定时1000us
TL1=0X18;
ET1=1;//打开定时器1中断允许
EA=1;//打开总中断
TR1=1;//打开定时器
}
void interrupt_timer1() interrupt 3 //1000us
{
TH1 = 0xfc; //重装
TL1 = 0x18;
TimeTickCount++;//1000us计时器
}
⑤ 单片机编写一个能延时1秒的子程序
通用办法,可以类推:
DELAY1s:
MOVR5,#08H;∵1s=1000000us
MOVR6,#0A2H;∴1000000/2=500000
MOVR7,#20H;500000用16进制表示为:07A120
;所以R5=07H+1=08H
;R6=0A1H+1=0A2H
;R7=20H
loop:DJNZR7,$;延时时间≈2×[(R5-1)×256+R6-1]×256+R7
DJNZR6,loop;当R5、R6等于0,相当于256参与运算
DJNZR5,loop;当R5、R6等于0,相当于256参与运算
RET
⑥ 请问在单片机C语言编程中,用delay延迟的话,1秒程序是什么单片机晶振为12MHZ
在Keil里仿真的话,在配置里把晶振调成12MHz,然后在调用delay函数的地方设置一个断点,开始调试程序,运行到断点处,注意程序左边有一个记录当前寄存器和一些状态的窗口,其中,里面有一个是专门记录当前运行了多少时间的变量,记下当前时间T1,然后按F10(不进入子函数)调试,再记录当前时间T2,则延时=T2-T1。多试几个A,差不多调到1s就够了。我一般都这么调。
你要想明白其中原理,想自己算的话,你就看看delay的汇编代码段自己算吧。
⑦ 单片机延时一秒的c程序
void
delay(unsigned
int
k)
{
unsigned
int
i,j;
for
(i=0;<k;i++)
{
for
(j=0;j<121;j++)
{;}
}
}
/*
取k=3000
*/
或者你可以用keil
自设一个延时函数,一直调试到你所需要的时间为止
⑧ 51单片机用汇编语言设计1S延时子程序,晶振为12MHz。 (麻烦附上详细计算过程以及详细说明,
如果单纯延时,可以用实验的办法,在keilc51里面仿真
void Delay1S(char n)
{
char i,j;
n=n*4;
for(;n;n--)
{
for(i=6;i;i++)
{
for(j=7;j;j++) // 一个循环约为1mS
;
}
}
}
看编译后的汇编:
C:0x0805 7D01 MOV R5,#0x06;j=1,1时钟
C:0x0807 0D INC R5;j++,1时钟
C:0x0808 ED MOV A,R5;A=R5,1时钟
C:0x0809 70FC JNZ C:0807;A=0?,2时钟
循环共249次,一个循环共需4个时钟周期,加上第一个赋值语句1周期。
共997uS,加上外层循环,一次约1mS,
如果要精确的延时建议采用中断:
#include "reg51.h"
//timer init
void initTimer(void)
{
TMOD=0x2;
TH0=0x6;
TL0=0x6;
}
int T250uS;
char T_mark;
//timer0/counter0 interrupt
void timer0(void) interrupt 1
{
//add your code here.
T250uS++;
T_mark=0;
}
void Delay1S(char n)
{
for(;n;n--)
for(T250uS=0;T250uS<4000;)
{
T_mark=1;
while(T_mark);
}
}
//the main fun
void main(void)
{
initTimer();
TR0=1;
ET0=1;
EA=1;
while(1)
{
Delay1S(1);
}
}
⑨ 怎么把单片机的数字电子钟延时1s
大哥,一般都不像你这样写的呀!
void delay10ms(int x)
{ int i,j; // 声明变量
for (i=1;i<x;i++) // 执行x次,延迟X*10ms
for (j=1;j<1200;j++);// 执行120次,延迟10ms
} // delay1ms()函数结束
如果你的延时精度要求不高,调用delay10ms(100)约1s就可以了呀。如果你的延时要求精度高的话,用51内部的定时器。
⑩ 设单片机晶振频率为12MHZ,试编写一延时1s的子程序
//----假设,系统工作于
12mhz/12t的传统51单片机下.#include
<reg51.h>
sbit
test
=
p1^0;
void
delay_50ms(unsigned
char
times)
{
while(times
--
)
{
th0
=
0x3c;
//----装入初值,定时器0定时50ms
tl0
=
0xb0;
tr0
=
1;
//-----启动定时器
while(!tf0);
//-----等等定时时间到达
tf0
=
0;
//-----清零定时到达标志
}
}
void
delay_1s(unsigned
char
times)
{
while(times
--
)
{
delay_50ms(20);
}
}
void
main(void)
{
tmod
=
0x01;
//----定时器0工作于方式1
while(1)
{
delay_1s(2);
test
=
~test;
}
}