单片机实现的多数BCD码加法器源代码.doc_第1页
单片机实现的多数BCD码加法器源代码.doc_第2页
单片机实现的多数BCD码加法器源代码.doc_第3页
单片机实现的多数BCD码加法器源代码.doc_第4页
单片机实现的多数BCD码加法器源代码.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

*;多位BCD码加法:BCDAN;入口:字节数在R7中,被加数在R0,加数在R1;出口:结果在R0;使用寄存器:A,R7,R2,R1,C,R0;*BCDAN:MOV A, R7MOV R2, AADD A, R0MOV R0, AMOV A, R2ADD A, R1MOV R1, ACLR C;指令1BCDAN1: DEC R0;指令2DEC R1;指令3MOV A, R1ADDC A, R0;指令DA A;指令4MOV R0, A;指令DJNZ R2, BCDAN1RET上述子程序出错的可能发生在子程序设计过程中,也可能发生在子程序调用时。现分别讨论如下:指令疏漏指令最有可能被疏漏,此指令被疏漏的后果是该子程序的结果时对时错。错误的特征是比正确结果小。尤其是当编写调试减法程序时,由于单片机的减法指令只有SUBB是带进位减法,故在减法开始前不使用CLR C指令将进位清除,会导致类似的错误,而且更不容易发现。位置不妥指令、最可能出现这种错误。显然程序设计的思想是BCD码的高位在低地址单元,低位在高地址单元,从高到低依次存放。因此相加时必须从低位加起,所以作为被加数、加数的指针、必须通过程序前的一段指令调整到指向低位,调整的方法是原指针加字节数。但实际上直接加字节数后使得、指到最低字节的后面一个字节去了,故必须首先将这减掉,指向最低字节。从表面上看,指令、放在指令后面似乎也实现了从低字节逐渐向高字节的推进作用,很多开发者一不留神就想当然的这样做了,结果前面的一层作用被疏漏掉了,导致程序错误。指令不当例如指令由于疏忽写成指令,则结果无法正确。非法调用按照子程序的说明,调用该子程序是非常容易的。但有时由于疏忽,没有按照入口要求送数出现非法调用现象,导致出错。这类错误在调试时会使得开发者一时不知错在子程序还是调用它的程序。例如,在调用前必须按字节数目正确置数,如果忘了此步,显然结果是无法正常的。【例二】转换结果读取中断子程序。;*;AD转换结果读取中断程序:(/INT0);万位引起中断: 其它各位采用查询方式;结果暂存在AD单元中(3字节);*ICL7135: CLR IE0;因为是电平触发,故必软件清中断标志PUSH ACC ;保护现场PUSH 02H ;R2PUSH 01H ;R1PUSH 00HPUSH DPLPUSH DPHMOV DPTR, #I8155_PA;读8155A口的A/D结果MOVX A, DPTRMOV R2, A ;万位入R2ANL A, #0F0HJNZ ICL7135_0 ;POL,OV,UN各位非0,则说明结果不正常SJMP ICL7135_1ICL7135_0: LJMP PRIICL7135_1: MOV R1, #AD ;结果暂存单元(始地址)MOV A, R2ANL A, #01H ;存万位XCHD A, R1MOV A, R2ANL A, #00HSWAP AXCHD A, R1MOV R1, AINC R1WD4: MOVX A, DPTR;读千位JNB ACC.7, WD4SWAP AMOV R1, A ;千存入WD3: MOVX A, DPTR ;读百位JNB ACC.6, WD3XCHD A, R1 ;百位存入INC R1WD2: MOVX A, DPTR ;读十位JNB ACC.5, WD2SWAP AMOV R1, AWD1: MOVX A, DPTR ;读个位JNB ACC.4, WD1XCHD A, R1SETB EOC_AD ;设置转换完成标志MOV R0, #AD_L ;R0指向结果单元首址MOV R1, #AD ;转存结果缓冲区MOV R2, #03HYL_0: MOV A, R1MOV R0, AINC R0INC R1DJNZ R2, YL_0SJMP PRIPRI: POP DPH ;恢复现场POP DPLPOP 00HPOP 01HPOP 02HPOP ACCRETI;中断返回引用该子程序主要想讨论以下两个问题:中断程序的常规错误)现场的保护与恢复该指令通过PUSH压栈指令将程序中用到的寄存器及其它资源保护起来,然后通过出栈指令按照“先进后出”原则在中断返回前依次恢复,避免干扰或破坏其它程序的正常执行。当然,工作寄存器的保存也可通过寄存器组切换的方式更为便捷地实现。由于中断的不可预测性,因此现场保护显得尤为重要,否则中断返回后无法正常运行被中断程序。这种错误的调试非常困难。)触发方式的正确使用单片机的外中断有两种触发方式:低电平触发和下跳边沿触发。为了设计正确的中断子程序,必须十分清楚地了解两种方式的差异。电平触发方式的中断标志位单片机不会自动清除,而边沿触发方式下该标志位能自动清除。上面的INT0中断子程序采用电平触发方式,如果将CLR IE0指令疏漏,会导致中断重入错误。断点调试方法的应用由于中断的不可控制特性,因此中断子程序的调试常常通过仿真器的断点功能来实现。一般分两种情形:看是否正常触发中断为了查看是否正常触发中断,以排查相关的软硬件系统是否存在错误,可以简单地在中断子程序的第一条指令设置断点,然后联机全速执行。如果能进入断点,则说明触发电路等基本正常,中断初始化程序也基本正常。看结果是否正常也是采用断点法,将断点设置在需要查看的位置。例如设置在PRI标号位置可以查看整个结果,即_开始的单元中的内容。如果在该处无法进入中断,则说明此前程序隐含错误,断点必须逐渐前移,一旦断点能正常进入,则一般可以断定断点后的程序可能有错误。【例三】位定时中断子序。;*;定时器中断2: 16位重装入方式;*TO_COUNTEQU30H;中断计数器;INT_T2: CLR EAPUSH PSWPUSH ACC;保护现场,APUSH 00H ;R0PUSH 01H ;R1PUSH 02H ;R2PUSH 03H ;R3PUSH 04H ;R4PUSH 06H ;R6PUSH 07H ;R7CLR 0CFH ;清定时器溢出标志INC T0_COUNTMOV A, T0_COUNTCJNE A, #64H, INT_T2_11;判中断100次否?; CLR T0_COUNT (语法没错,但此处的地址被认为是位地址)MOV T0_COUNT,#00H;清累计单元(以重新开始)MOV R7, #02H;YES,则2字节BCD减法(剩余时间-1)MOV R1, #BCDJJ ;减数为0001MOV R1, #00HINC R1MOV R1, #01HMOV R0, #WTBFMOV R1, #BCDJJLCALL BCDBN ;BCD减法MOV A, R0 ;判是否到0?INC R0ORL A, R0JNZ INT_T2_1 ;判剩余时间为0?CLR 0CAH ;关T2CLR TR0 ;YES,则关定时器T0,T1CLR TR1CLR ET0 ;禁止T0,T1溢出中断CLR ET1CLR EA ;关总中断SETB ISOVER ;设置工作结束标志CLR ISENDINT_T2_1: MOV R0, #WTBF ;将新的剩余时间转换成显示代码送显缓MOV R1, #DISPBUF+8MOV A, R0MOV B, A ;第一字节暂存ANL A, #0F0H ;取工作时间的千位SWAP AMOV R1, A ;送存显缓INC R1MOV A, BANL A, #0FH ;百位MOV R1, A ;送存显缓INC R0INC R1MOV A, R0MOV B, AANL A, #0F0H ;十位送存SWAP AMOV R1, AINC R1MOV A, BANL A, #0FH ;个位MOV R1, AJB ISOVER, INT_T2_12INT_T2_11: CLR ISOVER ;工作还未结束INT_T2_12: POP 07H ;恢复现场POP 06HPOP 04HPOP 03HPOP 02HPOP 01HPOP 00HPOP ACCPOP PSWJB ISOVER, INT_T2_13SETB EAINT_T2_13: RETI/csylc/ /

温馨提示

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

评论

0/150

提交评论