2022年单片机汇编_第1页
2022年单片机汇编_第2页
2022年单片机汇编_第3页
2022年单片机汇编_第4页
2022年单片机汇编_第5页
已阅读5页,还剩72页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

第4章单片机汇编语言

程序设计第4章单片机汇编语言

程序设计4.1概述4.2伪指令4.3汇编语言程序设计方法4.4汇编语言程序设计举例4.1概述单片机汇编语言程序实际上就是单片机的所支持的能完成指定功能的指令系列。构成汇编语言程序的是汇编语句。在MCS-51系列单片机汇编语言中汇编语句一般分为两种:指令性语句(即汇编指令)指示性语句(即伪指令)指令性语句在汇编后成为单片机执行的指令码,而指示性语句并不能产生可执行的指令码,它只是在汇编时通知汇编程序如何工作。4.1.1汇编的概念在单片机中,汇编是将单片机的汇编语言助记符指令(汇编程序)翻译成单片机能识别执行的二进制机器指令(目标程序)。目前汇编一般有两种方法:手工汇编机器汇编手工汇编是用人工查表的方式将汇编程序翻译为目标程序。汇编程序是一种翻译程序,利用汇编指令与机器码指令的一一对应的关系。将源程序翻译成目标程序

汇编过程源程序(汇编指令程序)汇编目标程序(机器码指令程序)图4-1汇编过程4.1.2汇编程序汇编语言程序转换成机器语言的过程称为汇编过程。能实现汇编语言到机器语言的转换的程序称为汇编程序。汇编时汇编过程可以由汇编程序完成,也可以由人工完成。因此,汇编可以分为:手工汇编机器汇编(1)手工汇编手工汇编就是根据指令表,将源程序由汇编指令逐条翻译成机器指令,并把这些机器指令代码以字节为单元从起始地址依次排列成目标程序的过程。手工汇编一般分两步进行(即两次汇编过程):第一步:确定各条指令(第一字节)的地址并翻译出各条指令的机器码。第二步:将第一步未处理的标号进行代替,求出标号所代表的具体地址或地址偏移量,从而形成最终机器代码。手工汇编举例源程序地址目标程序第一次汇编第二次汇编ORG1000HSTART:MOVR0,BUFFER1000A830A830MOVR2,#00H10027A007A00MOVA,@R01004E6E6MOVR3,A1005FBFBINCR310060B0BSJMPNEXT100780NEXT8005LOOP:INCR010090808CJNE@R0,#44H,NEXT100AB644NEXTB64402INCR2100D0A0ANEXT:DJNZR3,LOOP100EDBLOOPDBF9MOVRESULT,R210108A2A8A2ASJMP$101280FE80FEBUFFERDATA30HRESULTDATA2AHEND(2)机器汇编机器汇编是由计算机的汇编软件将汇编语言源程序自动生成机器语言程序,称汇编软件为汇编程序。机器汇编可在单片机开发系统(如仿真器)上汇编软件实现,称驻留汇编;在其它计算机(如PC机)上进行,称交叉汇编。4.2伪指令伪指令是单片机中的指示性指令,它主要是汇编时告诉汇编程序,如何汇编源程序的指令。说明:伪指令不能被汇编成机器代码,也不能被机器执行完成某种操作,因此称为伪指令(1)、起始地址伪指令ORG指令格式:ORGaddr16指令功能:用于规定目标程序段或数据块的在程序存储器中的起始地址,需放置在程序段或数据块的开始处。例如:ORG3000HSTART:MOVA,#30H……(2)、汇编结束伪指令END指令格式:END或END标号指令功能:汇编时通知汇编程序,对源程序的汇编到此结束。一个程序中只出现一次,在程序的最后出现。(3)赋值伪指令EQU指令格式:标识符EQU数值或汇编符号指令功能:汇编时告诉汇编程序,将汇编语句操作数的值赋予本语句的标识符。“标识符”在源程序中可以作数值使用,也可以作数据地址、位地址使用。要使用此标识符必须先定义后使用,且放在程序开头。注意:标识符后没有冒号,只须一个空格分隔。例如:DATAEQU29HMOVA,DATA……(4)、定义字节伪指令DB指令格式:[标号:]DB字节数据或字节数据表指令功能:汇编时告诉汇编程序从指定的地址单元开始,定义若干字节存储单元,并将指定的数据或数据表赋予初值。注意:数据表中各字节数据用逗号分隔,如果是字符数据还需要用“”引起来,数据可以是二进制、十六进制和ASCII码;DB指令在汇编语言程序中可以多次使用。例如:ORG1000HADDR:DB20HDATA:DB0AFH,“A”,00100001B……汇编结果是将20H存放于ADDR即1000H地址单元中,将0AFH存放于ADDR+1地址单元,将“A”存放于ADDR+2地址单元;将00100001B存放于ADDR+3地址单元。(5)、定义字伪指令DW指令格式:[标号:]DW字数据或字数据表指令功能:汇编时告诉汇编程序从指定的地址单元开始,定义若干个字存储单元,并将指定的数据或数据表赋予作为初值。其中数据高八位存入低地址;低八位存入高地址。例如:ORG1000HDATA1:DW7654H,40H、12、‘AB’(6)、数据地址赋值伪指令DATA指令格式:字符名称DATA表达式指令功能:将表达式指定的数据地址赋予规定的字符名称。注意:该指令与EQU指令相似,只是可先使用后定义,放于程序开头、结尾均可。(7)、定义空间伪指令DS指令格式:[标号:]DS数值指令功能:从标号所指示的地址单元开始,保留指定的若干字节空间作为备用空间。例如:ORG2000HDS0FHDB55H,11H,0F1H;从100BH开始存放55H、11H、0F1H。注:DB、DW、DS只能用于程序存储器;而不能用于数据存储器。(8)、位地址赋值伪指令BIT指令格式:标识符BIT位地址指令功能:将位地址赋予规定的标识符。

