C51中延时程序的编写

发布者:SereneGardener最新更新时间:2016-11-07 来源: eefocus关键字:C51  延时程序 手机看文章 扫描二维码
随时随地手机看文章

C51及C51和汇编的混合编程的资料都是从前辈那儿偷来的,先谢谢各位前辈的分享!:)

 

 
 
 
 众所周知,c51在编程时很难掌握程序运行的时间,所以编写延时程序时很难做到很精确,解决的方式有插入汇编语句,但总觉得汇编用起来不是那么顺手,还可以用定时器来做,但只是一个很小的延时程序而已,不必小题大作。其实办法还是有的,下面介绍一下常用的几种延时程序。
1、us级延时程序
   常用的一个函数如下:
   void delayus(unsigned char x)
   {  while(--x) ;
   }
生成的汇编代码为:
C:0x001C    7F0A        MOV      R7,#0x0A                 //2us
C:0x001E    12003E     LCALL    delayus(C:003E)    //   2us
C:0x003E    DFFE        DJNZ     R7,delayus(C:003E)   //2x us
C:0x0040    22              RET                                        // 1us
      所以调用一次函数延时时间为 ( 2x+5 )us ,可以用来延时大于5us的时间。
注意的是x要是unsigned char 类型,且 --x 不能写成x-- ,否则汇编代码会有一大串:C:0x001C    7F02      MOV      R7,#0x02
C:0x001E    120032   LCALL    delayus(C:0032)
C:0x0032    AE07       MOV      R6,0x07
C:0x0034    1F           DEC      R7
C:0x0035    EE           MOV      A,R6
C:0x0036    70FA       JNZ      delayus(C:0032)
C:0x0038    22            RET      
       因为汇编中的DJNZ 语句是先减一再判断的,和-xx的算法一致,所以--x和x--相差了很多。上述函数只适合x的范围是0-255,如果需要延时大于255*2+5us,则可以连续调用几次函数。
2、ms的延时程序
       常用的一个函数:
void delayms(unsigned int x)
{
unsigned char i;
  while(x--)
    {
      for(i=0;i<125;i++){;}
    }
}
      我们来看一下它的精度如何
