51 单片机 DIY 做 PLC 编程:实现净水机控制器的独特功能

而且其编程软件仍然是三菱的盗版软件,算了,再想办法把。而且还带着反汇编时候的行号,仅供参考了。逻辑,没有什么定时器,计数器功能的体现,哎!系统还是需要自己写了!本来就有两个定时器,无非多写一个串口中断服务程序就是了。小单片机就装不下了。软件仿真硬件运行也是不错的。

搜索结果中还有几篇论文,涉及到51单片机上实现PLC逻辑的内容,但那些论文都是摆设,只有很少的IO逻辑,也没有定时器、计数器功能。唉!仅供参考!看来这个PLC系统还是需要自己写一下了!OK!既然决定自己重写,那就开始吧!春节假期期间,我整理了如下ASM51汇编PLC代码: 代码主要结构如下: 1、IO定义部分: 根据所用单片机的IO口数量,可以任意指定I、O口有多少个,哪些引脚是I,哪些是O。本51系统中最多设计了32个I,32个O,占用64位寻址区域。 其实不需要这么多,也可以分配给其他需要的标志位,因为51系统总的可位寻址地址只有128位,需要精心分配。 2.可位寻址的变量定义(包括各种标志位,临时变量寄存器等)目前设计了8个定时器,Timer DN,Timer EN,共16位,8个计数器,计数器复位和计数器DN标志位,共16位,还有4对标志位专用于上升沿和下降沿检测,占用8位,其余用于临时变量,这些地址分配在这个变量定义区中,可以根据需要进行调整。 3.内存规划,包括堆栈区,定时器,计数器,累计值和预置值地址等的设置,目前初步定义8个计数器和8个定时器的当前计数值和预置值,共占用32个内存地址,也可以根据需要进行调整。 51单片机芯片内总共用户可用的内存地址包括堆栈区在内只有128个,除去位寻址区和堆栈区之后,估计可用的地址只有80个左右,但对于小程序来说应该够用了。

不需要增加扩展RAM的成本 4、上电初始化,包括0.01秒微定时器的设定,内存清除,中断的设定。如果要加串口功能也是可以的,51本来就有两个定时器,无非就是额外写一个串口中断服务程序。 5、写微定时器中断服务程序,每0.01秒单片机定时中断执行一次,刷新内存时基标志,提醒主程序相应时间到了。基本时基设计了0.01秒、0.1秒、1秒、10秒、1分、1小时、1天、1星期八个时间标志,其实真的没必要,不过自己写架构也挺好玩的,想设计多少就设计多少,哈哈! 6、下面是PLC主逻辑,是以连续扫描周期执行的,跟真正的PLC运行结构是一样的。 当然我们的编程就简单多了,没有那么多的功能。而且汇编语言的执行效率比C高,目前可以写出很多1K代码的汇编程序,但是如果用C写然后编译的话就会大很多,而且很多时候无法装在廉价的小单片机里。 7.扫描从定时器计数器的处理开始,如果某个定时器对应的时基标志位被设置,就处理对应的程序,对定时器的状态进行判断和设置,对计数器内存进行累加,对状态进行判断和设置,执行主要逻辑执行部分;对于计数器,主要是判断是否有计数器复位请求以及当前计数值是否等于预置值,并设置对应的标志位。 8.输入扫描,这部分很简单,只要把输入IO口复制到内存相应区域就可以了; 9.正式的逻辑执行:这部分直接基于梯形图行的概念,每一行梯形图行都是一段汇编代码,为了方便翻译,直接把逻辑用符号画在注释行里。

