51单片机,晶振为24.0,延时函数怎么写,延时4~5s

作者&投稿:淡璐 (若有异议请与网页底部的电邮联系)
51单片机c语言延时函数 Void delay 1ms(unsigned int ms){un~

C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。 以某晶振为12MHz的单片机为例,晶振为12MHz即一个机器周期为1us。
void delay_ms(unsigned int ms_number) // ms延时函数 (AT89C51 @ 11.0592MHz)
{
unsigned int i;
unsigned char j;
for(i=0;i<ms;i++)
{
for(j=0;j<200;j++);
for(j=0;j<102;j++);
}
}
void Delay()
{
unsigned char a,b,c;
for(a=0;a<?;a++)
for(b=0;b<?;b++)
for(c=0;c<?;c++);
}
void delay_ms(unsigned int ms)
{
unsigned int i;
unsigned char j;
for(i=0;i<ms;i++)
{
for(j=0;j<200;j++);
for(j=0;j<102;j++);
}
}

拓展资料
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

很简单, for循环也是需要时间的.
当你使用仿真的时候,通常可以在编译器里面查看这段代码的汇编指令.
你可以看书它的用到了多少个汇编指令, 然后在你的芯片手册上查询,每一个汇编指令执行需要多少个最小指令周期. 最小指令周期才是你说的1um, 全部加起来, 你就知道你这句话用掉了多少个最小指令.
很明显 远远超过了1个最小指令.9秒的的误差算少的了...
所以说,假如你要做1s的延迟, 最好使用内部时钟中断来做,直接在程序内部delay延时的话,占用系统资源还算不准...
具体解释下上图, 为了拿这5分还真不容易...
首先, 进入函数就需要5个汇编指令, 这些指令主要是入栈,备份指针的操作, 不同的编译器指令不同,但都差不多.... 当然 这5个指令是进入函数只跑一次, 占用时间不多, 消耗时间最多的是你for循环内部的指令, 一个for循环需要8条汇编指令才能实现, 而每个汇编指令通常都需要消耗1-2个最小指令循环,具体那个指令消耗几个循环我懒的查手册, 不同的芯片不一样, 你自己看看你用的芯片手册把....
以上... 应该清楚了把.. 不明白追问, 我要是再次无聊的话, 会修改回答.

;晶振24M
DELAY1s:  ;子程序
        mov   A,R4
        jz    enddelay
        MOV   R5,#10H           ; ∵ 1s=2000000*0.5us 
        MOV   R6,#43H          ; ∴ 2000000/2=1000000
        MOV   R7,#40H           ; 1000000用16进制表示为: 0f4240
                                ; 所以 R5=0fH+1=10H
                                ;     R6=042H+1=043H
                                ;     R7=40H
loop:   DJNZ  R7,$              ; 延时时间≈2×[(R5-1)×256+R6-1]×256+R7
        DJNZ  R6,loop           ; 当R5、R6等于0,相当于256参与运算
        DJNZ  R5,loop           ; 当R5、R6等于0,相当于256参与运算
        DJNZ  R4,DELAY1s
enddelay: RET

上面是延时子程序,基础延时是1s,调用前给R4赋值,R4的值就是延时的秒数,比如:


mov  R4,#3      ;表示延时3秒

lcall   DELAY1s   



延时4~5S,用循环方式的延时函数没什么实用性。单片机不做其它事在这里一直循环是不现实的。
还是用定时器中断吧

DELAY:
MOV R2,#100 ;1
DELAY1:
MOV R3,#200 ;1*100
DELAY2:
MOV R4,#249 ;1*100*200
DJNZ R4,$ ;2*100*200*248
DJNZ R3,DELAY2 ;2*100*200
DJNZ R2,DELAY1 ;2*100
RET ;2
以上数字之和即为延时的机器周期数,每个机器周期为0.5us
所以共延时4.99S

C语言代码:
void delay5s(void) //误差 0us
{
unsigned char a,b,c;
for(c=191;c>0;c--)
for(b=189;b>0;b--)
for(a=137;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
汇编实现:
DELAY5S: ;误差 0us
MOV R7,#0BFH
DL1:
MOV R6,#0BDH
DL0:
MOV R5,#89H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
NOP
RET


单片机上机考试,河北工业大学 大三
B.8031单片机的定时器T1用作计数方式时计数脉冲是A。外部计数脉冲由T1(P3.5)输入。B.8031单片机的机器周期为2µs,则其晶振频率fosc为C。6 MHz.B.8031单片机共有5 个中断入口,在同一级别里,5个中断源同时发出中断请求时,程序计数器PC的内容变为B。0003H。B.8031单片机晶振频率fosc=12MHz,则一个机器周期为...

51单片机的晶振频率为11.0592MHZ,波特率为9600b\/s,要求串口工作在方式...
init_uart(){ TMOD=0x20;TH1=0xfd;TL1=0xfd;SCON=0x5=40;TR1=1;}

单片机电源5V晶振两端只有1V该如何解决,电路检查过了
单片机在正常工作下,晶振两个引脚上的电压应该在2-3V左右。如果要检验晶振是否正常工作可以用数字电压表频率档检查下单片机ALE端是否有1\/6的时钟频率的输出,如果有,则晶振正常工作。此外要注意EA\/Vpp脚是否接+5V或者接地(使用外部程序存储器时),不然单片机内部程序不会运行,以及复位电路RST。

已知8051单片机
你好,根据题中信息可得,12MHz晶振的机器周期就是12\/12M=1us,要能在P1.1输出4ms的方波就很简单了,你要求求初值,那么:---使用定时器0的工作方式1,TMOD=0x01; ,然后工作方式1是16位的定时器,最大定时值为65.536ms,要定时4ms就很容易,TH0=(65536-2000)\/256;TL0=(65536-2000)...

我用w77e58单片机,晶振为22.1184,串口0和串口1分别用定时器2和定时器1...
\/\/设置T2为工作方式2,作为波特率时钟 TCLK = 1;RCLK = 1;C_T2 = 0;\/\/T2的输入时钟为主时钟的2分频,不采用外部输入 T2MOD&= ~DCEN_;\/\/递增计数方式 \/ T2作为串口波特率时钟,设置T2初始值:MCU工作时钟Fclk = 11.0592MHz 机器周期Tm = 12\/11.0592us = 1.085us,T1初值 = 0x10000 ...

单片机的XTAL1引脚和XTAL2引脚之连接晶振来起振,同时要接小于30PF的电 ...
因为晶体振荡器的启动是需要时间的,这两个电容为了帮助晶振启振。两个电容不要太大,单片机一般用的是12MHz的晶振,电容可以换,但是大了不行。

请问为何某些单片机上使用的晶振频率为32.768k?要去到.768?
32768 刚好是int型数据的最大整数 这个晶振一般用在时钟上 为了凑整方便计算一个有符号的int型 从0 计慢刚好是 1s 即 (1\/32.768kHz)*32768=1s 所以要精确到 .768 为了准确

mcs-51\/52系列单片机当外接晶振时是如何使用xtal1,xtal2?
xtal1,xtal2直接接晶振的两脚就行,对于这两脚分别接多大的电容到地,那就要看你的晶振是多大的,一般十几兆的晶振对应的两个电容大小为12pf,8pf,22pf 都可以的

当80C51单片机晶振频率为12MHz时,时钟周期.机器周期各是多少?_百度知 ...
1.时钟周期即晶振的单位时间发出的脉冲数,12MHZ=12×10的6次方,即每秒发出12000000个脉冲信号,那么发出一个脉冲的时间就是时钟周期,即1\/12微秒.2.一个机器周期等于12个时钟周期,所以是1微秒.

设8051单片机的晶振频率为6MHz,试分别用定时器T0的方式1、2编程,使...
include<reg51.h> sbit pluse=P1^0;void t0isr() interrupt 1 { TH0=(65536-500);TL0=(65536-500);pluse=~pluse;} main(){ TMOD=0x01;TH0=(65536-500);TL0=(65536-500);TR0=1;ET0=1;while(1);} include<reg51.h> sbit pluse=P1^0;bit flag=0;void t0isr() interrupt 1...

九江市18036236568: 24.5M晶振的单片机 延时函数怎么计算 ?和12M的有什么区别?请帮忙写出1us、2us、、、 -
鄹梵帕歌: 一般来说要是通过延时函数来得到一个精准的延时时间(比如你说的1us、2us)是让正常人无法忍受的工作量,你可以点击编辑环境中的放大镜图标,在左边会弹出显示栏,sys下sec就是延时时间(要通过设置断点),你可以改变函数中变量值大概地调出需要的时间(希望你不要固执地去尝试调出你要的时间,因为这会让你享受到一天都不止的漫长调试“乐趣”中).晶振频率不同自然在相同参数的情况下得出延时时间不同.另外如果你确实需要得到一个比较精准的延时时间,建议你采用定时/计数器,至于怎么用这玩意儿,很简单!不到十分钟就能学会的事儿!这里就不提供教程了,用你调试的时间去学它会让你更有成就感.写了那么多,希望能帮助点什么.......

九江市18036236568: 求解释单片机晶振和延时函数间数值关系 -
鄹梵帕歌: 单片机的晶振是最原始的频率发生器,一个单片机的晶振频率是这个单片机系统里的最大频率,他的工作频率 输出频率都是以这个晶振频率为基准的,.通过倍频器、分频器分成不同的频率使用.至于你说的延时函数的话,这个要查他执行一个指令的指令周期是多少,延时函数最好用汇编编程,然后看他执行几个指令周期,这样就能精确地做延时函数了.

九江市18036236568: 单片机外接24M的晶振,1ms的基准延时函数用C语言怎么写? -
鄹梵帕歌: 定时器T0 工作方式1 晶振频率24MHz定时器最大定时时间(us):32768定时器最小定时时间(us):0.5【1ms精确定时C51代码】void T0_init(void) ...

九江市18036236568: 51单片机,晶振为24.0,延时函数怎么写,延时4~5s -
鄹梵帕歌: 延时4~5S,用循环方式的延时函数没什么实用性.单片机不做其它事在这里一直循环是不现实的.还是用定时器中断吧

九江市18036236568: [C51单片机C语言]:能否根据晶振和要延时时间定义一个通用的延时函数? -
鄹梵帕歌: 原则上是可以的,用12除以晶振频率得到单指令周期指令的时间,然后根据这个时间计算循环次数.但是,这些计算是要花时间的,而且时间不定.如果延时时间长,这个时间或可以忽略,但是微秒级的延时,影响就很大了,所以,虽然可以,但是不实用. 估计这也是为什么没人这么用的原因.

九江市18036236568: 单片机循环延时函数 -
鄹梵帕歌: 这个延时是通过三个for循环数数实现的,数了20*20*248次,时间刚好是0.2秒,因为单片机每执行一条指令,需要一定的时间.其实,根据不同的晶振产生的时钟,执行每条指令的时间会不一样,用keil软件进行仿真调试能得到一些较精确的延时!

九江市18036236568: 单片机延时时间程序怎么编程 -
鄹梵帕歌: 举一个例子来说明吧.比如你要编一个延时50毫秒的子程序,那么步骤如下:1、查看一下你的硬件环境,比如晶振大小,CPU型号,不用CPU指令的机器周期是不一样的.2、计算延时需要的机器周期.比如采用12M晶振,CPU采用通用8051,...

九江市18036236568: 单片机延时程序的延时时间怎么算的? -
鄹梵帕歌: 单片机的延时程序通过执行指令来达到延时效果,这个时间等于执行的指令需要的时间,而一个指令需要的时间叫做指令周期,这个时间等于若干个机器周期. 扩展资料: 1丶指令周期,是每种运算需要的时间,如加法、逻辑等,是每一步进行这种指令运算需要的时间,是机器周期的整数倍,这种周期不定. 2丶51单片机12M晶振,晶振周期1/12微妙,一个机器周期包含12个晶振周期,所以12M晶振时机器周期=12x(1/12)微妙=1微妙. 3丶1个毫秒延时子程序如下: void delay1ms(uint ms) { uint i,j; for(i=0;i<ms;i++) { for(j=0;j<110;j++); } }

九江市18036236568: 单片机延时计算方法?
鄹梵帕歌: 以C51为例,12MHZ晶振的话,1个时钟周期为1/12微秒,1个机器周期=12个时钟周期,定时器每个机器周期可延时12*1/12微秒=1微秒.如果晶振为8MHZ的话,定时器每个机器周期可延时12*1/8微秒=1.5微秒

九江市18036236568: (51单片机)那个大佬给讲解一下这个延时函数 -
鄹梵帕歌: u16 i,这是定义一个16位整型的形参变量 i ,其实,u16 并不是C51的变量类型,而是在程序的前面用#define u16 unsigned int 宏定义的. 延时就是利用循环体while(i--); 来实现的,变量x先减1,判断不是0,继续循环,继续减1,判断,直到x=0,结束循环,延时结束.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网