相当于X1EQU90H4.3汇编语言程序设计方法单片机软件开发过程是单片机设计的主要任务之一,它的开发过程一般包括以下四个阶段:(1)编写汇编语言源程序;(2)汇编;(3)调试;(4)固化等。4.3汇编语言程序设计方法图4-1单片机软件开发过程汇编固化调试ROM汇编语言源程序机器代码文本编辑器编辑4.3汇编语言程序设计方法为了编写高质量的单片机程序,编写单片机汇编语言程序时需要做到以下几点:1)程序占用存储空间尽量少;2)运行时间短;3)程序的编制、调试及排错所需时间短;4)结构清晰,可读性好、易于移植。

4.3汇编语言程序设计方法汇编语言程序设计一般步骤:1)分析问题,明确任务2)建立数学模型,确定算法3)绘制程序流程图4)编写源程序5)汇编、调试三种基本程序结构三种基本程序结构:顺序结构分支结构循环结构等如下图所示:图(a)顺序结构图(b)分支结构BAC入口出口分支1分支2入口出口YN条件满足否?图(c)循环结构(1)图(d)循环结构(2)修改条件处理条件满足否?入口出口NY修改条件处理条件满足否?入口出口NYORL1000HMOVR0,#50H;外存地址MOVXA,@R0;读取原数据MOVB,A;保存原数据ANLA,#0F0H;屏蔽低4位SWAPA;高低4位互换MOVX@R0,A;保存第一个4位数ANLB,#0FH;屏蔽高4位,得到第二个4位数MOVA,BINCR0;修改地址MOVX@R0,A;保存第二个4位数END4.3.2分支程序分支结构程序是根据不同的条件,选择不同的分支以进行相应的处理。通常可用条件转移指令形成简单分支结构。如:判断(A)=0(或非0),程序转移判断(CY)=1(或0),程序转移判断(bit)=1(或0),程序转移以下是二个分支程序设计的例子。例4-2、设a存放在累加器A中,b存放在寄存器B中,要求按下式计算Y值,并将结果Y存于累加器A 中,试编写程序。a-b(a≥0)Y=a+b(a<0)解:本题关键是判a是正数,还是负数;显然累加器A中的ACC.7为符号为,如果是负数则该位为1,若该位为0,则为非负数。显然条件的判断变为检测ACC.7是否为1。ORG1000HSTART:JBACC7,KK0;判断并选择分支CLRC;清进位标志位SUBBA,B;a-bSJMPDONE;跳过a+b分支KK0:ADDA,B;a+bDONE:SJMP$;原地踏步,等待END例4-3、设有两个16位无符号数M,N分别存放在8031单片机内部RAM的40H、41H及50H、51H单元中,当M>N时,将内部RAM的42H单元清0;否则,将该单元置成全1,试编程。解法I:因为无16位数的比较指令,所以,只能用8位数的比较指令