逻辑的翻译稍微有点技巧,实现了基本的IO输入、AND/N逻辑、定时器和计数器功能,加上上升沿和下降沿判断功能,这些基本的PLC功能在这个小架构中都能实现。虽然还不完善,比如定时器状态更新的时效性因为架构问题不能每次扫描都更新,上升沿和下降沿的判断需要更多的内存和语句等等,但对于简单的应用还是没问题的。 10 逻辑输出,这部分也很简单,只要把相应的逻辑运算结果输出到单片机的IO口就可以了。 11 后运算部分,也就是每次扫描运算完之后,还有余地输出其他需要的功能。这部分在真正的PLC中也是很重要的,要进行逻辑验证,远程通讯等功能,我们这里简化了,只是把一个内存变量加一,用来测试扫描时间,可以调用看看扫描周期时间是否超过最小定时器时间等辅助功能。 实测12M时钟在0.01秒内执行了这个小逻辑70多次!架构在那里,具体逻辑怎么写呢,最好是在PLC里写好先在模拟器上试着编程一下,等功能OK了再拷进我们的MCU里,一句一句的翻译。因为MCU汇编语言的调试还是很麻烦的,毕竟不直观,最好是在PLC模拟器里完成再搬进来。

在Keil中编译成HEX文件后,直接烧写到单片机中使用即可。实际使用前最好根据单片机的晶振时钟调整好微定时器的定时参数,尽量达到0.01秒的要求,不要偏差太大。还有一种方法就是用proteus软件模拟硬件运行,也是一个不错的办法。通过反复修改汇编程序,通过模拟测试,到现在为止我们只完成了PLC芯片逻辑的软件编写,现在就可以烧写到51内核的单片机中进行实际运行了。这里我采用的是STC的国产单片机,15W408系列,DIP20代替AT89C2051,可以多加几个IO引脚。 才几块钱,价格便宜,1T内核,性能强(之前写的0.01秒扫描70次是在仿真环境下,12T的89C2051达到的性能,如果用STC的1T系列的话,要注意实际运行速度会提升12倍,达到0.01秒扫描700次,有时候太快会出毛病,哈哈),IO可以设置强推挽,驱动力强,串口直接下载程序,编程方便,对于非专业应用来说,还是很适合DIYer来搞一些小东西的。使用STC专用下载线(才十几块钱,比其他芯片下载编程器便宜多了,甚至用5块钱的USB+TTL串口线也可以用,不过只需要手动断电一次,专用下载线有自动断电功能,下载更方便)下载到芯片里,得到一个带有程序的芯片。用面包板搭测试电路,实际验证逻辑功能。 如果逻辑不满意或时序不合适,可以回头修改程序,重新编译下载,直到满意为止。为了能够运用到实际环境中,还需要配备电源电路、输入按钮开关、输出驱动晶体管或继电器等硬件,以配合实际应用环境,发挥预期的作用。

在实际应用中,还是需要在抗干扰上花些功夫的。干扰来自以下几个方面:1、电磁阀运动时产生的电磁脉冲和反电动势,可以采用二极管作为续流来消除电磁阀断电时的反电动势脉冲。通过加光耦做输出隔离,也可以提高抗干扰性能;2、对于开关量输入通道,需要考虑单片机的输入电阻比较大,长线容易引入外界干扰,可以在输入脚加1K的上拉电阻来降低输入阻抗,达到抗干扰的目的;3、电源也是一个干扰源,因为大功率电机、电磁阀的动作会引起24V电源瞬间剧烈的波动,虽然单片机功耗不大,但是很容易因干扰而复位或者引起输入输出异常。 所以电源滤波也很重要,可用示波器观察电机或电磁阀运动时单片机5V电源的波动情况,通过加π型LC滤波,可大大降低电源带来的干扰。 4 还要考虑电磁辐射,最好给单片机控制板加一个金属外壳,并接地,以抵抗电机电磁阀或厨房电器等外界干扰。这也是我喜欢收藏金属糖果、蛋糕盒的原因,哈哈!对于DIY爱好者来说,有时候想法很好,测试成功,但实际安装后却失败了。这可能不是我们做的不好,而是其实我们没有考虑到复杂的工作环境。真正的产品比我们DIY的贵的主要原因就是实际工作现场的复杂性,真正的核心控制可能很简单,但周围的各种保护却很复杂,甚至连错误的接线都要考虑,成本和可靠性是成正比的。希望朋友们DIY愉快!

单片机

毕业设计的意义与优秀毕业设计的特点(精选 10 篇)

2024-6-9 3:08:07

单片机

PHY1_VDDIO 与 PHY2_VDDIO 开发板使用入门教程

2024-6-9 4:00:45

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索