c编程时,51单片机怎么用定时器写一个延时1ms的子函数

如题,作用像
void delay(uint16 n)
{uint16 i,j;
for(i=n;i>0;i--)
for(j=125;j>0;j--);}
可以设置参数来决定调用时延长时间

51单片机的定时器工作方式有4中,其中3种需要在中断函数中重装初值,而且C51明确规定中断函数不能传入参数也不能返回参数,那么这样一来就只能用不用重装初值的工作方式2了,我给出了工作方式2的初始化函数:
void init(unsigned int x)
{
TMOD=0x02;
TH0=x;
TL0=x;
EA=1;
ET0=1;
TR0=1;
}
这样将x作为定时器的初值传入,当TL0计数完成时,TH0会自动将值赋给TL0,TH0不变,当然你自己来定义键盘函数或者什么函数来决定x的值。
希望我的回答能帮助到你。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-05-12
好办
用C51,方式一
void delay(unsigned int T) //T的单位取微秒
{
signed int cnt; //这里用符号数的相反数 就是2^16-n的原码,也可以定义无符号数自己换成2^16-n

cnt=-(fosec*1.0/12)*T; // fosec的单位MHz

TMOD=0x01;
TH0=(unsigned char)(cnt>>8);
TL0=(unsigned char)cnt;
TR0=1;
while(!TF0);
TR0=0;
TF0=0;//加这句是为了可以循环使用

}
第2个回答  2013-05-12
假如使用12MHZ晶振

定时器初始化:

void init(void )
{
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
ET0=1;
TR0=1;
}

主程序;

main(void)
{
init();

while(1)
{
;
}
}

void inter_t0(void) //1ms中断一次
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;

; // 1毫秒中断后要添加的代码
}追问

这个好像不能自己定义延长时间呀

追答

你可以在中断中对中断次数进行计数,例如1毫秒中断一次,你要延时1秒,就计数1000次就是1秒了。 计数要用一个整形变量; int cnt;
计数到1000后要对变量清零,再重新 开始计数

本回答被网友采纳
第3个回答  2013-05-12
void main()
{
TMOD = 0x01;//设置T0为工作方式1
for(;;)
{
TH0 = (65536-1000)/256 //设定初值
TL0 = (65536-1000)%256; //设定初值
TR0 = 1;//启动定时器0
}

c编程时,51单片机怎么用定时器写一个延时1ms的子函数
51单片机的定时器工作方式有4中,其中3种需要在中断函数中重装初值,而且C51明确规定中断函数不能传入参数也不能返回参数,那么这样一来就只能用不用重装初值的工作方式2了,我给出了工作方式2的初始化函数:void init(unsigned int x){ TMOD=0x02;TH0=x;TL0=x;EA=1;ET0=1;TR0=1;} 这样将x...

请帮忙在51系列单片机系统中,编写一个延时1ms的子程序。谢谢。。_百...
1、首先,在电脑中打开keil软件,创建好工程,然后添加c文件,如下图所示。2、然后添加c文件,接下来输入代码,先输入一个头文件命令。3、然后,进行宏定义,代码如图所示。4、然后声明P1口,如下图所示。5、最后,将延时语句全部添加进去,代码按照图中所示的直接敲入即可。6、最后,点击编译,生成HEX...

51单片机中,写个延时函数,延时1ms,该怎么写,为什么?
用汇编语言写可以精确计算,但有时想拼出整数的ms或10ms也不容易,计算方法如下图说明:而C语言靠经验和实验得来的,如下面程序 如果不准(与晶振频率有关),调K的值,,软件仿真查看,直到大致准确,想更精确用定时器 void delay(unsigned char i) \/\/延时程序{ unsigned char i,k;for(j=i;j...

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

设51单片机晶振频率为12MHZ,延时1m的子程序
下面为你写出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;...

C51单片机,谁帮我写个1ms的延时
void delay(uint i) \/\/调用子程序所需时间){ uchar j,k;for (j=i; j>0; j--)for(k=0;k<30;k++);} 在程序调用函数就可以得到1ms的程序,具体调用如下:delay(10); \/\/延时1.011ms

哪位高手知道 单片机精确延时1秒得C语言子程序 谢谢了
SETB TR0 ;开启定时器 HERE:JBC TF0,NEXT1 SJMP HERE NEXT1:MOV TL0,#0B0H MOV TH0,#3CH DJNZ R7,HERE CLR TR0 ;定时器要软件清零 SETB EX0 RET C语言延时程序:10ms延时子程序(12MHZ)void delay10ms(void){ unsigned char i,j,k;for(i=5;i>0;i...

需要一个C语言程序。51单片机控制:按键按一下,延迟1分钟后开灯,灯亮半...
void delay1s(uint i) \/\/1s延时程序 { for(;i>0;i--){delay1ms(1000);} } void main(){ led=0;while(1){ if (s==0){ delayms(20);if (s==0);{delay1s(60);led=1; } } if(led==1){delay1s(1800);led=0; } } } 如果对时间要求精确,则要用到定时器,还要确保电路...

51单片机用c语言怎么写延时函数?
所以一个简单的延时功能就诞生了,我们只需要自减120次,就可以延时1ms,如果我们要延时50ms呢,那就自减50*120=6000次。那么在程序上如何表达呢?我们可以用两套for循环 void delay(int i){ int x,y;for(x=i;x>0;x--){ for(y=120;y>0;y--)} } 参数 i 代表该函数延时多少ms ...

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

相似回答