(42)=00H(42)=FFH开始结束YNM高8位=N高8位?CY=1?M低8位=N低8位?NYNYORG2000HCMP:MOVA,50HCJNEA,40H,CMP1MOVA,51HCJNEA,41H,CMP1SJMPNHIGHE;跳过一些其它分支CMP1:JCHIGHENHIGHE:MOV42H,#0FFHSJMPDONEHIGHE:MOV42H,#00HDONE:SJMP$END解法II:ORG3000HCMP2:MOVR0,#00HMOVA,50HCJNEA,40H,CMP3;(50H)-(40H)MOVA,51H;不等转移,相等比较低位CJNEA,41H,CMP3;(51H)-(41H)SJMPNHIGHECMP3:JCHIGHE;(N-M)第八位有C,跳转到HIGHENHIGHE:MOVR0,#0FFH;不大于标志HIGHE:MOV42H,R0SJMP$END4.3.3循环程序循环程序是指在一定条件下,程序中的一些代码重复执行的情况。典型循环结构程序一般包括四部分:初始化部分循环处理部分循环控制部分循环结束部分

例4-4将首址为DATA的100个外部RAM单元清零。解:该例为已知循环次数的循环程序将循环次数存放在R0中。程序如下:MOVR0,#64H;设置循环计数器MOVDPTR,#DATA;设置地址指针CLRALOOP:MOVX@DPTR,A;清0INCDPTRDJNZR0,LOOP;判0结束循环例4-5设某以“$”为结束标志的字符中共不超过256个,存放在内部RAM以STA为首址的连续单元里,设统计此字符中长度并存放到内部RAM的LEN单元中。解法I:(先判定,后增1)程序如下:ORG1000HMOVR2,#STA;设地址指针MOVB,#00H;设计数器LOOP:MOVA,@R2CJNEA,“$”,NEXT;判断是否结束MOVLEN,B;存数据结果SJMPDONENEXT:INCB;修改计数器INCR2;修改地址指针,准备下一次循环SJMPLOOPDONE:END解法II先增1后判定程序如下:ORG1000HMOVR2,#STA-1;设地址指针MOVB,#0FFH;设计数器LOOP:INCR2;修改地址指针,准备下一次循环INCB;修改计数器MOVA,@R2;取数CJNEA,“$”,LOOP;判断循环是否结束MOVLEN,B;存数据END例4-6、设用户用键盘输入长度不超过100字节的字符串放在8031单片机外部RAM以20H为首地址的连续单元,该字符串用回车符CR(‘CR’=0DH)作为结束标志,要求统计此字符串的长度并存入内部RAM的1FH单元中。解:从首单元开始取数,每取一数判断其是否为‘CR’,是则结束。ORG1000HSTADADATA20HSLANGDATA1FHCMCR2:MOVR0,#STADA-1;(减一为了计数)MOVB,#0FFHCRLOP:INCR0INCBMOVXA,@R0CJNEA,#0DH,CRLOPMOVSLANG,BSJMP$END例4-7、单片机片内RAM中,DATA1位置起的20H个RAM单元,试统计每个单元1的位数,并存入以DATA2起的20H个单元内。解:分析:这是一个两重循环,循环次数都是已知,内循环为求8位数1的位数,循环次数为8,外循环的次数为20H。程序如下:ORG2000HMOVR0,#DATA1;置地址指针MOVR1,#DADA2MOVR7,#20H;外循环计数器CON:MOVR6,#08H;内循环计数器MOVA,@R0;取数MOVR5,#0H:从第0位开始判断CONBIT:RLCA;内循环,统计每字节1的个数JNCNEXTBINCR5;计数NEXTB:DJNER6,CONBITMOVA,R5MOV@R1,A;存数INCR1;修改指针,指向下一单元INCR0DJNER7,CON;外循环判0END4.3.4子程序子程序设计是程序设计模块化的重要技术,它可以大大提高程序代码的可重用性。在使用子程序时,主程序调用子程序需要用到LCALL或ACALL指令,在子程序中末尾必须用返回指令RET返回到主程序中。注意:在单片机汇编语言程序中,一般允许进行子程序的嵌套调用,但嵌套调用时调用的层数最好不要太多,以提高程序的效率。4.3.4子程序在子程序设计和调用时,要注意两个方面的主要问题:(1)在子程序中的现场保护;(2)主程序与子程序间参数的传递方式。(1)现场保护为了避免子程序调用时修改了一些寄存器的内容导致对主程序的影响,子程序执行时首先必须将两段程序都用到的寄存器或存贮单元保存起来,这种过程称为现场保护。在子程序返回时,再将保存起来的内容恢复到原来状态,使子程序返回后能继续正确执行程序,这个过程称恢复现场。一般来说,现场保护可以在主程序中进行,也可以在子程序中进行。要保护的现场可能是寄存器,也可以能是一段内存(对于PC值的现场保护和恢复是由计算机在执行LCALL,ACALL和RET时自动完成的),保护的方法通常采用堆栈的方法,即在保护现场时让被保存的内容入栈,恢复时让被保护的内容出栈。通常,为了方便调用子程序,现场保护一般由程序员在子程序的开头和结尾编程实现,此时要注意用于传递参数的寄存器对主程序的影响。

