delay_ms(500) 延长时间的添加方法

delay_ms(500) 延长时间的添加方法,第1张

你可以添加一个包装函数,

调用myDelay可以任意延迟:

void myDelay(int t)

{

    while(t)

    {

        if(t>500)

        {

            delay_ms(500);

            t-=500;

        }

        else

        {

            delay_ms(t);

            t=0;

        }

    }

}

主程序中调用了delay_ms(500),每执行一个循环,就会延时500毫秒,主程序肯定变慢,毋庸置疑的。要解决这个问题,可以用定时器延时来解决,怎么说呢,你这个延时500毫秒,肯定是为了某些控制对象的要求而用的,比如AD转换,比如测距等模块控制,为了达到既能500毫秒左右控制一次这些模块,又不影响主程序的执行速度,可以用定时器500毫秒生成一个标志位置1,当主程序检测到该标志位为1时就清除该标志,同时执行一次模块控制。这样就解决了控制与速度的矛盾问题。

void Delay500ms() //@6000MHz

{

unsigned char i, j, k;

i = 12;

j = 103;

k = 57;

do

{

do

{

while (--k);

} while (--j);

} while (--i);

}

下面是一个利用for循环控制一盏灯闪烁5次停止的C语言程序:

上述程序中,我们先利用两个嵌套的for循环控制灯的闪烁次数和每次闪烁的亮灭过程。其中外层循环控制闪烁的总次数为5次,内层循环控制灯的亮灭,在循环体中通过printf函数输出相应信息,并利用Sleep函数使程序暂停500毫秒以实现延时效果。

请注意,上述程序中使用了Windows系统下的conioh头文件和Sleep函数,如果在其他 *** 作系统或编译器上运行需要根据实际情况进行相应修改。

定时器其实就是单片机的一个内部自身时钟的计数器,每一个周期计数器加1,所以使用定时器功能时候先要给定时器付初值,就是先写TH0TL0的值(如下),写完初值后就等着定时器功能的那个计数器记满了数后也就是到了65536后就溢出了,所以一次定时的过程就是65536-初值 之间的数 所代表的时钟周期,计数满了溢出要产生中断就要写一个中断服务子程序,子程序如下void timer0() interrrupt X 中断服务子程序中还要给定时器计数器的TH TL付初值 进行下一次的计数,明白了吧。。楼上的那个没写interrupt 选择定时器工作方式。哎呀,妈呀 累死我了

void main()

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;//定时器0初值,定时50ms 定时多少MS就多少1000

EA=1;//开启总中断

ET0=1;//定时器0中断允许

TR0=1;//开启定时器0

while(1)

{

}

}

void timer0() interrrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

}

单片机汇编语言流水灯,用定时器中断控制,可以初始化设置定时器时间(如50mS注定时器最大定时时间到不了500mS,需要加计数存储,中断10就是500mS),有多种方式实现如作一个流水状态表,定时读取写入IO端口 表加一,,或者用左移太移等方式都可以实现在,网上有很多这种实例。

以上就是关于delay_ms(500) 延长时间的添加方法全部的内容,包括:delay_ms(500) 延长时间的添加方法、在主程序中while(1)中调用了delay_ms(500)会使主程序变慢,如何解决、51单片机 编译一条延时500ms的程序 要求fosc=6MHZ等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://www.54852.com/zz/9489358.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存