51单片机c语言延时函数 Void delay 1ms(unsigned int ms){un

51单片机c语言延时函数 Void delay 1ms(unsigned int ms){un,第1张

这个延时关键看使用的晶振多大,比如12M晶振for(j=0;j<120;j++);大概延时1毫秒,110592M晶振那么for(j=0;j<110;j++);延时1毫秒,你这里的for(j=0;j<100;j++);延时1毫秒的话,晶振应该是10M,不太常见哟,特别是在单片机方面。

你是用的uvision吧?我用的uvision4,把程序编好运行,然后进行调试(在此要设置两个断点就是一个在Delay延时函数之前,一个断点设在延时之后),然后你会在左边register栏会看见一个   sec:000014182  这个就是软件运行到断点处所用时间,然后再运行一次(这次就是运行完延时函数所用时间)。你把两次的时间做差值就是延时函数延时时间。再附图两张。

51单片机12M晶振延时1us,只需要执行一个NOP就是了。C语言中也是如此。

#include<reg51h>

#include<intrinsh>

main()

{

_nop_(); //延时1us

while(1);

}

你的这两个函数void delayms(uint)和void display(uchar,uchar,uchar,uchar)我可以肯定的告诉你,没有问题。你的这个程序其实就是想显示0000~5959之间的数,而且这个数是每20秒+1顺序递增的。之所以没有任何反应,那是你的主程序没有挂起,也就是在while(1)里没有没有大括号,程序执行一次就结束了,所以你什么都看不到。应该这样

while(1)

{//加入的成对大括号

for(thou=0;thou<=5;thou++) //千位

for(hun=0;hun<=9;hun++) //百位

for(ten=0;ten<=5;ten++) //十位

for(one=0;one<=9;one++) //个位

{

while(num!=20) //循环一秒

{

display(thou,hun,ten,one);//数码管显示四个数字

}

num=0;

}

}

这样你就可以看到程序运行的结果了,但结果是这样的:四个LED显示管闪得很严重,计划是一亮一灭的,而且0000~5959这个数字几乎显示得不成样子。主要是delayms(5),这个延迟程序你应该尽量控制在20ms之内(主要是人眼残辉的时间极限),短了感觉就全亮,长了就一闪一灭。

不过我很看不惯你的这个程序,我给你一个CPU负担更小,而显示又非常好的程序供你参考:

#include<AT89X52H>

#define uint unsigned int

#define uchar unsigned char

sbit LED4=P2^0; //数码管千分位

sbit LED3=P2^1; //数码管百分位

sbit LED2=P2^2; //数码管十分位

sbit LED1=P2^3; //数码管个分位

uchar ms20,s1;//20毫秒和1s变量定义(声明)

//定时器T0初始化,10ms秒初值

void InitTimer0(void)

{

TMOD=0x01;

TH0=0x0D8;

TL0=0x0F0;

EA=1;

ET0=1;

TR0=1;

}

void Display(uchar dat4,uchar dat3,uchar dat2,uchar dat1)

{

static uchar k;

P2=P2|0xf0;

switch(k++)

{

case 0:

P0=dat4;

LED4=1;

break;

case 1:

P0=dat3;

LED3=1;

break;

case 2:

P0=dat2;

LED2=1;

break;

case 3:

P0=dat1;

LED1=1;

break;

default:k=0;return;

}

}

void Timer0(void) interrupt 1//1ms中断

{

TH0=0x0D8;

TL0=0x0F0;

ms20++;

s1++;

}

void Main(void)

{

uchar thou,hun,ten,one;

InitTimer0();

while(1)

{

if(s1>=100)//每1秒钟one+1

{

s1=0;

if(one++>=9)

{

one=0;

if(ten++>=5)

{

ten=0;

if(hun++>=9)

{

hun=0;

if(thou++>=5) thou=0

}

}

}

}

if(ms20==2)//每20毫秒调用一次显示函数

{

Display(thou,hun,ten,one);

ms20=0;

}

}

}

j=t100;这一句了,如果把这一句给删了,那么你的程序就是延时100ms的,delay(10)就是延时一秒。为什么会延时一秒,那就要看你单片机的晶振是多大,以及程序的执行速度有关了,可以用仿真试试看

定义一个延时xms毫秒的延时函数

void delay(unsigned int xms) // xms代表需要延时的毫秒数

{

unsigned int x,y;

for(x=xms;x》0;x--)

for(y=110;y》0;y--);

}

使用:

void Delay10us(uchar Ms)

{

uchar data i;

for(;Ms》0;Ms--)

for(i=26;i》0;i--);

}

i=[(延时值-175)12/Ms-15]/4

扩展资料

1、在C51中进行精确的延时子程序设计时,尽量不要或少在延时子程序中定义局部变量,所有的延时子程序中变量通过有参函数传递。

2、在延时子程序设计时,采用dowhile,结构做循环体要比for结构做循环体好。

3、在延时子程序设计时,要进行循环体嵌套时,采用先内循环,再减减比先减减,再内循环要好。

以上就是关于51单片机c语言延时函数 Void delay 1ms(unsigned int ms){un全部的内容,包括:51单片机c语言延时函数 Void delay 1ms(unsigned int ms){un、单片机C语言编程关于延时函数、51单片机延时1us,12M晶振怎么用c语言写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9274598.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存