(2)、主程序与子程序的参数传递子程序在使用时,有时需要从主程序获得某些数据,也可能需要将处理结果返回给主程序。这些工作就是通过子程序的参数来实现。根据数据传送的方向可将参数分为人口参数和出口参数。如果主程序在调用子程序时需将具体的数据传递给子程序中相应的变量(寄存器等),这些数据称为入口参数。如果子程序执行结束后将运行结果传递给主程序供主程序使用,这些结果数据称为出口参数。单片机子程序传递参数的方法主要有以下三种:

1)累加器和通用寄存器传送2)指针寄存器传送3)堆栈传送例4-8、编写一段子程序将片内RAM的一组单元清零。设被清零的地址单元的首地址在R0中,被清零的地址单元个数在R7中。解:子程序:(通过通用寄存器来传递参数)ORG1000HSUB1:MOVA,#00H;清除A内容为零LOOP:MOV@R0,A;R0中的内容清零INCR0;修改地址DJNZR7,LOOP;R7非零时循环DONE:RET主程序:MAIN:……MOVR0,#30H;参数1(首地址)MOVR7,#0AH;参数2(地址个数)ACALLSUB1;调用子程序……例4-9(1)编写子程序,实现以下功能:计算内部RAM中N个字节无符号数之和。(N小于1000H)。(2)编写一程序,调用(1)中子程序实现以下功能:求内部RAM30H~5FH中存放的字节无符号数之和,并存入60H、61H单元中(高位在前),若和大于100H,62H单元0FFH,否则62H单元清零解:分析:该例中需要传递的参数有3类:①参与运算的字节无符号数个数N,用寄存器R2传递。②参与运算的数据,在RAM单元中,以R0为指针寄存器,通过间接寻址传送。③运算结果,共两个,用R1间接寻址传送(1)子程序如下:ORG2000HSUB2:PUSHPSW;保护现场MOV@R1,#0;目的单元清零R160HINCR1MOV@R1,#0LOOP:MOVA,@R0;取数ADDA,@R1;求和MOV@R1,A;存和的低字节数INCR1;修改指针,指向和的高位地址CLRAADDCA,@R1;取进位位MOV@R1,A;存和的高字节数DECR1;修改指针,指向和的低位地址INCR0;修改指针,指向下一个单元DJNZR2,LOOPPOPPSW;恢复现场RET(2)主程序如下:ORG0100HMAIN:MOVR0,#30H;设置R0为入口指针寄存器MOVR1,#60H;设置R1为出口指针寄存器MOVR2,#2FH;设置R2传递字节数ACALLSUB2MOV62H,#0FFH;预置62H单元为0FFHMOVA,61H;判总和高位是否为0JNETOENDMOV62H,#00H;小于100H,62H改为00HTOEND:END4.4汇编语言程序设计举例4.4.1算术运算类程序4.4.2逻辑运算类程序4.4.3代码转换类程序4.4.4查表程序4.4.5数据排序程序4.4.6延时程序4.4.7软件看门狗程序4.4.8数字滤波程序

