【Keil C51单片机延时程序】

基本说明

单片机中的delay()的单位时间不是系统提供的,而是用户自己编制的;
晶振为12MHz的单片机,机器周期等于晶振周期*分频=(1/12)*12=1ms;
晶振12MHz和16位的单片机一次最大的延时时间为2^16=65536us=65ms;

标准的C语言没有空语句。但在单片机的C语言编程中,经常需要用几个空指令产生延迟的效果,所以总会看起来复杂无序。验证程序延时是否正确可将程序编译成汇编程序在进行计算,至于为什么,目前也没找到合适的资料。

常用的延时程序

nop()(um级)

#include<instrins.h>
_nop_();

下面4us延时声明(直接定义法无需编译执行,故无空指令参与延时):

#define Delay4us(){_nop_();_nop_();_nop_();_nop_();}

循环函数(延时一般大于10us)

500ms延时:

void delay500ms(void)
{
    unsigned char i,j,k;
    for(i=15;i>0;i--)
    for(j=202;j>0;j--)
    for(k=81;k>0;k--);
}

200ms延时:

void delay200ms(void)
{
    unsigned char i,j,k;
    for(i=5;i>0;i--)
    for(j=132;j>0;j--)
    for(k=150;k>0;k--);
}

10ms延时:

void delay10ms(void)
{
    unsigned char i,j,k;
    for(i=5;i>0;i--)
    for(j=4;j>0;j--)
    for(k=248;k>0;k--);
}

1ms延时:

void delay1s(void)
{
    unsigned char h,i,j,k;
    for(h=5;h>0;h--)
    for(i=4;i>0;i--)
    for(j=116;j>0;j--)
    for(k=214;k>0;k--);
}

void delay1ms()
{
	unsigned char i,j;	
	for(i=0;i<10;i++)
	for(j=0;j<33;j++);		 
}

定时器方式(常用单位为秒)

1 可以按定时时间的计算公式, 计算出定时器的时间常数X:
定时时间T=(2的N次方-X)12/单片机晶振频率
2 N为定时器的工作方式:
方式0时,N=13
方式1时,N=16
方式2时,N=8
3 根据定时时间和工作方式,计算出时间常数X
把X转换成二进制数,高8位送给TH1,低8位送给TL1,就可以启动定时器开始定时了。
例如: 工作在方式1,定时时间为1000微秒 晶振频率=12MHZ
则 定时时间T=(2的16次方-X)12/12MHZ=1000 解出 X=64536=FC18H

例:
16位定时器,th0是高八位,tl0是低八位,算好你要定的时间,如你要定1000毫秒,
th0=(65535-64535)/256
tl0=(65535-64535)%256

定时65ms,则th0=0;tl0=0;
直接写入程序即可

初始设置好th0和tl0;需要的时候,启动定时器TR0=1;执行程序并延时;关闭定时器TR0=0;

通用比较精确的ms级延时程序

void Delayms(unsigned int n)
{
    unsigned int i,j;
    for(j=n;j>0;j--)
    for(i=112;i>0;i--);


}

参考链接: 循环延时1,循环延时2,定时器延时

  • 3
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
99分钟倒计时器报警器实验例程C51单片机KEIL工程源码文件: /*----------------------------------------------- 名称:99分钟倒计时数码管显示 内容:99分钟倒计时器,可以通过按键上调下调时间,定时器到时喇叭发声报警 带有点按和连按功能 ------------------------------------------------*/ #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换 sbit LATCH1=P2^2;//定义锁存使能端口 段锁存 sbit LATCH2=P2^3;// 位锁存 sbit BEEP = P1^1;//定义喇叭端口 bit BeepFlag; sbit KEY_ADD=P3^0; //定义按键输入端口 sbit KEY_DEC=P3^1; unsigned char hour,minute,second;//定义时分秒 bit UpdateTimeFlag;//定义读时间标志 unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9 unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码 unsigned char TempData[8]; //存储显示值的全局变量 void DelayUs2x(unsigned char t);//us级延时函数声明 void DelayMs(unsigned char t); //ms级延时 void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数 void Init_Timer0(void);//定时器初始化 void Beep_OFF(void); void Beep_ON(void); void Display_Data_Operation(void); /*------------------------------------------------ 显示数据处理函数 ------------------------------------------------*/ void Display_Data_Operation(void) { TempData[2]=dofly_DuanMa[minute/10];//分解显示信息,如要显示68,则68/10=6 68%10=8 TempData[3]=dofly_DuanMa[minute%10];//分解显示信息,如要显示68,则68/10=6 68%10=8 TempData[4]=0x40; TempData[5]=dofly_DuanMa[second/10];//分解显示信息,如要显示68,则68/10=6 68%10=8 TempData[6]=dofly_DuanMa[second%10];//分解显示信息,如要显示68,则68/10=6 68%10=8 } /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { unsigned char key_press_num; Init_Timer0(); while (1) //主循环 { if(!KEY_ADD) //如果检测到低电平,说明按键按下 { DelayMs(10); //延时去抖,一般10-20ms if(!KEY_ADD) //再次确认按键是否按下,没有按下则退出 { while(!KEY_ADD) { key_press_num++; DelayMs(10); //10x200=2000ms=2s if(key_press_num==200) /

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值