用c语言为单片机编程无疑十分节约时间,可在很短的时间内开发出较高效的代码,对于程序的维护和扩充也较汇编语言方便许多。
但c语言也有它的不足之处,那就是在时间的精确控制上。要想用c实现精确的延时,只能把c的函数编译成汇编语言,然后按照汇编语言计算其执行时间。本人就按照这种方法,编写了几个51单片机的c语言精确延时函数。
注:1.编译软件为"Keil uVision3"(Keil uVision2也试用)。用其他编译软件的话就不准了。
2.需要包含头文件
3.所有函数的延时时间都是在12Mhz晶振下计算的,如用其他晶振需进行换算。
4.函数的执行时间为“函数的参数”乘以精确到的时间。例如delayms(unsigned char n)函数,其精确度为1ms,如果写入语句delayms(4),那就是延时4ms。
5.计算出来的延时时间不包括函数调用与返回的时间。如果函数的精确度较高,且参数较小,那么实际延时时间就可能与计算的时间差很远。
(1)精确到2us的延时(12MHz)
void delayus(unsigned char n)
{ while(--n);
}
(2)精确到100us的延时(12MHz)
void delay100us(unsigned char n)
{ unsigned char i;
for(;n;n--)
{ _nop_();
for(i=46;i;i--);
}
}
(3)精确的半毫秒延时函数(12MHz)
void delay1_2ms(unsigned char n)
{ unsigned char i;
for(;n!=0;n--)
{ _nop_();
for(i=246u;i!=0;i--);
}
}
(4)精确的毫秒延时函数(12MHz)
void delayms(unsigned char n)
{ unsigned char i;
for(;n!=0;n--)
{ for(i=248u;i!=0;i--);
for(i=248u;i!=0;i--);
}
}
关键字:c51 精确延时
引用地址:
c51的精确延时
推荐阅读最新更新时间:2024-03-16 14:32
C51语言中断函数结构,C51中断函数的写法
1、一、中断允许控制CPU 对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE 控制的。EX0(IE.0),外部中断 0 允许位;ET0(IE.1),定时/计数器 T0 中断允许位;EX1(IE.2),外部中断 0 允许位;ET1(IE.3),定时/计数器 T1 中断允许位;ES(IE.4),串行口中断允许位;EA (IE.7), CPU 中断允许(总允许)位。80C51 单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD 用于设置其工作方式;TCON 用于控制其启动和中断申请。一、工作方式寄存器 TMOD工作方式寄存器 TMOD 用于设置定时/计数器的工作方式,低四位用于。 2、 T0,高四位用于 T
[单片机]
Proteus C51仿真学习板7——LCD1602
LCD1602作为最基础的字符型液晶显示屏,能过显示16x02=32个字符。那么时序的操作——读写是最主要的内容,今天就带大家一起读读时序。 在看时序图前,对LCD的引脚功能要了解,才能更好的读懂时序。 这里除了电源(1、2)、背光(15、16)、对比度(3)外,主要是控制信号和数据信号。 RS:数据/命令选择引脚,即=1写入数据,=0写入命令; RW:读写选择引脚,即=1读数据,=0写数据; EN:使能引脚;D0-D8:8位数据位。 所以:当RS=0,RW=0时,写入指令;当RS=1,RW=0时,写入数据;当RS=0,RW=1时,读忙信号;当RS=1,RW=1时,读数据。 这里忙信号主要是D7引脚,即D7=0
[单片机]
使用HD44780读写单片机的C51程序详细概述
下面我给大家介绍一个HD44780读写单片机c51程序 #include 《reg51.h》 #include 《intrins.h》 sbit GND_LCD=P1^7; sbit rs=P1^0; sbit rw=P1^1; sbit e=P1^2; unsigned char busy(void); void ctrl(unsigned char); void wd_h(unsigned char); void wd_l(unsigned char); unsigned char rd(void); void write(unsigned char); void init(void); void NOP(void); voi
[单片机]
C51如何实现带死区控制的PID算法
真正要用PID算法的时候,发现书上的代码在我们51上来实现还不是那么容易的事情。简单的说来,就是不能直接调用。仔细分析你可以发现,教材上的、网上现行的PID实现的C语言代码几乎都是用浮点型的数据来做的,可以想象,如果我们的计算使用浮点数据,那我们的51单片机来运行的话会有多痛苦。 所以,本人自己琢磨着弄了一个整型变量来实现了PID算法,由于是用整型数来做的,所以也不是很精确,但是对于很多的使用场合,这个精度也够了。关于系数和采样电压全部是放大10倍处理的。所以精度不是很高,但是也不是那么低,大部分的场合都够用了。实在觉得精度不够,可以再放大10倍或者100倍处理,但是要注意不超出整个数据类型的范围就可以了。 本人做的是带死区控制
[单片机]
简单的51单片机多任务操作系统(C51)
在网上看到这段代码,所以自己尝试了,可以跑起来,但是没有精确的定时功能,仅仅是任务的调度而已。 数组中是11,而不是12。这里写错了。。。 /* 简单的多任务操作系统 其实只有个任务调度切换,把说它是OS有点牵强,但它对于一些简单的开发应用来说, 简单也许就是最好的.尽情的扩展它吧.别忘了把你的成果分享给大家. 这是一个最简单的OS,一切以运行效率为重,经测试,切换一次任务仅20个机器周期, 也就是在标准51(工作于12M晶振)上20uS. 而为速度作出的牺牲是,为了给每个任务都分配一个私有堆栈,而占用了较多的内存. 作为补偿,多任务更容易安排程序逻辑,从而可以节省一些用于控制的变量. 任务槽越多,占用内存越多,但任务也越
[单片机]
DS1302读写一体化C51源程序
DS1302读写一体化C51源程序 (hotpower) /*---------------------------------------------- DS1302读写一体化C51源程序 HotPower@126.com ------------------------------------------------*/ //打开DS1302 void TimeSpiOpen(void) { TIMECLK = 0; TIMERST = 0;//禁止DS1302 TIMEIO = 1;//释放数据总线 TIMERST = 1;//使能DS1302 } //关闭DS1302 void TimeSpiClose(v
[单片机]
C51单片机定时器T0,T1的常用基本设置
有时候带手机不方便,可以又想知道时间,这时候可以用蜂鸣器做一个音频的时间提醒器,每60秒发一声提醒 提醒器计时可以使用单片机的定时器T0、T1来做,计时的定时器用T1来做,工作在方式2(8位自动装载),系统运行提示的定时器用T0来做,工作在方式1(16位定时) 代码如下 #include reg52.h #define uint unsigned int #define uchar unsigned char #define time_set0 5000//设置定时器0的计时长度 #define th0 (65536-time_set0)/256//计算定时器高8位装入值 #define tl0 (65
[单片机]
用C51单片机设计物体分级设备的测量光幕
1 引言 光幕是电子测量系统中应用比较多的一种设备。利用光幕可以测量恒速传送带上的物体高度、长度或宽度等一系列数据,以便为后面的电子系统提供相应的参数。本文给出了一种利用单片机实现物体高度测量的光幕测量方法。 2 光幕测量物体高度的基本原理 图1所示是一个用普通光幕测量物体高度的测试原理结构示意图。图中,光幕的一边等间距安装有多个红外发射管,另一边相应的有相同数量同样排列的红外接收管,每一个红外发射管都对应有一个相应的红外接收管,且安装在同一条直线上。当同一条直线上的红外发射管、红外接收管之间没有障碍物时,红外发射管发出的调制信号(光信号)能顺利到达红外接收管。红外接收管接收到调制信号后,相应的电路输出低电平,而在有
[单片机]