4.4.1算术运算类程序MCS-51单片机算术运算类指令有单字节的加(ADD)、带进位加(ADDC)、带进位减(SUBB)、乘(MUL)、除(DIV)等。例4-10、两个4字节无符号数分别存放在以DATA1和DATA2为首址的连续单元中(低字节在前),设计程序求两数的和,结果放在被加数单元中。〔解〕ORG2000HSTART:MOV R0,#DATA1MOVR1,#DATA2MOVR2,#04HCLRCLOOP:MOVA,@R0ADDCA,@R1;带进位加法MOV@R0,AINCR0INCR1DJNZR2,LOOPJCOTHER;最高字节有进位,转它程序处理RET例4-11、两个4字节无符号数分别存放在以DATA1和DATA2为首址的连续单元中(低字节在前),设计程序求两数的差,结果放在被减数单元中。〔解〕ORG2200HSTART:MOV R0,#DATA1MOVR1,#DATA2MOVR2,#04HCLRCLOOP:MOVA,@R0SUBBA,@R1;带进位减法MOV@R0,AINCR0INCR1DJNZR2,LOOPJCOTHER;最高字节有借位,转它程序处理RET4.4.2逻辑运算类程序MCS-51单片机逻辑运算指令有与ANL、或ORL、异或XRL、求反CPL、清零CLR等指令,可以字节操作,也可逐位进行。例4-12、单片机片内RAM有两个数据段分别从地址DATA1和DATA2开始,每个数据段数据个数相同,并存放在N中,编写程序实现两个数据段中相同数据的个数统计,结果放入DATA3中。解:程序如下:ORG3000HMOVR0,#DATA1MOVR1,#DATA2MOVR2,00HMOVR3,NLOOP1:MOVA,@R0XRLA,@R1INCR0INCR1JNZLOOP2INCR2LOOP2:DJNER3LOOP1MOVDAT3,R2END4.4.3代码转换类程序在计算机内部,数据都是采用二进制表示的,而在数据输入或显示时常采用ASCII码表示,由于人们在日常生活中比较习惯十进制数,有时在单片机数据输出时还采用BCD码表示。在这些不同类型数据的表示时,需要对这些不同类型的数据进行转换。(1)、二进制数与BCD码的转换例4-13、将单片机RAM中单元地址为MEM的8位二进制数转化为BCD码,并存入首址为DATA的内存单元中。解:分析:8位二进制数最大值为255,可用3位十进制数表示,所以要对应3个BCD码。具体做法是将二进制数除以100,商为百位数;所得余数再除以10,商为十位数;最后的余数就是个位数。程序如下:ORG2300HMOVA,MEMMOVB,#64HDIVABMOVDAT,AMOVA,BMOVB,#0AHDIVABMOVDAT+1,AMOVDAT+2,BEND(2)、二进制数(十六进制数)与ASCII的转换1)、十六进制转换成ASCII码实现此功能的程序段:设入口:(A)中存放一位十六进制;出口:(A)返回ASCII值HASC:ANLA,#0FHADDA,#90HDAA;(A)>9时起作用ADDCA,#40HDAA;(A)<=9时起作用RET2)ASCII码转换成十六进制数实现此功能的程序段:设入口:(A)中存放ASCII码出口:(A)中返回十六进制ATOH:CLRCSUBBA,#30HCJNEA,#10H,ATOH1

