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

作者&投稿:强秀 (若有异议请与网页底部的电邮联系)
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)以及超级电脑等作业平台。

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;ti<112;ti++){}//112
}
}


调用方式如下:
delay(400); //开机延时400ms
够详细了吧?!

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的值。
希望我的回答能帮助到你。

好办
用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;//加这句是为了可以循环使用

}

假如使用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毫秒中断后要添加的代码
}

void main()
{
TMOD = 0x01;//设置T0为工作方式1
for(;;)
{
TH0 = (65536-1000)/256 //设定初值
TL0 = (65536-1000)%256; //设定初值
TR0 = 1;//启动定时器0
}


51 单片机编程-按键按下时间控制LED
其实是很简单的程序:当按键按下直接启动定时器TRx=1,当松开时关闭定时器TRx=0,然后判断定时时长,写一个if()语句来判断时长,当在9~10秒之间,点亮LED1,else点亮LED2。最好根据思路自己写程序,别人给的东西自己理解不会那么深刻,也无法进步,想成为高手不是靠别人就能成的。希望我的回答能...

51单片机编程题,要求每条语句写出注释。求解答。
P1接8个发光管,P0接8个开关K1~K8,读开关状态,控制二极管亮灭,开关闭合,发光管亮。程序如下 include<REG51.H> void main(){ while(1){ P1=P0;\/\/P1接8个发光管,P0接8个开关K1~K8,读开关状态,控制二极管亮灭,开关闭合,发光管亮 } } 仿真图 ...

初学单片机,编程不太熟悉,51单片机根据开关状态输出高低电平,有逻辑判 ...
编程思路:每次都是将P1口的值读取进来,再屏蔽低4位,仅对高4位进行判断 { define INPUTMASK 0xF0 char ReadPort = 0;ReadPort = P1 & INPUTMASK;switch(ReadPort){ case 0xf0: break; \/* 没有任何按键按下,跳出 *\/ case 0x10: Subfunction1();break; \/* P1.4按下,跳转到...

51单片机编程这一句P0的第4位赋值时,哪里出错了?谢谢啦~
P0^4这是运算式,不是变量,不能给运算表达式赋值!这样 在主函数上面定义 sbit p04=P0^4;删除主函数中的那一行,改成 p04=1;

51单片机编程2位数码管倒计时,从10秒开始每隔一秒减一当减到零有重复...
include<reg51.h> define uchar unsigned char define uint unsigned int uchar DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};\/\/主程序 void main(){ P0=0x06; \/\/显示10 P2=0x3f;i=0;Second_Counts=100;TMOD=0x01; \/\/定时器0方式1 TH0=(65536-50000...

51单片机C语言编程如何实现长按按键实现数值的累加
这个可以用定时器来做,比如检查某键,按键时间超过2秒后一个变量开始累加知道键释放为止。实现方法如下:include<reg51.h> define uint unsigned int define uchar unsigned char uint v=0,time=0;sbit key=P1^0;void t0isr() interrupt 1 { TH0=(65536-50000)\/256;TL0=(65536-50000)%256;ti...

求组高手帮忙:51单片机编程
一、MOV A, 40H CJNE A, 41H, $+3 JNC DDD MOV A, 41H DDD:MOV 42H, A END 二、CLR A MOV R2, A MOV R3, A MOV R0, #40H MOV R1, #10 LOOP:MOV A, R3 ADD A, @R0 INC R0 MOV R3, A MOV A, R2 ADDC A, #0 MOV...

51单片机用c语言编程实现1s定时、1khz方波、512hz方波输出,麻烦多在...
Include<reg51.h> define uchar unsigned cahr uchar times=0,sec=0;sbit p512=P1^0;sbit p1k=P1^1;void t0isr() interrupt 1 { times++;if((times%4)==0)p512=~p512;if((times%2)==0)p1k=~p1k;if(times>=205){times=0;sec++} } main(){ TMOD=0x02;TH0=256-244;TL0=...

51单片机编程中 数字可以用十或者十六进制表示 比如计算时可以为256-0...
在单片机内部,在运算过程中一律以二进制数形式进行。而写程序时随便用十进制数和十六进制数都行,但在编译时,也都变成二进制数了。其实,十六进制数就是二进制数的表示形式,一位十六进制数表示四位二进制数,这样,在显示和写二进制数时,就可以用十六进制数了。对十六进制数不熟悉,就写十进制数...

51系列单片机编程
设高8位存在B中,低8位存在A中。双字节数据从高向低《循环右移》一位的子程序如下:RCR16:MOV C, ACC.0 XCH A, B RRC A XCH A, B RRC A RET ;--- 如果需要循环右移四位,就调用四次上述的程序。故,双字节数据循环右移四位子程序如下:CALL RCR16 CALL RCR...

宣汉县17746496799: 51单片机8个灯同时闪烁数程序用定时器写怎么写?c语言版. -
姜娥消咳: 你就先写个清零端清零,然后同时低电平控制八个灯,写个延时程序,然后同时给给高电平,定时器记时.

宣汉县17746496799: 求教怎么在C语言中使用定时器 -
姜娥消咳: 简单使用,比如初始化,回读计数值,可以通过访问定时器的寄存器的方式完成 如果需要定时器中断服务,要编写中断服务程序,并设置中断向量表

宣汉县17746496799: 51单片机怎么用定时器记录两次外部中断的时间?C语言应该如何编程? -
姜娥消咳: 我51的时钟寄存器了解的不多,因此以概念形式来述说下.第一需要定时器初始化: a:中断寄存器初始化 b:计数寄存器初始化 c:重装填寄存器初始化(当计数寄存器计数完了后,使用这个寄存器,还原计数寄存器) d:分频值 主频/2^分频...

宣汉县17746496799: 51单片机C语言程序,利用定时器1控制LED灯每隔100ms亮一个,并且数码管上的数每隔200ms加1,加到100清零 -
姜娥消咳: #include<reg51.h> #include<intrins.h> #define uchar unsigned char; uchar distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //0到f uchar number,dat,time; void t0isr() interrupt 1 {TH0=(65536-5000...

宣汉县17746496799: 单片机c语言里怎么用2个定时器?怎么设置优先级? -
姜娥消咳: 是51单片机吗?如果是51单片机,你可以使用TMOD设置两个定时器,然后使用TR0、TR1分别启动两个定时器.PT0置为“1”,就可以中断定时器1的服务函数,相反,如果PT1置为“1”就可以中断定时器0的服务函数. 如果不设置PT的值,默认为“0”,这样的话,T0和T1谁也不能中断谁.

宣汉县17746496799: 求用C编写一个51单片机的延时函数,用T0定时器. -
姜娥消咳: #include <reg51.h>#define uchar unsigned char sbit LED=P1^0; uchar time; void InitTimer0(void) { TMOD = 0x01; //定时器0,工作方式1 TH0 = 0x3c; TL0 = 0xb0; //50ms中断一次 EA = 1; ET0 = 1; TR0 = 1; } void main(void) { InitTimer0(); while(1);...

宣汉县17746496799: 如何用单片机实现C语言编程的定时器,不借助单片机内部的T1,T0定时器.求高手解答,程序??? -
姜娥消咳: 软件延时 但时间长了时间就不准了 下面是两个延时的子程序 最后面调用示例/*----------------------------------------------- 名称:delay10ms 功能:延时10ms 误差0ms 晶振:12MHz 机器周期1us 时间计算:t=2+1+9995+2=10000us =10.000ms ---------------...

宣汉县17746496799: 单片机中用C语言怎么设置TOMD,模式0,1,2,3,对应的定时器0,1,求大神帮忙 啊 -
姜娥消咳: 那得看你用什么单片机,51单片机的话有两定时器T0和T1; TMOD是一个八位的寄存器,分别对应两个定时器的一些状态,如工作方式、启动方式的设置,设置TMOD时是字节寻址,就是直接写一个字节. 如:如果我要使用T0定时器,让它工作在方式1、软件启动; TM0D=0x01;

宣汉县17746496799: 用c语言写51单片机定时器中断判断按键是否按下该怎么写? 我想实现的功 -
姜娥消咳: 这个可以这样实现: #include<reg51.h> #define uchar unsigned char uchar time=0; sbit key=P1^0; void t0isr() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; time++; } main() { TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-...

宣汉县17746496799: 怎么利用单片机定时器实现定时的编程过程? -
姜娥消咳: 定时器其实就是单片机的一个内部自身时钟的计数器,每一个周期计数器加1,所以使用定时器功能时候先要给定时器付初值,就是先写TH0TL0的值(如下),写完初值后就等着定时器功能的那个计数器记满了数后也就是到了65536后就溢出了...

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