找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
楼主: Similarv
收起左侧

请工程化,定制化你的单片机代码

  [复制链接]
回帖奖励 40 黑币 回复本帖可获得 2 黑币奖励! 每人限 1 次
454473587 发表于 2019-7-28 11:09 | 显示全部楼层
谢谢楼主慷慨,很好的一篇文章,不过得慢慢消化,期待源码
回复

使用道具 举报

yasi666 发表于 2019-7-31 16:53 | 显示全部楼层
谢谢了,这位兄弟分享了他的编程精髓,看了之后很受教。我是一个初学者,万分感谢
回复

使用道具 举报

shenchaobiao 发表于 2019-7-31 21:08 | 显示全部楼层
好文,这是结合硬件实际的结构化编程思想、
回复

使用道具 举报

ccdmcu 发表于 2019-8-2 16:22 | 显示全部楼层
按键的松手检测呢?怎么用定时器写?
回复

使用道具 举报

难得糊涂2018 发表于 2019-8-2 18:55 | 显示全部楼层
学习了,你的想法好!
回复

使用道具 举报

上善若水001 发表于 2019-8-2 19:56 | 显示全部楼层
感谢发出这么好的文章,持续关注中!
回复

使用道具 举报

 楼主| Similarv 发表于 2019-8-2 20:36 | 显示全部楼层
ccdmcu 发表于 2019-8-2 16:22
按键的松手检测呢?怎么用定时器写?

我不是给了个keyPress()程序么,你再好好看看。
简单来说,有键按下时,时间就会++;
无键按下时,时间就会清零。
但在清零之前会先检查,时间是否大于0,时间值大于0(或者消抖值)说明曾经有键按下过,并且刚刚松开。这时候处理“这次按键”不就好了。
回复

使用道具 举报

泽文i 发表于 2019-8-5 10:34 | 显示全部楼层
将单片机程序工程化的好处,就在于后期升级和改进,将变得无比的方便。尤其是模块化以后,对相关的功能进行升级,只需要针对这一部分进行修改就可以。

回复

使用道具 举报

DJDN 发表于 2019-8-7 08:33 | 显示全部楼层
Mark      
回复

使用道具 举报

happynocn 发表于 2019-8-7 09:04 | 显示全部楼层
感谢分享,前来学习一下。
回复

使用道具 举报

鹏博士PBs 发表于 2019-8-7 10:14 | 显示全部楼层
不错不错 涨知识了
回复

使用道具 举报

laishu12345 发表于 2019-8-8 17:09 | 显示全部楼层
楼主的程序确实写得很好,思路清晰,比教材上的程序更实用
回复

使用道具 举报

252622979 发表于 2019-8-8 20:46 | 显示全部楼层
好文章,收藏了
回复

使用道具 举报

duanyazhou 发表于 2019-8-9 08:38 | 显示全部楼层
难得的良师
回复

使用道具 举报

zyi 发表于 2019-8-9 10:26 | 显示全部楼层
工程复杂用状态机方式编程,或上实时系统
回复

使用道具 举报

zcl1976 发表于 2019-8-9 12:09 | 显示全部楼层
文章不错,搞技术的多替客户想一点,肯定没错。忽悠是做不了长远的。
回复

使用道具 举报

tt98 发表于 2019-8-9 14:31 | 显示全部楼层
写得不错,后续有更深入的文章更好!
回复

使用道具 举报

a89588038 发表于 2019-8-9 14:38 | 显示全部楼层
持续关注,楼主厉害!!!!
回复

使用道具 举报

laishu12345 发表于 2019-8-9 17:08 | 显示全部楼层
if(++key_press_time <=0 ) --key_press_time;//计量按键时间,并避免数据溢出        楼主问个问题,key_press_time这个参数是无符号整型,++key_press_time 不会小于等于0吧!
回复

使用道具 举报

shenyuqiu 发表于 2019-8-10 10:38 | 显示全部楼层
楼主这文章比那些所谓的教科书好多了,那些教科书按键消抖动不动就是delay(20ms),真是误人子弟,真正出来做到大型项目才知道 DELAY是多么不实际。希望楼主继续更新,最好转成PDF,多点例程,尤其是一些按键的,短按,长按,双击组合键例程。现在绝大部份写按键程序都喜欢delay消抖,while松手检测。郭天详的书也是这么教的,一点不实用
回复

使用道具 举报

 楼主| Similarv 发表于 2019-8-12 11:46 | 显示全部楼层

确实不会“小于”0,但“等于”0是有可能的喔,所以这样写是没问题的。
至于为什么我写了“<=",而不是”==“呢?
理由是 —— 容错机制:
万一手残了,在定义key_press_time的时候忘记加了unsigned,我们的按键程序照样可以正常工作(只是计数最大值只有原来的一半了)
回复

使用道具 举报

我要打十个 发表于 2019-8-12 16:17 | 显示全部楼层
小黑屋525 发表于 2019-7-26 09:11
好文,最近师傅也这样子说太浪费单片机资源。

有师傅带真好
回复

使用道具 举报