sjmpATOH2

ATOH1:JCATOH2;(A)<=9SUBBA,#07H;(A)>9ATOH2:RETORG1000HSTART:MOVR0,#30HMOVR1,#40HMOVR2,#04HTRA:ACALLASCIISWAPAMOV@R1,AINCR0ACALLASCIIXCHDA,@R1INCR0INCR1DJNZR2,TRASJMP$END4.4.4查表程序例4-16、某检测系统中,已知温度X与电压Y有以下对应关系:

X(℃):X1=0,X2=5,X3=10,……X20=100(间隔5℃)Y(mV):Y1=15,Y2=21,Y3=23,……Y20=52(非线性关系)若温度为X,Xn<X<Xn+1,则对应电压可由公式:Y=Yn+(Yn+1-Yn)×(X-Xn)/5近似值求得。试编程实现以上运算。〔解〕将表格(Y值)放在TABL开始的单元中。设X值在P0中,结果送回P0,则程序如下:ORG1000HSTART:MOVDPTR,#TABLMOVA,P0;取XMOVB,#05HDIVAB;n=X0/5的商存于A中,余数即(X-Xn)存于B中MOVR7,A;保护nMOVCA,@A+DPTR;查表求YnXCHR7,AINCAMOVCA,@A+DPTR;查表求Yn+1CLRCSUBBA,R7;求Yn+1-YnMULAB;求(Yn+1–Yn)×(X0-Xn)MOVB,#05DIVAB;(Yn+1–Yn)×(X0-Xn)/5ADDA,R7;求出YMOVP0,ARETORG3000HTABL:DB15,21,23,……4.4.5数据排序程序数据排序程序就是采用某种算法将一组数据按大小顺序排列。若按从小到大次序排列,称为升序排列,反之则称为降序。典型的数据排序算法为冒泡法,方法如下:

