51单片机定时中断导致主程序数码管显示出问题
程序功能为显示AD模块热敏电阻的电压值,并定时将电压值进行串口通信传输到串口调试助手。定时中断子程序实现定时串口通信,但导致主程序里的数码管显示效果出现问题,原本为动态常...
程序功能为显示AD模块热敏电阻的电压值,并定时将电压值进行串口通信传输到串口调试助手。定时中断子程序实现定时串口通信,但导致主程序里的数码管显示效果出现问题,原本为动态常显,加了中断后就变成了从左到右一位一位的点亮显示。并且显示完一边后有很大延时。
请高手分析 展开
请高手分析 展开
3个回答
展开全部
我猜你的串口发送用的是轮询等待发送结束的方式,而数码管动态扫描用的是软件延时(就是for循环)吧?、、
这样串口发送很占时间——你想,如果是9600baud的话,发一字节就要1ms左右。因此这个插入的发送数据的任务会让延时函数的延时时间比预定的长很久,动态扫描就连不起来了。
改善方法有3个:
1,最简单的,在通信可靠的前提下尽可能提高串口波特率,同时降低发送频率(就是增大定时器中断周期),再把要发送的数据弄少点,能用缩写的就别写一大串。。
2,串口发送改为中断方式,这个不细说了,网上有资料。。
3,舍弃数码管扫描的软件延时,改用硬件延时(就是把数码管的位的切换也放在定时器中断里完成),保证动态扫描的及时性。这叫单片机的“前后台”编程方式,相当于将动态扫描放在了“后台”,由定时器中断来触发,不触发则不占CPU时间。
这样串口发送很占时间——你想,如果是9600baud的话,发一字节就要1ms左右。因此这个插入的发送数据的任务会让延时函数的延时时间比预定的长很久,动态扫描就连不起来了。
改善方法有3个:
1,最简单的,在通信可靠的前提下尽可能提高串口波特率,同时降低发送频率(就是增大定时器中断周期),再把要发送的数据弄少点,能用缩写的就别写一大串。。
2,串口发送改为中断方式,这个不细说了,网上有资料。。
3,舍弃数码管扫描的软件延时,改用硬件延时(就是把数码管的位的切换也放在定时器中断里完成),保证动态扫描的及时性。这叫单片机的“前后台”编程方式,相当于将动态扫描放在了“后台”,由定时器中断来触发,不触发则不占CPU时间。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询