设单片机晶振频率为12MHZ,试编写一延时500us的子程序。51单片机

供稿:hz-xin.com     日期:2025-01-13
设单片机晶振频率为12MHZ,试编写一延时1s的子程序

//----假设,系统工作于
12mhz/12t的传统51单片机下.#include

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;
}
}

猜想你问的是1ms.
下面为你写出1ms的程序:
用的是11.0592M的,你如果真的需要是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;
}

如果是标准的12T单片机模式,那么一个时钟周期就是1us,把定时器T0(或T1)设置为16位模式,TH0、TL0的初始值分别设为#FEH、#0BH,进入子程序时,启动定时器T0,定时器从#FEOB运行500个时钟周期,正好是#FFFFH,定时器T0溢出,即为500us。

void delay(uint time)
{
while(time--);
}
12M晶振,一个机器周期就是1us,time 给 500 就可以

DELAY:MOV R0,#250
DJNZ R0,$;执行一次2us共执行250次用时2×250=500us
RET

DELAY: ;误差 0us
MOV R6,#47H
DL0:
MOV R5,#02H
DJNZ R5,$
DJNZ R6,DL0
RET

;********************汇编****************************
DELAY:
MOV R6,#47H
DL0:
MOV R5,#02H
DJNZ R5,$
DJNZ R6,DL0
RET
/****************C语言*******************/
void delay(void)
{
unsigned char a,b;
for(b=71;b>0;b--)
for(a=2;a>0;a--);
}

一个51单片机,晶振为12MHz,让前三个LED灯分别以1ms,1s,5s的频率闪烁...
要实现51单片机上的三个LED灯分别以1ms, 1s, 5s的频率闪烁,可以通过定时器来控制。首先,我们设定定时器0为16位定时模式,计时50ms。然后设置一个变量进行定时器中断计数,当计数达到10(即0.5s)时,LED2的状态取反;当计数达到5000(即2.5s)时,LED3的状态取反。这样,LED1将以1ms的频率闪烁...

已知单片机的外接晶振频率fosc=12MHz 。请编写汇编语言子程序,其功能...
实际为0.100005s delay01s:mov r1, #200 loop01s:mov r0, #249 djnz r0,djnz r1, loop01s ret 实际为1.000074s delay1s:mov r0, #10 loop1s:acall delay01s djnz r0, loop1s ret 实际为60.004568s delay1m:mov r0, #60 loop1m:acall delay1s djnz r0, loop1m ret ...

设单片机晶振频率为12MHZ,编写出其延时100毫秒的程序??
最好直接利用定时器延时,定时1毫秒,程序中调用延时函数就行了,Delay(100):uint count; \/\/定义外部变量 Delay( uint k) \/\/ 延时函数 { count = k;while(count!=0) ;} TIME0() interrupt 1 \/\/ 定时器0中断函数 { TH0 = 0XFC;TL0 = 0X18;count--;} ...

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 ...

单片机晶振频率12MHz 编程实现PI.0输出频率为2kHz 占空比为50%的方波...
STC的单片机,请参考 sbitOUTPUT=P1^0;void Timer1Init(void)\/\/250微秒@12.000MHz { AUXR &= 0xBF;\/\/定时器时钟12T模式 TMOD &= 0x0F;\/\/设置定时器模式 TMOD |= 0x20;\/\/设置定时器模式 TL1 = 0x06;\/\/设置定时初值 TH1 = 0x06;\/\/设置定时重载值 TF1 = 0;\/\/清除TF1标志 TR1 = 1...

编程题 设MCS-51单片机系统中晶振频率为12MHz,欲使用定时器\/计数器1...
采用12Mhz晶振的51单片机,软件如下(调试通过)include <reg52.h> define PERIODH (65536l-50000l)\/0X100 \/\/设50ms中断1次TH1初值 define PERIODL (65536l-50000l)%0X100 \/\/设50ms中断1次TL1初值 \/\/如果需要极精确的延时,应根据实际编译后的产生的汇编指令,扣除掉中断响应中重装所占用的...

试用循环转移编写延时50ms,晶振12MHZ (单片机程序)的延时子指令_百度知 ...
你是想要左移还是右移?还是一直循环就可以了?如果是左移右移就要调用了"intrins.h"的文件包,如果是一直循环,那么用while循环语句就可以实现了,如下:左移右右:#include "reg52.h"include"intrins.h" \/\/包含_crol_函数所在的头文件 define uint unsigned int \/\/ 宏定义 define uchar ...

设系统晶振为12MHz 编写一个延时500ms的延时程序 单片机
void delay_ms(unsigned int z){ unsigned int x,y;for(x = z;x>0;x--)for(y = 110;y>0;y--);} 这是1MS的延时程序 直接调用delay_ms(500);就为500ms的延时程序,适用与普通的51单片机,纯手打~

MCS-51单片机的编程题:已知系统晶振频率为12MHZ,采用定时器T0的方式1...
DELAY1S: MOV TMOD,#01H MOV TH0,#HIGH(65536-50000) MOV TL0,#LOW(65536-50000) SETB TR0 MOV R2,#20LOOP: JNB TF0,$ CLR TF0 CLR TR0 MOV TH0,#HIGH(65536-50000) MOV TL0,#LOW(65536-50000) SETB TR0 DJNZ R2,LOOP RET ...

单片机震荡频率是12MHZ,请编写1MS的延时程序,拜托啦
void delay(){ unsigned char i;for(i=0; i<120; i++);} 这个程序差不多就是1ms的时间, 不过没有定时器准,最好用定时器好点