打印
[程序源码]

单片机处这种数字比较大的取余和除法运算怎么处理?

[复制链接]
楼主: whirt_noob
手机看帖
扫描二维码
随时随地手机跟帖
21
tomzbj| | 2017-5-3 08:52 | 只看该作者 回帖奖励 |倒序浏览
别折腾595了, 一片TM1650解决问题.

使用特权

评论回复
22
dragon_hn| | 2017-5-3 09:40 | 只看该作者
不可能需要30ms.自己找找真实的原因吧

使用特权

评论回复
23
whirt_noob|  楼主 | 2017-5-3 09:59 | 只看该作者
dirtwillfly 发表于 2017-5-2 10:42
尽量用移位操作代替除法和取模。或者num不要用数字,直接用字符串来储存数字,显示的时候就方便了 ...

在数码管中显示数字不是还要把字符串再转换成数字吗?

使用特权

评论回复
24
whirt_noob|  楼主 | 2017-5-3 13:59 | 只看该作者
linqing171 发表于 2017-5-2 12:48
首先是这个运算不会有1ms,肯定不会有。你的代码其它地方有耗时的。
其次是你可以一次运算好,存起来,后面 ...

确实不会有30ms,部分代码是以前同事的,看了一下,温度采集用了很多的延时,以前不用数码管的时候没什么问题,现在要加上数码管,所以就有闪烁了,自己的代码也有问题,优化不够,多谢指点。以按照方面做优化了

使用特权

评论回复
25
whirt_noob|  楼主 | 2017-5-3 14:04 | 只看该作者
gx_huang 发表于 2017-5-2 12:55
应该用中间变量
uchar temp;
temp=num/100;

按照提示做了优化,另外问一下,像DS18B20这一类采集温度时间比较久的元器件,要怎么样处理程序中需要延时的部分?我把采集温度过程中的延时过程都用来刷新数码管,可还是有非常轻微的闪烁,不注意看看不出来,但是总归是不太好

使用特权

评论回复
26
whirt_noob|  楼主 | 2017-5-3 14:05 | 只看该作者
@若水 发表于 2017-5-2 13:14
STM8处理这点代码不可能用30ms的,肯定是其它代码占时间

确实是读取温度是占用了时间

使用特权

评论回复
27
whirt_noob|  楼主 | 2017-5-3 14:07 | 只看该作者
菜鸟同学 发表于 2017-5-2 14:30
30ms 这个你怎么测试出来的。

穷逼公司,毁我青春,拿着28元的逻辑分析仪测的

使用特权

评论回复
28
whirt_noob|  楼主 | 2017-5-3 14:07 | 只看该作者
ningling_21 发表于 2017-5-2 15:50
30ms 怎么测出来的

拿28块钱的逻辑分析仪测的

使用特权

评论回复
29
whirt_noob|  楼主 | 2017-5-3 14:09 | 只看该作者
jackhwang 发表于 2017-5-2 16:43
num=(u16)ucdata;
Thousand=num/1000;
Hundred=num%1000/100;

已改了原来的程序,谢谢了

使用特权

评论回复
30
whirt_noob|  楼主 | 2017-5-3 14:27 | 只看该作者
icecut 发表于 2017-5-2 17:45
没有除法可以用减法...还可以用比较,二分法,比如大于5000否,大于就减去,然后大于3000否,大于就减去,大于200 ...

版主果然厉害,方法多,思路广。

使用特权

评论回复
31
whirt_noob|  楼主 | 2017-5-3 14:29 | 只看该作者
宇容创行 发表于 2017-5-2 17:47
这是设计问题,和算法无关,算的再慢都不应该影响到显示

怎么处理采集温度时候的延时?虽然我把采集温度时候的延时用刷新数码管来代替,可还是有非常轻微的闪烁。

使用特权

评论回复
32
whirt_noob|  楼主 | 2017-5-3 14:30 | 只看该作者
ayb_ice 发表于 2017-5-2 18:56
stm8有除法指令,并且支持16位的,就算没有也不可能要30ms,除非你的时钟很慢,查找其它地方问题 ...

修改了温度采集部分,学习用STM8单片机需要学学汇编吗?一直用C

使用特权

评论回复
33
whirt_noob|  楼主 | 2017-5-3 14:32 | 只看该作者
JerryWu75 发表于 2017-5-2 19:39
LED刷新放到定时器中断中, 计算过程放到主循环中. 再作一个互斥锁.

你说的是设置一个标志,刷新数码管的时候不去计算,计算的时候不去刷新是吗?

使用特权

评论回复
34
gx_huang| | 2017-5-3 14:33 | 只看该作者
whirt_noob 发表于 2017-5-3 14:04
按照提示做了优化,另外问一下,像DS18B20这一类采集温度时间比较久的元器件,要怎么样处理程序中需要延 ...

这个需要程序架构的调整。
正常情况下,显示程序可以在定时器中断里运行显示,比如8个数码管,定时器中断周期设置为2.5ms,每进一次中断,显示一个数码管,显示完8个数码管大约20ms。那种主程序延时扫描的显示程序,注定是不好的,有多任务时,程序很难协调各个功能的。
至于温度采集,也可以在定时中断里运行,每进一次中断,计数累计一次,什么时候发什么指令,然后隔多久再读结果,全是中断程序执行。

使用特权

评论回复
35
whirt_noob|  楼主 | 2017-5-3 14:36 | 只看该作者
zyj9490 发表于 2017-5-2 21:06
这段代码完全可以优化,NUM%1000,可以作为中间变量进行保存,

已经优化了代码,多谢指点。

使用特权

评论回复
36
whirt_noob|  楼主 | 2017-5-3 14:40 | 只看该作者
tomzbj 发表于 2017-5-3 08:52
别折腾595了, 一片TM1650解决问题.

595便宜啊

使用特权

评论回复
37
whirt_noob|  楼主 | 2017-5-3 14:48 | 只看该作者
gx_huang 发表于 2017-5-3 14:33
这个需要程序架构的调整。
正常情况下,显示程序可以在定时器中断里运行显示,比如8个数码管,定时器中断 ...

我明白你的意思了,谢谢指点

使用特权

评论回复
38
whirt_noob|  楼主 | 2017-5-3 14:49 | 只看该作者
dragon_hn 发表于 2017-5-3 09:40
不可能需要30ms.自己找找真实的原因吧

已经找到原因了

使用特权

评论回复
39
fengfeng的恒| | 2017-5-3 16:13 | 只看该作者
把计算放到主函数,需要变化的时候才计算,保存每个数码管显示的数字;然后在中断里定时刷新显示就好了;多任务、延时长都不是问题。

使用特权

评论回复
40
菜鸟同学| | 2017-5-3 16:29 | 只看该作者
这个计算需要30ms我真的不信。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则