您好,欢迎访问三七文档
单片机编程经验思路如下:1、首先,程序必须模块化。每个模块(子程序)执行一个功能。每个模块只有一个出口(RET)。2、设立一个模块(子程序)ID寄存器。'c6b3K*N!B'g8Z-I3、为每个子程序配置一个唯一的ID号码。(R4Nb!a7~+V6c4、每当子程序执行完毕,要返回(RET)之前,先将本子程序的ID号送入ID寄存器5、返回到上级程序后,先判断ID寄存器中的ID号。如果正确,则继续执行;如果不正确,则表示;Y4m1a1D4i*kPC指针有可能已经跳错了,子程序没有按预计的出口返回,这时将程序拦截到初始化段或程序错误处理段。这种方法,如同在程序中设立了若干个岗哨,每次调用子程序返回后,都要对口令(ID号),验明正身后再放行。再配合软件陷阱,基本上可以将大多数PC指针弹飞的现象检测到。到了程序错误处理段,要杀要剐(冷启动还是热启动)就由您了。仅以一条代码来揭示程序飞跑的本质!-S+W9Y_$\)_,k9_-A7f750102H;MOV01H,#02H如当前PC不是指向75H,而是指向01H或02H,那么51内的指令译码器将把她们忠实地翻译成AJMPXX01H或LJMPXXXXH而XX01HXXXXH又是什么呢?天知道!这样恶性飞跑下去那还不死定!改革一下:CLRA;0C4H,V*V2b)f;l,ZINCA;04HMOVR1,A;0F9H1{0F9D!I3Gi1_%X(p9^INCA;04HMOV@R1,A;86H每一字节代码都不能在生成跳转和循环,且都是单字节指令!往那跑去?跑出去了都要自己回来!“在家”千日好!“跳出”事事难嘛!这样只要平时习惯了用累加器和寄存器把数倒一倒,把那些危险代码都给倒掉,这样虽说给PC的“足”上多加了两字节的“包”9A#q5W#h.r:y'd4b可它不好“跑”啊!“足包”====跑!有朋友会问:要是PC抓做02H--LJMP又有抓做了老鼻子远的XXH,再抓做隔壁的YYH不就没用了吗?提这样的问题只有ZENYIN这种钻牛角得才会提!PC那一位最活跃啊?PC0啊!要“扯拐”显然发生在她身上,至于那PC15同志啊,睡得更死猪一样,雷爆(强干扰)来了都打不醒?此外如果干扰都强到了PC高位都出错的地步!关电!关电!不干了!“不是我们不行而是敌人太强大”!反过来要是敌人在你的专政下,只是偶尔出来捣捣乱,但一出来就冲到屁西(PC)高层,就要问问是不是你的王国根基(硬件)有问题了?而非出在意识形态(软件)上!硬件为本!软件为标!标本兼治铸就坚强体魄,方能百毒不侵!9I7aE0^3Q6J7q经验之二、不要轻信软件狗$Q'W;u6]$\,a+E)a关于软件狗的讨论,论坛上多矣。匠人也曾经查阅过许多关于软件狗的文章。有些大师确实提出了一些比较有技巧性的方法。但是,匠人的忠告是:不要轻信软件狗!其实,软件狗相当于软件的一种自律行为。一般的思路都是通过设立一个计数器,在计时中断中对其+1,在主程序的适当地方对其清零。如果程序失控了,清零指令未被执行,但中断造常发生,则计数器溢出(狗狗叫了)。但是这里有个问题:万一干扰导致中断被屏蔽了,那软件狗就永远不会叫了!——针对这种可能,有人提出在主程序中反复刷新中断使能标志,保证不让中断被屏蔽。——但万一程序飞到某个死循环中去了,不再执行“刷新中断使能标志”这一功能了,还是有可能把狗狗活活饿死。3Z%h*v3j$?4c3k,W所以,匠人的观点是:看门狗必须拥有独立的计数器。(即硬件看门狗)好在现在好多芯片都提供了内部WDT。这种狗都是自带计数器的。即使干扰导致程序失控,WDT还是会造常计数直到溢出。当然,匠人也没有要将软件狗一棍子全部打死的意思。毕竟不管是软狗还是硬狗,逮到耗子就是好狗嘛(狗拿耗子——多管闲事?)。如果哪位训狗专家确实养过一条能看门的好软件狗,请牵出来让大伙瞧瞧。$a*W-w7D5F7W2c6m9C6U(u:V#u0q.R%{)TFx经验之三、话说RAM冗余技术所谓的RAM冗余,就是:)S5u7iD4i/D%Dd1、将重要的数据信息备份2份(或以上)并存放在RAM中不同的区域(指地址不相连)。X.f,KF4F0[2、当平时对这些数据进行修改时,同时也更新备份'{2a;w!s6_!m5N3、当干扰发生并被拦截到“程序错误处理段”中时,将数据与备份做比较,采用表决方式(少数服从多数)选出正确(或可能正确?)的那个。0^8o1J#X!^.N4D4、备份越多,效果越好。(当然,你得有足够的存储空间)5、只备份最最原始的数据。中间变量(指那些可以从原始数据重新推导出来的数据)不必备份#X-U(m2B;iz注:!I-~'Z/x3~1、这种思路的理论依据,据说是源于一种“概率论”,即一个人被老婆打肿脸的概率是很大的,但如果他捂着脸去上班却发现全公司每个已婚男人的脸都青了,这种概率是很小的。同理,一个RAM寄存器数据被冲毁的概率是很大的,但地址不相连的多个RAM同时被冲毁的概率是很小的。2、前两年,小匠学徒时,用过一次这种方法,但效果不太理想。当时感觉可能是概率论在我这失*C7j7]2Fv)T%n4m-r效了?现在回想起来,可能是备份的时机选的不好。结果将已经冲毁的数据又备份进去了。这样以来,恢复出来的数据自然也就不对了。w#E(L3p)f'N$f0`:\/O'w.O经验之四、话说指令冗余技术^9J6N7L*P!u'?前面有个朋友问到指令冗余,按匠人的理解,指令冗余,就是动作冗余。!W1b1U-b1F0R3}(p举个例子,你要在某个输出口上输出一个高电平去驱动一个外部器件,你如果只送一次+Zd9X)y$X,O8o“1”,那么,当干扰来临时,这个“1”就有可能变成“0”了。正确的处理方式是,你定期刷新这个“1”。那么,即使偶然受了干扰,它也能恢复回来。除了I/O口动作的冗余,匠人强烈建议大家在下面各方面也采用这种方法:1、LCD的显示。有时,也许你会用一些LCD的专用驱动芯片(如HT1621),这种芯片有个好处,即你只要将显示数据传送给它,它就会不断的自动扫描LCD。但是,你千万不要以为这样就没你啥事了。正确的处理方式是,要记得定期刷新送显数据(即使显示内容没有改变)。对于CPU中自带LCDDRIVER的,也要定期刷新LCDRAM。2、中断使能标志的设置。不要以为你在程序初始化段将中断设置好就OK了。应该在主程序中适当的地方定期刷新一下,以免你的中断被挂起来。3、其它一些标志字和参数寄存器(包括你自己定义的),也要记得常常刷新。:G-q#Q5C%W1d4、其它一些你认为有必要反复刷新的地方。#E8c2{'_)V经验之五、10种软件滤波方法)q/q7S*R#L$c0N){下面奉献——匠人呕心沥血搜肠刮肚冥思苦想东拼西凑整理出来的10种软件滤波方法6I)w+j3e#I3B4o1、限幅滤波法(又称程序判断滤波法)-cy)R'J$bA、方法:#?:l#S#T7R2zz/]根据经验判断,确定两次采样允许的最大偏差值(设为A)每次检测到新值时判断:如果本次值与上次值之差=A,则本次值有效I-U'{+J;{8w'`,U如果本次值与上次值之差A,则本次值无效,放弃本次值,用上次值代替本次值;L,?:S8Q/d8j1oB、优点:能有效克服因偶然因素引起的脉冲干扰0j%q9p4}-f+m;M'f-R2LC、缺点无法抑制那种周期性的干扰v3B0N3B(_+U平滑度差4C(W9z;b7r8O$y:c5S2、中位值滤波法A、方法:V-X6V'~+L-G:a连续采样N次(N取奇数)G5i'M$y;`8u9w把N次采样值按大小排列取中间值为本次有效值,d5D9I#\)Y'yB、优点:7T$\3C4x%h*j能有效克服因偶然因素引起的波动干扰对温度、液位的变化缓慢的被测参数有良好的滤波效果C、缺点:对流量、速度等快速变化的参数不宜3、算术平均滤波法A、方法:连续取N个采样值进行算术平均运算N值较大时:信号平滑度较高,但灵敏度较低N值较小时:信号平滑度较低,但灵敏度较高N值的选取:一般流量,N=12;压力:N=4B、优点:适用于对一般具有随机干扰的信号进行滤波;d.xj'S(|*d这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动C、缺点:对于测量速度较慢或要求数据计算速度较快的实时控制不适用比较浪费RAM8b7u'g/B.h'[2E3p4w8v8P,[,A(t!B0m.~:R,P4、递推平均滤波法(又称滑动平均滤波法)A、方法:把连续取N个采样值看成一个队列队列的长度固定为N1kG-I2P2h1C*^每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)把队列中的N个数据进行算术平均运算,就可获得新的滤波结果N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4B、优点:对周期性干扰有良好的抑制作用,平滑度高适用于高频振荡的系统/T(o*z0}H-c8i6h!F!bC、缺点:灵敏度低+L8v8Z7O)[8s,[!J+b-G对偶然出现的脉冲性干扰的抑制作用较差不易消除由于脉冲干扰所引起的采样值偏差4t1p+q$v)i/H5W)v不适用于脉冲干扰比较严重的场合2x!Y'J*~-t0F'x;`比较浪费RAM;r2[(z#~%m!d3v+?-R5、中位值平均滤波法(又称防脉冲干扰平均滤波法)A、方法:;y.R5s1q1U/[$N相当于“中位值滤波法”+“算术平均滤波法”7V2^*j1s7u%F连续采样N个数据,去掉一个最大值和一个最小值然后计算N-2个数据的算术平均值)o'E'N5w*n6[N值的选取:3~14B、优点:(h0t.n9J(~7];m融合了两种滤波法的优点:x6bA8D?;r7e8L2s8B对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差C、缺点:$B5E;p;e3Zw测量速度较慢,和算术平均滤波法一样比较浪费RAM,WW:\)O#A;p7g/F'_:z(Z7N;~,C3F6、限幅平均滤波法A、方法:?*d8A%k(t+@相当于“限幅滤波法”+“递推平均滤波法”3a3U1H!JJ:k每次采样到的新数据先进行限幅处理,!z+m!M%m#a8k3C,i)o再送入队列进行递推平均滤波处理/H'd;_']1c!G*JB、优点:,d(W6I2m8}3|!u+`;k#K融合了两种滤波法的优点:FuaZ4q2m1f对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差q/jd1[&F%f*vC、缺点:8G/\3e*r1`7\(K比较浪费RAM7、一阶滞后滤波法A、方法:#R+y4`#d#g取a=0~1-Y$H;f#s.y+dQ5M本次滤波结果=(1-a)*本次采样值+a*上次滤波结果B、优点:6Y!B4K0A+A8J)T%Y/T1O/V对周期性干扰具有良好的抑制作用适用于波动频率较高的场合C、缺点:相位滞后,灵敏度低!e.h']2y8]5U滞后程度取决于a值大小*r!t;U:g$\+~不能消除滤波频率高于采样频率的1/2的干扰信号#m%G%EM.DI8、加权递推平均滤波法A、方法:4m,y0Uj1K%Q9])dM是对递推平均滤波法的改进,即不同时刻的数据加以不同的权通常是,越接近现时刻的数据,权取得越大。)h;A'A+`6X*X(m1A'R3M0m+h给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低B、优点:适用于有较大纯滞后时间常数的对象7X$V)s3l(U5H/W3s0\.s和采样周期较短的系统;a(}/N$B)lC、缺点:4l2O+S6p!y)U#sq9@.V对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号8Ti,P4[%X;g-C不能迅速反应系统当前所受干扰的严重程度,滤波效果差'g/O!?H-J2S9、消抖滤波法A、方法:设置一个滤波计数器`,gH%i8y1H*N7O将每次采样值与当前有效值比较:)B3m'lY:F&i如果采样值=当前有效值,则计数器清零如果采样值当前有效值,则计数器+1,并判断计数器是否=上限N(溢出)\%G%}#\@.E7p如果计数器溢出,则将本次值替换当前有效值,并清计数器4
本文标题:单片机编程经验
链接地址:https://www.777doc.com/doc-2594601 .html