1、 例例1 1 : 设内部设内部RAM(30H)=40HRAM(30H)=40H,(40H)=10H(40H)=10H,(10H)=00H(10H)=00H,(P1)=CAH(P1)=CAH,分析以下程序执行后各单元及寄存器、,分析以下程序执行后各单元及寄存器、P2P2口的内口的内容容。MOV R0,#30H;(R0)30HMOV A,R0;(A)(R0)MOV R1,A;(R1)(A)MOV B,R1;(B)(R1)MOV R1,P1;(R1)(P1)MOV P2,P1;(P2)(P1)MOV 10H,#20H;(10H)20H 结果:结果:(R0)=30H(R0)=30H,(R1)=(A)=
2、40H(R1)=(A)=40H,(B)=10H(B)=10H, (10H)=20H,(40H)=(P1)=(P2)=CAH(40H)=(P1)=(P2)=CAH。 例例2 2 若在外部程序存储器中若在外部程序存储器中2000H2000H单元开始依次存放单元开始依次存放0 09 9的的平方值,数据指针平方值,数据指针(DPTR)=3A00H(DPTR)=3A00H,用查表指令取得,用查表指令取得2003H2003H单元的单元的数据后,要求保持数据后,要求保持DPTRDPTR中的内容不变。中的内容不变。MOV A,#03H;(A)03HPUSH DPH;保护DPTR高8位入栈PUSH DPL;保护
3、DPTR低8位入栈MOV DPTR,#2000H;(DPTR)2000HMOVC A,A+DPTR;(A)(2000H+03H)POP DPL ;弹出DPTR低位POP DPH ;弹出DPTR高位结果:结果:(A)(A)09H09H,(DPTR)=3A00H(DPTR)=3A00H。例例3 3 设设(R0) = 30H(R0) = 30H,30H = 4AH30H = 4AH,(A) = 28H(A) = 28H,则,则执行执行XCH AXCH A, R0R0后,结果为后,结果为(A) = 4AH(A) = 4AH,(30H) = 28H(30H) = 28H。执行执行XCHD AXCHD A
4、,R0R0后,结果为后,结果为(A) = 2AH(A) = 2AH,(30H) = 48H(30H) = 48H。执行执行SWAP ASWAP A后,结果为后,结果为(A) = 82H(A) = 82H。例例4 4 设外部设外部RAM(0203H)= FFHRAM(0203H)= FFH,分析以下指令执行后的结果。,分析以下指令执行后的结果。MOV DPTR,#0203H ;(DPTR)0203HMOVX A,DPTR ;(A)(DPTR)MOV 30H,A ;(30H)(A)MOV A,#0FH ;(A)0FHMOVX DPTR,A ;(DPTR)(A)结果为:结果为:(DPTR)=0203
5、H(DPTR)=0203H,(30H)=FFH(30H)=FFH,(0203H)=(A)=0FH(0203H)=(A)=0FH。 例例5 5 从片外程序存储器从片外程序存储器2000H2000H单元开始存放单元开始存放0909的平方值,的平方值,以以PCPC作为基址寄存器进行查表得作为基址寄存器进行查表得9 9的平方值。的平方值。 设设MOVCMOVC指令所在地址指令所在地址(PC)=1FF0H(PC)=1FF0H,则偏移量,则偏移量=2000H-=2000H-(1FF0H+1)=0FH(1FF0H+1)=0FH。MOV A,#09H ;(A)09HADD A,#0FH ;用加法指令进行地址调
6、整MOVC A,A+PC ;(A)(A)+(PC)+1)结果为:结果为:(PC)=1FF1H(PC)=1FF1H,(A)=51H(A)=51H。用以用以DPTRDPTR为基址寄存器的查表指令,其程序如下:为基址寄存器的查表指令,其程序如下:MOV DPTR, 2000H;置表首地址MOV A, #09HMOVC A, A+DPTR 例例6 6 设设(A) = 49H(A) = 49H,(R0)=6BH(R0)=6BH,分析执行指令,分析执行指令ADD ADD A A,R0R0后的结果。后的结果。 结果:结果:(A)=B4H(A)=B4H,OV=1OV=1,CY=0CY=0,AC=1AC=1,P
7、=0P=0。 例例7 7 设设(A)=C3H(A)=C3H,数据指针低位,数据指针低位(DPL)=ABH(DPL)=ABH,CY=1CY=1,分析执行指令分析执行指令ADDC AADDC A,DPLDPL后的结果。后的结果。 结果:结果:(A)=6FH(A)=6FH,CY=1CY=1,AC=0AC=0,P=0P=0。 例例8 8 设设 (A) = 52H(A) = 52H,(R0)=B4H(R0)=B4H,分析执行如下指令后,分析执行如下指令后的结果。的结果。 CLR C CLR C ;是位操作指令,是进位位清零;是位操作指令,是进位位清零 SUBB ASUBB A,R0R0 结果为:结果为:
8、(A)=9EH(A)=9EH,CY=1CY=1,AC=1AC=1,OV=1OV=1,P=1P=1。 例例9 9 设设 (R0) = 7EH(R0) = 7EH,(7EH)=FFH(7EH)=FFH,(7FH)=38H(7FH)=38H,(DPTR)=10FEH(DPTR)=10FEH,分析逐条执行下列指令后各单元的内容。,分析逐条执行下列指令后各单元的内容。INC R0 ;使7EH单元内容由FFH变为00HINC R0 ;使R0的内容由7EH变为7FHINC R0 ;使7FH单元内容由38H变为39HINC DPTR ;使DPL为FFH,DPH不变INC DPTR ;使DPL为00H,DPH为
9、11HINC DPTR ;使DPL为01H,DPH不变 例例10 10 对对BCDBCD码加法码加法65 + 58DBH65 + 58DBH,进行十进制调整。,进行十进制调整。MOV A,#65H ;(A)65ADD A,#58H ;(A)(A)+58DA A ;十进制调整 例例11 11 设片内设片内RAM 30HRAM 30H,31H31H单元中分别存放着两位单元中分别存放着两位BCDBCD码表码表示的被减数和减数,两数相减的差仍以示的被减数和减数,两数相减的差仍以BCDBCD码的形式存放在码的形式存放在32H32H单元中。单元中。CLR CMOV A,#9AHSUBB A,31H ;求减
10、数的十进制补码ADD A,30H ;作十进制补码加法DA A ;进行BCD调整MOV 32H,A ;将BCD码的差送存32H单元 例例12 (P1)=C5H=11000101B12 (P1)=C5H=11000101B,屏蔽,屏蔽P1P1口高口高4 4位而保留低位而保留低4 4位。位。 执行指令:ANL P1,#0FH 结果为:(P1)=05H=00000101B。 例例13 13 若若(A)=C0H(A)=C0H,(R0)=3FH(R0)=3FH,(3FH)=0FH,(3FH)=0FH, 执行指令:ORL A,R0 结果:(A)=CFH=11001111B。 例例14 14 若若(A)=B5
11、H=10110101B(A)=B5H=10110101B,执行下列操作:,执行下列操作: XRL A,#0F0H ; A的高4位取反,低4位保留, (A)=01000101B=45H MOV 30H,A ;(30H)=45H XRL A,30H ;自身异或使A清零 例例15 设(A)=5AH=90,且CY=0,则执行指令RL A后,(A)=B4H=90。执行指令 RR A后,(A)=2DH=45。执行指令 RLC A后,(A)=B4H=90。执行指令 RRC A后,(A)=2DH=45。例例16 16 根据累加器根据累加器A A的值,转不同处理程序的入口。的值,转不同处理程序的入口。 MOV
12、DPTR,#TABLE ;表首地址送DPTR JMP A+DPTR ;根据A值转移 TABLE:AJMP TAB1 ;当(A)=0时转TAB1执行 AJMP TAB2 ;当(A)=2时转TAB2执行 AJMP TAB3 ;当(A)=4时转TAB3执行 例例17 17 将片外将片外RAMRAM首地址为首地址为DATA1DATA1的一个数据块转送到片内的一个数据块转送到片内RAMRAM首地址为首地址为DATA2DATA2的存储区中。的存储区中。 MOV R0,#DATA1 ;R0作为外部数据块的地址指针 MOV R1,#DATA1 ;R1作为内部数据块的地址指针LOOP: MOVX A,R0 ;取
13、外部RAM数据送入AHERE: JZ HERE ;数据为零则终止传送 MOV R1,A ;数据传送至内部RAM 单元 INC R0 ;修改指针,指向下一数据地址 INC R1 SJMP LOOP ;循环取数 例例18 18 当从当从P1P1口输入数据为口输入数据为01H 01H 时,程序继续执行,否则等时,程序继续执行,否则等待,直到待,直到P1P1口出现口出现01H01H。 MOV A,#01H ;立即数01H送AWAIT: CJNE A,P1,WAIT ;(P1)01H,则等待 例例19 19 将内部将内部RAMRAM从从DATADATA单元开始的单元开始的1010个无符号数相加,相个无符
14、号数相加,相加结果送加结果送SUMSUM单元保存。设相加结果不超过单元保存。设相加结果不超过8 8位二进制数。位二进制数。 MOV R0,#0AH ;设置循环次数 MOV R1,#DATA ;R1作地址指针,指向数据块首地址 CLR A ;A清零LOOP: ADD A,R1 ;加一个数 INC R1 ;修改指针,指向下一个数 DJNZ R0,LOOP ;R0减1,不为0循环 MOV SUM,A ;存10个数相加的和 例例20 20 利用位操作指令,模拟图利用位操作指令,模拟图3.63.6所示硬件逻辑电路的所示硬件逻辑电路的功能。功能。 PR2: MOV C,P1.1 ;(CY) (P1.1)
15、ORL C, P1.2 ;(CY) (P1.1) (P1.2)=AANL C,P1.0 ;(CY)(P1.0)A CPL C ;(CY)(P1.0)A=B MOV F0,C ;F0内暂存B MOV C,P1.3 ;(CY)(P1.3) ANL C,/P1.4 ;(CY)(P1.3)(P1.4)=D ORL C,F0 ;(CY)BD MOV P1.5,C ;运算结果送入P1.5 RET 算术、逻辑处理程序算术、逻辑处理程序 例例21 21 将一个双字节数存入片内将一个双字节数存入片内RAMRAM。 设该待存双字节数高字节在工作寄存器设该待存双字节数高字节在工作寄存器R2R2中,低字节在中,低字节
16、在累加器累加器A A中,要求高字节存入片内中,要求高字节存入片内RAMRAM的的36H36H单元,低字节存入单元,低字节存入35H35H单元。单元。MOV R0,#35H ;R0作指向片内RAM单元的地址指针,先指向35H 单元MOV R0,A ;低字节存入35H单元INC R0 ;使R0指向36H单元XCH A,R2 ;R2与A的内容交换,待存高字节交换到A中MOV R0,A ;高字节存入36H单元,A的内容未受影响XCH A,R2 ;R2与A的内容再次交换,两者的内容恢复原状 例例22 22 多字节无符号数相加。多字节无符号数相加。 设被加数与加数分别在以设被加数与加数分别在以ADR1AD
17、R1与与ADR2ADR2为初址的片内数据为初址的片内数据存储器区域中存储器区域中, ,自低字节起自低字节起, ,由低到高依次存放;它们的字节由低到高依次存放;它们的字节数为数为L L,要求加得的和放回被加数的单元。,要求加得的和放回被加数的单元。 MOV R0,#ADR1 MOV R1,#ADR2 MOV R2,#L CLR CLOOP: MOV A,R0;通过R0间址,取得被加数的一 ;个字节 ADDC A,R1;通过R1间址,取得加数的一个字 ;节,与被加数的相应字节相加 MOV R0,A ;加得的和通过R0间址放回原被;加数单元INC R0 ;修改指针,指向下一个相加的数INC R1DJ
18、NZ R2,LOOP;循环实现多字节数相加 例例23 23 将将R1R1、R2R2、R3R3、R4R4四个工作寄存器中的四个工作寄存器中的BCDBCD码码数据依次相加,要求中间计算结果与最后的和都仍为数据依次相加,要求中间计算结果与最后的和都仍为BCDBCD码,且存入片内码,且存入片内RAMRAM。 设四个工作寄存器中的设四个工作寄存器中的BCDBCD码数据相加后其和仍为码数据相加后其和仍为2 2位位BCDBCD码,码,无溢出;无溢出;(R1)+(R2)(R1)+(R2)后的和存入片内后的和存入片内RAMRAM的的30H30H单元,再加单元,再加(R3)(R3)后后的和存入的和存入31H31H
19、单元,总的和存入单元,总的和存入32H32H单元。单元。主程序:主程序:ORG 0050HMOV R0,#30H MOV A,R1ADD A,R2 ;(R1)+(R2)ACALL SUB ;调用子程序进行BCD调整,并存和ADD A,R3 ;(R1)+(R2)+(R3)ACALL SUBADD A,R4 ;(R1)+(R2)+(R3)+(R4)ACALL SUB 子程序为:子程序为: ORG 01A0H ;十进制调整与存和子程序 SUB:MOV R7,A ;保护累加器A的内容,以便返回主程序继续使用 DA A MOV R0,A ;把当前和调整成BCD码后存入R0所指单元 INC R0 ;调整地
20、址指针 MOV A,R7 ;恢复累加器A的内容,使A中仍为调用子程序时的和 RET ;返主 例例24 24 使双字节数依次右移使双字节数依次右移1 1位。位。 设该双字节数的高字节已在工作寄存器设该双字节数的高字节已在工作寄存器R2R2中,低字节中,低字节已在累加器已在累加器A A中。中。 SETB C ;C预置1 XCH A,R2 ;R2与A内容交换,高字节进A JB A.7,ELSE ;A.7(原R2第7位)为1转,否则C清零 CLR C ELSE:RRC A ;A(原R2内容)带C循环右移1位,移位后原R2第7位的值 ;保持不变,原R2零位则进C XCH A,R2 ;移位后原R2内容自A
21、交换回R2,A内容自R2交换回A, ;准备移位 RRC A ;低字节带C(原R2零位)循环右移1位,A.0则移入C后丢失 例例25 25 多字节数求补。多字节数求补。 设该多字节数由低字节到高字节依次存放在片内设该多字节数由低字节到高字节依次存放在片内RAMRAM的以的以30H30H为起始地址的区域中,求补后放回原处。为起始地址的区域中,求补后放回原处。 ORG 1000H MOV R2,#LH ;R2作循环计数器,放置待处理字节数 MOV R0,#30H ;R0作为地址指针,指向待处理首数的地址 MOV A,R0 ;自片内RAM 30H单元取最低字节 CPL A ;最低字节取反 ADD A,
22、#1 ;求补时最低字节取反后再加1 MOV R0,A ;最低字节取反后送存 DEC R2 ;已处理一个字节,待处理字节数减1NEXT:INC R0 ;调整地址指针,指向下一个字节 MOV A,R0 ;取下一个字节 CPL A ;非最低字节求补时只需取反 ADDC A,#0 ;本条指令真正用意是计及处理前一个字节时可能有的进位 MOV R0,A ;本字节处理后送存 DJNZ R2,NEXT ;循环处理多字节求补 例例26 26 统计自统计自P1P1口输入的字串中正数、负数、零的个数。口输入的字串中正数、负数、零的个数。 设设R0R0、R1R1、R2R2三个工作寄存器分别为统计正数、负数、三个工作
23、寄存器分别为统计正数、负数、零的个数的计数器。零的个数的计数器。START:CLR A MOV R0,A MOV R1,A MOV R2,A ENTER:MOV A,P1 ;自P1口取一个数 JZ ZERO ;该数为0,转ZERO JB P1.0,NEG ;该数为负,转NEG INC R0 ;该数不为0、不为负,则必为正数,R0内容加1 SJMP ENTER ;循环自P1口取数 ZERO: INC R2 ;零计数器加1 SJMP ENTER NEG: INC R1 ;负数计数器加1 SJMP ENTER 例例27 27 双字节无符号数乘法子程序设计。双字节无符号数乘法子程序设计。 两个双字节无
24、符号数分别放在两个双字节无符号数分别放在R7R7、R6R6和和R5R5、R4R4中。中。 算法:把乘数分解为:算法:把乘数分解为: (R7)(R6) = (R7) 28 + (R6) (R5)(R4) = (R5) 28+(R4) 两个数的乘积可表示为:两个数的乘积可表示为: (R7)(R6)(R5)(R4) = (R7) 28 + (R6) (R5) 28 + (R4) = (R7) (R5) 216 + (R7) (R4) 28 + (R6) (R5) 28 + (R6) (R4) = (R04) (R03) (R02) (R01) 将将(R6) (R4)(R6) (R4)放入放入(R02
25、) (R01)(R02) (R01)中,将中,将(R7) (R4)(R7) (R4)和和(R6) (R5)(R6) (R5)累加到累加到(R03) (R02)(R03) (R02)中,再将中,再将(R7) (R5) (R7) (R5) 累加到累加到(R04) (R03)(R04) (R03)中即可得到乘积结果。中即可得到乘积结果。 入口:入口:(R7 R6)=(R7 R6)=被乘数,被乘数,(R5 R4)=(R5 R4)=乘数,乘数,(R0)=(R0)=乘积的低位乘积的低位字节地址指针。字节地址指针。 出口:出口:(R0)=(R0)=乘积的高位字节地址指针,指向乘积的高位字节地址指针,指向32
26、32位积的高位积的高8 8位。位。 工作寄存器:工作寄存器:R3R3、R2R2存放部分积,存放部分积,R1R1存放进位位。存放进位位。MUL1:MOV A,R6 ;取被乘数的低字节到A MOV B,R4 ;取乘数的低字节到B MUL AB ;(R6) (R4) MOV R0,A ;R01存乘积低8位 MOV R3,B ;R3暂存(R6) (R4)的高8位 MOV A,R7 ;取被乘数的高字节到A MOV B,R4 ;取乘数的低字节到B MUL AB ;(R7) (R4) ADD A,R3 ;(R7) (R4)低8位加(R3) MOV R3,A ;R3暂存28部分项低8位 MOV A,B ;(R
27、7) (R4)高8位送AADDC A,#00H ;(R7) (R4)高8位加进位位CY MOV R2,A ;R2暂存28部分项高8位 MOV A,R6 ;取被乘数的低字节到A MOV B,R5 ;取乘数的高字节到B MUL AB ;(R6) (R5) ADD A,R3 ;(R6) (R5)低8位加(R3) INC R0 ;调整R0地址为R02单元 MOV R0,A ;R02存放乘积158位结果 MOV R1,#00H ;清暂存单元 MOV A,R2 ADDC A,B ;(R6) (R5)高8位加(R2)与CY MOV R2,A ;R2暂存28部分项高8位 JNC NEXT ;28项向216项无
28、进位则转移 INC R1 ;有进位则R1置1标记NEXT:MOV A,R7 ;取被乘数高字节 MOV B,R5 ;取乘数高字节 MUL AB ;(R7) (R5) ADD A,R2 ;(R7) (R5)低8位加(R2) INC R0 ;调整R0地址为R03单元 MOV R0,A ;R03存放乘积2316位结果 MOV A,B ADDC A,R1 ;(R7) (R5)高8位加28项进位 INC R0 ;调整R0地址为R04单元 MOV R0,A ;R04存放乘积3124位结果 RET 数制转换程序数制转换程序 例例28 28 将某将某8 8位二进制数转换为位二进制数转换为BCDBCD码。码。 设
29、设8 8位二进制数已在位二进制数已在A A中,转换后存于片内中,转换后存于片内RAMRAM的的20H20H、21H21H单元。单元。 MOV B,#100 DIV AB ;该8位二进制数除100,在A中得商,也即转换为BCD码后 ;的百位数 MOV R0,#21H ;R0指向21H单元 MOV R0,A ;百位数存入片内RAM的21H单元 DEC R0 ;调整R0指向20H单元 MOV A,#10 XCH A,B ;该8位二进制数除100所得余数自B交换到A,A中的10 ;交换进B DIV AB ;除100所得余数进一步除10,在A中得转换为BCD码后的 ;十位数;在B中得余数,也即转换为BC
30、D码后的个位数 SWAP A ;A中BCD码的十位数调整到A的高半字节,原高半字节的 ;零则调整到低半字节 ADD A,B ;A中高半字节的十位数与B中低半字节的个位数合并,结 ;果在A中 MOV R0,A ;十位数与个位数存入20H单元 例例29 29 将某十进制数转换为将某十进制数转换为ASCIIASCII码。码。 设该十进制数已在设该十进制数已在A A中。中。 查查ASCIIASCII码表可知:数字码表可知:数字0909的的ASCIIASCII码分别是码分别是30H39H30H39H;英文大写字母英文大写字母AFAF的的ASCIIASCII码分别是码分别是41H46H41H46H。可见数
31、字的。可见数字的ASCIIASCII码值与数字值相差码值与数字值相差30H30H;字母的;字母的ASCIIASCII码值与其值相码值与其值相差差37H37H。 MOV R2,A ;将待转换的十六进制数暂存于R2 ADD A,#F6H ;将待转换的十六进制数加246,以待根据相加后 ;有无进位来判别它是否大于等于10 MOV A,R2 ;原十六进制数送到A JNC AD30 ;如无进位,转换到AD30,只加30H ADD A,#07H ;有进位,不跳转,加07H AD30:ADD A,#30H END 例例30 30 编写将某编写将某BCDBCD码数据转换为码数据转换为ASCIIASCII码的子
32、程序。码的子程序。 设待转换的设待转换的BCDBCD码数据已在累加器码数据已在累加器A A中,且在程序存储器中,且在程序存储器中按序放有与中按序放有与BCDBCD码数据对应的码数据对应的ASCIIASCII码的表格,其首地址为码的表格,其首地址为TABTAB。TRANS1:MOV DPTR,#TAB ;将表首地址置入DPTR MOVC A,A+DPTR ;查表得对应的ASCII码 RET ;返主 TAB: DB 30H DB 31H DB 32H DB 39H 用用MOVC AMOVC A,A+PCA+PC指令的子程序:指令的子程序: TRANS1:INC A ;调整查表指令距表首地址的偏移量
33、 MOVC A,A+PC ;查表得对应的ASCII码 RET ;返主TAB:DB 30H DB 31H DB 32H DB 39H 多分支转移多分支转移( (散转散转) )程序程序1 1使用转移指令表的散转程序使用转移指令表的散转程序 例例31 31 设计可多达设计可多达128128路分支出口的转移程序。路分支出口的转移程序。 设设128128个出口分别转向个出口分别转向128128段小程序,它们的首地址依次段小程序,它们的首地址依次为为addr00addr00、addr01addr01、addr02addr02、addr03addr03、addr7Faddr7F。要转移。要转移到某分支的信息
34、存放在工作寄存器到某分支的信息存放在工作寄存器R2R2中。中。 MOV DPTR,#TAB MOV A,R2 RL A ;将出口分支信息乘2 JMP A+DPTRTAB:AJMP addr00 AJMP addr01 AJMP addr02 AJMP addr7F改用改用LJMPLJMP指令:指令: MOV DPTR,#TAB MOV A,R2 MOV B,#3 MUL AB ;以上3条指令将出口信息乘3 XCH A,B ;积的高8位交换到A,低8位暂存于B ADD A,DPH MOV DPH,A ;把积的高8位叠加到DPH XCH A,B ;积的低8位交换回A JMP A+DPTR TAB:
35、LJMP addr00 LJMP addr01 LJMP addr02 LJMP addr7F 2 2使用地址表的散转程序使用地址表的散转程序 设计方法:把转移执行的目标地址组织成一个地址设计方法:把转移执行的目标地址组织成一个地址表,在程序中查表获得转移执行的目标地址,然后转向表,在程序中查表获得转移执行的目标地址,然后转向该地址执行。该地址执行。 例例32 32 设计有设计有256256路分支出口的转移程序。路分支出口的转移程序。 设出口信息已在设出口信息已在R2R2中。中。 查表取得目标地址,利用查表取得目标地址,利用PUSHPUSH与与RETRET指令将目标地址送入指令将目标地址送入P
36、CPC,达到转移的目的。达到转移的目的。MOV DPTR,#TAB MOV A,R2 ;出口信息送A CLR C RLC A ;出口信息乘2 JNC LOW ;出口信息在0127之间则转移 INC DPH ;出口信息在128255之间,则DPTR加256 LOW:MOV R3,A ;出口信息暂存于R3 MOVC A,A+DPTR ;查找目标地址的低8位 PUSH A ;目标地址的低8位压栈 MOV A,R3 ;A恢复为出口信息 INC A MOVC A,A+DPTR ;查找目标地址的高8位 PUSH A ;目标地址的高8位压栈 RET 定时器定时器/ /计数器应用程序计数器应用程序 设计定时器
37、设计定时器/ /计数器应用程序,包括:计数器应用程序,包括: 根据定时或计数要求确定适当的定时器根据定时或计数要求确定适当的定时器/ /计数器工作方计数器工作方式、计算出初值,并设置特殊功能寄存器式、计算出初值,并设置特殊功能寄存器TMODTMOD、THxTHx、TLxTLx。 根据对定时器根据对定时器/ /计数器的工作要求设置中断系统,即设计数器的工作要求设置中断系统,即设置中断允许控制寄存器置中断允许控制寄存器IEIE和中断优先级控制寄存器和中断优先级控制寄存器IPIP。 启动定时器启动定时器/ /计数器,即置位计数器,即置位TCONTCON中的中的TRxTRx位。位。 例例33 33 要
38、求用单片机内部的定时器要求用单片机内部的定时器/ /计数器定时计数器定时1 1分钟。分钟。 设单片机振荡频率设单片机振荡频率fosc=12 MHzfosc=12 MHz。 分析:分析: 定时工作方式,最长定时时间只有定时工作方式,最长定时时间只有65.536 ms65.536 ms。1 1分钟定时分钟定时可采用两个定时器串接的方法。使可采用两个定时器串接的方法。使T0T0工作于方式工作于方式1 1定时定时1 ms1 ms,T1T1工作于方式工作于方式1 1对对T0T0的溢出脉冲计数的溢出脉冲计数6000060000次,即定时次,即定时1 1分钟。分钟。 T1T1计数对外部引脚计数对外部引脚P3
39、.5P3.5上的输入脉冲进行上的输入脉冲进行, T0, T0的溢出对外的溢出对外无脉冲信号。用软件方法,当无脉冲信号。用软件方法,当T0T0定时溢出时,在定时溢出时,在P3.5P3.5引脚上形引脚上形成一个计数脉冲。成一个计数脉冲。 T0T0、T1T1初值计算及设置:初值计算及设置: 初值计算初值计算 T0:65536-1000=64536=FC18H T1:65536-60000=5536=15A0H参考程序如下:参考程序如下: LJMP 0030H ORG 0030H ;主程序START: MOV TMOD,#51H ;设置T0、T1工作方式REPEAT:MOV TH1,#15H ;设置T
40、1计数初值 MOV TL1,#A0H MOV TH0,#0FCH ;设置T0计数初值 MOV TL0,#18H CLR P3.5 ;以便形成计数脉冲 MOV IE,#88H ;开T1内部中断 SETB TR1 ;启动定时器/计数器T1 SETB TR0 ;启动定时器/计数器T0LOOP: ;此处可写完成监控任务的程序 JNB TF0,$ ;T0定时未到等待,定时到执行以下程序 CLR TF0 ;清T0溢出标志 JBC F0,ELSE ;F0在中断服务程序中置位,表示定时1分钟到,此时转ELSE ;处执行 SETB P3.5 ;形成计数脉冲,T1计数一次 MOV TH0,#0FCH ;重装T0初
41、值 MOV TL0,#18H CLR P3.5 ;以便再形成计数脉冲 SJMP LOOPELSE: ;此处可写定时1分钟到后的处理程序 AJMP REPEAT ORG 001BH ;定时器/计数器T1的中断服务程序入口地址 SETB F0 ;建立定时1分钟到的用户标志 RETI 外部中断应用程序外部中断应用程序 例例34 34 某工业监控系统,具有温度、压力、某工业监控系统,具有温度、压力、PHPH值等多路监值等多路监控功能,中断源的连接如图控功能,中断源的连接如图3.93.9所示。对于所示。对于PHPH值,在小于值,在小于7 7时向时向CPUCPU申请中断,申请中断,CPUCPU响应中断后使
42、响应中断后使P3.0P3.0引脚输出高电平,经驱动,引脚输出高电平,经驱动,使加碱管道电磁阀接通使加碱管道电磁阀接通1 1秒钟,以调整秒钟,以调整PHPH值。值。图3.9 多个外部中断源公用引脚的接法ORG 0030H ;外部中断0中断服务程序入口 JB P1.0,INT00 ;检测转移指令表 JB P1.1,INT01 JB P1.2,INT02 JB P1.3,INT03 ORG 0080H ;中断服务程序2 INT02:PUSH PSW ;保护现场 PUSH A SETB PSW.3 ;工作寄存器设置为1组,以保护原0组的内容 SETB P3.0 ;接通加碱管道电磁阀 ACALL DEL
43、AY ;调延时1秒子程序CLR P3.0 ;1秒钟到关加碱管道电磁阀 ANL P1,#BFH ORL P1,#40H ;这两条用来产生一个P1.6的负脉冲,用来撤除PH7 ;的中断请求 POP A POP PSW RETI 串行口应用程序串行口应用程序 例例35 35 由串行口发送带偶校验位的由串行口发送带偶校验位的ASCIIASCII码数据块。码数据块。 设拟发送的设拟发送的ASCIIASCII码数据块在片内码数据块在片内RAMRAM的的30H30H3FH3FH单元;单元;单片机采用单片机采用12 MHz12 MHz晶振。串行口工作于方式晶振。串行口工作于方式1 1;定时器;定时器/ /计计
44、数器数器T1T1用作波特率发生器,工作于方式用作波特率发生器,工作于方式2 2;PCONPCON中的中的SMODSMOD位位为为0 0;发送的波特率要求为;发送的波特率要求为12001200。1 1、定时器、定时器/ /计数器计数器T1T1初值计算初值计算 波特率波特率=2=2SMODSMODT1T1溢出率溢出率/32/32 溢出率溢出率=1200=120032=3840032=38400 溢出周期溢出周期=1/=1/溢出率溢出率=26 s =26 s 定时器初值定时器初值=256-26=230=E6H=256-26=230=E6H2 2、TMODTMOD中的方式控制字为中的方式控制字为20H
45、20H,串行口,串行口SCONSCON中的控制字为中的控制字为40H40H。3 3、奇偶校验位的确定。、奇偶校验位的确定。TSTART:MOV TMOD,#20H ;置定时器/计数器T1工作于方 式2定时 MOV TL1,#0E6H ;定时器/计数器T1置初值 MOV TH1,#E6H ;定时器/计数器T1置重装数 MOV SCON,#40H ;置串行口工作于方式1 MOV R0,#30H ;R0作地址指针,指向数据块 首址 MOV R7,#10H ;R7作循环计数器,置以发送 字节数 SETB TR1 ;启动定时器/计数器T1LOOP:MOV A,R0 ;取待发送的一个字节 MOV C,P
46、;取奇偶标志,奇为1,偶为0 MOV A.7,C ;给发送的ASCII码最高位加偶校验位 MOV SBUF,A ;启动串行口发送 WAIT:JNB TI,WAIT ;等待发送完毕 CLR TI ;清TI标志,为下一个字节发送作准备 INC R0 ;指向数据块下一个待发送字节的地址 DJINZ R7,LOOP ;循环发送,直到数据块发送完毕 RET 例例36 36 由串行口接收带偶校验位的由串行口接收带偶校验位的ASCIIASCII码数据块。码数据块。 设待接收数据块共设待接收数据块共10H10H个字节,接收后拟存于片内个字节,接收后拟存于片内RAMRAM的的40H40H4FH4FH单元;单片机
47、采用的晶振频率、波特率、单元;单片机采用的晶振频率、波特率、SMODSMOD位的值等位的值等均同例均同例3535。RSTART:MOV TMOD,#20H ;置定时器/计数器T1工作于方式2定时 MOV TL1,#0E6H ;定时器/计数器T1置初值 MOV TH1,#E6H ;定时器/计数器T1置重装数 MOV R0,#40H ;R0作地址指针,指向拟存放数据块首址 MOV R7,#10H ;R7作循环计数器,置以接收数据字节数 SETB TR1 ;启动定时器/计数器T1LOOP:MOV SCON,#50H ;置串行口工作于方式1并启动串行口接收WAIT:JNB RI,WAIT ;等待接收完毕 MOV A,SBUF ;取已接收字节数据到A MOV C,P ;取奇偶标志,奇为1,偶为0 JC ERROR ;发现有错,转出错处理程序 ANL A,#7FH ;未出错,去掉偶校验位 MOV R0,A ;存已接收的一个字节 INC R0 ;指向下一存放已接收字节的地址 DJINZ R7,LOOP ;循环接收,直到数据块接收完毕 RET