在主程序中while(1)中调用了delay_ms(500)会使主程序变慢,如何解决?

在主程序中while(1)中调用了delay_ms(500)会使主程序变慢,如何解决?,第1张

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

中断和脊迹延时是不一样的,2个不同的概念。

中断是停止当前正执行的任务,转而去执行中断任务,等中断任务执行结束后继续回来执行当前正在运行的任务。中断程序要求尽可能的简洁越短越好(尤其是在多中断任务执行时),中断首先要开启中断源,初始化中断,樱歼并然后响应中断,从中断的入口地址处执行中断程序。

利用中断可以使程序执行效率高效,实现“一边。。。一边。。。”初始化中断源后主程序,就可以去干其他事情了。好比你一边洗衣服一边等电水壶水开一样:

先给电水壶装满水插上电源,然后去洗衣服,当水开鸣笛时,停下洗衣服去倒开水;然后装满冷水,继续烧水,再接着洗衣服等水开,倒水,装水,洗衣服。。。。重复这个循环。

而延时仅仅是主程序在执行的过程中不断调用的一段子程序。例如我们使用51单片机编写程序如下:

//主程序不断的调用延时程序DELAY,等待定时器T0产生定时中断

//芯片使用STC89C52单片机,工作于12T,12M晶振。

ORG0000H

LJMP START //系统复位入口地址

ORG000BH

LJMP T0_INTERRPUT //T0中断改仔子程序入口地址

ORG0030H //程序开始处

START:

MOV TMOD,#01H //定时器工作在16位定时模式

MOV TH0,#(65535-50000) / 255 //t0赋初值

MOV TL0,#(65535-50000) MOD 255

SETB TR0//启动定时器T0

SETB ET0//允许T0中断

SETB EA //开启系统总中断

LOOP:

LCALL DELAY //调用延时程序

SJMP LOOP

//主程序到此结束

//延时10MS

DELAY:

MOV R5,#20

D1: MOV R6,#20

D2: MOV R7,#248

DJNZ R7,$

DJNZ R6,D2

DJNZ R5,D1

RET //子程序返回

//t0定时中断子程序

//定时50ms

T0_INTERRPUT :

PUSH ACC //保护断点-入栈

PUSH PSW

PUSH DPH

PUSH DPL

MOV TH0,#(65536-50000) / 256//再次装如t0初值

MOV TL0,#(65536-50000) MOD 256

POP DPL//d出断点,先进后出

POP DPH

POP PSW

POP ACC

RETI //中断返回

END


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

原文地址: https://outofmemory.cn/yw/12310156.html

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

发表评论

登录后才能评论

评论列表(0条)

保存