tag 标签: asm

相关博文
  • 热度 22
    2015-2-26 08:10
    5058 次阅读|
    12 个评论
    51 单片机 DIY 做 PLC 编程   有朋友想定制一个 净水机 控制器,有一些独特的功能要增加,但是商品控制板没有这样的功能,问我能否做一个,我觉得单片机完全能满足这种简单的控制需要,上手开始编程序时候突然感到,用 PLC 逻辑编这种功能是非常简单轻松的,而如果用汇编或 C 编却感觉 有点棘手,编程效率不高,所以想为何不在单片机上实现 PLC 的逻辑呢?   上网搜索 尝试看 能否找到合适的程序下载来稍微改改就能用的呢?方案几年前就有了,实际上是利用三菱的低档 PLC 编程软件编辑好梯形图,存盘后用专用的格式转换工具转换成 HEX 单片机烧写文件 烧进去,尝试下载三菱 PLC 工具软件,但是在我的 WIN7-64 位系统上不能正常工作,好容易换了系统装好开发工具,但是初次上手这款开发工具,界面挺复杂的,懒得研究各个按钮的使用,由于是单片机的硬件,对于程序的编制和转换有很多限制条件,否则是转换不成功的,嫌麻烦,放弃!   某宝倒是 有百元 PLC 板出售,但是为了这么个简单的东西专门买个全功能板子有点浪费,而且其编程软件仍然是三菱的盗版软件,算了,再想办法把。   由于工作中经常接触 PLC 程序,对其工作原理也略知一二,网上也有相关的说明介绍,其实就是三个主要步骤,第一步扫描 IO 输入,第二步执行逻辑,第三步输出逻辑到 IO ,很简单的,最早 PLC 也是用单片机实现的,我为何不用汇编在 51 上搭建一个架构,简单的逻辑编制进去就能运转呢?   其中逻辑执行步骤还是有点意思的,需要把 PLC 逻辑翻译成单片机的汇编语言执行,这块开始也没有把握,后来搜索到一篇百度文章,介绍了一下三菱 PLC 逻辑是如何翻译成汇编的,我看了 下估计 其实是利用反汇编工具把 HEX 反编译成的 ASM 代码,并不清晰明了,而且还带着反汇编时候的行号,仅供参考了。   搜索结果中也有几篇论文,涉及到在 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 个计数器的 counter reset 和 counter 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 输入 , 与或非逻辑 , 定时器以及计数器功能 , 外加上升沿下降 沿判断 等功能 , 这些基本的 PLC 功能都能在这个小架构里面实现 , 尽管不是十分完美例如定时器状态更新的时效性由于架构问题还不能达到每次扫描更新 , 对于上升下降沿的判断需要更多的内存和语句实现等等,但是对于简单的应用还是没有问题的 . 10 逻辑输出 , 这块也很简单 , 就是把对应的逻辑运算结果输出到单片机的 IO 口即可 . 11 后期操作部分 , 也就是每次扫描运算结束后还有余力进行其它需要功能的输出 , 这块在真正 PLC 里面也是很重要的 , 应该会进行逻辑效验 , 远程通讯等功能 , 咱这个就都简化掉了 , 仅仅为了测试扫描时间对一个内存变量进行增 一 操作而已 , 可以调用看看扫描周期时间是否超过了最小定时器时间等等辅助功能 . 实测 12M 时钟 0.01 秒执行了这个小逻辑多达 70 多遍 ! 架构有了,具体逻辑要怎么写,最好还是在 PLC 模拟器上先试着编写一下,功能没问题了再抄到我们的单片机里面来,进行逐句翻译,因为单片机汇编语言的调试还是很麻烦的,毕竟不直观,还是在 PLC 模拟器里面做好了再搬进来比较好。 Keil 里面编译成 HEX 文件后可以直接刷写进单片机使用了,真正 用之前 最好还是要根据单片机的晶振时钟,再调整一下微定时器的定时参数,尽量符合 0.01 秒的要求,不要偏差太大,还有一种方法是利用 proteus 软件仿真硬件运行也是不错的。 通过反复修改汇编程序 , 通过仿真测试到目前为止我们只是完成了 PLC 芯片逻辑的软件编写,下面就可以烧写进 51 内核的单片机内实际运行了 , 这里我使用的是 STC 的国产单片机 ,15W408 系列 ,DIP20 替换 AT89C2051 还能多增加几个 IO 脚 , 仅仅几元 , 价格便宜 ,1T 内核 , 性能强劲 ( 之前写的 0.01 秒扫描 70 多次是在仿真环境下 ,12T 的 89C 2051 达到的性能 , 如果使用 STC 的 1T 系列要注意实际运行速度会增加 12 倍 , 达到 0.01 秒扫 700 多次 , 有时候太快了也会引起烦恼呵呵 ),IO 可以设定为强推挽 , 驱动力强 , 串口直接下载程序 , 编程方便 , 对于非专业应用 , 给 DIYer 做点小东西还是很合适的 . 使用 STC 专用 下载线 ( 仅仅十几块 , 比别的芯片下载编程器可便宜多了 , 甚至使用 5 元的 USB 转 TTL 串口线也能用 , 只是需要手动断电一次而已 , 专用的 下载线 增加了自动断电功能 , 使下载更方便些 ) 下载进 芯片 , 得到一只 带程序 的芯片 . 利用面包板搭建测试电路实际验证逻辑功能 , 如果逻辑不满意或者定时时间不 合适还 可以回去修改程序 , 重新编译下装 , 直到满意为止 , 为了能够应用到实际环境中,还需要为它配上电源电路,输入按键开关,输出驱动三极管或继电器等硬件才能和实际的应用环境配合使用,发挥预想的作用。   实际应用中对于抗干扰还是需要花费一些心思的 , 干扰来自一下几个方面 : 1 电磁阀动作时候产生的电磁脉冲和反电动势 , 这个可以使用二极管做续流 , 来消除电磁阀断电反电动势脉冲 , 通过增加光 耦 进行输出隔离 , 也可以提高抗干扰性能 ; 2 对于开关输入通道要考虑单片机输入电阻是比较高的 , 长线容易引入外部干扰 , 这个问题可以通过在输入引脚外加 1K 上拉电阻的方法来降低输入阻抗 , 达到抗干扰的目的 ; 3 电源也是干扰源 , 因为大功率电机和电磁阀的动作都会造成 24V 电源的瞬间剧烈波动 , 尽管单片机的电源消耗 不大但是 很容易因干扰而复位或者造成输入输出不正常等现象 , 因此电源滤波也很重要 , 通过示波器可以观察到当电机或电磁阀动作时 , 单片机 5V 电源的波动情况 , 通过采取增加π型 LC 滤波 , 可以极大降低电源引起的干扰 . 4 电磁辐射也要考虑 , 单片机控制板本体最好增加金属外壳并接地 , 抵抗电机电磁阀或厨房用电设备的外部干扰 , 这就是为什么我喜欢收集金属糖果糕点盒的原因 , 呵呵 !   对于 DIYer 来讲 , 有时候想法挺好 , 试验也成功 , 但是实际装机后却失败了 , 这些可能不是我们做的不好 , 实际是没有考虑到复杂的工作环境 , 真正的产品为什么比我们 DIY 的成本高 , 其主要方面就是考虑的实际工作现场的复杂性 , 真正的核心控制可能很简单 , 但是周边的各种保护很复杂 , 甚至接错线了也要考虑到 , 成本和可靠性就成正比了 , 希望朋友们 DIY 快乐 !
  • 热度 43
    2012-9-24 16:07
    6991 次阅读|
    29 个评论
    张高工今年74了,退休后一直为一家私企做输油管道的防盗设备。 老先生年轻时玩的是TP801单板机,后来有了51单片机,把51ASM汇编指令可以倒背如流。 一个工具用顺手了,改用其他工具总是不得劲,C语言虽然方便,但老先生几十年来还是用汇编写程序。汇编语言写的程序效率非常高,驾驭感强,作者清楚每个资源是如何分配的,哪个中断的优先级更高,对时序的控制可以精确到一个指令周期。有幸看过老先生写的一段控制子程序,那个严谨、周到、精确令人拍手叫绝。 与老先生合作多年的私企老板去年春节应酬酒后心脏病突发走了,50岁留下未竟事业及妻儿撒手人间,公司家庭都瘫痪了。后来是老先生联系了朋友把这个公司买下了。 与张高工聊天,他没有其他爱好,也不喜欢带孙子,就喜欢待在实验室。老先生说话声音很大,底气足,从不失眠。只凭声音判断的话感觉也就50来岁。我见过许多与他同龄属牛的老人,退休后呆在家里,腿脚耳朵都不大好使了。 能不能说,搞硬件越老越有价值?搞硬件的人还长寿?  
