51系列单片机软件应用技巧数例.doc_第1页
51系列单片机软件应用技巧数例.doc_第2页
51系列单片机软件应用技巧数例.doc_第3页
51系列单片机软件应用技巧数例.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

51系列单片机软件应用技巧数例吕 群 周绍平(扬州职业大学,江苏 扬州 225012)摘 要:随着电子产品智能化的发展,单片机在电子产品中的作用越来越重要。为了提高产品的性价比,设计人员努力在降低产品的硬件成本,同时不断地提高软件的设计水平。51系列单片机有三种实用的编程技巧和方法值得介绍:多字节减1和减1非零跳转处理方法、消除定时器方式1积累误差的方法及状态检测中消除干扰及延时控制的方法。关键词:单片机 编程技巧 最优控制Several Cases of 51 Series SCM Software Application SkillsLv Qun Zhou Shaoping(Yangzhou Technical Institute, Yangzhou225012, Jiangsu)Abstract: With the intelligentizing development of electron, SCM is becoming more important. In order to improve products, designers are working hard to decrease products hardware cost, meanwhile, increasing software designing. 51 series SCM has 3 practical programming techniques and methods to introduce: more bytes minus 1 and minus 1 non-zero transfer of control procedures; eliminate the accumulated error in Timer of Way1; interfere elimination and delayed control method in condition examination.Key Words: SCM; programming skills; optimal control随着电子产品智能化的发展,单片机在电子产品中的作用越来越重要。为了提高产品的性价比,设计人员努力在降低产品的硬件成本,同时不断地提高软件的设计水平。在单片机应用过程中,设计一个功能达标、字节数少、同时可靠性及抗干扰性强的软件是广大工程技术人员一直在孜孜不倦追求的目标。笔者在多年的产品设计中,总结了一些51系列单片机软件应用技巧,现选几例介绍如下,与读者共同探讨。1 多字节减1和减1非零跳转处理方法51系列单片机指令集中有加1指令如INC A,INC Rn,INC direct,INC Ri 和INC DPTR,其中前面四条为8位二进制数即一个字节,第五条为16位二进制数即两个字节,同时指令集中有减1指令如DEC A,DEC Rn,DEC direct和DEC Ri 共四条,但这四条全是8位二进制数,即一个字节,若程序中有两个以上字节数需进行减1运算,或者当循环次数超过256次时,采用DJNZ direct,rel 就无法进行循环控制。这时可采用借位减法实现,但程序就显得冗长,且占用其它资源。1.1 多字节减1处理程序先看二字节减1程序,设此二字节数存放于DY1和DY2单元中。方法一:MOV A,DY1 ;低字节数送累加器A CLR C ;进位位清零 SUBB A,#01H ;低字节数带借位位减1 MOV DY1,A ;结果送回DY1 MOV A,DY2 ;高字节数送累加器A SUBB A,#00H ;高字节数减去借位位 MOV DY2, A ;结果送回DY2方法二:INC DY1 ;低字节数加1 DJNZ DY1,LP1 ;低字节数减1不为零转LP1 DEC DY2 ;高字节数减1 LP1:DEC DY1 ;低字节数减1方法一是采用借位减法实现减1功能,方法二的前面两条指令是先对DY1进行判零检查,若是零此时减1 就要产生借位,于是把高字节数减1,若不为零就直接转到减1 指令。方法一和方法二比较:同样的功能,方法二比方法一少了三条指令,目标程序少了四个字节。更重要的是方法二:不占用累加器A和标志寄存器PSW;解决了DPTR无减1功能的缺点。方法二也可用在三字节数减1程序中。 INC DY1 ;DY1非零判别 DJNZ DY1,LP1 ; INC DY2 ;DY2非零判别 DJNZ DY2,LP2 ; DEC DY3 ;LP2:DEC DY2 ;LP1:DEC DY1 ;1.2 多字节减1非零转移程序设计一个二字节减1非零转移程序,循环控制变量低字节存DY1,高字节存DY2。MOV DY1,#XXH ;低字节赋值MOV DY2,#YYH ;高字节赋值 LOOP: ;循环体 ; 循环体 ;循环体DJNZ DY1,LOOP ;低字节数减1不为零返回DJNZ DY2,LOOP ;高字节数减1不为零返回这不是循环嵌套,而是高低字节共同控制循环。在预置初值时要注意:当低字节数值不为零时高字节要比原定数加1,低字节数为零时不加1,这是因为只有当低字节数减1为零时才进入高字节减1判断,而高字节一旦减1 为零就不再进入循环,比实际的循环次数少了256次,因此高字节设置初值必须加1。而当DY1初值为零时进入减1判零后为FFH,和实际的循环次数相同,故DY2无须加1。同样,可用在三字节减1非零转移程序: MOV DY1,#XXH MOV DY2,#YYH MOV DY3,#ZZH LOOP: DJNZ DY1,LOOPDJNZ DY2,LOOPDJNZ DY3,LOOP由此也可推广到三个以上字节减1非零转移程序。在给循环变量赋值时要注意:相邻的两字节中低字节数不为零时,高字节数须加1;低字节数为零时,高字节不加1,从低字节向高字节依次类推。2 定时器方式1的误差及处理定时/计数器方式1由THx和TLx组成16位计数器,计时/计数脉冲从TLx低位输入,计数每溢出一次,THx计数器加1。当16位由全“1”变成全“0”时,最高位产生溢出,置TFx为1,向主机请求中断。方式1是16位定时器,由于没有硬件自动重装载的功能,因此每次溢出后必须通过软件给TLx和THx赋初值,让机器再行下一轮定时。这就存在一个问题,从溢出到响应中断,再到给TLx、THx重新赋值,需要一定时间,而且这个时间并不确定,如果方式1的定时需多次运行,那么加起来就会产生积累误差,如何解决呢?我们知道,机器一旦执行SETB TRx指令就启动了定时/计数器,不管你是否给THx、TLx赋值,定时器在溢出之后会自动地从0000H开始+1计数定时,根据这个原理,方法如下。21 消除积累误差的程序每次重置定时常数时,如果只需对THx置初值,即TLx的初值为00H,则从定时器为0000H时提出中断申请,直到重置THx时的时间误差都在TLx里,只要不超过256个计数值,就不会产生积累误差。如果定时时间需要用到TLx(即TLx的初值不为00H),则仍可只重置THx,但隔几次对THx修正一次。如定时10ms,即计数次数为2710H(晶振12MHz),定时常数为D8F0H,这时可将计数次数定为2700H,定时常数为D900H,实际定时时间为9.984ms,每定时16次相差0100H,则15次对THx置D9H,一次对THx置D8H。若误差的值是一个随机数,可采用如下通用程序: MOV THx,#XXH ;XXH为定时常数 MOV A,#EEH ;EEH为误差值 ADD A,R2 ;将误差积累存于R2 MOV R2,A ; JNC LOOP ; DEC THx ; LOOP:NOP ; 从程序中可以看出:当误差积累到超过256时,就对THx的初值进行减1处理,从而可以消除积累误差。22 精确定时的程序如果对每次的定时要求精确,可采用如下方法:CLR TRx ;停止计数器工作MOV A,#XXH ;XXH为定时常数低位ADD A,TLx ;TLx为计数器停止时的低位值MOV TLx,A ;MOV A,#YYH ;YYH为定时常数高位ADDC A,THx ;THx为计数器停止时的高位值MOV THx,A ;MOV A,#0DH ;0DH为本段程序执行的机器周期数ADD A,TLx ;MOV TLx,A ;CLR AADDC A,THx ;MOV THx,A ;SETB TRx ;如果定时常数是已知的,可不需要加“MOV A,#0DH”及其后面的五条指令,这时可将定时常数直接人工修正加“7”。此段程序的修正作用主要在:对进入此中断服务程序时,机器已执行时间所造成的误差修正;对修正程序执行时间所造成的误差修正。3 状态检测中多种因素的产生及处理单片机应用中经常要用到对外部接口的状态进行判别处理,如往复运动中物体是否到位,自动检测中产品的性能指标是否已达到预定目标,在电动机或电网的自动保护中电压或电流是否已超限等等。这些检测一般都是采用对电平高低鉴别的方法来实现。但当外界出现干扰,则会产生误动作。为此,单片机教科书都介绍了消除抖动(即消除干扰脉冲)的方法和程序,不外乎是调用延时程序,即延时一段时间(通常为510ms)再次检测以排除干扰。此方法虽然可行,但又带来一个新的问题,若主程序在运行中不允许中断延时510ms怎么办?此外,状态变量的值是一个不确定的值,在一定范围内无须处理,在另一些范围内又必须处理,但处理时间又不相等,怎么办?31 将抗干扰延时直接加在主程序中设状态从P1.1输入,有效状态为高电平,判断程序为主程序的一部分,若主程序运行周期为10ms,当出现干扰脉冲,虽然使CPU检测到有效状态,但仅使计数指针R0加1,不作任何处理。10ms后再次进入此段程序时发现已为无效状态,故将R0减1,也就不会进入处理程序。只有在主程序累计运行五次均检测到P1.1为有效状态,即计数指针R0的值为05H时才进入处理。当然,R0的值满多少进入处理可由程序员确定,即当外部状态稳定后才能进入事件处理程序。程序如下:MAIN: JNB P1.1,LP1 ;判断P1.1状态INC R0 ;P1.1为高电平,计数指针加1CJNE R0,#05H,LP3 ;不满5次退出PRO: ;有效状态处理程序SJMP LP3 ;处理完退出LP1:DEC R0 ;P1.1为低电平,R0减1 CJNE R0,#0FFH,LP3 MOV R0,#00HLP3:NOP LJMP MAIN32 电网或电动机过载保护处理程序电网或电动机过载保护与前面状态判别不一样,它们要根据过载量的大小决定处理时间,即存在延时控制的问题。以电动机为例:额定工作电流20A,启动电流约120A左右,如果控制电流在20A,电动机就无法启动。启动电流虽大,但作用时间却很短,可采用以下控制思路:电流在20A以下时不动作;2140A时8秒起控; 4180A时4秒起控;81120A时2秒起控;121150A 时1秒起控; 150A以上0.5秒起控。这样可以有效地控制电动机过载,防止被烧毁。在电路的实现上,可以将检测到的电流通过A/D转换成数字量,经查表方式取出加权值以控制循环次数,过载越大,加权值越大,循环次数越少,起控动作越快。程序如下:MAIN: JZ LP1 ;判别A=0? MOV B,#02H ;A0,已达起控条件 MUL AB ;加权相乘 ADD A,R0 ;累加 MOV R0,A ;结果送R0 CLR CSUBB A, #200JC LP3 ;是否已满200?PRO: ;满足条件,进入处理程序 SJMP LP3 ;处理完退出LP1:MOV R0,#00H ;A=0,R0清零LP3:NOP LJMP MAIN 设主程序运行一次为80ms,20A以下表内加权值为0,2140A时加权值

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论