50us的延时c语言函数 c语言中延时函数怎么计算

求单片机高手帮我逐句解释一下这个程序 谢谢了#includereg52.h //字头50us的延时c语言函数 , 表示如果涉及到50us的延时c语言函数的函数从这两个后缀名.H50us的延时c语言函数的文件里调用 。
#includeintrins.h
#define uchar unsigned char//方便定义函数无符号型应该用UCHAR表示为方便直接用CHAR表示了 。
#define uint unsigned int//整形同上解释
sbit clock=P1^0; //定义CLOCK接到单片机P0_1口 , 请注意这里用P0^1,就是因为包含了REG51.H 。如果不包含就不能这么使用 。
sbit d_in=P1^1;
sbit d_out=P1^2;
sbit _cs=P1^3;
//以下就是定义几个变量
uchar a1,b1,c1,d1;
float sum,sum1;
double sum_final1;
double sum_final;
//数码管定义段选和位选
uchar duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar wei[]={0xf7,0xfb,0xfd,0xfe};
void delay(unsigned char b)//50us延时函数,延时50US
{
unsigned char a;
for(;b0;b--)
for(a=22;a0;a--);
}
void display(uchar a,uchar b,uchar c,uchard)//定义显示函数,什么时候位选为1,什么时候段选为1.
{
P0=duan[a]|0x80;
P2=wei[0];
delay(5);
P2=0xff;
P0=duan[b];
P2=wei[1];
delay(5);
P2=0xff;
P0=duan[c];
P2=wei[2];
delay(5);
P2=0xff;
P0=duan[d];
P2=wei[3];
delay(5);
P2=0xff;
}
uint read(uchar port)//定义读取端口条件,
{
uchari,al=0,ah=0;
unsignedlong ad;
clock=0;
_cs=0;
port=4;
for(i=0;i4;i)
{
d_in=port0x80;
clock=1;
clock=0;
port=1;
}
d_in=0;
for(i=0;i8;i)
{
clock=1;
clock=0;
}
_cs=1;
delay(5);
_cs=0;
for(i=0;i4;i)
{
clock=1;
ah=1;
if(d_out)ah|=0x01;
clock=0;
}
for(i=0;i8;i)
{
clock=1;
al=1;
if(d_out)al|=0x01;
clock=0;
}
_cs=1;
ad=(uint)ah;
ad=8;
ad|=al;
return(ad);
}
void main()//主函数,此函数把前面50us的延时c语言函数的函数在这里循环调用,从而实现数码管显示
{
ucharj;
sum=0;sum1=0;
sum_final=0;
sum_final1=0;
while(1)
{
for(j=0;j128;j)
{
sum1 =read(1);
display(a1,b1,c1,d1);
}
sum=sum1/128;
sum1=0;
sum_final1=(sum/4095)*5;
sum_final=sum_final1*1000;
a1=(int)sum_final/1000;
b1=(int)sum_final00/100;
c1=(int)sum_final000/10;
【50us的延时c语言函数 c语言中延时函数怎么计算】d1=(int)sum_final;
display(a1,b1,c1,d1);
}
c语言延时的计算?这个跟50us的延时c语言函数的系统频率有关系 。看看你50us的延时c语言函数的晶振是多少 。另外还跟指令集有关系 。
精确的时间你可以反汇编一下看看有多少条指令50us的延时c语言函数,根据指令周期算算延时时间 。
c语言的延迟函数 编写C语言的延迟函数一般是利用无意义程序运行来控制时间从而达到延时的目的
举个例子:
for(i=0;ix;i)
for(j=0;j120;j);
这是延时x毫秒的for循环语句 。
值得注意的是记得最后的;一定得记得写 。
AT89C51的单片机,晶振是11.0592MHZ的,算延时,要有计算步骤 , 谢谢9: void delay_50us(uint t) //50us延迟函数
10: {
11:uchar j;
12:for(;t0;t--)
13:for(j=19;j0;j--);
14: }
C:0x0D45D3SETBC ;1
C:0x0D46EFMOVA,R7 ;1
C:0x0D479400SUBBA,#0x00 ;2
C:0x0D49EEMOVA,R6 ;1
C:0x0D4A9400SUBBA,#0x00 ;2
C:0x0D4C400BJCC:0D59 ;1
C:0x0D4E7D13MOVR5,#0x13 ;1
C:0x0D50DDFEDJNZR5,C:0D50 ;19*2=38
C:0x0D52EFMOVA,R7 ;1
C:0x0D531FDECR7 ;1
C:0x0D5470EFJNZdelay_50us(C:0D45) ;2
C:0x0D561EDECR6 ;1
C:0x0D5780ECSJMPdelay_50us(C:0D45) ;2
C:0x0D5922RET;2
这是KEIL反汇编出来50us的延时c语言函数的结果50us的延时c语言函数,可见总50us的延时c语言函数的机器周期=56
当晶振为11.0592M时50us的延时c语言函数,t=150us的延时c语言函数,那么实际延时时间=61us
求一个C语言的微秒级延时函数c语言50us的延时c语言函数,微秒级延时
void Delay_us (unsigned char time_us)
{
unsigned long intTM_LODAE;
TR2= 0;// Stop timer
TF2H= 0;// Clear timer overflow flag
TM_LODAE = 65535-(UINT)(SYSCLK/1000000) * (UINT)(time_us);
// TMR2= -( (UINT)(SYSCLK/1000000) * (UINT)(time_us) );
TMR2H =TM_LODAE8;
TMR2L =TM_LODAE0x00FF;
TR2= 1;// Start timer
while (!TF2H);// Wait till timer overflow occurs
TR2= 0;// Stop timer
}
程序分析:
前面一起住航分析一下该代码50us的延时c语言函数,
unsigned long intTM_LODAE;声明一个长整型数据50us的延时c语言函数,
TR2= 0;定时器2停止计时
TF2H= 0;清除定时器2中断标志
TM_LODAE = 65535-(UINT)(SYSCLK/1000000) * (UINT)(time_us);计算定时器初值 。SYSCLK是系统50us的延时c语言函数的晶振频率50us的延时c语言函数,SYSCLK/1000000是系统 1uS 执行的指令 。(UINT)(SYSCLK/1000000) * (UINT)(time_us)就是系统 time_us执行的指令数 。65535-(UINT)(SYSCLK/1000000) * (UINT)(time_us)定时器需要 TM_LODAE指令周期才会溢出 。
该单片机的一个指令周期就是一个时钟周期.TMR2H =TM_LODAE8;TMR2L =TM_LODAE0x00FF;置定时器寄存器的初值、
TR2= 1;启动单片机计时while (!TF2H);等待定时器2寄存器溢出 。TR2= 0;停止计时,在这段代码注释中已经说明了应该有50nS的误差,这个是函数调用产生的 。
51单片机用c语言怎么写延时函数?延时时间的计算与单片机的晶振频率有关 。若晶振频率为12Mhz50us的延时c语言函数,那么单片机每震动一次所需要的时间是1/12M s 。那么再来看看单片机执行一次自减所需要的振动次数是96次 , 假如我们对时间要求不是特别精确的话,可以约等于100来计算 。现在通过上面两个数据可以得出:单片机每执行一次自减所需要的时间是1/12M *100(s),即1/120000 s,逆向计算一下,每1ms需要自减多少次50us的延时c语言函数?120次对吧 。所以一个简单的延时功能就诞生了,我们只需要自减120次,就可以延时1ms,如果我们要延时50ms呢,那就自减50*120=6000次 。那么在程序上如何表达呢?我们可以用两套for循环
void delay(int i){
int x,y;
for(x=i;x0;x--){
for(y=120;y0;y--)
}
}
参数 i 代表该函数延时多少ms
关于50us的延时c语言函数和c语言中延时函数怎么计算的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读