相关资源
  • 所需E币: 4
    时间: 2019-12-26 00:24
    大小: 105.67KB
    上传者: 238112554_qq
    ARMBootloader的实现-C和ASM混合编程……
  • 所需E币: 5
    时间: 2019-12-26 00:21
    大小: 37.81KB
    上传者: 238112554_qq
    12864图形模块汉字显示驱动程序(C_and_ASM)……
  • 所需E币: 4
    时间: 2019-12-25 23:18
    大小: 12.58KB
    上传者: 二不过三
    UARTRS-232HyperTerminal(ASM)电源行业门户网站。内容有:行业资讯、求购信息、供应信息、求职招聘信息、中国人气最旺的电源技术论坛、技术文章等等。范围涉及:开关电源,稳压电源,充电电源,通信电源,模块电源,变频电源等。……
  • 所需E币: 5
    时间: 2019-12-25 16:32
    大小: 120.66KB
    上传者: wsu_w_hotmail.com
    ARMBootloader分析及源代码http://embedded.homeunix.orgARMBootloader的实现-------C和ASM混合编程GavinLiver0.1Tuesday,June03,2003CirrusLogic的clps7111~Ep9312系列ARMcore的CPU内置128字节的boot程序。这个boot程序为把操作系统下载到裸机提供了极大的方便。这样再焊接电路板之前不用把操作系统预先写入Flash,而且日后升级操作系统也非常方便。这个boot程序的功能是:1.设置串行口的参数为:9600,8N1,NoFlowControl。2.然后送出一个3.开始接收2K字节程序(Bootloader)4.送出一个>字符5.跳转去执行这2K的程序。烧写操作系统的过程是:1.连接ARMtarget的产性口和PC的串行口ARMPCRX-------------------TXTX-------------------RXGND----------------GND2.从BOOT程序引导ARMtarget3.在WindowsN……
  • 所需E币: 4
    时间: 2019-12-25 15:00
    大小: 15KB
    上传者: rdg1993
    Sample.indexAugust13,1999GENERAL:GeneralTopicsAPPS:SampleApplicationsFLOW.CFlowMeterMonitorPUMPS.CPumpControllerSEQ.CSequentialController(Costatement)SER_KEYS.CSerialKeys(VideoMultiplexerController)DC:DynamicCFAQ.DOCFrequentlyAskQuestionsEPROM.DOCNoteonEmbeddingCodeinEPROMHINTS.DOCDevelopmentHintsQUEUE.CCharacterQueueUtilitiesSTDIO.CRedirectSTDIOtoSerialPortZ0VSPRINTF.CVirtualsprintf(UtilityforCustomPrintfs)GENERAL\5KEY:5-KeyandFKFunctions5CHAR.CStringEditorfor5-KeyFKLONG.CLongIntegerItemforFKGENERAL\ADC:AnalogtoDigitalConversionFAQ.DOCFrequentlyAskQuestionsRANGE.CMeasureADCNoiseRange……
  • 所需E币: 5
    时间: 2019-12-25 12:17
    大小: 120.66KB
    上传者: quw431979_163.com
    armbootloaderhttp://embedded.homeunix.orgARMBootloader的实现-------C和ASM混合编程GavinLiver0.1Tuesday,June03,2003CirrusLogic的clps7111~Ep9312系列ARMcore的CPU内置128字节的boot程序。这个boot程序为把操作系统下载到裸机提供了极大的方便。这样再焊接电路板之前不用把操作系统预先写入Flash,而且日后升级操作系统也非常方便。这个boot程序的功能是:1.设置串行口的参数为:9600,8N1,NoFlowControl。2.然后送出一个3.开始接收2K字节程序(Bootloader)4.送出一个>字符5.跳转去执行这2K的程序。烧写操作系统的过程是:1.连接ARMtarget的产性口和PC的串行口ARMPCRX-------------------TXTX-------------------RXGND----------------GND2.从BOOT程序引导ARMtarget3.在WindowsN……
  • 所需E币: 5
    时间: 2019-12-25 12:07
    大小: 300.36KB
    上传者: 微风DS
    C与汇编混合编程……
  • 所需E币: 3
    时间: 2019-12-25 12:07
    大小: 135.18KB
    上传者: quw431979_163.com
    ASM编程……
  • 所需E币: 3
    时间: 2019-12-25 10:30
    大小: 6.43KB
    上传者: wsu_w_hotmail.com
    同步串口……
  • 所需E币: 4
    时间: 2019-12-25 10:30
    大小: 3.7KB
    上传者: quw431979_163.com
    定时器……
  • 所需E币: 4
    时间: 2019-12-25 10:30
    大小: 3.12KB
    上传者: givh79_163.com
    步进电机……
  • 所需E币: 3
    时间: 2019-12-25 10:22
    大小: 120.66KB
    上传者: 978461154_qq
    ARMBootloaderhttp://embedded.homeunix.orgARMBootloader的实现-------C和ASM混合编程GavinLiver0.1Tuesday,June03,2003CirrusLogic的clps7111~Ep9312系列ARMcore的CPU内置128字节的boot程序。这个boot程序为把操作系统下载到裸机提供了极大的方便。这样再焊接电路板之前不用把操作系统预先写入Flash,而且日后升级操作系统也非常方便。这个boot程序的功能是:1.设置串行口的参数为:9600,8N1,NoFlowControl。2.然后送出一个3.开始接收2K字节程序(Bootloader)4.送出一个>字符5.跳转去执行这2K的程序。烧写操作系统的过程是:1.连接ARMtarget的产性口和PC的串行口ARMPCRX-------------------TXTX-------------------RXGND----------------GND2.从BOOT程序引导ARMtarget3.在WindowsN……