本文目录一览:
- 1、设51单片机晶振频率为12MHZ,延时1m的子程序
- 2、请教老师,51单片机在12M晶振,C语言编程时,延时函数120次=1ms(书本上是这样的,不懂),是怎样得来的?
- 3、单片机外接12M的晶振,1ms的基准延时函数用C语言怎么写?
设51单片机晶振频率为12MHZ,延时1m的子程序
猜想你问的是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;
}
请教老师,51单片机在12M晶振,C语言编程时,延时函数120次=1ms(书本上是这样的,不懂),是怎样得来的?
C的话其实时间没有办法完全定性地计算的
如果非得精确的话只能使用定时器了,或者汇编的也行
不过时间要求精度不是很高的话使用下面的代码就行了
当时使用示波器把时间完全调准的,65536ms范围内还是比较准的,已经可以满足通常的要求了:
#include "reg51.h" //头文件包含
//宏定义
#define uint unsigned int
#define uchar unsigned char
void delay(uint ms) // 毫秒级延时(AT89C52 @ 11.0592MHz)
{
uint ti;
while(ms--)
{
for(ti=0;ti112;ti++){}//112
}
}
调用方式如下:
delay(400); //开机延时400ms
够详细了吧?!
单片机外接12M的晶振,1ms的基准延时函数用C语言怎么写?
/*-----------------------------------------------
名称:delay1ms()
功能:延时1ms
晶振:12MHz 机器周期1us
时间计算:t=2+1+995+2=1000us =1.000ms
-----------------------------------------------*/
void delay1ms(void) //延时1ms子程序
{
unsigned char i,j;
for(i=5;i0;i--)
for(j=98;j0;j--);
}
对应汇编
/*-----------------------------------------------
名称:delay1ms
功能:延时1ms
晶振:12MHz 机器周期1us
时间计算:t=2+1+995+2=1000us =1.000ms
-----------------------------------------------*/
LCALL DELAY1MS ;2us
DELAY1MS:
MOV R6,#5 ;1us
DEL1: MOV R7,#98 ;1us
DJNZ R7,$ ;2*98=196us
DJNZ R6,DEL1 ;2us DLE1执行完所用时间(1+196+2)*5=995us。
RET ;2us