苦瓜茶 发表于 2019-8-12 18:01 | 显示全部楼层
厉害,受教了
回复

使用道具 举报

awen_233 发表于 2019-8-13 10:19 | 显示全部楼层
感谢楼主,学到了很多东西
回复

使用道具 举报

笑豆 发表于 2019-8-14 08:03 | 显示全部楼层
学习了,谢谢
回复

使用道具 举报

IdeaMing 发表于 2019-8-14 10:27 | 显示全部楼层
我想问,怎么把DS18B20的加入到你这种机制里?一次通讯时间都要好几毫秒
回复

使用道具 举报

 楼主| Similarv 发表于 2019-8-14 14:12 | 显示全部楼层
本帖最后由 Similarv 于 2019-8-15 10:40 编辑
IdeaMing 发表于 2019-8-14 10:27
我想问,怎么把DS18B20的加入到你这种机制里?一次通讯时间都要好几毫秒

这个好说,把基础时基变成10ms(或者20ms),也就是定时器中断10ms(或者20ms)产生一次。
然后就是……
  1. unsigned char flag10ms=0,flag100ms=0;
  2. void t0Init()
  3. { /*略*/}
  4. void t0Xint() Interrupt n
  5. {
  6.     flag10ms = 1;//10ms产生一次中断
  7. }
复制代码



回复

使用道具 举报

yewuyue 发表于 2019-8-14 17:54 | 显示全部楼层
我们公司都有一个规范手持,每一行没错就是每一行代码都要写上注释,我看一下能不能弄出外网上传上来
回复

使用道具 举报

鹏博士PBs 发表于 2019-8-14 19:03 | 显示全部楼层
蛮清晰的 感谢分享
回复

使用道具 举报

1035510176 发表于 2019-8-15 11:00 | 显示全部楼层
好东西,学习到了
回复

使用道具 举报

IdeaMing 发表于 2019-8-16 16:25 | 显示全部楼层
Similarv 发表于 2019-8-14 14:12
这个好说,把基础时基变成10ms(或者20ms),也就是定时器中断10ms(或者20ms)产生一次。
然后就是…… ...

如果同时存在数码管的刷新呢,比如一秒读一次18B20,读的时候数码管的刷新就被卡了一下
回复

使用道具 举报

laishu12345 发表于 2019-8-18 09:31 | 显示全部楼层
感谢发出这么好的文章,持续关注中!
回复

使用道具 举报

zhike 发表于 2019-8-18 11:13 | 显示全部楼层
技术提升帖!收藏!等学到这里了再回来研究!
回复

使用道具 举报

liuyuanhui0 发表于 2019-8-18 16:28 | 显示全部楼层
不错学习了
回复

使用道具 举报

 楼主| Similarv 发表于 2019-8-19 01:00 来自手机 | 显示全部楼层
IdeaMing 发表于 2019-8-16 16:25
如果同时存在数码管的刷新呢,比如一秒读一次18B20,读的时候数码管的刷新就被卡了一下

我刚刚特意去查了一下,这玩意仅仅是个温度传感器,而且还特么是数字的,读一次温度居然至少要5Ms?!(还不确定是否会更久)
这样,如果你有示波器的话,请你做这么一个实验,把单片机某个端口设为输出,这个端口平时是低电平,然后用18b20读取温度之前拉高它,读取结束的时候又拉低它,然后用示波器好好的看看这个端口被拉高的时间,你就知道它每次采温需要多长时间了。再结合其他子程序的工作时长,设计你的时基。
其实,这种数字型温度传感器在我们实际做项目的人的眼里,只有华而不实四个字可以评价。如果我们的项目里需要测温,我们一般会采用内部自带adc模块的单片机,测温只要一个热敏电阻就可以搞定。整个测温的时间只需大约10us。不但更便宜,精度更好,效率还是你那个测温模块的500倍!具体方案这里就不赘述了。
回复

使用道具 举报

IdeaMing 发表于 2019-8-19 16:54 | 显示全部楼层
Similarv 发表于 2019-8-19 01:00
我刚刚特意去查了一下,这玩意仅仅是个温度传感器,而且还特么是数字的,读一次温度居然至少要5Ms?!( ...

18B20确实要很久,主要问题是它采用的单总线方式通讯速度慢。程序我也喜欢用你讲的这种所时间片轮方式(其实是当时大学师傅讲授的)。所以用到DS18B20的时候就改构架,有时候还不只一个DS18B20,很是头疼。
回复

使用道具 举报

zengcym 发表于 2019-8-21 18:00 | 显示全部楼层
学习了,编程思想非常重要
回复

使用道具 举报

到处走看 发表于 2019-10-4 09:48 | 显示全部楼层
关注中,期待楼主继续更新!
回复

使用道具 举报

qq1182560902 发表于 2019-10-8 23:36 | 显示全部楼层
学到了。感觉大佬
回复

使用道具 举报

wifingtta 发表于 2019-10-9 07:37 | 显示全部楼层
真得很好,一直想了解这方面的编程,以前自己的编程太笨,程序实时性不高,希望楼主能尽快做成PDF,让我们下载学习。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表