设51单片机晶振频率为12MHZ,延时1m的子程序

设51单片机晶振频率为12MHZ,延时1m的子程序,第1张

猜想你问的是1ms

下面为你写出1ms的程序:

用的是110592M的,你如果真的需要是12M的,那自己直接修改成12M就可以了。调用的时候直接把uinsigned int ms改成1就是1ms

void ConfigTimer0(unsigned int ms)

{

unsigned long tmp;

tmp = 11059200/12;

tmp = (tmp ms)/1000;

tmp = 65536 - tmp;

tmp = tmp + 18;

T0RH = (unsigned char)(tmp >> 8);

T0RL = (unsigned char)tmp;

TMOD &= 0xF0;

TMOD |= 0x01;

TH0 = T0RH;

TL0 = T0RL;

ET0 =1;

TR0 = 1;

}

你好!

如果你要求是比较准确的延时程序,是一定要用定时器中断的,如果是大约的时间,是要知道你的晶振大小,然后用

while(a)

{

a--;

}

就可以了

如果对你有帮助,望采纳。

通用办法,可以类推:

DELAY1s:

        MOV   R5,#08H           ; ∵ 1s=1000000us 

        MOV   R6,#0A2H          ; ∴ 1000000/2=500000

        MOV   R7,#20H           ; 500000用16进制表示为: 07A120

                                ; 所以 R5=07H+1=08H

                                ;     R6=0A1H+1=0A2H

                                ;     R7=20H

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参与运算

        RET

两种方案,简单粗暴的直接用for循环:

for(int i=0;i<1000000000;i++);

循环次数自行调试,试出大概的值就行

第二种,精准延时,通过SysTick系统计时器来实现

6M晶振,方式2定时1mS的时间太长,不能直接实现,(最大定时应该是512uS)下面是500uS定时示例程序,可在中断函数中计数每2次得1S。

void Timer1Init(void) //500微秒@6000MHz

{

AUXR &= 0xBF; //定时器时钟12T模式

TMOD &= 0x0F; //设置定时器模式

TMOD |= 0x20; //设置定时器模式

TL1 = 0x06; //设置定时初值

TH1 = 0x06; //设置定时重载值

TF1 = 0; //清除TF1标志

TR1 = 1; //定时器1开始计时

}

以上就是关于设51单片机晶振频率为12MHZ,延时1m的子程序全部的内容,包括:设51单片机晶振频率为12MHZ,延时1m的子程序、怎么用c语言定义一个1ms的延时程序;只用while、 for 等,不用定时器和中断、单片机编写一个能延时1秒的子程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9280734.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存