1)从首址开始,依次检查数中两相邻单元的数据,若为顺序排列,则不交换,否则,两单元内容交换,直到检查完所有数,一直比较结束。2)如果在一轮比较中,未出现交换情况,则排序结束,否则进行下一轮比较。3)为了判断在每轮中是否出现交换,应设置标志。每轮开始前,将标志位清0,检查过程中若出现交换,则将标志位置1。以标志位是否为0作为判断排序循环结束的条件。例4-17、将内部RAM中的20H~2FH单元中的二进制无符号数从大到小排列。解:采用冒泡法排序。程序如下:SORT:MOVR7,#10HMOVR0,#20HLOOP1:MOVA,@R0INCR0MOVR2,ACLRCSUBBA,@R0MOVA,R2JNCLOOP2SETBF0MOVA,R2XCHA,@R0DECR0XCHA,@R0INCR0LOOP2:DJNZR7,LOOP1JBF0,SORTRET4.4.6延时程序延时程序主要是通过让单片机重复执行某些代码来实现。由于目前单片机时钟频率都比较高,而寄存器的位数又只有8位,所以要获得较多的延时,通常需要采用多重循环来实现。通过改变循环次数就可以调整延时时间。以下是一个简单延时子程序:DELAY:MOVR2,#data;机器周期数=1DELAY1:DJNZR2,DELAY1;机器周期数=2RET延时时间=1(第一条指令周期)+(R2)×2(周期数)延时范围:3~513个机器周期,由data的值决定采用简单延时子程序时存在两个问题:(1)延时时间很小,(2)影响CPU工作效率。实际上,根据单片机的时钟频率,通过计算我们还可以比较准确地设定延时时间例4-18、设8051使用12MHz晶振,试设计延迟100ms的延时程序解:机器周期:T=12/fosc=12/(12×106)=1usORG1000HDELAY:MOVR2,#C7H;延时一个机器周期T=1usLOOPS:MOVB,#FAH;每循环延时1usLOOPR:DJNZB,LOOPR;每循环延时2usDJNZR2,LOOPS;每循环延时2usEND4.4.7软件看门狗程序软件“看门狗”也可叫做程序运行监视系统。这种程序监视系统可以监控系统的运行情况,能及时发现系统进入死循环并使系统复位。软件“看门狗”的要求具有如下特性:(1)本身能独立工作,基本上不依赖CPU;(2)CPU在一定的时间间隔内对看门狗计数(定时)系统复位一次(俗称喂狗),以表明系统目前工作正常。(3)当CPU陷入死循环时,能及时发现并使系统复位。一个用定时/计数器T0作软件看门狗的完整程序:ORG0000HAJMPMAINORG000BHLJMPERRORMAIN:MOVSP,#60HMOVPSW,#00HMOVSCON,#00HMOVTMOD,#01H;设置T0为16位定时器SETBET0;允许T0中断SETBPT0;设置T0中断为高级中断MOVTL0,#00H;设定T0的定时初值,定时时间约为16ms(6M晶振)MOVTH0,#0B0HSETBEA;开中断SETBTR0;启动T0LOOP:......;主程序开始LCALLWATCHDOG;调用喂狗子程序......LJMPLOOPWATCHDOG:MOVTL0,#00H;喂狗子程序MOVTH0,#0B0HSETBTR0RETERROR:POPACC;定时器中断POPACC;看门狗软件复位程序CLRAPUSHACCPUSHACCRETI4.4.8数字滤波程序数字滤波程序是指用软件的方法对采集到的数据进行消除干扰的处理。一般来说,在单片机系统中除了在硬件中对信号采取抗干扰措施之外,还要在软件中进行数字滤波的处理,以进一步消除附加在数据中的各式各样的干扰,使采集到的数据能够真实的反映现场的实际情况。数字滤波的方法较多,常用的有算术平均值法、超值滤波法、中值法、比较取舍法、竞赛评分法、取极值法、滑动算术平均法和一阶低通滤波法等。(1)超值滤波法超值滤波法又称为限幅滤波法或程序判断滤波法。工作原理:先根据经验判断,确定两次采样允许的最大偏差值△X(限额值)每次检测到新值时判断:1)如果本次值与上次值之差<=△X,则本次值有效;2)如果本次值与上次值之差>△X,则本次值无效,放弃本次值,用上次值代替本次值。为了加快程序的判断速度,可以把根据经验确定的允许误差△X取反后编入程序,以便它可以和实际采样的差值相加来替代比较(成法)运算。例4-19在某单片机温度检侧系统中,设相邻两次采样的最大允许误差△X=02H,试编出它的超值滤波程序。解:设30H为上次采样值存放单元,31H为本次采样值存放单元.程序应先求出本次采样对上次采样的差值,若差值为正,则直接进行超限判断,若差值为负,则求绝对值后再进行超限判断。超限判断采用加法进行,即采样差值+FDH(02H的反码)。若有进位,则超限,若无进位,则未超限。相应程序流程如下:ORG2000HFILTI:MOV30H,31H;上次采样值送30HACALLLOAD;A返回本次采样值MOV31H,A;暂存于31HCLRCSUBBA,30H;求两次采样差值JNCFILTII;若差值为正,则FILTIICPLA;若差值为负,则求绝对值INCAFILT11:ADD.A,#0FDH;超限?JNCFILT12;若不超限,期本次采样有效MOV31H,30H;若超限,本次采样值送31HFILT12:RETLOAD:

温馨提示

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

评论

0/150

提交评论