x                     us
1                 1024
5                 5076
10             10141
50             50661
100         101311
      可见,精度不“精”,随着x值的增大,延时误差越大,只适合在延时不要求很准确的地方使用。于是想到对程序进行一些修改,想到125是不是取的太大了,假如把它变为可变,不同的x值取值不同,就可以对延时时间进行一些修正,把程序改为如下:
   void delayms(unsigned int x,unsigned char y)
{
unsigned char j;
 while(x--)
    { 
      for(j=0;j     }
}
      对不同的延时时间取不同的y值,发现一个“怪”现象,当取y=123时,延时时间的误差是一个固定值:
x                     us
1                 1017
2                 2016
5                 5016
10             10016
50             50016
100         100016
    除了x=1外,其余的误差都为16us, 即不管x为多大都只有16us的误差,精度大幅度提高,可以满足大多数的需要!

关键字:C51  延时程序 引用地址:C51中延时程序的编写

上一篇:单片机系统硬件抗干扰实践
下一篇:STM8L外部中断为何死循环 寄存器操作

推荐阅读最新更新时间:2024-03-16 15:19

C51+CH375读U盘实例
找到了一个现成的例子,对于读写U盘,文件系统是个大麻烦。现在一直还没有弄明白,先收藏一下这个程序先,等到后面慢慢研究。 作者这个编程规范不错,注释很丰富,值得学习。 #include #include CH375INC.H #include /* 以下定义适用于MCS-51单片机 */ #define UINT8 unsigned char #define UINT16 unsigned short #define UINT32 unsigned long #define UINT8X unsigned char xdata #define UINT8VX unsigned char volatile xd
[单片机]
C51编译器-语言扩展(4)-函数
Function Declarations函数声明 Cx51对标准C进行了一定的扩展,使用这些扩展可以: (1)把一个函数声明为一个中断过程 (2)选择使用的寄存器组 (3)选择存储器模式 (4)声时可重入 (5)声明外部函数 在函数声中包含这些扩展或属性,使用下面的方法声明Cx51函数 funcname ( ) 这里 return_type 返回值类型 funcname 函数名称 args 参数 small, compact, or large 存储器模式 reentrant 是否可重入 interrupt 是否是中断函数 using
[单片机]
c51 T2中断程序
//T2中断程序 #include stdio.h #include reg52.h main() { RCAP2H=(65536-50000)/256; /*T2自动重载方式,定时t=50ms,当f=12MHZ,定时常数 TC=2^L-t*10^3,此处10进制表示, */ RCAP2L=(65536-50000)%256; EA=1; //总中断允许 ET2=1; //T2开中断 TR2=1; //t2启动 while(1) { } //等待 } void time2() interrupt 5 //T2中断程序, { TF2=0; //T2中断
[单片机]
基于C51单片机对液晶显示的实验设计
程序一:在液晶屏上显示一个1 //在液晶屏上显示一个字符 #include #define uchar unsigned char #define uint unsigned int //端口设置 sbit lcden=P3^4; sbit lcdrs=P3^5; //延迟函数,大约1秒 void delay(uint z) { uint x,y; for(x=z;x》0;x--) for(y=110;y》0;y--); } //写命令 void write_com(uchar com) { lcdrs=0;//写命令 P0=com; delay(5)
[单片机]
基于<font color='red'>C51</font>单片机对液晶显示的实验设计
C51系统上实现YAFFS文件系统
随着NAND Flash存储器作为大容量数据存储介质的普及,基于NAND闪存的文件系统YAFFS(Yet Another Flash File System)正逐渐被应用到各种嵌入式系统中。本文将详细阐述YAFFS文件系统在C51系统上的实现过程。 1 NAND Flash的特点 非易失性闪速存储器Flash具有速度快、成本低、密度大的特点,被广泛应用于嵌入式系统中。Flash存储器主要有NOR和NAND两种类型。NOR型比较适合存储程序代码;NAND型则可用作大容量数据存储。NAND闪存的存储单元为块和页。本文使用的Samsung公司的K9F5608包括2 048块,每一块又包括32页,一页大小为528字节,依次分为2个256
[单片机]
C51单片机计数器实验
实验要求 实现一个秒表显示器,具体的画一个MSC51单片机、2个八段数码管,运行后数码管依次显示00-59,循环显示,到59后跳变回。 必须用到中断,T0还是T1不限,方式0,1,2不限。 代码部分 #include reg51.h unsigned char code table ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char second=0; bit a=0; char t=0; int0_srv() interrupt 1{ t++; if(t==20){t=0;a=1;} TH0=0x3c; TL0=0xb
[单片机]
<font color='red'>C51</font>单片机计数器实验
C51按键识别,等待释放
#include reg51.h unsigned char val; unsigned char i,j,k; sbit k1=P3^4; void delayms(int ms) // 1ms { unsigned char i,j; for(;ms 0;ms--) for(i=6;i 0;i--) for(j=82;j 0;j--); } void main() { val=0xff; while(1) { if(k1==0) { delayms(10); if(k1==0) { P0=val; val--; } while(k1==0); //等待按键释放,要按信一直减,取消这一句即可 } }
[单片机]
c51 串口 波特率的计算
在串行通信中,收发双方对发送或接收的数据速率要有一定的约定,我们通过软件对MCS 51串行口编程可约定四种工作方式。其中,方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T溢出率决定。 串行口的四种工作方式对应着三种波特率。由于输人的移位时钟的来源不同,所以,各种方式的波特率计算公式也不同。 一、方式0的波特率 方式0时,移位时钟脉冲由56(即第6个状态周期,第12个节拍)给出,即每个机器周期产生一个移位时钟,发送或接收一位数据。所以,波特率为振荡频率的十二分之一,并不受 PCON寄存器中SMOD的影响,即: 方式0的波特率=fosc/12 三、方式l和方式3的波特率 方式1和方式3
[单片机]
<font color='red'>c51</font> 串口 波特率的计算
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved