STC12系列单片机C语言的延时程序

合集下载

STC12系列单片机C语言的延时程序

STC12系列单片机C语言的延时程序

STC12系列单片机C语言的延时程序本举例所用CPU为STC12C5412系列12倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。

共有三条延时函数说明如下:函数调用分两级:一级是小于10US的延时,二级是大于10US的延时//====================小于10US的【用1US级延时】====================//----------微秒级延时---------for(i=X;i>;X;i--) 延时时间=(3+5*X)/12提示(单位us, X不能大于255)//================大于10US;0;Ms--)for(i=26;i>;0;i--);}i=[(延时值-1.75)*12/Ms-15]/4如想延时60US则i=[(60-1.75)*12/6-15]/4=25.375≈26; 修改i的值=26,再调用上面的【10US级延时函数】Delay10us(6); 则就精确延时60US;如果想延时64US可以用这二种函数组合来用:Delay10us(6); for(i=9;i>;X;i--) 共延时64US//==============对于大于20Ms的可用中断来实现程序运行比较好===============中断用定时器0, 1Ms中断:void timer0(void) interrupt 1{TL0=(0xffff-1000+2)%0x100;TH0=(0xffff-1000+2)/0x1 00; //每毫秒执行一次if(DelayMs_1>;0)DelayMs_1--;//大于20Ms延时程序}函数调用void DelayMs(uint a)//延时 a×1(ms)的时间。

{DelayMs_1=a;while(DelayMs_1);}如果延时50Ms则函数值为 DelayMs(50)。

单片机STC12C5A60S2控制AT24C04的程序(C语言)

单片机STC12C5A60S2控制AT24C04的程序(C语言)
**************************************/
void Delay5ms()
{
WORD n = 2500;
while(n--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
/**************************************
起始信号
**************************************/
void AT24C04_Start()
{
SDA = 1; //拉高数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 0; //产生下降沿
Delay5us(); //延时
SCL = 0; //拉低时钟线
SDA = 1; //产生上升沿
*******************************
发送应答信号
入口参数:ack(0:ACK 1:NAK)
**************************************/
void AT24C04_SendACK(bit ack)
{
SDA = ack; //写应答信号
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
/**************************************
接收应答信号
**************************************/

单片机·延时程序小结

单片机·延时程序小结

单片机·延时程序小结
在单片机实验中,有一个很重要也是很基本的子程序必须要求我们掌握,
那就是延时程序。

下面我凭记忆来讲解延时程序。

课本上讲,1 个机器周期=6 个状态周期=12 个时钟周期,而这个时钟周期与
晶振频率有关。

我们接下来要上的实验基本都是以12MHz 的晶振。

12M 的频率,得其周期为1/12 乘10 的-6 方s,那么1 个机器周期就是它的12 倍,即1us, 而一般语句需要2 个机器周期,例如
MOV R6,#20
DNJZ R6,$
每一次执行时,每一个过程就需要2 个机器周期,为1us 乘2。

.同样C 语言中for 循环语句没执行一次也是2 个机器周期,即2us。

下面我会以每个语句执
行一次用时的2us 为基本单位,不会再细化了。

汇编语言最基本延时:
MOV R6,#20
D1:MOV R7,#248
DNJZ R7,$//循环248 次,共用248X2us,
DNJZ R6,D1
我开始也是搞不懂怎么算它到底延时多少,现在给大家写它表达式:
我觉得应该从最后往前算,在MOR R7,#248 执行一次前提下,用时1X2us, 然后循环减248,用时248X2us,故共用时[2+2X248]us。

然而又由于DNJZ R6,D1,上面的过程又循环20 次,故上面的循环最终用时20X[2+2X248]us。

接着注意到单纯DNJZ R6,D1 会用时20X2=40us。

STC12延时函数的探究

STC12延时函数的探究

STC12延时函数的探究
这种写法是C中嵌套了汇编。

精确延时时间
=2*t*T+5*T,T为一个机器周期。

对于8051,
如果t=1,那么这个函数执行应该是7us。

如果是STC12,那么这个延时函数的延时应该是:若t=1,精确延时
=2*1*1/12+5*1/12=(7/12)us啊。

昨天也查了STC12手册手册上对时钟写的很笼统,其中一句话是:与8051指令执行时间对比,一共有12个指令,一个时钟就可以执行完成,工作在相同频率下运行速度
提高8~12倍
难道这里应该是(7/8)us?而不是(7/12)us?
这个是uint型函数时间是近似的
那么可以用延时时间=8*t*T
应该是8*1*(1/12)=8/12
根据程序分析猜想t=1时这个延时函数应该为1us最为合理。

用示波器测试过执行一个delay(5000)大约5.8ms。

51执行一个delay(5000)大约40064us
嗯,用示波器测得那个IO口的频率变化为85.47HZ,那
么一个delay(5000)就是(1/85.47)/2*1000=5850us
这里的t设的uint型,有误差,加上 LED=1;LED=0;执行也会消耗时间结果存在误差。

最后总结得出这条延时语句在51上执行一次大约花7us,在12上花1us。

示波器测试通过!和我计算符合。

STC12C5A60S2单片机c语言程序代码调试例程

STC12C5A60S2单片机c语言程序代码调试例程

//12T指的是每12个时钟加1与普通C51一样
//允许将P3.5/T1脚配置为定时器1的时钟输出CLKOUT1,只
能工作在定时器模式2下
//T1工作在1T模式时的输出频率 = SYSclk/(256-TH0)/2
//T1工作在12T模式时的输出频率 = SYSclk/12/(256-TH0)/2
//工作模式为1T
BRT = 0xff;
#if( Bus_clk == 12 )
CLK_DIV = 0x00;
#elif( Bus_clk == 6 )
CLK_DIV = 0x01;
#elif( Bus_clk == 3 )
CLK_DIV = 0x02;
#elif( Bus_clk == 1500 )
void Delay_ms( uint time )
{
uint t; //延时时间 = (time*1003+16)us while(time--)
{
for( t = 0; t < 82; t++ );
}
}
//***********************************//
//1T指的是每1个时钟加1,是普通C51的12倍
//12T指的是每12个时钟加1与普通C51一样
AUXR = 0xc0; //T0定时器速度是普通8051的12倍,即工作在1T模式下
//T1定时器速度是普通8051的12倍,即工作在1T模式下
TMOD = 0x22; //定时器0工作模式为方式2,自动装载时间常数
#define uchar unsigned char

单片机的延时与中断问题及解决方法

单片机的延时与中断问题及解决方法

单片机的延时与中断问题及解决方法概述在单片机的应用开发中,延时和中断是两个非常重要的概念。

延时是指在程序中暂停一段时间,而中断是指在程序执行过程中突然打断当前的执行流程去处理其他事务。

延时和中断的使用对于单片机的应用开发非常重要,合理的使用可以提高程序的效率和可靠性。

在实际开发中,延时和中断也经常会遇到一些问题。

本文将针对单片机的延时和中断问题进行分析,并提出相应的解决方法。

延时问题及解决方法延时是指在程序执行过程中暂停一段时间。

单片机中常用的延时方法有软件延时和硬件延时两种。

软件延时是通过在程序中执行循环来实现延时的。

例如:void delay(unsigned int time){while(time--);}硬件延时是通过单片机内部的定时器来实现延时的。

在51单片机中可以通过配置定时器的初值和工作模式来实现延时。

在实际开发中,延时经常会遇到一些问题。

延时时间不准确,延时过长或过短等。

造成这些问题的原因有很多,常见的原因包括系统时钟频率不准确、程序执行过程中被中断打断、延时中使用了未初始化的变量等。

为了解决这些问题,可以采取一些措施。

要确保系统时钟频率的准确性。

一般来说,单片机的延时是通过系统时钟来实现的,如果系统时钟频率不准确,那么延时时间也会不准确。

要确保系统时钟频率的准确性。

一种简单的方法是通过外部晶振来提供时钟信号,另一种方法是通过软件校准系统时钟频率。

要避免在延时中使用未初始化的变量。

在C语言中,未初始化的变量的值是不确定的,因此在延时中使用未初始化的变量可能会导致延时时间不准确。

在延时前要确保所使用的变量已经正确初始化。

要避免在延时中被中断打断。

在单片机的程序执行过程中,可能会发生各种中断事件,如果在延时中被中断打断,那么延时时间也会不准确。

为了避免这种情况,可以在延时前禁止所有中断,延时结束后再使能中断。

中断问题的解决方法主要包括中断优先级的设置、中断屏蔽和中断标志的清除。

中断优先级的设置是非常重要的。

单片机软件延时程序的设计

单片机软件延时程序的设计

单片机软件延时程序的设计一、单片机软件延时的基本原理单片机执行指令需要一定的时间,通过编写一系列无实际功能的指令循环,让单片机在这段时间内持续执行这些指令,从而实现延时的效果。

延时的时间长度取决于所使用的单片机型号、晶振频率以及所编写的指令数量和类型。

以常见的 51 单片机为例,假设其晶振频率为 12MHz,一个机器周期等于 12 个时钟周期,那么执行一条单周期指令的时间约为1μs。

通过编写一定数量的这种单周期指令的循环,就可以实现不同时长的延时。

二、软件延时程序的设计方法1、简单的空操作延时这是最基本的延时方法,通过使用空操作指令“NOP”来实现。

以下是一个简单的示例:```cvoid delay_nop(unsigned int n){unsigned int i;for (i = 0; i < n; i++){_nop_();}}```这种方法的延时时间较短,而且不太精确,因为实际的延时时间还会受到编译器优化等因素的影响。

2、基于循环的延时通过使用循环来执行一定数量的指令,从而实现较长时间的延时。

以下是一个基于循环的延时函数示例:```cvoid delay_ms(unsigned int ms){unsigned int i, j;for (i = 0; i < ms; i++){for (j = 0; j < 120; j++)_nop_();}}}```在这个示例中,通过内外两层循环来增加延时的时间。

需要注意的是,这里的循环次数是根据实验和估算得出的,实际的延时时间可能会有一定的偏差。

3、更精确的延时为了实现更精确的延时,可以根据单片机的机器周期和指令执行时间来精确计算延时的循环次数。

例如,对于12MHz 晶振的51 单片机,要实现 1ms 的延时,可以这样计算:1ms =1000μs,一个机器周期为1μs,执行一条指令需要 1 到 4 个机器周期。

假设平均每条指令需要 2 个机器周期,那么要实现1000μs的延时,大约需要执行 2000 条指令。

单片机C语言延时程序计算

单片机C语言延时程序计算

2 软件延时与时间计算
在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。下面介绍几种软件延时的方法。
2.1 短暂延时
可以在C文件中通过使用带_NOP_( )语句的函数实现,定义一系列不同的延
单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。
80us 1 1 48 0
90us 1 1 55 +0.5
}
延时时间 a的值 b的值 c的值 延时误差(us)
10us 1 1 1 -0.5
1ms 1 3 219 -1.5
2ms 2 3 220 +3
900us
9 1 63 -1.5
60us 1 1 35 +0.5
70us 1 1 42 +1
在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。
300us 3 1 63 +1.5

STC12单片机精确定时

STC12单片机精确定时

STC12C5A60S2单片机软件延时分类全部都是本人通过示波器反复测量得到1~255倍内精确延时。

误差绝对不会超过5%。

仅限STC12系列的单片机,如需传统51单片机软件延时,请自己计算。

本延时仅限运用在stc12系列单片机上,仅限11.0592mhz。

100us以上的延时可以根据晶振的倍数扩大或缩小循环倍数,以得到相应的延时。

100us以下需改动需要重新测算。

void delay1s(unsigned char n){unsigned char i,j,k;for(;n>0;n--)for(i=83;i>0;i--)for(j=202;j>0;j--)for(k=162;k>0;k--);}void delay500ms(unsigned char n){unsigned char i,j,k;for(;n>0;n--)for(i=83;i>0;i--)for(j=202;j>0;j--)for(k=81;k>0;k--);}void delay100ms(unsigned char n){unsigned char i,j,k;for(;n>0;n--)for(i=83;i>0;i--)for(j=40;j>0;j--)for(k=82;k>0;k--);}void delay10ms(unsigned char n){unsigned char i,k;for(;n>0;n--)for(i=169;i>0;i--)for(k=162;k>0;k--);}void delay1ms(unsigned char n) {unsigned char i,k;for(;n>0;n--)for(i=167;i>0;i--)for(k=15;k>0;k--);}void delay140us(unsigned char n) {unsigned char i,k;for(;n>0;n--)for(i=17;i>0;i--)for(k=21;k>0;k--);}void delay100us(unsigned char n) {unsigned char i,k;for(;n>0;n--)for(i=17;i>0;i--)for(k=15;k>0;k--);}void delay10us(){unsigned char i;for(i=23;i>0;i--);}void delay5us(){unsigned char i;for(i=9;i>0;i--);}#define delay1us(); {_nop_();_nop_();_nop_();_nop_();};。

STC12系列单片机的延时方法

STC12系列单片机的延时方法
要使用示波器确定延时时间(比较精确)
一、如何用示波器来测定延时程序的执行时间?
方法如下:编写一个实现延时的函数,在该函数的开始置某个 I/O 口线如 P1.0为高电平,在函数的最后清 P1.0为低电平。在主程序中循环调用该延时函 数,通过示波器测量 P1.0引脚上的高电平时间即可确定延时函数的执行时间。 方法如下: 示例程序: #include<STC12C5A60S2.H> void DelayTimer_10ms(unsigned int DelayValue); sbit LED = P1^0; int main() {
/*
51 单片机的 b 数值为:1827
STC12 系列单片机的延时误差有点大。
*/
void DelayTimer_10ms(unsigned int DelayValue)
{
unsigned int a,b;
for(a = 0;a < DelayValue; a++)
{
for(b = 0; b < 10015; b++);
for(b = 0; b < 10015; b++); } }
把 P1.0接入示波器,运行上面的程序,可以看到 P1.0输出的波形为周期是3 0ms 的方波。其中,高电平为20ms,低电平为10ms,也可以不用 for 循环而用别 的语句实现延时。这里讨论的只是确定延时的方法。
二、针对 STC12系列单片机调试的延时,误差相对较小
}
}
/*
针对 STC12C5A60S2 系列单片机的延时,速度比 51 单片机快 5 倍左右,误差比较小
*/
void DelayTimer_1ms(unsigned int DelayValue)

关于单片机C语言的精确延时

关于单片机C语言的精确延时
一、函数调用分两级:一级是小于10US的延时,二级是大于10US的延时 //====================小于10US的【用1US级延时】==================== //----------微秒级延时--------for(i=X;i>0;i--) 延时时间=(3+5*X)/12 提示(单位us, X不能大于255)
for(i = 0; i < 600; i++); } } /********************************************************************************************
/******************************************************************************************** void main (void){ //主程序 while(1){
LED = ~LED; //取LED相反状态 DELAY_MS(1000); //修改这里的数值看看会有什么变化 }
} /******************************************************************************************** - 应用实例
可将其模板下载到本地硬盘,在编写新程序的时候复制、粘贴到工程当 中,然后根据情况写入具体内容。
- 使用说明
data unsigned char cou = 0; // 定义软计数器,放在程序最前面的寄存 器定义部分
/********************************************************************************************

单片机延时程序实验解析

单片机延时程序实验解析

实验一:单片机延时程序实验一、实验目的与要求:由于发光管亮灭变化频率为4Mhz,无法观察到LED0的闪烁,而是以较低的亮度保持LED0常亮,要求加入延时子程序能够看到LED0的闪烁。

二、实验内容:1.硬件电路设计:PIC单片机的绝大部分引脚作为输出I/O端口时,能够提供25mA的电流,因此,本实验直接用PORTD的8个I/O端口驱动连接了限流电阻的发光二极管即可。

为了TMR0定时计算方便,采用4MHz的外部晶体振荡器作为单片机的系统时钟,这样未经过预分频的TMR0内部计数时钟周期,就是指令周期1微秒。

2.软件设计思路:①将小试牛刀出的实验运行得到结果代码如下:#INCLUDE "P16F877A.INC";ORG 0000H;NOP;BSF STATUS,5;CLRF TRISDBCF STATUS,5;CLRF PORTD;LOOPBCF PORTD,0;BSF PORTD,0;GOTO LOOP;END②加入延时子程序后继续调试得到结果代码如下:#include P16F877A.inci EQU 20H ;定义寄存器ij EQU 21H ;定义寄存器jORG 0000H;NOP;BSF STATUS,5;CLRF TRISDBCF STATUS,5;CLRF PORTD;LOOPBCF PORTD,0;CALL DELAYBSF PORTD,0;CALL DELAYGOTO LOOP;DELAYMOVLW D'131' ;设置外部循环次数MOVWF i ;LOOP1MOVLW D'50' ;设置内部循环次数MOVWF j ;LOOP2DECFSZ j ,f ;内部循环变量自减1,GOTO LOOP2 ;为0则跳转DECFSZ i,f ;外部循环变量自减1,GOTO LOOP1 ;为0则跳转RETURN ;返回主程序END三、实验步骤及结果:①将小试牛刀实验在MPLAB IDE v8.8的软件中编译成功;②配置单片机的基本工作方式,由于PIC16F877A振荡器为4MHz,所以把处理器频率设置为4MHz;③完成configure菜单下的configure bits菜单项,逐一设置窗口中提供的单片机配置④连接ICD3和实验套件相连,将ICD3和PC机用USB电缆线连接。

单片机的C语言延时程序

单片机的C语言延时程序

单片机C语言环境延时程序设计东北电力学院(132012)盛文利摘要:讨论运用C语言的单片机开发中,对于时序要求苛刻的延时的开发过程。

实例说明在高级语言中,严格控制时序的可能性和注意事项。

关键词:单片机C语言编译器现在单片机的开发中,C语言以其方便、灵活、逻辑性强、易于维护和可移植性好等强大优势,占据了单片机开发的主要地位。

过去,由于单片机C 语言本身存在的缺陷,加之单片机工程本身都不大,C语言在单片机中的应用没有被重视。

在C语言环境下,我们只需关心程序的逻辑关系,实现细节由编译器完成,这给我们快速开发提供了条件,也大大减小了开发工作量。

但同时实现细节就不被控制了,这个问题对于经常重视实现细节的单片机,就必须得到解决。

好在一般的C语言编译器都提供嵌入汇编、与汇编互调用和汇编级的代码察看等功能。

现以KEIL C51[1]下的一线总线器件程序开发为例,说明我的解决方法。

1 一线总线协议器件一线总线协议(1 wire bus protocol)也叫做单总线协议,是单总线器件数据传输协议。

因为数据(也可以包括电源)都由一条线来传输,没有辅助的数据同步信号,这时就只能由时序来解析协议内容。

这样就只有依靠对时序的严格要求,来保障数据传输的准确性。

单总线协议的信号主要有:初始化时序,包括复位脉冲和在线脉冲,是主机与器件的联络信号。

然后是读、写时序。

单总线器件完全依靠对线上的时序来做出响应,这些有效的时序称作时隙,也有称作时间片的,是同一词汇的不同翻译[2]。

初始化时序时间裕度大,容易实现。

读写脉冲对时序要求相对严格,尤其在慢速的MCS-51下,指令的运行在微妙级,而读写时序在15微秒的后小部分,大约4微秒,不同批次的芯片会有少许差距。

有的会允许你的时序有少许误差,有的则非常严格。

2 C语言编译器在用汇编语言编写的程序时,很容易控制时间,因为我们知道每条语句的执行时间,每段宏的执行时间,每段子程序加调用语句所消耗的时间。

单片机C语言的延时计算

单片机C语言的延时计算

标准的C语言中没有空语句。

但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果。

这在汇编语言中很容易实现,写几个nop就行了。

在keil C51中,直接调用库函数:#include<intrins.h> // 声明了void _nop_(void);_nop_(); // 产生一条NOP指令作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP 指令,延时几微秒。

NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。

对于延时比较长的,要求在大于10us,采用C51中的循环语句来实现。

在选择C51中循环语句时,要注意以下几个问题第一、定义的C51中循环变量,尽量采用无符号字符型变量。

第二、在FOR循环语句中,尽量采用变量减减来做循环。

第三、在do…while,while语句中,循环体内变量也采用减减方法。

这因为在C51编译器中,对不同的循环方法,采用不同的指令来完成的。

下面举例说明:unsigned char I;for(i=0;i<255;i++);unsigned char I;for(i=255;i>0;i--);其中,第二个循环语句C51编译后,就用DJNZ指令来完成,相当于如下指令:MOV09H,#0FFHLOOP:DJNZ09H,LOOP指令相当简洁,也很好计算精确的延时时间。

同样对do…while,while循环语句中,也是如此例:unsigned char n;n=255;do{n--}while(n);或n=255;while(n){n--};这两个循环语句经过C51编译之后,形成DJNZ来完成的方法,故其精确时间的计算也很方便。

其三:对于要求精确延时时间更长,这时就要采用循环嵌套的方法来实现,因此,循环嵌套的方法常用于达到ms级的延时。

对于循环语句同样可以采用for,do…while,while结构来完成,每个循环体内的变量仍然采用无符号字符变量。

单片机写延时程序的几种方法

单片机写延时程序的几种方法

单片机写延时程序的几种方法1)空操作延時 (12MHz)void delay10us(){_NOP_();_NOP_();_NOP_();_NOP_();_NOP_();_NOP_();}2)循環延時 (12MHz)Void delay500ms(){unsigned char i,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for(k=81;k>0;k--);}延時總時間=[(k*2+3)*j+3]*i+5k*2+3=165 us165*j+3=33333 us33333*i+5=500000 us=500 ms3)計時器中斷延時(工作方式2) (12MHz)#include<reg52.h>sbit led=P1^0;unsigned int num=0; void main(){TMOD=0x02;TH0=6;TL0=6;EA=1;ET0=1;TR0=1;while(1){if(num==4000){num=0;led=~led;}}}void T0_time() interrupt 1 {num++;}4)C程序嵌入組合語言延時#pragma asm……組合語言程序段……#pragma endasmKEIL軟件仿真測量延時程序延時時間這是前段事件總結之延時程序、由於不懂組合語言,故NO.4無程序。

希望對你有幫助對於12MHz晶振,機器周期為1uS,在執行該for循環延時程式的時候Void delay500ms(){unsigned char i,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for(k=81;k>0;k--);}賦值需要1個機器周期,跳轉需要2個機器周期,執行一次for循環的空操作需要2個機器周期,那么,對於第三階循環for(k=81;k>0;k--);,從第二階跳轉到第三階需要2機器周期,賦值需要1個機器周期,執行81次則需要2*81個機器周期,執行一次二階for循環的事件為81*2+1+2;執行了220次,則(81*2+3)*220+3,執行15次一階循環,則[(81*2+3)*220+3]*15,由於不需要從上階跳往下階,則只加賦值的一個機器周期,另外進入該延時子函數和跳出該函數均需要2個機器周期,故還需要+5。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STC12系列单片机C语言的延时程序
本举例所用CPU 为STC12C5412 系列12 倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。

共有三条延时函数说明如下:函数调用
分两级:一级是小于10US 的延时,二级是大于10US 的延时
//====================小于10US 的【用1US 级延时】
====================//----------微秒级延时---------for(i=X;i>X;i--) 延时时间
=(3+5*X)/12 提示(单位us, X 不能大于255)//================大于10US0;Ms--)for(i=26;i>0;i--);}i=[(延时值-1.75)*12/Ms-15]/4 如想延时60US 则
i=[(60-1.75)*12/6-15]/4=25.375&asymp;26; 修改i 的值=26,再调用上面的【10US 级延时函数】Delay10us(6); 则就精确延时60US;如果想延时64US 可以用这二种函数组合来用: Delay10us(6); for(i=9;i>X;i--) 共延时64US//============== 对于大于20Ms 的可用中断来实现程序运行比较好===============中断用定
时器0, 1Ms 中断:void timer0(void) interrupt 1{ TL0=(0xffff-1000+2)% 0x100;TH0=(0xffff-1000+2)/0x100; //每毫秒执行一次if(DelayMs_1>0) DelayMs_1--;//大于20Ms 延时程序}函数调用void DelayMs(uint a)//延时 a 乘以1(ms)的时间。

{ DelayMs_1=a; while(DelayMs_1);}如果延时50Ms 则函数值为DelayMs(50)tips:感谢大家的阅读,本文由我司收集整编。

仅供参阅!。

相关文档
最新文档