1 / 47

【 例 3-1】 ( A ) =53H , ( R0 ) =FCH ,执行指令 ADD A,R0 结果 : ( A ) =4FH , Cy=1 , Ac=0 , OV=0 , P=1

0 1 0 1 0 0 1 1 + 1 1 1 1 1 1 0 0 1 1 1 0 0 0 0 = 0 1 0 0 1 1 1 1. 1 0 0 0 0 1 0 1 + 1 0 1 0 1 1 1 1 0 0 0 1 1 1 1 = 0 0 1 1 0 1 0 0. Cy: 1. Cy: 1. P.38. 【 例 3-1】 ( A ) =53H , ( R0 ) =FCH ,执行指令 ADD A,R0

ashtyn
Télécharger la présentation

【 例 3-1】 ( A ) =53H , ( R0 ) =FCH ,执行指令 ADD A,R0 结果 : ( A ) =4FH , Cy=1 , Ac=0 , OV=0 , P=1

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 0 1 0 1 0 0 1 1 + 1 1 1 1 1 1 0 0 1 1 1 0 0 0 0 = 0 1 0 0 1 1 1 1 1 0 0 0 0 1 0 1 + 1 0 1 0 1 1 1 1 0 0 0 1 1 1 1 = 0 0 1 1 0 1 0 0 Cy: 1 Cy: 1 P.38 【例3-1】(A)=53H,(R0)=FCH,执行指令 ADD A,R0 结果: (A)=4FH,Cy=1,Ac=0,OV=0,P=1 注意:运算中,由于位6和位7同时有进位,所以标志位OV=0。 【例3-2】(A)= 85H,(R0)=20H,(20H)=AFH,执行指令: ADD A,@R0 结果:(A)=34H,Cy=1,Ac=1,OV=1,P=1 注意:由于位7有进位,而位6无进位,所以标志位OV=1

  2. 1 0 0 0 0 1 0 1 + 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 = 1 0 0 0 0 1 0 1 Cy: 1 Cy: 0 1 1 0 0 1 0 0 1 - 0 1 0 1 0 1 0 0 - 1 = 0 1 1 1 0 1 0 0 ←原Cy P.38~40 ←原Cy 【例3-3】(A)=85H,(20H)=FFH,Cy=1,执行指令: ADDC A,20H 结果为:(A)=85H,Cy=1,Ac=1,OV=0,P=1 【例3-4】(A)=56H,(R5)=67H,把它们看作为两个压缩的BCD数,进行BCD数的加法。执行指令: ADD A,R5 ;先按二进制加,得BDH DA A ;紧接着进行BCD调整,得23H且有向上进位 结果为:(A)=23H,Cy=1 (维持ADD后的Ac=1,OV=1),P=1。 可见,56+67=123,结果是正确的。 【例3-5】(A)=C9H,(R2)=54H,Cy=1,执行指令 SUBB A,R2 结果:(A)=74H,Cy=0,Ac=0,OV=1(位6向位7借位而位7无 向上借位) ,P=0

  3. P.41 【例3-6】(A)=0FH,(R7)=19H,(30H)=00H,(R1)=40H,(40H)=0FFH,执行指令 DEC A ;(A)-1→A = 0EH DEC R7 ;(R7)-1→R7 =18H DEC 30H ;(30H)-1→30H = FFH DEC @R1 ;((R1))-1→(R1) = FEH 结果为(A)=0EH,(R7)=18H,(30H)=0FFH,(40H)=0FEH,P=1, 不影响其他标志 【例3-7】 (A)=FBH,(B)=12H,执行指令 DIV AB 结果为(A)=0DH,(B)=11H,Cy=0,OV=0。

  4. 【例B3-7】编程序实现R1、R2中的双字节BCD数加上R3、R4中的双字节BCD数,三字节和值存放于R5、R6、R7中。【例B3-7】编程序实现R1、R2中的双字节BCD数加上R3、R4中的双字节BCD数,三字节和值存放于R5、R6、R7中。 ORG 11A0H 11A0 EA MOV A,R2 ;取被加数低字节 11A1 2C ADD A,R4 ;加上加数低字节 11A2 D4 DA A;十进制调整 11A3 FF MOV R7,A ;存和值的低字节 11A4 E9 MOV A,R1 ;取被加数高字节 11A5 3B ADDC A,R3 ;加上加数高字节及低字节的进位 11A6 D4 DA A;十进制调整 11A7 FE MOV R6,A ;存和值的高字节 11A8 74 00 MOV A,#00H ;被加数与加数无第三字节,设其为0 11AA 34 00 ADDC A,#00H ;加上高字节向第三字节的进位 ;无需进行十进制调整(其结果为00H或01H) 11AC FD MOV R5,A ;存和值的第三字节 11AD 80 FE SJMP $ ;自循环暂停 11AF 【练习】如果是双字节数相加结果只需双字节呢? 如果是双字节二进制数相加(不是BCD数)呢? 如果是双字节二进制数相减结果为双字节二进制数呢? 如果是单字节二进制数相加结果为双字节呢? 如果是(31H)、(30H)的双字节数加上(41H)、(40H)中的双字节数,三字节结果存放于(52H)、(51H)、(50H)中,前者为高字节,如何编程。

  5. D0 D0 D7 D7 D7 D0 D0 D7 移位指令操作示意图 【例B3-11】 8位二进制码算术左移(无符号数乘2): CLR C ;Cy清0 RLCA;左移1位,低位补0,原最高位进到Cy中 【例B3-12】 8位二进制码逻辑右移(无符号数除2): CLR C ;Cy清0 RRCA;右移1位,高位补0,原最低位移到Cy中 【思考】 DPTR(DPH、DPL)中的16位二进制码算术左移(乘2) 【思考】 DPTR(DPH、DPL)中的16位二进制码逻辑右移(除2)

  6. 请分析下列程序段执行后有关单元的内容。 MOV A,#68H MOV R0,#40H PUSH ACC ADD A,#50H MOV @R0,A MOV A,R0 INC R0 MOV @R0,A POP B ORL A,40H 答:A= , R0= , B= , (40H)= , (41H)=

  7. 【例】单字节BCD码加法运算 (BCD.ASM) [+46]补 ;单字节BCD码加法运算 0000 ORG 0000H 0000 802E SJMP MAIN 0002 0030 ORG 0030H 0030 7456 MAIN:MOV A , #56H 0032 2467 ADD A , #67H 0034 D4 DA A 0035 F530 MOV 30H , A 0037 80FE SJMP $ ; 0039 END +2 目标地址 0030 减下一址- 0002 获rel字节002E PC→ +48 执行相对转移:PC ← PC + rel ;∴rel=[目标地址-下一指令址]低8位 目标地址 下一指令址 + 偏移量 0030H ← 0002H + 0046H

  8. P.68 例4-12(改)如果xi均为单字节数,并按i顺序存放在51单片机内部RAM从50H开始的单元中,数据个数n放在R2中,求这批数据的和(双字节)放在R3、R4中,程序如下:(求数组和程序) ORG 0000H ADD1: MOV R2,#0AH ;加法次数n 送R2,n为具体的数据个数,如10 MOV R3,#0 ;部分和高字节单元清0 MOV R4,#0 ;部分和低字节单元清0 MOV R0,#50H;R0指向第一个数 LOOP: MOV A,R4 ;取部分和低字节原有的值 ADD A,@R0 ;加上当前数低字节(本例原始数据只有低字节) MOV R4,A ;回存新的部分和低字节结果 MOV A,R3 ;取部分和高字节原有的值 ADDC A, #00H ;加上当前数高字节(00H)及低字节的进位 MOV R3,A ;回存新的部分和高字节结果 INC R0;R0指向下一个数 DJNZ R2,LOOP ;未加完,转回继续进行下一个数的累加 SJMP $ END

  9. 补充1: 请编程序使40H、41H单元所存储的二个数中的大数减去小数,差值存58H单元(即求两数差的绝对值)。 补充2:有8个双字节BCD数存放在片内RAM的40H开始的单元中,请编程求它们的和(双字节)放在60H、61H单元中。(设双字节数的高字节存放在两字节的高地址单元)

  10. 补充3:完成下列程序的人工汇编工作: ORG 2036H D2 SETB P1.6 12 LOOP:LCALL DELY B2 CPL P1.6 80 SJMP LOOP 7D DELY:MOV R5,#0F5H 00 DELY2:NOP 00 NOP DD DJNZ R5,DELY2 22 RET 2036 1 ORG 2036H 2036 D296 2 SETB P1.6 2038 12203F 3 LOOP:LCALL DELY 203B B296 4 CPL P1.6 203D 80F9 5 SJMP LOOP 203F 7DF5 6 DELY: MOV R5,#0F5H 2041 00 7 DELY2: NOP 2042 00 8 NOP 2043 DDFC 9 DJNZ R5,DELY2 2045 22 10 RET

  11. (INT0-1.ASM) 外部中断应用例: 【例B5-1】外部中断INT0每中断一次令P1.0求反。 实验板INT0按键电路

  12. (INT0-2.ASM) 软件计数改为 5×100×200=100000次 DJNZ 4AH,LR MOV 4AH,#200 DJNZ 49H,LR MOV 49H,#100 【例B5-2】外部中断INT0每中断五次令P1.0求反一次 (要紧接着 DJNZ后重置) MOV 4AH,#200 MOV 49H,#100

  13. (INT0-3.ASM) 【例B5-3】主程序运用软件延时控制P1.7秒闪的同时实现外部中断INT0每中断五次令P1.0求反一次

  14. (INT0-4.ASM) 【例B5-4】上例基础上中断服务子程序具体代码后移的方法

  15. 【例B5-2】 INT0每中断1次令50H单元内容加1并且输出到P1口 (INT0-5.ASM) MOV A,50H ADD A,#1 DA A MOV 50H,A 按BCD码加1

  16. 【例B4-3】将3AH单元中的压缩BCD码转换为非压缩BCD码分别存放到30H、31H单元中去,其中高位(十位)存放在31H单元。【例B4-3】将3AH单元中的压缩BCD码转换为非压缩BCD码分别存放到30H、31H单元中去,其中高位(十位)存放在31H单元。 • CZ1:MOV A,3AH ;取压缩BCD码 • ANL A,#0FH ;保留低4位(个位) • MOV 30H,A ;送非压缩BCD码个位单元 • MOV A,3AH ;再取原压缩BCD码 • ANL A,#0F0H ;保留高4位(十位) • SWAP A ;交换到低4位 • MOV 31H,A ;送非压缩BCD码十位单元 【拆字拼字典型程序例】 【拆字程序】 屏蔽高四位 屏蔽低四位 • 编写非压缩BCD码转换为压缩BCD码的程序 • 编写压缩BCD码转换为对应的两个ASCII码的程序 • 编写两个0~9的ASCII码转换为对应的压缩BCD码的程序 【拼字程序】 【拆字程序】 【拼字程序】

  17. 【例B4-3】将3AH单元中的压缩BCD码转换为非压缩BCD码分别存放到30H、31H单元中去,其中高位(十位)存放在31H单元。【例B4-3】将3AH单元中的压缩BCD码转换为非压缩BCD码分别存放到30H、31H单元中去,其中高位(十位)存放在31H单元。 • CZ:MOV R0,#3AH ;拆字程序。R0指向压缩BCD码单元 • MOV R1,#30H ; R1指向非压缩BCD码第一单元 • CZ1:MOV A,@R0 ;取压缩BCD码 • ANL A,#0FH ;保留低4位(个位) • MOV @R1,A ;送非压缩BCD码个位单元 • INC R1 ;R1指向高位单元(十位) • MOV A,@R0 ;再取原压缩BCD码 • ANL A,#0F0H ;保留高4位(十位) • SWAP A ;交换到低4位 • MOV @R1,A ;送非压缩BCD码十位单元 【拆字拼字典型程序例】

  18. CJNE A,49H,LP SJMP LP1 ;相等 LP:JNC LP1 ;甲>乙 【例B4-1】请编程序使48H、49H单元所存储的二个数中较大者 在前。 ORG 0000H BIG:MOV A ,48H ;取甲 CLR C ;清Cy SUBB A ,49H ;减去乙数 JNC LP1 ;无借位则甲≥乙,转LP1 MOV A ,48H ;乙数大:两数交换 MOV 48,49H MOV 49H,A LP1:SJMP $;自循环 【练习】 • 请编程序使48H、49H单元所存储的二个数中较小者送28H单元。 • 请编程序判断若34H、35H单元所存储的二个数相等则置F0位为0,否则置1。

  19. P.69 多重循环程序:最常见的多重循环是软件延时程序。 例4-1450ms延时程序。 使用12MHz晶振时,一个机器周期为TM=1µs,执行一条DJNZ指令的时间为2µs。这时,可用双重循环方法写出延时50ms的程序: DEL: MOV R7,#200① DEL1: MOV R6,#125 ② DEL2: DJNZ R6,DEL2③;估算:2*125*200*1µs≈50ms DJNZ R7,DEL1 ④ RET ⑤ 以上计算没有考虑到除“DJNZ R6,DEL2 ”指令外的其它指令的执行时间,如细致计算,它的延时时间为: [1+(1+2*125+2)*200+2]×1µs=50603µs=50.603ms ① ② ③ ④ ⑤

  20. 【计算程序运行时间例】 ;实现P1口输出驱动8只LED巡回点亮的控制程序 ORG 0000H MAIN:MOV SP,#6FH ;设定栈底指针 SETB C ;Cy置'1' MOV P1,#0FEH ;置控制码初始值并输出P1口,(P1.0='0',其他为'1') LOOP:LCALL D1S ;延时1S MOV A,P1 ;读入P1口原控制码 RL A ;调整控制码(循环左移一位) MOV P1,A ;输出新控制码到P1口 SJMP LOOP D1S:MOV R7,#8 ① ;软件延时1S子程序 D1S2:MOV R6,#200② D1S1:MOV R5,#200③ D1S0:NOP④ ;估算3×200×200×8×1.085uS≈1.0416 S DJNZ R5,D1S0⑤ DJNZ R6,D1S1⑥ DJNZ R7,D1S2⑦ RET⑧ END <2 +1+{1+[1+(1+2)×200+2]×200+2}×8+2>TM =964829TM=964829×12/11.0592=1,046,897uS CALL① ② ③ ④⑤ ⑥ ⑦ ⑧

  21. 作业四 : P.83 — 1. 2. 补充5-1:编写完整的应用程序,运用外部中断功能,实现从 INT1引脚每输入2个下降沿信号令3FH单元内容按BCD码加1并且输出到P1口。 补充5-2:请列式准确计算出运行下列软件延时子程序需要花费的机器周期数,设单片机时钟频率为11.0592MHZ,该子程序运行时间是多少的? DELAY:MOV R7,#3CH NOP DL:MOV R6,#0F8H NOP DJNZ R6,$ DEC R7 DJNZ R7,DL RET

  22. P.134 【例8-1】编写程序将片外数据存储器中5000H~50FFH单元全部清零 方法1: 用DPTR作数据地址指针,同时使用字节计数器。(计数控制循环) MOV DPTR,#5000H ;设置数据块指针的初值 MOV R7,#00H ;设置块长度计数器初值 CLR A;A置写数据00H LOOP: MOVX @DPTR,A ;把当前单元清零 INC DPTR ;地址指针加1 DJNZ R7,LOOP ;减1,若不为0则继续清零 HERE: SJMP HERE ;执行完毕,原地踏步 4FA0H EBH MOV A,#0D6H 如果改为对4FA0H~508AH单元写数据D6H ,如上更改。

  23. P.134 例8-1编写程序将片外数据存储器中5000H~50FFH单元全部清零 方法2: 用DPTR作为数据区地址指针,但不使用字节计数器,而是比较特征地址。 (条件控制循环) MOV DPTR,#5000H;设置数据块指针的初值 CLR A;A置写数据00H LOOP:MOVX @DPTR,A;把当前单元清零 INC DPTR;地址指针加1 MOV R7,DPL;取新地址值低字节 CJNE R7,# 0 ,LOOP;与末地址+1的低字节比较,未完继续 HERE:SJMP HERE 4FA0H MOV A,#0D6H 8BH 如果改为对4FA0H~508AH单元写数据D6H ,如上更改。

  24. ORG 0000H 0000 02 0030 LJMP START 0003 0030 ORG 0030H 0030 78 30 START:MOV R0,#30H ;R0指向源数据区首地址 0032 79 50 MOV R1,#50H ;R1指向目标数据区首地址 0034 7F 0C MOV R7,#12 ;置循环计数初值12 0036 E6 LOOP:MOV A,@R0 ;取当前源数据 0037 04 INC A ;加1 0038 F7 MOV @R1,A ;送目标数据区当前单元 0039 08 INC R0 ;R0指向下一个源数据 003A 09 INC R1 ;R1指向下一个目标单元 003B DF F9 DJNZ R7,LOOP ;循环计数减1,未完继续 003D 80 FE SJMP $ END 【数据块传送程序例】 【例B4-2】有一组数据,存放在30H为首地址的内存单元,数据长度为12个。试将每一个数取出加1,依序存放到以50H为首地址的单元中。 • 若题中说明数据个数n存放在2FH单元中? • 若要求的是个数据取出按BCD码加1后传送? • 若要求的是数据原样传送? • 若要求的是依序传送到58H之前的内存单元中? • 若要求的是与片外数据存储器之间进行数据块传送?

  25. 作业五 : P.140 — 4. 6. 7. 8. 11. 13. (对每个答案仔细思考为什么) 补充4-4:编写完整的应用程序,将片外数据存储器2A01H开始的24个单字节数据依次传送到片内32H开始的单元中。 补充8-1:请列出详细的地址分析过程,求出下列存储器片选译码电路各输出端所对应的地址区域。

  26. P.87-88 TM TOSC 溢出中断 标志 (12MHZ) (1uS) 计数溢出 +1 6.2.2 方式1——16位计数方式 16位可预置加1计数器 ‘1’接通 计数初值 可计数 可定时 0000H 65536次 65536TM 0001H 65535次 65535TM ············ FFFFH 1次 1TM 图6-5 • 12MHZ时最长可定时 65536uS • 11.0592MHZ时最长可定时约71111uS 6.4.1 方式1应用 【例6-1】假设系统时钟频率采用6MHz,要在P1.0上输出一个周期为2ms的方波,即500Hz方波,如图6-13所示。 P.86 500×2uS 每1mS令P1.0求反一次即可 图6-13

  27. 【例6-1】 [题意:Fosc=6MHz] P.91 ORG 0000H RESET: AJMP MAIN ;转主程序 ORG 000BH ;T0的中断入口 AJMP IT0P ;转T0中断处理程序IT0P ORG 0100H MAIN: MOV SP,#60H ;设堆栈指针 MOV TMOD,#01H ;设置T0为定时方式1,00000001B PT0M0: MOV TL0,#0CH ;置T0计数初值FE0CH,500=01F4H MOV TH0,#0FEH ;0000H-FE0CH=500,500×2uS=1mS SETB ET0 ;允许T0中断 SETB EA ;CPU开中断 SETB TR0 ;启动T0 HERE: AJMP HERE ;自身跳转 ITOP: MOV TL0,#0CH ;T0中断服务子程序,T0重新置初值 MOV TH0,#0FEH ;重置初值会导致有若干个TM误差 CPL P1.0 ;P1.0的状态取反 RETI ;中断返回 • 若改TMOD赋值05H,则实现:对T0引脚每计满500个脉冲令P1.0求反一次 • 若改计数初值为65536-250=65286=FF06H 则实现:P1.0输出1000HZ方波

  28. P.88 TM TOSC 溢出中断 标志 8位可预置加1计数器 (12MHZ) (1uS) 计数溢出 +1 6.2.3 方式2 ——8位计数自动重装工作方式 自动 ‘1’接通 计数初值 可计数 可定时 00H 256次 256TM 01H 255次 255TM ········· FFH 1次 1TM 自动重装初值寄存器 图6-6 • 12MHZ时最长可定时256uS • 11.0592MHZ时最长可定时约277.7uS 【例B6-1】改例6-1为T0定时方式2实现P1.0输出1000HZ方波 (1)选择工作方式控制字为TMOD=00000010B=02H。 (2)计算T0的计数初值X=28-250=6=06H 因此,TL1的初值为06H,重装初值寄存器TH1=06H (3)程序设计 借上例程序框架改造如下页:

  29. 【例B6-1】改例6-1为T0定时方式2实现P1.0输出1000HZ方波【例B6-1】改例6-1为T0定时方式2实现P1.0输出1000HZ方波 [题意:Fosc=6MHz] ORG 0000H RESET: AJMP MAIN ;转主程序 ORG 000BH ;T0的中断入口 AJMP IT0P ;转T0中断处理程序IT0P ORG 0100H MAIN: MOV SP,#60H ;设堆栈指针 MOV TMOD,#02H ;设置T0为定时方式2,00000010B PT0M0: MOV TL0,#06H;置T0计数初值06H,定时250×2=500uS MOV TH0,#06H;置自动重装初值06H SETB ET0 ;允许T0中断 SETB EA ;CPU开中断 SETB TR0 ;启动T0 HERE: AJMP HERE ;自身跳转 ITOP: ;T0中断服务子程序。 CPL P1.0 ;P1.0的状态取反 RETI ;中断返回

  30. 【例B6-2】扩展例B6-1的定时时间为P1.0输出1HZ方波【例B6-2】扩展例B6-1的定时时间为P1.0输出1HZ方波 ORG 0000H RESET: AJMP MAIN ;转主程序 ORG 000BH ;T0的中断入口 AJMP IT0P ;转T0中断处理程序IT0P ORG 0100H MAIN: MOV SP,#60H ;设堆栈指针 MOV TMOD,#02H ;设置T0为定时方式2,00000010B PT0M0: MOV TL0,#06H;置T0计数初值06H ,定时250×2=500uS MOV TH0,#06H;置自动重装初值06H SETB ET0 ;允许T0中断 SETB EA ;CPU开中断 SETB TR0 ;启动T0 MOV 58H,#10 MOV 59H,#100 HERE: AJMP HERE ITOP: DJNZ 58H,LR ;递减计数 MOV 58H,#10 DJNZ 59H,LR MOV 59H,#100 CPL P1.0 ;P1.0的状态取反 LR:RETI ;中断返回 [Fosc=6MHz] 以递增计数方式实现 中断次数的计数扩展 MOV 58H,#00H MOV 59H,#00H INC 58H ;二进制加1 MOV A,58H CJNE A,#0AH,LR MOV 58H,#00H MOV A,59H ADD A,#01H ;BCD加1 DA A MOV 59H,A CJNE A,#00H,LR MOV 59H,#00H

  31. P.94 【例6-4】利用T1的方式2对外部信号计数,要求每计满100个数,将P1.0取反。(本例是方式2计数模式的应用) (1)选择工作方式T1计数方式2的控制字为TMOD=60H。 (2)计算T1的初值X=28-100=156=9CH,∴TH1=TL1=9CH (3)程序设计 ORG 0000H LJMP MAIN ORG 001BH ;T1中断服务程序入口 CPL P1.0 ;P1.0位取反 RETI ORG 0100H MAIN:MOV TMOD,#60H ;设T1为计数方式2,01100000B MOV TL1,#9CH ;T0置初值 MOV TH1,#9CH SETB ET1 ;允许T1中断 SETB EA ;CPU开中断 SETB TR1 ;启动T1 HERE:AJMP HERE

  32. P.62 4.3.4 数据极值查找程序设计 在指定的无序数据区中找出最大值(或最小值)。 逐个进行数值大小的比较,记存下暂时较大(小)的数,最终从这批数据中找出最大值(或最小值)并存于某一单元中。 • 不带符号数比较大小根据相减后Cy标志位判定 • 补码表示的带符号数比较大小根据相减后差的符号位及OV标志位判定 A-B, Cy=0(JNC)则A≥B Cy=1(JC) 则A<B A-B→E, Es=0(正)且OV=0 或 Es=1(负)且OV=1 则A≥B Es=1(负)且OV=0 或 Es=0(正)且OV=1 则A<B

  33. 【例B4-4】以2042H为首地址的存储单元中,连续存放一组单字节无符号数,数据个数存于2041H单元,从中找出最大数并存于2040H。【例B4-4】以2042H为首地址的存储单元中,连续存放一组单字节无符号数,数据个数存于2041H单元,从中找出最大数并存于2040H。 【求极值典型程序例】 循环 次数 循环 准备 0100 ORG 0100H 0100 90 20 41 MOV DPTR , #2041H 0103 E0 MOVX A , @DPTR 0104 FF MOV R7,A ;取数据个数为循环次数 0105 A3 INC DPTR ;DPTR指向第一个数据 0106 75 30 00 MOV 30H , #00H ;向暂存单元预置极小值 0109 E0 L1: MOVX A , @DPIR ;取当前数据 010A B5 30 02 CJNE A , 30H , L2 ;比较,不等则进一步判大小 010D 80 04 SJMP L3 ;相等则跳转(本例可略去) 010F 40 02 L2:JC L3 ;Cy=1说明当前数小则跳转 0111 F5 30 MOV 30H,A ;Cy=0:当前数大则取代原暂存单元值 0113 A3 L3:INC DPTR ;DPTR指向下一个数据 0114 DF F3 DJNZ R7 , L1 ;未完继续比较 0116 90 20 40 MOV DPTR,#2040H 0119 E5 30 MOVA,30H 011B F0 MOVX @DPTR,A;存最大值结果 011C 80 FE SJMP $ 010E END P.70—9习题分析(改求最小数存6AH单元) 地址指针→ 数据初值→ 循环体 相等的处理 小于→ 大于→ 为下循环准备→ 循环控制→ 结果处理 • 找最小值? • 对片内单元数据?

  34. P.61 4.3.3 关键字查找程序设计 顺序检索和对分检索 1. 顺序检索 从第1项开始逐项顺序查找,判断所取数据是否与关键字相等。 • 找到与关键字相等的数据则进行……处理,继续或结束检索; • 全部数据扫描完从未发现与关键字相等的数据则进行……处理。

  35. 【例B4-5】从30H开始的20个字节的无序表中查找一个关键字如4AH,若有则将其所在单元地址存R3,若不存在则R3置0。【例B4-5】从30H开始的20个字节的无序表中查找一个关键字如4AH,若有则将其所在单元地址存R3,若不存在则R3置0。 ORG 0200H JS: MOV R0,#30H ;R0指向数据区首地址 MOV R5, #14H ;取数据长度于R5作为循环次数 MOV 2FH,#4AH ;关键字4AH存至2FH单元 LOOP: MOV A,@R0 ;取当前数据 CJNE A,2FH,LP1 ;与关键字比较,不相等转查下一个 MOV A, R0 ;找到关键字:取该数据所在地址 MOV R3,A ;存到R3中 SJMP LP2 ;结束查找 LP1: INC R0 ;R0指向新一个数据 DJNZ R5,LOOP ;未找完,继续 MOV R3,#00H ;全部查找结束:说明不存在,R3置00H LP2: SJMP $ P.70—7、8习题分析 【数据检索典型程序例】 这是初次找到的关键字数据的地址 • 若查找的关键字是字符‘a’?若是数50?若是BCD数50 ? • 若找到关键字数据则51H单元存01H,若不存在则51H单元存00H ? • 若要求统计关键字数据的个数值存放到54H单元,若都不存在54H单元存00H?

  36. 【数据表可在64K内任一处】 (x+ TAB) 【省用DPTR,数据表应随后】 (x+TAB-NEXTPC + PC)=(x+TAB) 相等

  37. 作业七:编写程序请加详细注释 P.70-8.试编写程序,查找在内部RAM的20H~40H单元中出现“00H”这一数据的次数,并将查找到的结果存入41H单元。 P.70-9改 在内部RAM的21H单元开始存有一组单字节无符号数,数据长度为20H,编写程序,要求找出最小数存入6AH单元。 【补充4-5】编写程序将40H、41H单元中的两位十进制数的ASCII码转换为对应的压缩BCD码存放到4AH单元中去,其中高位(十位数)的ASCII码存放在40H单元。

  38. 【例B11-1】分析如下8位D/A驱动程序,请绘出D/A输出波形,【例B11-1】分析如下8位D/A驱动程序,请绘出D/A输出波形, 标明幅度参数,列式精确计算输出波形的周期。设晶体振荡器的频率为6 MHz。 机器周期数 START:MOV DPTR,#0DFFFH (2) LP0:MOV A,#2AH (1) LP1:ADD A,#01H (1) MOVX @DPTR,A (2) CJNE A,#0C8H,LP1 (2) SJMP LP0 (2) 计算所产生的锯齿波周期?(6MHz) T=[1+(1+2+2)×(C8H-2BH+1)+2]×2uS =[5×158+3]×2uS =793×2uS =1586uS C8H 2BH T 图11-4

  39. 作业八:编写程序请加注释 【补充11-1】分析如下8位D/A驱动程序,请绘出D/A输出波形,标明幅度参数,列式精确计算输出波形的周期。(设fOSC=6MHZ) START:MOV DPTR,#7FFFH LP0:MOV A,#0C0H LP1:DEC A MOVX @DPTR,A CJNE A,#17H,LP1 SJMP LP0

  40. P.210 AT89C51与ADC0809的接口 (用地址总线低3位选择通道) ≈500kHZ 128uS一次 设fosc=6MHZ ≈1MHZ 01 0~1 01 MOVX写: ①DPTR送A15~A0②A送D7~D0 ③发WR“” ② 无关! ③ ③ ① 0 ③ ③ ① • 选择通道0(~通道7)且启动转换: 图11-17 MOV A , 00H ;A值与本次操作无关 MOV DPTR, #07FF8H MOVX @DPTR , A ;写操作实现选择IN0(~IN7)且启动转换 ;置启动相应输入通道的地址值7FF8H(~7FFFH) • A/D结束后读取结果数据: • MOVX A , @DPTR 地址分析:0111 1111 1111 1000--7FF8H 选IN0且启动 ················· 0111 1111 1111 1111—7FFFH 选IN7且启动

  41. P.211 【例】对8路模拟信号轮流采样一次,采用软件延时的方式,并依次把结果转储到数据存储区40H起的单元。 设fosc=6MHZ MAIN:MOV R1,#40H ;置数据区首地址 MOV R7,#08H ;置转换的通道个数 MOV DPTR,#7FF8H ;端口地址初值,指向模拟量输入通道IN0 LOOP:MOVX @DPTR,A ;启动当前通道A/D转换(A的值无关) MOV R6,#0FH ;软件延时,等待转换结束(64×2=128uS) DELAY:NOP NOP NOP DJNZ R6,DELAY ;延时约5×15×2uS=150uS MOVX A,@DPTR ;读取转换结果 MOV @R1,A ;存储转换结果 INC DPTR ;指向下一个模拟量通道(地址低三位决定通道 i) INC R1 ;修改数据区指针 DJNZ R7,LOOP ;8个通道全采样完否?未完则继续 ……

  42. 【补充】 AT89C51与ADC0809的接口 (用数据总线低3位选择通道) ≈500kHZ 128uS一次 设fosc=6MHZ ≈1MHZ 01 0~ 1 01 D2 D1 D0 MOVX读: ①DPTR送A15~A0②A送D7~D0 ③发WR“” ② ③ ③ ① 0 ③ ③ ① • 选择通道0(~通道7)且启动转换: MOV A , 00H MOV DPTR, #07FFFH MOVX @DPTR , A;写操作实现选择IN0(~IN7)且启动转换 ;置选择输入通道0(~7)的三位码,00H(~07H) ;置启动A/D的地址值 • A/D结束后读取结果数据: • MOVX A , @DPTR 地址分析:0111 1111 1111 1111--7FFFH 选INi且启动 (i=0~7,由A中数据的低三位000~111决定)

  43. 改用数据总线低3位选择通道时的程序变更: 【补充】 【例】对8路模拟信号轮流采样一次,采用软件延时的方式,并依次把结果转储到数据存储区40H开始的单元。 设fosc=6MHZ MAIN:MOV R1,#40H ;置数据区首地址 MOV R7,#08H ;置转换的通道个数 MOV DPTR,#7FFFH ; A/D端口地址 送DPTR MOV 18H,#00H ;置初始通道码,指向IN0 LOOP:MOVA,18H ;取当前通道码 MOVX @DPTR,A ;启动当前通道A/D(A的低三位决定通道 i) MOV R6,#0FH ;软件延时,等待转换结束(64×2=128uS) DELAY:NOP NOP NOP DJNZ R6,DELAY ;延时约5×15×2uS=150uS MOVX A,@DPTR ;读取转换结果 MOV @R1,A ;存储转换结果 INC 18H ;指向下一个模拟量通道 INC R1 ;修改数据区指针 DJNZ R7,LOOP ;8个通道全采样完否?未完则继续 ……

  44. P.211 中断方式 将图11-17中EOC脚经一个非门连接到8031的INT1*脚即可。转换结束时,EOC发出一个脉冲向单片机提出中断申请,单片机响应中断请求,在中断服务程序读A/D结果,并启动0809的下一次转换,外中断1采用下跳沿触发。

  45. 实验板A/D接口电路设计实例: U9 ADC0809 AN0 0~5V AN1 FBF8H→IN0 · · ·· ·· FBFFH→IN7 0~5V RD A0 A1 A2 接P2.2/A10 WR 89S51ALE--CLOCK +5V fALE≈11.0592MHZ/6≈1.8MHZ>>640KHZ 地址分析:1111 1011 1111 1000--FBF8H 选IN0且启动 ················· 1111 1011 1111 1111—FBFFH 选IN7且启动

  46. 实验板A/D驱动子程序:(主流程约每8mS调用一次) (灰) ADSUB:MOVDPTR,#0FBF9H;A/D子程序 MOVX @DPTR,A ;启动对IN1的A/D转换 LCALL D1MS ;延时等待A/D转换结束 MOVX A,@DPTR ;读取A/D转换结果值 MOV B,A ;A/D转换结果拆送最左两位的显示缓冲单元 ANL A,#0FH MOV 36H,A MOV A,B ANL A,#0F0H SWAP A MOV 37H,A RET • 如何修改ADSUB子程序为对IN0的A/D转换? • 如何修改ADSUB子程序使得A/D采集间隔扩展至0.4S或2S?

  47. 作业八(续) 【补充11-2】设AT89C51单片机与ADC0809的连接如下图,其中ADC0809的C、B、A有接到A2、A1、A0与接到D2、D1、D0两种方案,请测算该电路一次A/D转换的时间,针对两种方案分别编写程序段实现:启动对IN6输入的模拟量的A/D转换,待A/D转换结束后读取A/D转换结果数据并存入6AH单元。(调用的软件延时子程序可略,但须在注释说明延时时间,设fOSC=6MHZ) A2 D2 A1 D1 A0 D0

More Related