
你可以添加一个包装函数,
调用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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)