08.01.2013 Views

MCS-51 单片机设计应用程序实例 - Read

MCS-51 单片机设计应用程序实例 - Read

MCS-51 单片机设计应用程序实例 - Read

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

<strong>MCS</strong>-<strong>51</strong> 单 片 机 设 计 应 用 程 序 实 例<br />

例 1 闪 烁 LED 小灯的设计<br />

例 2 数 码管时钟电路的设计<br />

例 3 8× 8 点阵 LED 字符显示器<br />

例 4 八 路输入模拟信号的数值显示电路<br />

例 5 单 键学习型遥控器的设计<br />

例 6 十 六路电器遥控的设计<br />

例 7 自 行车里程/速度计的设计<br />

例 8 自 动往返行驶小汽车的设计<br />

例 9 遥 控小汽车的设计<br />

例 10 汽 车行驶信息发送与接收器<br />

例 11 数 控调频发射台的设计<br />

例 12 大 屏幕比赛用电子计分器的设计<br />

例 13可在线修改程序的单片机 W78B<strong>51</strong>6E 设计实例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

1


说明:<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

例 1 闪 烁 LED 小 灯 的 设 计<br />

采用 AT89C20<strong>51</strong> 单片机作为控制器,按 键 K1、K2、K3 可选择闪烁的方式,晶振采用 12MHZ,<br />

如要控制交流彩灯可在 P1 端口加接继电器或可控硅。<br />

;************;<br />

;小 灯控制程序;<br />

;************;<br />

;<br />

;************;<br />

;中 断入口程序;<br />

;************;<br />

;<br />

ORG 0000H<br />

LJMP START<br />

ORG 0003H<br />

RETI<br />

ORG 000BH<br />

RETI<br />

ORG 0013H<br />

RETI<br />

ORG 001BH<br />

RETI<br />

ORG 0023H<br />

RETI<br />

;<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

2


;************;<br />

; 初 始化程序 ;<br />

;************;<br />

;<br />

CLEAR: MOV 20H,#00H<br />

;<br />

SETB 00H<br />

RET<br />

;************;<br />

; 主 程 序 ;<br />

;************;<br />

;<br />

START:ACALL CLEAR<br />

MAIN: LCALL KEYWORK<br />

;<br />

JB 00H,FUN0<br />

JB 01H,FUN1<br />

JB 02H,FUN2<br />

JB 03H,MAIN<br />

AJMP MAIN<br />

;************;<br />

; 功 能程序 ;<br />

;************;<br />

;<br />

FUN0: MOV A,#0FEH<br />

FUN00:MOV P1,A<br />

;<br />

LCALL DL05S<br />

JNB ACC.7,MAIN<br />

RL A<br />

AJMP FUN00<br />

FUN1:MOV A,#0FEH<br />

FUN11:MOV P1,A<br />

;<br />

LCALL DL05S<br />

JZ MAIN<br />

RL A<br />

ANL A,P1<br />

AJMP FUN11<br />

FUN2:MOV A,#0AAH<br />

MOV P1,A<br />

LCALL DL05S<br />

CPL A<br />

MOV P1,A<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

3


LCALL DL05S<br />

AJMP MAIN<br />

;************;<br />

; 扫 键程序 ;<br />

;************;<br />

;<br />

KEYWORK:MOV P3,#0FFH<br />

;<br />

JNB P3.0,KEY0<br />

JNB P3.1,KEY1<br />

JNB P3.2,KEY2<br />

JNB P3.3,KEY3<br />

RET<br />

KEY0:LCALL DL10MS<br />

OUT0:RET<br />

JB P3.0,OUT0<br />

SETB 00H<br />

CLR 01H<br />

CLR 02H<br />

CLR 03H<br />

KEY1:LCALL DL10MS<br />

OUT1:RET<br />

JB P3.1,OUT1<br />

SETB 01H<br />

CLR 00H<br />

CLR 02H<br />

CLR 03H<br />

KEY2:LCALL DL10MS<br />

OUT2:RET<br />

JB P3.2,OUT2<br />

SETB 02H<br />

CLR 01H<br />

CLR 00H<br />

CLR 03H<br />

KEY3:LCALL DL10MS<br />

OUT3:RET<br />

;<br />

JB P3.3,OUT3<br />

SETB 03H<br />

CLR 01H<br />

CLR 02H<br />

CLR 00H<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

4


;************;<br />

; 延 时程序 ;<br />

;************;<br />

;<br />

DL<strong>51</strong>2:MOV R2,#0FFH<br />

LOOP1: DJNZ R2,LOOP1<br />

RET<br />

DL10MS:MOV R3,#14H<br />

LOOP2: LCALL DL<strong>51</strong>2<br />

DJNZ R3,LOOP2<br />

RET<br />

DL05S:MOV R4,#0FH<br />

LOOP3: LCALL DL25MS<br />

DJNZ R4,LOOP3<br />

RET<br />

DL25MS:MOV R5,#0FFH<br />

LOOP4:LCALL KEYWORK<br />

END<br />

DJNZ R5,LOOP4<br />

RET<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

5


说明:<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

例 2 数 码 管 时 钟 电 路 的 设 计<br />

采用 AT89C20<strong>51</strong> 作为控制器,设置一个调整按键,可进入三种状态:省电方式(不显示<br />

时间),调时状态,加 1状态。AT89C20<strong>51</strong> 可用 3V 供 电 。<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

;; AT89C20<strong>51</strong> 时 钟 程 序 ;;<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

;显 示缓冲单元在 70H— 75H, 70H— 71H 显示秒,72H— 73H 显示分,74H— 75H 显示时<br />

;时间计数单元在 70H— 71H( 秒)、76H— 77H( 分 )、 78H— 79H( 时 ), 7AH 单 元放熄灭符(#0AH)<br />

;计 数单元采用 BCD 码计数,定时器 T0 设 置 为 50MS 溢出中断,为 秒 计数用,定时器 T1 为调<br />

;整时闪烁用<br />

;P3.7 为调整按钮,P1 口 为 字符输出口,采用共阳显示管。<br />

;<br />

;<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

;; 中 断入口程序 ;;<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

;<br />

ORG 0000H<br />

LJMP START<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

6


;<br />

;<br />

;<br />

ORG 0003H<br />

RETI<br />

ORG 000BH<br />

LJMP INTT0<br />

ORG 0013H<br />

RETI<br />

ORG 001BH<br />

LJMP INTT1<br />

ORG 0023H<br />

RETI<br />

ORG 002BH<br />

RETI<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

;; 主 程 序 ;;<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

START: MOV R0, #70H<br />

MOV R7, #0BH<br />

MOV 20H, #00H<br />

CLEARDISP: MOV @R0, #00H<br />

INC R0<br />

DJNZ R7,CLEARDISP<br />

MOV 7AH,#0AH<br />

MOV TMOD,#11H<br />

MOV TL0, #0B0H<br />

MOV TH0, #3CH<br />

MOV TL1, #0B0H<br />

MOV TH1, #3CH<br />

SETB EA<br />

SETB ET0<br />

SETB TR0<br />

MOV R4,#14H<br />

start1: LCALL DISPLAY<br />

JNB P3.7,SETMM1<br />

SJMP Start1<br />

SETMM1: LJMP SETMM<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

;; 1 秒定时 程 序 ;;<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

;<br />

INTT0: PUSH ACC<br />

PUSH PSW<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

7


;<br />

CLR ET0<br />

CLR TR0<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

MOV A,#0B7H ;中 断同步修正<br />

ADD A,TL0<br />

MOV TL0,A<br />

MOV A,#3CH<br />

ADD A,TH0<br />

MOV TH0,A<br />

SETB TR0<br />

DJNZ R4, OUTT0<br />

ADDSS: MOV R4,#14H<br />

MOV R0,#71H<br />

ACALL ADD1 ;加 1 程序<br />

MOV A,R3<br />

CLR C<br />

CJNE A,#60H,ADDMM<br />

ADDMM: JC OUTT0<br />

ACALL CLR0<br />

MOV R0,#77H<br />

ACALL ADD1<br />

MOV A,R3<br />

CLR C<br />

CJNE A,#60H,ADDHH<br />

ADDHH: JC OUTT0<br />

ACALL CLR0<br />

MOV R0,#79H<br />

ACALL ADD1<br />

MOV A,R3<br />

CLR C<br />

CJNE A,#24H,HOUR<br />

HOUR: JC OUTT0<br />

ACALL CLR0<br />

OUTT0: MOV 72H,76H<br />

MOV 73H,77H<br />

MOV 74H,78H<br />

MOV 75H,79H<br />

POP PSW<br />

POP ACC<br />

SETB ET0<br />

RETI<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

;; 闪 动调时 程 序 ;;<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

8


;<br />

INTT1: PUSH ACC<br />

PUSH PSW<br />

MOV TL1, #0B0H<br />

MOV TH1, #3CH<br />

DJNZ R2,INTT1OUT<br />

MOV R2,#06H<br />

CPL 02H<br />

JB 02H,FLASH1<br />

MOV 72H,76H<br />

MOV 73H,77H<br />

MOV 74H,78H<br />

MOV 75H,79H<br />

INTT1OUT: POP PSW<br />

POP ACC<br />

RETI<br />

FLASH1: JB 01H,FLASH2<br />

MOV 72H,7AH<br />

MOV 73H,7AH<br />

MOV 74H,78H<br />

MOV 75H,79H<br />

AJMP INTT1OUT<br />

FLASH2: MOV 72H,76H<br />

;<br />

MOV 73H,77H<br />

MOV 74H,7AH<br />

MOV 75H,7AH<br />

AJMP INTT1OUT<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

;; 加 1 程序 ;;<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

;<br />

ADD1: MOV A,@R0<br />

DEC R0<br />

SWAP A<br />

ORL A,@R0<br />

ADD A,#01H<br />

DA A<br />

MOV R3,A<br />

ANL A,#0FH<br />

MOV @R0,A<br />

MOV A,R3<br />

INC R0<br />

SWAP A<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

9


;<br />

ANL A,#0FH<br />

MOV @R0,A<br />

RET<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

;; 清 零程序 ;;<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

;<br />

;<br />

CLR0: CLR A<br />

MOV @R0,A<br />

DEC R0<br />

MOV @R0,A<br />

RET<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

;; 时 钟调整程序 ;;<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

;<br />

SETMM: cLR ET0<br />

CLR TR0<br />

LCALL DL1S<br />

JB P3.7,CLOSEDIS<br />

MOV R2,#06H<br />

SETB ET1<br />

SETB TR1<br />

SET2: JNB P3.7,SET1<br />

SETB 00H<br />

SET4: JB P3.7,SET3<br />

LCALL DL05S<br />

JNB P3.7,SETHH<br />

MOV R0,#77H ;加 1 分程序<br />

LCALL ADD1<br />

MOV A,R3<br />

CLR C<br />

CJNE A,#60H,HHH<br />

HHH: JC SET4<br />

LCALL CLR0<br />

CLR C<br />

AJMP SET4<br />

CLOSEDIS: SETB ET0<br />

SETB TR0<br />

CLOSE: JB P3.7,CLOSE<br />

LCALL DISPLAY<br />

JB P3.7,CLOSE<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

10


;<br />

WAITH: JNB P3.7,WAITH<br />

LJMP START1<br />

SETHH: CLR 00H<br />

SETHH1: JNB P3.7,SET5<br />

SETB 01H<br />

SET6: JB P3.7,SET7<br />

LCALL DL05S<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

JNB P3.7,SETOUT<br />

MOV R0,#79H<br />

LCALL ADD1<br />

MOV A,R3<br />

CLR C<br />

HOUU: JC SET6<br />

CJNE A,#24H,HOUU<br />

LCALL CLR0<br />

AJMP SET6<br />

SETOUT: JNB P3.7,SETOUT1<br />

LCALL DISPLAY<br />

JNB P3.7,SETOUT<br />

CLR 01H<br />

CLR 00H<br />

CLR 02H<br />

CLR TR1<br />

CLR ET1<br />

SETB TR0<br />

SETB ET0<br />

LJMP START1<br />

SET1: LCALL DISPLAY<br />

AJMP SET2<br />

SET3: LCALL DISPLAY<br />

AJMP SET4<br />

SET5: LCALL DISPLAY<br />

AJMP SETHH1<br />

SET7: LCALL DISPLAY<br />

AJMP SET6<br />

SETOUT1: LCALL DISPLAY<br />

AJMP SETOUT<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

;; 显 示程序 ;;<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

;<br />

DISPLAY: MOV R1,#70H<br />

MOV R5,#0FEH<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

11


;<br />

PLAY: MOV A,R5<br />

MOV P3,A<br />

MOV A,@R1<br />

MOV DPTR,#TAB<br />

MOVC A,@A+DPTR<br />

MOV P1,A<br />

LCALL DL1MS<br />

INC R1<br />

MOV A,R5<br />

JNB ACC.5,ENDOUT<br />

RL A<br />

MOV R5,A<br />

AJMP PLAY<br />

ENDOUT: SETB P3.5<br />

MOV P1,#0FFH<br />

RET<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

;; 延 时程序 ;;<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

;<br />

;<br />

DL1MS: MOV R6,#14H<br />

DL1: MOV R7,#19H<br />

DL2: DJNZ R7,DL2<br />

DJNZ R6,DL1<br />

RET<br />

DS20MS: ACALL DISPLAY<br />

ACALL DISPLAY<br />

ACALL DISPLAY<br />

RET<br />

DL1S: LCALL DL05S<br />

LCALL DL05S<br />

RET<br />

DL05S: MOV R3,#20H<br />

DL05S1: LCALL DISPLAY<br />

DJNZ R3,DL05S1<br />

RET<br />

END<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

12


说明:<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

例 3 8× 8 点 阵 LED 字 符 显 示 器<br />

能显示“电子设计”四个文字,显示方式由 K1— K3 选择,K1 为 逐 字显示,K2 为 向上<br />

滚动显示,K3 为 向左滚动显示。采用 AT89C52 单片机,12MHZ 晶 振 , 8*8 共阳 LED 显示<br />

器。<br />

K3<br />

K1<br />

P1.0 Vcc<br />

P1.1 P0.0<br />

P1.2<br />

P0.7<br />

EA<br />

P2.7<br />

Vss P2.0<br />

AT89C52<br />

270× 8<br />

5. 1K<br />

字符显示电路原理图<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

+5V<br />

P2.0<br />

P2.7<br />

+5V<br />

P0.7 P0.0<br />

8*8LED 显示器<br />

13


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

; *************************<br />

; * *<br />

; * 电 子屏字符显示器 *<br />

; * 显 示“电子设计” *<br />

; * 2001.10.23 LRM *<br />

; *************************<br />

; 四 个显示字符数据表在 50H— 6FH 单 元内,字符用 8*8 点阵,R4( 30H) 用 于<br />

; 控 制显示静止字的时间,R5( 31H) 静止字显示跳转地址步距,B内放显示首<br />

; 址<br />

;<br />

;<br />

;<br />

;************;<br />

;中 断入口程序;<br />

;************;<br />

;<br />

ORG 0000H<br />

LJMP START<br />

ORG 0003H<br />

RETI<br />

ORG 000BH<br />

RETI<br />

ORG 0013H<br />

RETI<br />

ORG 001BH<br />

RETI<br />

ORG 0023H<br />

RETI<br />

ORG 002BH<br />

RETI<br />

;<br />

;<br />

CLEARMEN: MOV A,#0FFH<br />

MOV P1,A<br />

MOV P2,A<br />

MOV P3,A<br />

MOV P0,A<br />

MOV DPTR,#TAB<br />

CLR A<br />

MOV R3,A<br />

MOV R1,#50H<br />

MOV R2,#20H<br />

CLLOOP: MOVC A,@A+DPTR<br />

MOV @R1,A<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

14


;<br />

MOV A,R3<br />

INC A<br />

MOV R3,A<br />

INC R1<br />

DJNZ R2,CLLOOP<br />

RET<br />

START: LCALL CLEARMEN<br />

START1: LCALL KEYWORK<br />

AJMP START1<br />

KEYWORK: MOV P1,#0FFH<br />

KEYRET: RET<br />

JNB P1.0,KEY1<br />

JNB P1.1,KEY2<br />

JNB P1.2,KEY3<br />

KEY1: LCALL DL10MS<br />

JB P1.0,KEYRET<br />

WAIT: JNB P1.0,WAIT<br />

LCALL CLEARMEN<br />

MOV 30H,#80H<br />

MOV 31H,#08H<br />

LJMP DISP1<br />

KEY2: LCALL DL10MS<br />

JB P1.1,KEYRET<br />

WAIT1: JNB P1.1,WAIT1<br />

LCALL CLEARMEN<br />

MOV 30H,#14H<br />

MOV 31H,#01H<br />

LJMP DISP1<br />

KEY3: LCALL DL10MS<br />

JB P1.2,KEYRET<br />

WAIT2: JNB P1.2,WAIT2<br />

;<br />

;<br />

LCALL CLEARMEN<br />

LJMP DISP2<br />

DISP1: MOV B,#50H<br />

MOV R4,30H<br />

MOV R5,31H<br />

LOOP: LCALL DISPLAY<br />

DJNZ R4,LOOP<br />

MOV R4,30H<br />

MOV A,B<br />

CJNE A,#68H,CONT<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

15


AJMP DISP1<br />

CONT: ADD A,R5<br />

;<br />

;<br />

MOV B,A<br />

AJMP LOOP<br />

DISPLAY: MOV A,#0FFH<br />

MOV P0,A<br />

MOV P2,A<br />

MOV R6,#0FEH<br />

MOV R0,B<br />

MOV R7,#08H<br />

DISLOOP: MOV A,@R0<br />

;<br />

MOV P0,A<br />

MOV P2,R6<br />

LCALL DL1MS<br />

INC R0<br />

MOV A,R6<br />

RL A<br />

MOV R6,A<br />

DJNZ R7,DISLOOP<br />

RET<br />

DISP2: LCALL DISPP<br />

;<br />

LCALL MOVH<br />

LCALL MOVH1<br />

AJMP DISP2<br />

DISPP: MOV B,#50H<br />

;<br />

MOV R4,#24H<br />

LCALL DISPLAY<br />

DJNZ R4,DISPP<br />

RET<br />

MOVH: MOV R1,#20H<br />

MOV R0,#50H<br />

MOV R2,#08H<br />

MOV1: MOV A,@R0<br />

CLR C<br />

RLC A<br />

MOV @R0,A<br />

MOV A,@R1<br />

RRC A<br />

MOV @R1,A<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

16


OUT: RET<br />

INC R0<br />

DJNZ R2,MOV1<br />

MOV R2,#08H<br />

INC R1<br />

MOV A,R1<br />

SUBB A,#24H<br />

JZ OUT<br />

AJMP MOV1<br />

MOVH1: MOV A,20H<br />

XCH A,23H<br />

XCH A,22H<br />

XCH A,21H<br />

MOV 20H,A<br />

MOV R1,#20H<br />

MOV R0,#50H<br />

MOV2: MOV A,@R0<br />

;<br />

RR A<br />

MOV @R0,A<br />

MOV A,@R1<br />

CLR C<br />

RRC A<br />

MOV A,@R0<br />

RLC A<br />

MOV @R0,A<br />

INC R0<br />

DJNZ R2,MOV2<br />

MOV R2,#08H<br />

INC R1<br />

MOV A,R1<br />

SUBB A,#24H<br />

JZ OUT<br />

AJMP MOV2<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

DL1MS: MOV R3,#64H ;100*( 8+2) us<br />

LOOPK: LCALL KEYWORK<br />

;<br />

DJNZ R3,LOOPK<br />

RET<br />

DL<strong>51</strong>2: MOV R2,#0FFH<br />

LOOP1: DJNZ R2,LOOP1<br />

RET<br />

DL10MS: MOV R3,#14H<br />

LOOP2: LCALL DL<strong>51</strong>2<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

17


DJNZ R3,LOOP2<br />

RET<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

TAB: DB 0EFH,83H,0ABH,83H,0ABH,83H,0EEH,0E0H ; 电<br />

;<br />

END<br />

DB 0FFH,0C7H,0EFH,83H,0EFH,0EFH,0CFH,0EFH ; 子<br />

DB 0B1H,0B5H,04H,0BFH,0B1H,0B5H,9BH,0A4H ; 设<br />

DB 0BBH,0BBH,1BH,0A0H,0BBH,0BBH,9BH,0BBH ; 计<br />

DB 00H,00H,00H,00H<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

18


说明:<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

例 4 八 路 输 入 模 拟 信 号 的 数 值 显 示 电 路<br />

采用 0809 作 A/D 转换器,AT89C52 作控制器,CD14024 作 2 分频器。开 机 后能自动轮流<br />

显示 8路输入的模拟电压值,输入电压在 0—5V 范围内,显示值在 0—255 范围内。<br />

八路模拟信号数值测量显示电路<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

19


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

;************************;<br />

; ;<br />

;八 路 模拟 数 据采 集显 示 电路;<br />

; 2001.10.08 编 ;<br />

;************************;<br />

; 70H— 77H 存放采样值,78H— 7BH 存放显示数据,依次为个位、十位、百位、通道标志<br />

;<br />

;<br />

;*************************************<br />

;* *<br />

;* 主 程序和中断程序入口 *<br />

;* *<br />

;*************************************<br />

;<br />

ORG 0000H<br />

ORG 0003H<br />

LJMP START<br />

RETI<br />

ORG 000BH<br />

RETI<br />

ORG 0013H<br />

RETI<br />

ORG 001BH<br />

RETI<br />

ORG 0023H<br />

RETI<br />

ORG 002BH<br />

RETI<br />

;*************************************<br />

;* *<br />

;* 初 始化程序中的各变量 *<br />

;* *<br />

;*************************************<br />

CLEARMEMIO: CLR A<br />

MOV P2,A<br />

MOV R0,#70H<br />

MOV R2,#0CH<br />

LOOPMEM: MOV @R0,A<br />

INC R0<br />

DJNZ R2,LOOPMEM<br />

MOV A,#0FFH<br />

MOV P0,A<br />

MOV P1,A<br />

MOV P3,A<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

20


;<br />

RET<br />

;*************************************<br />

;* *<br />

;* 主 程 序 *<br />

;* *<br />

;*************************************<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

START: LCALL CLEARMEMIO ;初 始化<br />

MAIN: LCALL DISPLAY ;显 示数据一次<br />

;<br />

LCALL TEST ;测 量一次<br />

AJMP MAIN<br />

NOP ;PC 值 出 错处理<br />

NOP<br />

NOP<br />

LJMP START<br />

DISPLAY: MOV R3,#08H ;8 路信号循环显示控制<br />

MOV R0,#70H ;显 示数据初址 70H~77H<br />

MOV 7BH,#00H ;显 示通道路数<br />

DISLOOP1: MOV A,@R0 ;显 示数据转为三位 BCD 码 存 入 7AH、 79H、 78H<br />

MOV B,#100<br />

DIV AB<br />

MOV 7AH,A<br />

MOV A,#10<br />

XCH A,B<br />

DIV AB<br />

MOV 79H,A<br />

MOV 78H,B<br />

MOV R2,#0FFH ;每 路显示时间控制 4MS*255<br />

DISLOOP2: LCALL DISP ;调 四 位 显示程序<br />

;<br />

DJNZ R2,DISLOOP2<br />

INC R0 ;显 示下一路<br />

INC 7BH ;通 道显示数加一<br />

DJNZ R3,DISLOOP1<br />

RET<br />

DISP: MOV R1,#78H ;共 阳显示子程序,显示内容在 78H—7BH<br />

PLAY: MOV P1,#0FFH<br />

MOV R5,#0FEH ;数 据 在 P1 输 出 ,列扫描在 P3.0-P3.3<br />

MOV A,R5<br />

ANL P3,A<br />

MOV A,@R1<br />

MOV DPTR,#TAB<br />

MOVC A,@A+DPTR<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

21


MOV P1,A<br />

LCALL DL1MS<br />

INC R1<br />

MOV A,P3<br />

JNB ACC.3,ENDOUT<br />

RL A<br />

MOV R5,A<br />

MOV P3,#0FFH<br />

AJMP PLAY<br />

ENDOUT: MOV P3,#0FFH<br />

MOV P1,#0FFH<br />

RET<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH<br />

;<br />

;<br />

DL1MS: MOV R6,#14H ;1MS 延 时子程序<br />

DL1: MOV R7,#19H<br />

DL2: DJNZ R7,DL2<br />

;<br />

DJNZ R6,DL1<br />

RET<br />

TEST: CLR A ;模 数转换子程序<br />

MOV P2,A<br />

MOV R0,#70H ;转 换值存放首址<br />

MOV R7,#08H ;转 换 8次控制<br />

LCALL TESTART ;启 动 测 试<br />

WAIT: JB P3.7,MOVD ;等 A/D 转换结束信号<br />

;<br />

AJMP WAIT<br />

TESTART: SETB P2.3 ;测 试启动<br />

;<br />

NOP<br />

NOP<br />

CLR P2.3<br />

SETB P2.4<br />

NOP<br />

NOP<br />

CLR P2.4<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

RET<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

22


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

MOVD: SETB P2.5 ;取 A/D 转换数据<br />

MOV A,P0<br />

MOV @R0,A<br />

CLR P2.5<br />

INC R0<br />

MOV A,P2 ;通 道地址加 1<br />

INC A<br />

MOV P2,A<br />

CJNE A,#08H,TESTCON ;等 8 路 A/D 转换结束<br />

JC TESTCON<br />

CLR A ;结 束恢复端口<br />

MOV P2,A<br />

MOV A,#0FFH<br />

MOV P0,A<br />

MOV P1,A<br />

MOV P3,A<br />

RET<br />

TESTCON: LCALL TESTART<br />

;<br />

LJMP WAIT<br />

END<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

23


说明:<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

例 5 单 键 学 习 型 遥 控 器 的 设 计<br />

可以学习任何遥控器的某个按键功能,使用时先按一下 K,绿色指示灯亮后,用遥控器<br />

对着红外接收头,按一下某个功能按键 ,当绿灯灭红灯亮时说明学习完成,按发射键就可<br />

以进行遥控了。设计时通过大量的不同种类的遥控码波形实验分析,遥控码的帧间歇位宽度<br />

均在 10 ms 以 上 , 起 始 位 码 宽 度在 100μ s— 20ms 之 间 , 编 码 位 在 100μ s— 5ms 之 间 ,为确<br />

保所有遥控器学习的成功,采用以下设计方法:<br />

1.寻提起始位方法:用 16 位 DPTR 计数器对高电平进行宽度计数,计数采样周期为<br />

21μ s, 当高电平结束时,如高 8位计数器为非零,则说明高电平宽度超过 5.35ms( 255×<br />

21μ s), 紧 接 来 的 低 电 平 码 就是起始位,否则重新开始。<br />

2.读起始位方法:采用 16 位 DPTR 对低电平进行宽度计数(最大可读宽度为 1.376s),<br />

当高电平跳变时结束计数,并将 DPTR 的 高 8 位 、 低 8 分 别 存 入 R4, R5 寄 存 器 。<br />

3. 读 遥控编码的方法:采用 DPTR 低 8 位 计数器对码(高电平或低电平)进行宽度计<br />

数,电平跳变时结束计数,并将值存入规定的地址,在高电平码计数时,如 DPTR 高 8 位 计<br />

数器为非零(宽度大于 5.35ms), 则判定为结束帧间隔位,在相应存储单元写入 OOH 作为结<br />

束标志。<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

24


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

; *************************************<br />

; * 单 键遥控码学习控制器 *<br />

; * 2001.11.29 修改 LRM *<br />

; *************************************<br />

;<br />

;<br />

;**********************************************************************<br />

;* *<br />

;* KEYX0 P1.0 * 1 40 * VCC *<br />

;* KEYX1 P1.1 * 2 39 * P0.0 KEYY0 *<br />

;* KEYX2 P1.2 * 3 38 * P0.1 KEYY1 *<br />

;* KEYX3 P1.3 * 4 37 * P0.2 KEYY2 *<br />

;* SCL P1.4 * 5 36 * P0.3 KEYY3 *<br />

;* SDA P1.5 * 6 35 * P0.4 KEYY4 *<br />

;* STUDYLAMP P1.6 * 7 34 * P0.5 KEYY5 *<br />

;* LAMP P1.7 * 8 33 * P0.6 KEYY6 *<br />

;* RST * 9 32 * P0.7 KEYY7 *<br />

;* RXD P3.0 * 10 <strong>MCS</strong>-<strong>51</strong> 31 * EA VDD *<br />

;* TXD P3.1 * 11 30 * ALE *<br />

;* STUDYKEY INT0 P3.2 * 12 29 * PSEN *<br />

;* INT1 P3.3 * 13 28 * P2.7 A15 DEV7 *<br />

;* REMOTEIN T0 P3.4 * 14 27 * P2.6 A14 DEV6 *<br />

;* REMOTEOUT T1 P3.5 * 15 26 * P2.5 A13 DEV5 *<br />

;* WR P3.6 * 16 25 * P2.4 A12 DEV4 *<br />

;* RD P3.7 * 17 24 * P2.3 A11 DEV3 *<br />

;* XTAL2 * 18 23 * P2.2 A10 DEV2 *<br />

;* XTAL1 * 19 22 * P2.1 A9 DEV1 *<br />

;* VSS * 20 21 * P2.0 A8 DEV0 *<br />

;* *<br />

;**********************************************************************<br />

;<br />

;<br />

;<br />

;<br />

SPBASE EQU 70H ;堆 栈基址<br />

IEVAL EQU 00H ;关 所有中断<br />

MEMBASE EQU 08H ;工 作 寄 存 器 基 址<br />

MEMS EQU 67H ;工 作 寄 存 器 个 数<br />

BITNMB EQU 08H ;一 个字节包含八个位<br />

KEYFUNFLAG EQU 80H ; 键 功能索引<br />

KEYFUNNMB EQU 81H ;键 功能号<br />

KEYFUNRW EQU 82H ;遥 控信号读写标志<br />

READFLAG EQU 88H ;读 标记<br />

WITERFLAG EQU 99H ;写 标记<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

25


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

TMPHADDR EQU 08H ;读 入 高 电 平 存放首址<br />

TMPLADDR EQU 90H ;读 入 低 电 平 存放首址<br />

READTIME EQU 00H ;读 入数据指令时间<br />

; LOWH EQU R4 ;起 始 位 存放高地址<br />

; LOWL EQU R5 ;起 始 位 存放低地址<br />

;<br />

;<br />

;<br />

STUDYLAMP EQU P1.6 ;学 习指示灯<br />

LAMP EQU P1.7 ;未 定 义 指 示灯<br />

STUDYKEY EQU P3.2 ;学 习键<br />

REMOTEIN EQU P3.4 ;遥 控输入<br />

REMOTEOUT EQU P3.5 ;遥 控输出<br />

DELAYCONUT EQU 30H ;延 时值<br />

DELAYCONUT0 EQU 0FFH ;延 时值<br />

T1COUNT EQU 0F3H ;T1 计数值<br />

TMODVAL EQU 22H<br />

TCONVAL EQU 41H<br />

PCONVAL EQU 00H<br />

T2CONVAL EQU 00H<br />

SCONVAL EQU 0F8H<br />

IPVAL EQU 01H<br />

;*************************************<br />

;* *<br />

;* 主 程序和中断程序入口 *<br />

;* *<br />

;*************************************<br />

;<br />

ORG 0000H<br />

AJMP START<br />

ORG 0003H<br />

AJMP INTEX0<br />

ORG 000BH<br />

RETI<br />

ORG 0013H<br />

RETI<br />

ORG 001BH<br />

AJMP INTT1<br />

ORG 0023H<br />

RETI<br />

ORG 002BH<br />

RETI<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

26


;*************************************<br />

;* *<br />

;* 初 始化程序中的各变量 *<br />

;* *<br />

;*************************************<br />

CLEARMEMIO: CLR A<br />

DEC A<br />

MOV P0,A ;清 I/O 口<br />

MOV P3,A<br />

MOV P1,A<br />

CLR A<br />

MOV P2,A<br />

CLR STUDYLAMP<br />

CLR LAMP<br />

CLR REMOTEOUT<br />

SETB REMOTEIN<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

MOV R0,#MEMBASE ;清 工 作 寄 存 器<br />

MOV R1,#MEMS<br />

CLEARMEM: MOV @R0,A<br />

;<br />

INC R0<br />

DJNZ R1,CLEARMEM<br />

MOV R0,#KEYFUNRW<br />

MOV @R0,#READFLAG<br />

MOV SP,#SPBASE ;设 堆栈基址<br />

MOV IE,#IEVAL ;关 所有中断<br />

MOV IP,#IPVAL<br />

MOV TMOD,#TMODVAL<br />

MOV PCON,#PCONVAL<br />

MOV SCON,#SCONVAL<br />

MOV TH1,#T1COUNT<br />

MOV TL1,#T1COUNT<br />

SETB EX0<br />

SETB EA<br />

RET<br />

;*************************************<br />

;* *<br />

;* 主 程序 *<br />

;* *<br />

;*************************************<br />

START: LCALL CLEARMEMIO ;初 始化<br />

;<br />

MAIN: LCALL KEYWORK ;主 体 程序<br />

LJMP MAIN<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

27


;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

NOP ;PC 值 出 错处理<br />

NOP<br />

NOP<br />

LJMP START<br />

;*************************************<br />

;* *<br />

;* T1 中断服务程序 *<br />

;* *<br />

;*************************************<br />

INTT1: CPL REMOTEOUT ;40kHZ<br />

;<br />

RETI<br />

;*************************************<br />

;* *<br />

;* 载 波 合 成 *<br />

;* *<br />

;*************************************<br />

REMOTETX: MOV R0,#TMPHADDR<br />

MOV R1,#TMPLADDR<br />

SETB LAMP<br />

; CPL STUDYLAMP<br />

MOV A,R4<br />

MOV R3,A<br />

JZ LOWBACK<br />

CLR A<br />

DEC A<br />

LOWBACKTMP: MOV R2,A ;起 始 位复原<br />

LOWBACKTMP0: SETB TR1<br />

SETB ET1<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

DJNZ R2,LOWBACKTMP0<br />

DJNZ R3,LOWBACKTMP<br />

LOWBACK: MOV A,R5<br />

MOV R2,A<br />

LOWBACKTMP1: SETB TR1<br />

SETB ET1<br />

NOP<br />

NOP<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

28


;<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

DJNZ R2,LOWBACKTMP1<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

TMP0: MOV A,@R0 ;高 电 平处理<br />

MOV R2,A<br />

; CPL LAMP<br />

TMP1: CLR TR1<br />

CLR ET1<br />

CLR REMOTEOUT ;<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

DJNZ R2,TMP1<br />

INC R0<br />

TMPP: MOV A,@R1<br />

MOV R2,A<br />

; CPL LAMP<br />

TMP2: SETB TR1 ;低 电 平处理<br />

SETB ET1<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

DJNZ R2,TMP2<br />

INC R1<br />

MOV A,@R1<br />

JZ OUT<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

29


AJMP TMP0<br />

OUT: CLR TR1<br />

;<br />

CLR ET1<br />

CLR LAMP<br />

CLR REMOTEOUT<br />

RET<br />

;*************************************<br />

;* 遥 控数据读取 INT0 中 断 程序 *<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

;* 高 电 平 存 TMPHADDR 为 首址 RAM *<br />

;* 低 电 平 存 TMPLADDR 为 首址 RAM *<br />

;*************************************<br />

INTEX0: CLR ET1<br />

CLR TR1<br />

CLR EX0<br />

CLR EA<br />

SETB STUDYLAMP<br />

CLR LAMP<br />

MOV R0,#TMPHADDR<br />

MOV R1,#TMPLADDR<br />

CLR A<br />

MOV DPH,A<br />

MOV DPL,A<br />

READHEAD: JNB REMOTEIN,READDATA ;寻 找 起 始 位<br />

;<br />

INC DPTR<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

AJMP READHEAD<br />

READDATA: CJNE A,DPH,READDATA00<br />

MOV DPH,A<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

30


;<br />

AJMP READHEAD<br />

READDATA00: MOV R3,DPH<br />

MOV DPH,A<br />

MOV DPL,A<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

READLOOP01: JB REMOTEIN,READDATA02 ;读 起始位<br />

;<br />

INC DPTR<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

AJMP READLOOP01<br />

READDATA02: CLR LAMP<br />

;<br />

MOV R4,DPH<br />

MOV R5,DPL ;存 起 始 位<br />

MOV DPH,#00H<br />

MOV DPL,#READTIME<br />

AJMP READLOOP1<br />

READDATA1: SETB LAMP ;存 高 电 平<br />

MOV @R0,DPL<br />

INC R0<br />

MOV DPL,#READTIME<br />

MOV DPH,#00H<br />

READLOOP0: JB REMOTEIN,READDATA2 ;读 低电平<br />

INC DPTR<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

31


;<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

AJMP READLOOP0<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

READDATA2: CLR LAMP ;存 低 电 平<br />

MOV @R1,DPL<br />

INC R1<br />

MOV DPL,#READTIME<br />

MOV DPH,#00H<br />

READLOOP1: JNB REMOTEIN,READDATA3 ;读 高电平<br />

;<br />

INC DPTR<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

AJMP READLOOP1<br />

READDATA3: CLR A<br />

;<br />

CJNE A,DPH,READDATA4<br />

AJMP READDATA1<br />

READDATA4: MOV @R0,A<br />

;<br />

MOV @R1,A<br />

SETB LAMP<br />

CLR STUDYLAMP<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

32


SETB REMOTEIN<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

READEND: JNB STUDYKEY,READEND<br />

;<br />

MOV R0,#KEYFUNRW<br />

MOV @R0,#WITERFLAG<br />

SETB EX0<br />

SETB EA<br />

RETI<br />

;*************************************<br />

;* *<br />

;* 键 工 作子程序 *<br />

;* *<br />

;*************************************<br />

KEYWORK: SETB P1.0<br />

KEYOUT: RET<br />

;<br />

JNB P1.0,KEY0<br />

KEY0: LCALL DL10MS ;延 时 去抖动<br />

;<br />

JB P1.0,KEYOUT<br />

LJMP REMOTETX<br />

;*************************************<br />

;* *<br />

;* 延 时 255 X 2 = <strong>51</strong>2 us *<br />

;* *<br />

;*************************************<br />

DELAY: MOV R0,#DELAYCONUT0<br />

DELAY1: DJNZ R0,DELAY1<br />

;<br />

;<br />

;<br />

RET<br />

;*************************************<br />

;* *<br />

;* 延 时 25 ms *<br />

;* *<br />

;*************************************<br />

DL10MS: MOV R1,#DELAYCONUT<br />

DL10MS1: LCALL DELAY<br />

;<br />

DJNZ R1,DL10MS1<br />

RET<br />

END<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

33


说明:<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

例 6 十 六 路 电 器 遥 控 的 设 计<br />

一块单片机用作遥控发射,一块用作接收并处理控制十五个电器的开关及一路电灯的亮<br />

度。采用红外线遥控。<br />

十六路遥控电器发射器硬件图<br />

十六路接收器电气原理图<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

34


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

; *************************************<br />

; * ( SEND.ASM) *<br />

; * 十 六路遥控发送控制器 *<br />

; * 2001.7.18 *<br />

; * LOURANMIAO *<br />

; *************************************<br />

;<br />

;**********************************************************************<br />

;* *<br />

;* KEYX0 P1.0 * 1 40 * VCC *<br />

;* KEYX1 P1.1 * 2 39 * P0.0 KEYY0 *<br />

;* KEYX2 P1.2 * 3 38 * P0.1 KEYY1 *<br />

;* KEYX3 P1.3 * 4 37 * P0.2 KEYY2 *<br />

;* P1.4 * 5 36 * P0.3 KEYY3 *<br />

;* P1.5 * 6 35 * P0.4 KEYY4 *<br />

;* P1.6 * 7 34 * P0.5 KEYY5 *<br />

;* P1.7 * 8 33 * P0.6 KEYY6 *<br />

;* RST * 9 32 * P0.7 KEYY7 *<br />

;* P3.0 * 10 <strong>MCS</strong>-<strong>51</strong> 31 * EA VDD *<br />

;* P3.1 * 11 30 * ALE *<br />

;* P3.2 * 12 29 * PSEN *<br />

;* P3.3 * 13 28 * P2.7 *<br />

;* P3.4 * 14 27 * P2.6 *<br />

;* REMOTEOUT T1 P3.5 * 15 26 * P2.5 *<br />

;* P3.6 * 16 25 * P2.4 *<br />

;* P3.7 * 17 24 * P2.3 *<br />

;* XTAL2 * 18 23 * P2.2 *<br />

;* XTAL1 * 19 22 * P2.1 *<br />

;* VSS * 20 21 * P2.0 *<br />

;* *<br />

;* *<br />

;**********************************************************************<br />

;<br />

;<br />

;<br />

;<br />

;<br />

KEYX0 EQU P1.0 ;P1.0 -- P1.3 位 键 盘 行 扫 描<br />

KEYX1 EQU P1.1 ;本 系 统 采用 4 * 8 键 盘 阵列<br />

KEYX2 EQU P1.2<br />

KEYX3 EQU P1.3<br />

KEYY EQU P0 ;P0 口 键 盘 列 扫 描<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

35


;*************************************<br />

;* *<br />

;* 主 程序和中断程序入口 *<br />

;* *<br />

;*************************************<br />

;<br />

ORG 0000H<br />

ORG 0003H<br />

LJMP START<br />

RETI<br />

ORG 000BH<br />

RETI<br />

ORG 0013H<br />

RETI<br />

ORG 001BH<br />

ORG 0023H<br />

LJMP INTT1<br />

RETI<br />

ORG 002BH<br />

RETI<br />

;*************************************<br />

;* *<br />

;* 初 始 化 程 序 *<br />

;* *<br />

;*************************************<br />

CLEARMEMIO: CLR A<br />

DEC A<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

MOV P0,A ;清 I/O 口<br />

MOV P1,A<br />

MOV P2,A<br />

MOV P3,A<br />

CLR P3.5<br />

CLEARMEM: MOV SP,#70H ;设 堆栈基址<br />

;<br />

MOV IE,#00H ;关 所有中断<br />

MOV IP,#01H<br />

MOV TMOD,#22H<br />

MOV TH1,#0F3H<br />

MOV TL1,#0F3H<br />

SETB EA<br />

RET<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

36


;*************************************<br />

;* *<br />

;* 主 程 序 *<br />

;* *<br />

;*************************************<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

START: LCALL CLEARMEMIO ;初 始化<br />

;<br />

MAIN: LCALL KEYWORK ;主 体 程序<br />

;<br />

LJMP MAIN<br />

NOP ;PC 值 出 错处理<br />

NOP<br />

NOP<br />

LJMP START<br />

;*************************************<br />

;* *<br />

;* T1 中断服务程序 *<br />

;* *<br />

;*************************************<br />

INTT1: CPL P3.5 ;40kHZ<br />

;<br />

;<br />

RETI<br />

;*************************************<br />

;* *<br />

;* 键 盘工作子程序(4 * 8 阵 列) *<br />

;* 出口为各键工作程序入口 *<br />

;*************************************<br />

KEYWORK: MOV KEYY,#0FFH ;置 列线输入<br />

KEYOUT: RET<br />

;<br />

CLR KEYX0 ;发 "0" 行 扫 描 码<br />

CLR KEYX1<br />

CLR KEYX2<br />

CLR KEYX3<br />

MOV A,KEYY ;是 否有键按下<br />

MOV B,A<br />

CJNE A,#0FFH,KEYHIT<br />

KEYHIT: LCALL DL10MS ;延 时 去抖动<br />

MOV A,KEYY<br />

CJNE A,B,KEYOUT ;有 键按下<br />

SETB KEYX1 ;行 线扫描<br />

SETB KEYX2<br />

SETB KEYX3<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

37


;<br />

MOV A,KEYY<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

CJNE A,#0FFH,KEYVAL0<br />

SETB KEYX0<br />

CLR KEYX1<br />

MOV A,KEYY<br />

CJNE A,#0FFH,KEYVAL1<br />

SETB KEYX1<br />

CLR KEYX2<br />

MOV A,KEYY<br />

CJNE A,#0FFH,KEYVAL2<br />

SETB KEYX2<br />

CLR KEYX3<br />

MOV A,KEYY<br />

CJNE A,#0FFH,KEYVAL3<br />

LJMP KEYOUT<br />

KEYVAL0: MOV R2,#00H<br />

;<br />

LJMP KEYVAL4<br />

KEYVAL1: MOV R2,#08H<br />

;<br />

LJMP KEYVAL4<br />

KEYVAL2: MOV R2,#10H<br />

;<br />

LJMP KEYVAL4<br />

KEYVAL3: MOV R2,#18H<br />

;<br />

LJMP KEYVAL4<br />

KEYVAL4: MOV DPTR,#KEYVALTAB ;键 值翻译成连续数字<br />

MOV B,A<br />

CLR A<br />

MOV R0,A<br />

KEYVAL5: MOV A,R0<br />

SUBB A,#08H<br />

JNC KEYOUT<br />

MOV A,R0<br />

MOVC A,@A+DPTR<br />

INC R0<br />

CJNE A,B,KEYVAL5<br />

DEC R0<br />

MOV A,R0<br />

ADD A,R2 ;连 接 成 连续数字<br />

MOV B,A<br />

RL A<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

38


ADD A,B<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

MOV DPTR,#KEYFUNTAB ;加 3 处 理 JMP 3 字 节 指 令<br />

JMP @A+DPTR<br />

KEYFUNTAB:LJMP KEYFUN00<br />

;<br />

LJMP KEYFUN01<br />

LJMP KEYFUN02<br />

LJMP KEYFUN03<br />

LJMP KEYFUN04<br />

LJMP KEYFUN05<br />

LJMP KEYFUN06<br />

LJMP KEYFUN07<br />

LJMP KEYFUN08<br />

LJMP KEYFUN09<br />

LJMP KEYFUN10<br />

LJMP KEYFUN11<br />

LJMP KEYFUN12<br />

LJMP KEYFUN13<br />

LJMP KEYFUN14<br />

LJMP KEYFUN15<br />

LJMP KEYFUN16<br />

LJMP KEYFUN17<br />

LJMP KEYFUN18<br />

LJMP KEYFUN19<br />

LJMP KEYFUN20<br />

LJMP KEYFUN21<br />

LJMP KEYFUN22<br />

LJMP KEYFUN23<br />

LJMP KEYFUN24<br />

LJMP KEYFUN25<br />

LJMP KEYFUN26<br />

LJMP KEYFUN27<br />

LJMP KEYFUN28<br />

LJMP KEYFUN29<br />

LJMP EYFUN30<br />

LJMP KEYFUN31<br />

RET<br />

KEYVALTAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH<br />

; 0 1 2 3 4 5 6 7<br />

;<br />

RET<br />

KEYFUN00: MOV A,#02H<br />

LJMP REMOTE<br />

RET<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

39


;<br />

KEYFUN01: MOV A,#03H<br />

;<br />

LJMP REMOTE<br />

RET<br />

KEYFUN02: MOV A,#04H<br />

;<br />

LJMP REMOTE<br />

RET<br />

KEYFUN03: MOV A,#05H<br />

;<br />

LJMP REMOTE<br />

RET<br />

KEYFUN04: MOV A,#06H<br />

;<br />

LJMP REMOTE<br />

RET<br />

KEYFUN05: MOV A,#07H<br />

;<br />

LJMP REMOTE<br />

RET<br />

KEYFUN06: MOV A,#08H<br />

;<br />

LJMP REMOTE<br />

RET<br />

KEYFUN07: MOV A,#09H<br />

;<br />

;<br />

LJMP REMOTE<br />

RET<br />

KEYFUN08: MOV A,#0AH<br />

;<br />

LJMP REMOTE<br />

RET<br />

KEYFUN09: MOV A,#0BH<br />

;<br />

LJMP REMOTE<br />

RET<br />

KEYFUN10: MOV A,#0CH<br />

;<br />

LJMP REMOTE<br />

RET<br />

KEYFUN11: MOV A,#0DH<br />

LJMP REMOTE<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

40


;<br />

RET<br />

KEYFUN12: MOV A,#0EH<br />

;<br />

LJMP REMOTE<br />

RET<br />

KEYFUN13: MOV A,#0FH<br />

;<br />

LJMP REMOTE<br />

RET<br />

KEYFUN14: MOV A,#10H<br />

;<br />

LJMP REMOTE<br />

RET<br />

KEYFUN15: MOV A,#11H<br />

LJMP REMOTE<br />

RET<br />

KEYFUN16: RET<br />

KEYFUN17: RET<br />

KEYFUN18: RET<br />

KEYFUN19: RET<br />

KEYFUN20: RET<br />

KEYFUN21: RET<br />

KEYFUN22: RET<br />

KEYFUN23: RET<br />

KEYFUN24: RET<br />

KEYFUN25: RET<br />

KEYFUN26: RET<br />

KEYFUN27: RET<br />

KEYFUN28: RET<br />

KEYFUN29: RET<br />

KEYFUN30: RET<br />

KEYFUN31: RET<br />

;<br />

;<br />

;*************************************<br />

;* *<br />

;* SEND *<br />

;* *<br />

;*************************************<br />

;<br />

REMOTE: MOV R1,A<br />

LJMP OUT3<br />

OUT: MOV R0,#55H<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

41


OUT1: SETB ET1<br />

SETB TR1<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

DJNZ R0,OUT1<br />

MOV R0,#32H<br />

OUT2: CLR TR1<br />

CLR ET1<br />

CLR P3.5<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

DJNZ R0,OUT2<br />

DJNZ R1,OUT<br />

LCALL DL500MS<br />

RET<br />

OUT3: MOV R0,#0FFH<br />

;<br />

LJMP OUT1<br />

;*************************************<br />

;* *<br />

;* 延 时 255 X 2 = <strong>51</strong>2 us *<br />

;* *<br />

;*************************************<br />

DELAY: MOV R2,#0FFH<br />

DELAY1: DJNZ R2,DELAY1<br />

;<br />

RET<br />

;*************************************<br />

;* *<br />

;* 延 时 10ms *<br />

;* *<br />

;*************************************<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

42


DL10MS: MOV R3,#14H<br />

DL10MS1: LCALL DELAY<br />

DJNZ R3,DL10MS1<br />

RET<br />

DL500MS: MOV R4,#32H<br />

DL500MS1: LCALL DL10MS<br />

;<br />

DJNZ R4,DL500MS1<br />

RET<br />

END<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

43


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

; *************************************<br />

; * (INCEPT3.ASM) *<br />

; * 十 六路遥控接收板 *<br />

; * 2001.7.18 LRM *<br />

; * *<br />

; *************************************<br />

;<br />

;**********************************************************************<br />

;* *<br />

;* A P1.0 1 40 VCC *<br />

;* B P1.1 2 39 P0.0 LED0 *<br />

;* C P1.2 3 38 P0.1 LED1 *<br />

;* P1.3 4 37 P0.2 LED2 *<br />

;* P1.4 5 36 P0.3 LED3 *<br />

;* P1.5 6 35 P0.4 LED4 *<br />

;* P1.6 7 34 P0.5 LED5 *<br />

;* P1.7 8 33 P0.6 LED6 *<br />

;* 100HZ RST 9 32 P0.7 LED7 *<br />

;* P3.0 10 <strong>MCS</strong>-<strong>51</strong> 31 EA VDD *<br />

;* P3.1 11 30 ALE *<br />

;* REMOTEIN P3.2 12 29 PSEN *<br />

;* P3.3 13 28 P2.7 调 光脉冲 *<br />

;* P3.4 14 27 P2.6 LED8 *<br />

;* P3.5 15 26 P2.5 LED9 *<br />

;* P3.6 16 25 P2.4 LED10 *<br />

;* P3.7 17 24 P2.3 LED11 *<br />

;* XTAL2 18 23 P2.2 LED12 *<br />

;* XTAL1 19 22 P2.1 LED13 *<br />

;* VSS 20 21 P2.0 DEV14(灯 泡 ) *<br />

;* *<br />

;* *<br />

;**********************************************************************<br />

;注 : P3.0 为 100HZ 的 交流电源过零点相位参考输入<br />

;<br />

;<br />

;*************************************<br />

;* *<br />

;* 主 程序和中断程序入口 *<br />

;* *<br />

;*************************************<br />

ORG 0000H<br />

ORG 0003H<br />

LJMP START<br />

LJMP INTEX0<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

44


;<br />

ORG 000BH<br />

RETI<br />

ORG 0013H<br />

RETI<br />

ORG 001BH<br />

RETI<br />

ORG 0023H<br />

RETI<br />

ORG 002BH<br />

RETI<br />

;***************************<br />

;* *<br />

;* 初 始化程序 *<br />

;* *<br />

;****************************<br />

CLEARMEMIO: CLR A<br />

DEC A<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

MOV P0,A ;清 I/O 口<br />

MOV P1,A<br />

MOV P2,A<br />

MOV P3,A<br />

CLEARMEM: MOV IE,#00H ;关 所有中断<br />

;<br />

SETB EX0<br />

SETB EA<br />

RET<br />

;*************************************<br />

;* *<br />

;* 主 程序 *<br />

;* *<br />

;*************************************<br />

START: LCALL CLEARMEMIO ;初 始化<br />

LCALL LOOP<br />

MAIN: JB P3.0,MAIN1<br />

LCALL DLX<br />

CLR P2.7<br />

LCALL DELAY<br />

SETB P2.7<br />

MAIN1: LJMP MAIN<br />

NOP ;PC 值 出 错处理<br />

NOP<br />

LJMP START<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

45


;******************************<br />

; 接 收程序<br />

;******************************<br />

INTEX0: CLR EX0<br />

JNB P3.1,READ1<br />

READOUTT0: SETB EX0<br />

;<br />

RETI<br />

READ1: CLR A<br />

MOV DPH,A<br />

MOV DPL,A<br />

HARD1: JB P3.1,HARD11<br />

INC DPTR<br />

NOP<br />

NOP<br />

AJMP HARD1<br />

HARD11: MOV A,DPH<br />

JZ READOUTT0<br />

CLR A<br />

READ11: INC A<br />

READ12: JNB P3.1,READ12<br />

MOV R1,#06H<br />

READ13: JNB P3.1,READ11<br />

LCALL DELAY<br />

DJNZ R1,READ13<br />

DEC A<br />

DEC A<br />

JZ FUN0<br />

DEC A<br />

JZ FUN1<br />

DEC A<br />

JZ FUN2<br />

DEC A<br />

JZ FUN3<br />

DEC A<br />

JZ FUN4<br />

DEC A<br />

JZ FUN5<br />

DEC A<br />

JZ FUN6<br />

DEC A<br />

JZ FUN7<br />

DEC A<br />

JZ FUN8<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

46


DEC A<br />

JZ FUN9<br />

DEC A<br />

JZ FUN10<br />

DEC A<br />

JZ FUN11<br />

DEC A<br />

JZ FUN12<br />

DEC A<br />

JZ FUN13<br />

DEC A<br />

JZ FUN14<br />

DEC A<br />

JZ FUN15<br />

NOP<br />

NOP<br />

LJMP READOUTT0<br />

FUN0: CPL P0.0<br />

LJMP READOUTT0<br />

FUN1: CPL P0.1<br />

LJMP READOUTT0<br />

FUN2: CPL P0.2<br />

LJMP READOUTT0<br />

FUN3: CPL P0.3<br />

LJMP READOUTT0<br />

FUN4: CPL P0.4<br />

LJMP READOUTT0<br />

FUN5: CPL P0.5<br />

LJMP READOUTT0<br />

FUN6: CPL P0.6<br />

LJMP READOUTT0<br />

FUN7: CPL P0.7<br />

LJMP READOUTT0<br />

FUN8: CPL P2.6<br />

LJMP READOUTT0<br />

FUN9: CPL P2.5<br />

LJMP READOUTT0<br />

FUN10: CPL P2.4<br />

LJMP READOUTT0<br />

FUN11: CPL P2.3<br />

LJMP READOUTT0<br />

FUN12: CPL P2.2<br />

LJMP READOUTT0<br />

FUN13: CPL P2.1<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

47


LJMP READOUTT0<br />

FUN14: CPL P2.0<br />

LJMP READOUTT0<br />

FUN15: DEC P1<br />

MOV A,P1<br />

CJNE A,#0F7H,OUTT0<br />

CLR A<br />

DEC A<br />

MOV P1,A<br />

OUTT0: LCALL LOOP<br />

;<br />

LJMP READOUTT0<br />

;*************************************<br />

;* *<br />

;* 延 时 255 X 2 = <strong>51</strong>2 us *<br />

;* *<br />

;*************************************<br />

DELAY: MOV R0,#0FFH<br />

DELAY1: DJNZ R0,DELAY1<br />

;<br />

RET<br />

;*************************************<br />

;* *<br />

;* 延 时 10 ms *<br />

;* *<br />

;*************************************<br />

DL10MS: MOV R1,#14H<br />

DL10MS1: LCALL DELAY<br />

DJNZ R1,DL10MS1<br />

RET<br />

;*************************************<br />

;* *<br />

;* 调 光 延 时 Xms *<br />

;* *<br />

;*************************************<br />

DLX: MOV R2,B<br />

DLX1: LCALL DELAY<br />

;<br />

DJNZ R2,DLX1<br />

RET<br />

;*************************************<br />

;* LOOP *<br />

;*************************************<br />

;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

48


LOOP: MOV A,P1<br />

SUBB A,#0FFH<br />

JZ LOOP7<br />

MOV A,P1<br />

SUBB A,#0FEH<br />

JZ LOOP6<br />

MOV A,P1<br />

SUBB A,#0FDH<br />

JZ LOOP5<br />

MOV A,P1<br />

SUBB A,#0FCH<br />

JZ LOOP4<br />

MOV A,P1<br />

SUBB A,#0FBH<br />

JZ LOOP3<br />

MOV A,P1<br />

SUBB A,#0FAH<br />

JZ LOOP2<br />

MOV A,P1<br />

SUBB A,#0F9H<br />

JZ LOOP1<br />

MOV A,P1<br />

SUBB A,#0F8H<br />

JZ LOOP0<br />

RET<br />

LOOP7: MOV B,#01H<br />

RET<br />

LOOP6: MOV B,#02H<br />

RET<br />

LOOP5: MOV B,#04H<br />

LOOP4: MOV B,#06H<br />

RET<br />

LOOP3: MOV B,#08H<br />

RET<br />

LOOP2: MOV B,#0AH<br />

RET<br />

LOOP1: MOV B,#0CH<br />

RET<br />

LOOP0: MOV B,#0DH<br />

;<br />

RET<br />

END<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

49


说明:<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

例 7 自 行 车 里 程 /速 度 计 的 设 计<br />

采用 AT89C52 单片机,速 度及里程传感器采用霍尔元件,能自动记录自行车的行驶里程,<br />

能选择显示自行车速度值或里程值,当车速超出 40 公 里 /小 时时能发声提醒。小开关用于设<br />

置自行车的轮胎尺寸,其中一只用于速度与里程的显示转换。存储器用 24C08, TC4024 用 于<br />

二 分频,转速脉冲用霍尔元件。电路如图<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

50


;<br />

;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

;; SPEED/MILE FOR BIKE PROGRAM ;;<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

VSDA EQU P1.5 ; EEP 数 据 传 送 口<br />

VSCL EQU P1.4 ; EEP 时钟传送口<br />

SLA EQU 50H ; EEP 器 件 寻 址 字 节 存放单元<br />

NUMBYT EQU <strong>51</strong>H ; EEP 传 送时节数存放单元<br />

MTD EQU 30H ; EEP 发送数据缓冲单元<br />

MRD EQU 40H ; EEP 读 出 数 据存放单元<br />

SLAW EQU 0A0H ; EEP 寻 址 字 节 写<br />

SLAR EQU 0A1H ; EEP 寻 址 字 节 读<br />

DPHH EQU 62H ; DPTR 计数扩展高 8位<br />

TH1H EQU 6CH ; 定 时器 T1 扩展高 8位<br />

TH1HH EQU 6DH ; 定 时器 T1 扩展高 8-16 位<br />

; 60H, 61H, 62H 作里程计数单元,6CH, 6DH 作 T1 计数扩充单元,<br />

; 68H, 69H, 6AH, 6BH 存放自行车每圈时间数,70H, 71H, 72H, 73H<br />

; 作 显示 BCD 码 存放数用,11H— —15H 存放被除数,16H— 19H 存放除数<br />

;;;;;;;;;;;;;;;;;;;;<br />

;; PROGRAM INPUT ;;<br />

;;;;;;;;;;;;;;;;;;;;<br />

;;<br />

;<br />

ORG 0000H<br />

LJMP START<br />

ORG 0003H<br />

LJMP INTEX0<br />

ORG 000BH<br />

RETI<br />

ORG 0013H<br />

LJMP INTEX1<br />

ORG 001BH<br />

LJMP INTT1<br />

ORG 0023H<br />

RETI<br />

ORG 002BH<br />

RETI<br />

;;;;;;;;;;;;;;;;;;;;<br />

;; PROGRAM CLEAR ;;<br />

;;;;;;;;;;;;;;;;;;;;<br />

;<br />

CLEARMEN: MOV TMOD,#90H ;T1 为 16 位外部控制定时器<br />

MOV SP,#75H ;堆 栈在 75H 开始<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

<strong>51</strong>


SETB PX0<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

SETB IT0 ;外 中断用边沿触发<br />

SETB IT1<br />

CLR A<br />

MOV 20H,A<br />

MOV 6CH,A<br />

MOV 6DH,A<br />

MOV 70H,A<br />

MOV 71H,A<br />

MOV 72H,A<br />

MOV 73H,A<br />

MOV 60H,A<br />

MOV 61H,A<br />

MOV 62H,A<br />

MOV 63H,A<br />

DEC A<br />

MOV 68H,A<br />

MOV 69H,A<br />

MOV 6AH,A<br />

MOV 6BH,A<br />

MOV P1,#0FFH<br />

CLEAR1: JB P1.2,KEY1 ;根 据 P1.2,P1.3,P1.6,P1.7 设 置 在 21H 赋 自<br />

行车周长值<br />

MOV 21H,#0FH<br />

LJMP CLEAR2<br />

KEY1: JB P1.3,KEY2<br />

MOV 21H,#12H<br />

LJMP CLEAR2<br />

KEY2: JB P1.6,KEY3<br />

MOV 21H,#14H<br />

LJMP CLEAR2<br />

KEY3: JB P1.7,ERR ;设 置出错处理<br />

MOV 21H,#19H<br />

CLEAR2: SETB TR1<br />

SETB EA<br />

SETB EX0<br />

SETB ET1<br />

SETB P3.1<br />

LCALL VIICREAD ;将 EEPROM 里程数据调入内存<br />

RET<br />

ERR: CPL P3.1 ;轮 周 长 设 置出错,LED 灯闪烁<br />

;<br />

LCALL DL5S<br />

LJMP CLEAR1<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

52


;;;;;;;;;;;;;;;;;;;;<br />

;; PROGRAM START ;;<br />

;;;;;;;;;;;;;;;;;;;;<br />

;<br />

START: LCALL CLEARMEN<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

START1: JB P3.0,DISPLAYS ;P3.0=1, 显示里程<br />

START2: SJMP START1<br />

;<br />

;;;;;;;;;;;;;;;;;;;;<br />

;;INTEX0 PROGRAM ;;<br />

;;;;;;;;;;;;;;;;;;;;<br />

;<br />

LCALL DISPLAYV ;显 示速度<br />

INTEX0: PUSH ACC ;里 程计数程序<br />

PUSH PSW<br />

INC 60H<br />

CLR A<br />

CJNE A,60H,INTEX0OUT<br />

INC 61H<br />

CJNE A,61H,INTEX0OUT<br />

INC 62H<br />

INTEX0OUT: LCALL VIICWRITE ;里 程数据存入 EEPROM<br />

SETB EX1<br />

POP PSW<br />

POP ACC<br />

RETI<br />

;;;;;;;;;;;;;;;;;;;;<br />

;;INTEX1 PROGRAM ;;<br />

;;;;;;;;;;;;;;;;;;;;<br />

;<br />

INTEX1: PUSH ACC ;每 转 1 圈 时 间 数 处 理 程序<br />

PUSH PSW<br />

CLR EX1<br />

JNB 20H,INTEX11<br />

MOV TL1,#0FFH<br />

MOV TH1,#0FFH<br />

MOV 6CH,#0FFH<br />

MOV 6DH,#0FFH<br />

INTEX11: MOV 68H,TL1<br />

MOV 69H,TH1<br />

MOV 6AH,6CH<br />

MOV 6BH,6DH<br />

CLR A<br />

DEC A<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

53


;<br />

MOV TL1,A<br />

MOV TH1,A<br />

MOV 6CH,A<br />

MOV 6DH,A<br />

CLR 20H<br />

POP PSW<br />

POP ACC<br />

RETI<br />

;;;;;;;;;;;;;;;;;;;;<br />

;;INTT1 PROGRAM ;;<br />

;;;;;;;;;;;;;;;;;;;;<br />

;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

INTT1: PUSH ACC ;T1 定 时器计数程序<br />

PUSH PSW<br />

INC 6CH<br />

MOV A,6CH<br />

JNZ INTT11<br />

INC 6DH<br />

MOV A,6DH<br />

JNZ INTT11<br />

SETB 20H<br />

INTT11: POP PSW<br />

POP ACC<br />

RETI<br />

;;;;;;;;;;;;;;;;;;;;<br />

;;DISPLAY S ;;<br />

;;;;;;;;;;;;;;;;;;;;<br />

;<br />

DISPLAYS: SETB P1.0 ;显 示里程程序,点亮 LED1<br />

;;;;;;;;;;;;;;;;;;;;<br />

;;DISPLAY V ;;<br />

;;;;;;;;;;;;;;;;;;;;<br />

;<br />

CLR P1.1<br />

SETB P3.7 ;显 示小数点<br />

LCALL SSSS ;圈 数 转 为 公 里数程序<br />

LCALL DISPLAY ;显 示程序<br />

LJMP START1<br />

DISPLAYV: CLR P1.0 ;显 示时速程序,点亮 LED2<br />

SETB P1.1<br />

CLR P3.7 ;关 切小数点头<br />

LCALL VVV ;每 圈 时 间换算为公里/小时程序<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

54


MOV A,71H<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

SUBB A,#04H ;时 速超过 40 报警灯 LED3 点 亮<br />

JNC WARING<br />

SETB P3.1<br />

V1: LCALL DISPLAY<br />

RET<br />

WARING: CLR P3.1<br />

;;;;;;;;;;;;;;;;;;;;<br />

;;VIICWRITE ;;<br />

AJMP V1<br />

;;;;;;;;;;;;;;;;;;;; ;归 一化 EEPROM 存 入程序(12M 时钟),存入<br />

数在 50H 起 单 元<br />

;<br />

VIICWRITE: ACALL WMOV9<br />

MOV SLA,#SLAW<br />

MOV NUMBYT,#09H<br />

LCALL WRNBYT<br />

RET<br />

WMOV9: MOV 5FH,#50H<br />

MOV R0,#MTD<br />

MOV R1,#5FH<br />

MOV R2,#09H<br />

WMOV: MOV A,@R1<br />

;<br />

MOV @R0,A<br />

INC R0<br />

INC R1<br />

DJNZ R2,WMOV<br />

RET<br />

;;;;;;;;;;;;;;;;;;;;<br />

;;VIICREAD ;;<br />

;;;;;;;;;;;;;;;;;;;;<br />

;<br />

VIICREAD: MOV MTD,#50H ;EEPROM 读 出 程 序 , 读 出 数 放 入<br />

60H-67H 单 元<br />

MOV SLA,#SLAW<br />

MOV NUMBYT,#01H<br />

LCALL WRNBYT<br />

MOV SLA,#SLAR<br />

MOV NUMBYT,#08H<br />

LCALL RDNBYT<br />

ACALL RMOV8<br />

RET<br />

RMOV8: MOV R0,#MRD<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

55


MOV R1,#60H<br />

MOV R2,#08H<br />

RMOV: MOV A,@R0<br />

;<br />

MOV @R1,A<br />

INC R0<br />

INC R1<br />

DJNZ R2,RMOV<br />

RET<br />

;;;;;;;;;;;;;;;;;;;;<br />

;;VIIC PROGRAM ;;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

;;;;;;;;;;;;;;;;;;;; ;IIC 串 行 归 一化存储子程序<br />

;<br />

STA: SETB VSDA<br />

SETB VSCL<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

CLR VSDA<br />

NOP<br />

CLR VSDA<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

CLR VSCL<br />

RET<br />

STOP: CLR VSDA<br />

SETB VSCL<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

SETB VSDA<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

CLR VSDA<br />

CLR VSCL<br />

RET<br />

MACK: CLR VSDA<br />

SETB VSCL<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

56


NOP<br />

NOP<br />

NOP<br />

NOP<br />

CLR VSCL<br />

SETB VSDA<br />

RET<br />

MNACK: SETB VSDA<br />

SETB VSCL<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

CLR VSCL<br />

CLR VSDA<br />

RET<br />

CACK: SETB VSDA<br />

SETB VSCL<br />

CLR F0<br />

MOV C,VSDA<br />

JNC CEND<br />

SETB F0<br />

CEND: CLR VSCL<br />

RET<br />

WRBYT: MOV R0,#08H<br />

WLP: RLC A<br />

JC WR1<br />

AJMP WR0<br />

WLP1: DJNZ R0,WLP<br />

RET<br />

WR1: SETB VSDA<br />

SETB VSCL<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

CLR VSCL<br />

CLR VSDA<br />

AJMP WLP1<br />

WR0: CLR VSDA<br />

SETB VSCL<br />

NOP<br />

NOP<br />

NOP<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

57


NOP<br />

CLR VSCL<br />

AJMP WLP1<br />

RDBYT: MOV R0,#08H<br />

RLP: SETB VSDA<br />

SETB VSCL<br />

MOV C,VSDA<br />

MOV A,R2<br />

RLC A<br />

MOV R2,A<br />

CLR VSCL<br />

DJNZ R0,RLP<br />

RET<br />

WRNBYT: MOV R3,NUMBYT<br />

LCALL STA<br />

MOV A,SLA<br />

LCALL WRBYT<br />

LCALL CACK<br />

JB F0,WRNBYT<br />

MOV R1,#MTD<br />

WRDA: MOV A,@R1<br />

LCALL WRBYT<br />

LCALL CACK<br />

JB F0,WRNBYT<br />

INC R1<br />

DJNZ R3,WRDA<br />

LCALL STOP<br />

RET<br />

RDNBYT: MOV R3,NUMBYT<br />

LCALL STA<br />

MOV A,SLA<br />

LCALL WRBYT<br />

LCALL CACK<br />

JB F0,RDNBYT<br />

RDN: MOV R1,#MRD<br />

RDN1: LCALL RDBYT<br />

MOV @R1,A<br />

DJNZ R3,ACK<br />

LCALL MNACK<br />

LCALL STOP<br />

RET<br />

ACK: LCALL MACK<br />

INC R1<br />

SJMP RDN1<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

58


;<br />

;;;;;;;;;;;;;;;;;;;;<br />

;;DISPLAY PROGRAM ;;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

;;;;;;;;;;;;;;;;;;;; ;显 示程序<br />

;<br />

DISPLAY: MOV R1,#70H ;显 示 BCD 码在 70H— 73H<br />

MOV R2,#0FEH<br />

PLAY: MOV A,R2<br />

MOV P2,A<br />

MOV A,@R1<br />

ANL A,#0FH<br />

MOV DPTR,#TAB<br />

MOVC A,@A+DPTR<br />

MOV P0,A<br />

LCALL DL1MS<br />

INC R1<br />

MOV A,R2<br />

JNB ACC.3,ENDOUT<br />

RL A<br />

MOV R2,A<br />

AJMP PLAY<br />

ENDOUT: SETB P2.0<br />

SETB P2.1<br />

SETB P2.2<br />

SETB P2.3<br />

RET<br />

TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H<br />

;;;;;;;;;;;;;;;;;;;;<br />

;;SSS PROGRAM ;;<br />

DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H<br />

DB 00H<br />

;;;;;;;;;;;;;;;;;;;; ;里 程处理程序<br />

;<br />

SSS: MOV 19H,#64H<br />

MOV 18H,#00H<br />

MOV 17H,#00H<br />

MOV 16H,#00H<br />

MOV 11H,#00H<br />

MOV 12H,#00H<br />

MOV 13H,62H<br />

MOV 14H,61H<br />

MOV 15H,60H<br />

LCALL DIVST ;除 法 程序<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

59


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

LCALL BCDST ;二 进 制 转 BCD 码程序<br />

MOV A,25H<br />

ANL A,#0FH<br />

MOV 70H,A<br />

MOV A,25H<br />

SWAP A<br />

ANL A,#0FH<br />

MOV 71H,A<br />

MOV A,24H<br />

ANL A,#0FH<br />

MOV 72H,A<br />

MOV A,24H<br />

SWAP A<br />

ANL A,#0FH<br />

MOV 73H,A<br />

RET<br />

SSSS: MOV A,60H<br />

;<br />

ANL A,#0FH<br />

MOV 70H,A<br />

MOV A,60H<br />

SWAP A<br />

ANL A,#0FH<br />

MOV 71H,A<br />

MOV A,61H<br />

ANL A,#0FH<br />

MOV 72H,A<br />

MOV A,61H<br />

SWAP A<br />

ANL A,#0FH<br />

MOV 73H,A<br />

RET<br />

;;;;;;;;;;;;;;;;;;;;<br />

;;VVV PROGRAM ;;<br />

;;;;;;;;;;;;;;;;;;;; ;时 速处理程序<br />

;<br />

VVV: MOV 18H,68H<br />

MOV 17H,69H<br />

MOV 16H,6AH<br />

MOV 11H,#00H<br />

MOV 12H,#00H<br />

MOV 13H,#36H<br />

MOV 14H,#0EEH<br />

MOV 15H,#80H<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

60


;<br />

;<br />

;;;;;;;;;;;;;;;;;<br />

; DL1MS ;;<br />

;;;;;;;;;;;;;;;;;<br />

;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

LCALL DIVST ;除 法 程序<br />

MOV 14H,#00H<br />

LCALL BCDST ;二 进 制 转 BCD 码程序<br />

MOV A,25H<br />

ANL A,#0FH<br />

MOV 70H,A<br />

MOV A,25H<br />

SWAP A<br />

ANL A,#0FH<br />

MOV 71H,A<br />

MOV 72H,#00H<br />

MOV 73H,#00H<br />

RET<br />

DL1MS: MOV R6,#14H<br />

DL1: MOV R7,#19H<br />

DL2: DJNZ R7,DL2<br />

;<br />

;;;;;;;;;;;;;;;;;<br />

DJNZ R6,DL1<br />

RET<br />

; DL0.5S ;;<br />

;;;;;;;;;;;;;;;;;<br />

;<br />

DL5S: MOV R5,#0FFH<br />

DL3: LCALL DL1MS<br />

DJNZ R5,DL3<br />

RET<br />

DIVST: CLR C ;运 算开始<br />

MOV A,13H<br />

SUBB A,18H<br />

MOV A,12H<br />

SUBB A,17H<br />

MOV A,11H<br />

SUBB A,16H<br />

JNC LOOP4<br />

MOV B,#10H<br />

NDIV1: CLR C<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

61


;<br />

;<br />

MOV A,15H<br />

RLC A<br />

MOV 15H,A<br />

MOV A,14H<br />

RLC A<br />

MOV 14H,A<br />

MOV A,13H<br />

RLC A<br />

MOV 13H,A<br />

MOV A,12H<br />

RLC A<br />

MOV 12H,A<br />

MOV A,11H<br />

RLC A<br />

MOV 11H,A<br />

MOV F0,C<br />

CLR C<br />

MOV A,13H<br />

SUBB A,18H<br />

MOV 1AH,A<br />

MOV A,12H<br />

SUBB A,17H<br />

MOV 19H,A<br />

MOV A,11H<br />

SUBB A,16H<br />

JB F0,NDIV2<br />

JC NDIV3<br />

NDIV2: MOV 11H,A<br />

MOV A,19H<br />

MOV 12H,A<br />

MOV A,1AH<br />

MOV 13H,A<br />

INC 15H<br />

NDIV3: DJNZ B,NDIV1<br />

DIVEND: RET<br />

CLR F0<br />

LOOP4: SETB F0<br />

SJMP DIVEND<br />

BCDST: MOV R7,#10H<br />

CLR C<br />

MOV 25H,#00H<br />

MOV 24H,#00H<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

62


;<br />

KKK: MOV A,15H<br />

RLC A<br />

MOV 15H,A<br />

MOV A,14H<br />

RLC A<br />

MOV 14H,A<br />

MOV A,25H<br />

ADDC A,25H<br />

DA A<br />

MOV 25H,A<br />

MOV A,24H<br />

ADDC A,24H<br />

DA A<br />

MOV 24H,A<br />

DJNZ R7,KKK<br />

RET<br />

END<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

63


说明:<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

例 8 自 动 往 返 行 驶 小 汽 车 的 设 计<br />

本 设计的小汔车能在如图的跑道上自动往返行驶,车 子从起跑线出发后到达终点线停车<br />

10 秒 钟,然后返回到起点停止。在限速区行驶时间要求大于 8秒,终点线停车与最后停车<br />

时要求车子中心点与黑线的误差尽量小。车子能自动记录时间及里程并在车上显示。跑道宽<br />

为 0.5米,两侧挡板高度大于 0.2米,跑道表面贴有白纸,在 B、C、D、E、F、G处画有<br />

2CM 宽 的 黑 线 。<br />

A B C D E F G H<br />

1 米 1 米<br />

0. 5 米<br />

0. 5 米<br />

起 跑 线<br />

采用 AT89C52 单片机作系统控制。显示系统采用三位 LED 显示里程数,四位 LED 显示一<br />

次往返的时间,电机正反转采用桥式驱动,二档电压调速,里程记录采用霍尔传感器,跑道<br />

标 志 线 脉 冲 采 用 光 敏 管 检 测 并 使 用 软 硬件整形消抖措 施 , 使 用 四 个 靠 轮 解决小 汽 车 碰 擦 问<br />

题 ,单片机、电机独立稳压电源供电。<br />

1.电机驱动电路<br />

主要采用两对互补三极管,利用单片机 16、 17 脚 电 位 的 高低去控制三极管的截止和<br />

导通状态,从而实现小汽车驱动马达的正反转功能。为了防止马达转动时对单片机的干扰影<br />

响,提高单片机的稳定性,在马达的电源两端加了抗干扰电路。<br />

2.电压调速电路<br />

0. 5 米<br />

3-6 米<br />

限 速 区<br />

3-6 米<br />

电机驱动电压由系统 AT89C52 单片机的 P1 .7 和 P1.6 分 别 控制+4.3v和+7.5v的稳压<br />

电源。当 P1 .7 为 0, P1.6 为 1 时,电机驱动电压为+7.5v,小车进入高速行驶状态;当 P1 .7<br />

为 1, P1.6 为 0 时,电机驱动电压为+4.3v,小车进入低速行驶状态。当 P1.0 为 高 电 位 时,<br />

马达供电三极管 D880 截 止 , 关 闭马达电源实现停车功能;当 p1.0 为 0 时,D880 输 出 电机<br />

电压,驱动电路处于服侍状态,等待单片机的指令,执行各种功能。<br />

2 米<br />

跑 道 顶 视 图<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

终 点 线<br />

64


3. 传感脉冲检测电路<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

由霍尔元件转速检测、跑道标志光电管检测两部分组成。电路图如下:<br />

( 1)、 用于里程累计的脉冲信号由霍尔元件检测。此装置安装在后左轮,车轮每转一<br />

周就由霍尔元件产生一个低电平脉冲,单片机外部中断 1产生中断,从而使里程脉冲数累计<br />

一次,根据本小车轮子的周长,每转 6周为 1米,所以每累计 6个脉冲就是 1米。<br />

(2)、用于道路标志的脉冲信号由光敏二极管、发光二极管电路组成。当小车在白纸<br />

上时,输出为高电平;当遇到黑条时,输出低电平脉冲,作中断计数判断用。<br />

4. LED 显示电路<br />

对 多 位 LED 显示器采用动态扫描的方法进行显示,系统采用七位数码管显示,前三位数<br />

码管显示的数值表示里程,显示的范围为 1m— 999m, 其 中 每 1m 累 计 一 次 。后四位数码管的<br />

数值表示一次往返过程中所需的时间,其中前两位表示分,后两位表示秒。往返到起点时显<br />

示的数值即一次往返总时间。<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

65


;<br />

;<br />

;*************************************<br />

;* *<br />

;* 主 程序和中断程序入口 *<br />

;* *<br />

;*************************************<br />

;<br />

ORG 0000H<br />

ORG 0003H<br />

ORG 000BH<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

;*************************************<br />

;* *<br />

;* 自 动 往 返 小 汽 车 *<br />

;* 2001 年 9 月 *<br />

;*************************************<br />

LJMP START<br />

LJMP INTEX0<br />

RETI<br />

ORG 0013H<br />

ORG 001BH<br />

ORG 0023H<br />

LJMP INTEX1<br />

LJMP INTIMEX1<br />

RETI<br />

ORG 002BH<br />

RETI<br />

;***************************<br />

;* *<br />

;* 初 始化程序 *<br />

;* *<br />

;****************************<br />

CLEARMEMIO: MOV R0, #70H<br />

MOV R7, #07H<br />

ML0: MOV @R0, #00H<br />

INC R0<br />

DJNZ R7, ML0<br />

MOV TMOD,#10H<br />

MOV R4,#14H<br />

MOV TL1, #0B0H<br />

MOV TH1, #3CH<br />

MOV 20H,#00H<br />

MOV 21H,#00H<br />

MOV 22H,#00H<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

66


;<br />

MOV 23H,#00H<br />

CLR 30H<br />

SETB ET1<br />

SETB EX1<br />

SETB IT1<br />

SETB IT0<br />

SETB EX0<br />

SETB EA<br />

SETB TR1<br />

RET<br />

;*************************************<br />

;* *<br />

;* 主 程 序 *<br />

;* *<br />

;*************************************<br />

;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

START: LCALL CLEARMEMIO ;初 始化<br />

MAIN: NOP<br />

;<br />

;<br />

SETB P1.6<br />

CLR P1.7<br />

SETB P3.7<br />

CLR P3.6<br />

CLR P1.0<br />

LCALL DISP<br />

LJMP MAIN<br />

NOP ;PC 值 出 错处理<br />

NOP<br />

LJMP START<br />

;*************************************<br />

;* *<br />

;* INTEX0 *<br />

;* *<br />

;*************************************<br />

INTEX0: PUSH ACC<br />

PUSH PSW<br />

CLR EX0<br />

LCALL DISP<br />

JB P3.2,IN0RET<br />

INC 23H<br />

MOV A,23H<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

67


CJNE A,#06H,JUDGE1<br />

LCALL STOP<br />

LJMP IN0RET<br />

JUDGE1: CJNE A,#03H,JUDGE2<br />

LCALL STOPSLOW<br />

LJMP IN0RET<br />

JUDGE2: CJNE A,#04H,JUDGE3<br />

LCALL FAST<br />

LJMP IN0RET<br />

JUDGE3: CJNE A,#05H,IN0RET<br />

LCALL STOPSLOW<br />

IN0RET: CLR IE0<br />

;<br />

POP PSW<br />

POP ACC<br />

LCALL DL7MS<br />

SETB EX0<br />

RETI<br />

;************************************<br />

;* STOP SLOW *<br />

;************************************<br />

STOPSLOW: CLR P1.6<br />

;<br />

CPL P3.6<br />

CPL P3.7<br />

LCALL DS50MS<br />

LCALL DS50MS<br />

LCALL DS50MS<br />

CPL P3.6<br />

CPL P3.7<br />

SETB P1.7<br />

RET<br />

;************************************<br />

;* FAST *<br />

;************************************<br />

FAST: CLR P1.7<br />

;<br />

SETB P1.6<br />

RET<br />

;************************************<br />

;* STOP *<br />

;************************************<br />

STOP: MOV 23H,#00H<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

68


;<br />

CPL P3.6<br />

CPL P3.7<br />

LCALL DS50MS<br />

LCALL DS50MS<br />

SETB P1.0<br />

SETB PT1<br />

LCALL DS10S<br />

CLR PT1<br />

SETB P1.6<br />

CLR P1.7<br />

CLR P1.0<br />

CPL 30H<br />

JB 30H,STREN<br />

LCALL CLR00<br />

STREN: MOV 23H,#00H<br />

RET<br />

;*********************************<br />

;* CLR00 *<br />

;*********************************<br />

CLR00: MOV 70H,#00H<br />

;<br />

MOV 71H,#00H<br />

MOV 72H,#00H<br />

MOV 73H,#00H<br />

RET<br />

;*************************************<br />

;* *<br />

;* INTEX1 *<br />

;* *<br />

;*************************************<br />

INTEX1: PUSH ACC<br />

PUSH PSW<br />

CLR EX1<br />

INC 20H<br />

LLLL: MOV A,20H<br />

CJNE A,#06H,LLL<br />

MOV 20H,#00H<br />

INC 21H<br />

MOV A,21H<br />

CJNE A,#0AH,LLL<br />

MOV 21H,#00H<br />

INC 22H<br />

MOV A,22H<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

69


CJNE A,#0AH,LLL<br />

MOV 22H,#00H<br />

INC 24H<br />

MOV A,24H<br />

CJNE A,#0AH,LLL<br />

MOV 24H,#00H<br />

MOV 74H,21H<br />

MOV 75H,22H<br />

MOV 76H,24H<br />

LJMP IN1RET<br />

LLL: MOV 74H,21H<br />

MOV 75H,22H<br />

IN1RET: POP PSW<br />

;<br />

POP ACC<br />

SETB EX1<br />

RETI<br />

;*************************************<br />

;* *<br />

;* INTIMEX1 *<br />

;* *<br />

;*************************************<br />

INTIMEX1: PUSH ACC<br />

PUSH PSW<br />

MOV TL1,#0B0H<br />

MOV TH1,#3CH<br />

DEC R4<br />

MOV A,R4<br />

JNZ RETT0<br />

MOV R4,#14H<br />

MOV R0,#71H<br />

ACALL ADD1<br />

MOV A,R3<br />

CLR C<br />

CJNE A,#60H,CC<br />

CC: JC RETT0<br />

ACALL CLR0<br />

MOV R0,#73H<br />

ACALL ADD1<br />

MOV A,R3<br />

CLR C<br />

CJNE A,#60H,CCC<br />

CCC: JC RETT0<br />

ACALL CLR0<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

70


RETT0: POP PSW<br />

POP ACC<br />

RETI<br />

;;;;;;;;;;;;;;<br />

; ADD1 ;<br />

;;;;;;;;;;;;;;<br />

ADD1: MOV A,@R0<br />

DEC R0<br />

SWAP A<br />

ORL A,@R0<br />

ADD A,#01H<br />

DA A<br />

MOV R3,A<br />

ANL A,#0FH<br />

MOV @R0,A<br />

MOV A,R3<br />

INC R0<br />

SWAP A<br />

ANL A,#0FH<br />

MOV @R0,A<br />

RET<br />

;;;;;;;;;;;;;<br />

; CLR0 ;<br />

;;;;;;;;;;;;;<br />

CLR0: CLR A<br />

MOV @R0,A<br />

DEC R0<br />

MOV @R0,A<br />

RET<br />

;;;;;;;;;;;;;<br />

; DISP ;<br />

;;;;;;;;;;;;;<br />

DISP: MOV R1,#70H<br />

MOV R5,#0FEH<br />

PLAY: MOV A,R5<br />

MOV P2,A<br />

MOV A,@R1<br />

MOV DPTR,#TAB<br />

MOVC A,@A+DPTR<br />

MOV P0,A<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

71


LCALL DL1MS<br />

INC R1<br />

MOV A,R5<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

JNB ACC.6,ENDOUT<br />

RL A<br />

MOV R5,A<br />

AJMP PLAY<br />

ENDOUT: SETB P2.0<br />

;<br />

SETB P2.1<br />

SETB P2.2<br />

SETB P2.3<br />

SETB P2.4<br />

SETB P2.5<br />

SETB P2.6<br />

RET<br />

TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH<br />

;<br />

DL1MS: MOV R6,#14H<br />

DL1: MOV R7,#19H<br />

DL2: DJNZ R7,DL2<br />

DJNZ R6,DL1<br />

RET<br />

DS50MS: LCALL DISP<br />

LCALL DISP<br />

LCALL DISP<br />

DS20MS: LCALL DISP<br />

LCALL DISP<br />

LCALL DISP<br />

RET<br />

DS10S: MOV R2,#08H<br />

TI0: MOV R0,#0B0H<br />

TI1: LCALL DISP<br />

DJNZ R0,TI1<br />

DJNZ R2,TI0<br />

RET<br />

DL7MS: SETB PX1<br />

MOV R2,#0EH<br />

DL11: LCALL DISP<br />

DJNZ R2,DL11<br />

CLR PX1<br />

RET<br />

END<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

72


说明:<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

例 9 遥 控 小 汽 车 的 设 计<br />

采 用 AT89C20<strong>51</strong> 作遥控发射器及接收处理器,汔车前进后退与转向分别用二个电机,采<br />

用 桥 式 开 关 电路驱动。无线传送用接发模块完成。小汔车能前进、后退、左转、右转及自动<br />

驾驶(碰到障碍时能自动改变行驶方向)。<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

73


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

; *************************************<br />

; * *<br />

; * 遥 控编码控制器 *<br />

; * *<br />

; * 采 用 89C20<strong>51</strong> *<br />

; *************************************<br />

;<br />

; P1.0 口 按 纽 为 前 进 , P1.1 口 按 纽 为 后 退 , P1.2 口 按 纽 为 左转弯,P1.3 口 按 纽 为 右 转 弯 ,<br />

; P1.4 口 按 纽 为自动驾驶,P3.5 为 编 码输出<br />

;<br />

;*************************************<br />

;* *<br />

;* 主 程序和中断程序入口 *<br />

;* *<br />

;*************************************<br />

;<br />

ORG 0000H<br />

ORG 0003H<br />

LJMP START<br />

RETI<br />

ORG 000BH<br />

RETI<br />

ORG 0013H<br />

RETI<br />

ORG 001BH<br />

RETI<br />

ORG 0023H<br />

RETI<br />

ORG 002BH<br />

RETI<br />

;*************************************<br />

;* *<br />

;* 初 始化程序中的各变量 *<br />

;* *<br />

;*************************************<br />

CLEARMEMIO: CLR A<br />

;<br />

DEC A<br />

MOV P1,A ; I/O 口 复位<br />

MOV P3,A<br />

MOV IE,#00H ;关 所有中断<br />

RET<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

74


;*************************************<br />

;* *<br />

;* 主 程 序 *<br />

;* *<br />

;*************************************<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

START: LCALL CLEARMEMIO ;初 始化<br />

;<br />

MAIN: LCALL KEYWORK ;主 体 程序<br />

;<br />

LJMP MAIN<br />

NOP ;PC 值 出 错处理<br />

NOP<br />

NOP<br />

LJMP START<br />

;**************************<br />

;* *<br />

;* 键 盘工作子程序 *<br />

;**************************<br />

KEYWORK: MOV P1,#0FFH<br />

KEYOUT: RET<br />

;<br />

JNB P1.0,KEY0<br />

JNB P1.1,KEY1<br />

JNB P1.4,KEY4<br />

KEY0: LCALL DL10MS<br />

JB P1.0,KEYOUT<br />

LJMP KEYFUN00<br />

KEY1: LCALL DL10MS<br />

JB P1.1,KEYOUT<br />

LJMP KEYFUN01<br />

KEY2: LCALL DL10MS<br />

JB P1.2,KEYOUT<br />

LJMP KEYFUN02<br />

KEY3: LCALL DL10MS<br />

JB P1.3,KEYOUT<br />

LJMP KEYFUN03<br />

KEY4: LCALL DL10MS<br />

JB P1.4,KEYOUT<br />

LJMP KEYFUN04<br />

KEYWORK1: JNB P1.2,KEY2<br />

JNB P1.3,KEY3<br />

LCALL KEYFUN05<br />

RET<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

75


;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

KEYFUN00: MOV A,#02H ; 按 下 发 2 个 脉 冲 , 释 放 发 8 个 脉 冲(停 止)<br />

LCALL REMOTE<br />

WAIT0: LCALL KEYWORK1<br />

;<br />

JNB P1.0,WAIT0<br />

MOV A,#02H<br />

LCALL REMOTE<br />

LCALL KEYFUN06<br />

RET<br />

KEYFUN01: MOV A,#03H ; 按 下 发 3 个 脉 冲 , 释 放 发 8 个 脉 冲(停 止)<br />

LCALL REMOTE<br />

WAIT1: LCALL KEYWORK1<br />

;<br />

JNB P1.1,WAIT1<br />

MOV A,#03H<br />

LCALL REMOTE<br />

LCALL KEYFUN06<br />

RET<br />

KEYFUN02: MOV A,#04H ; 按 下 发 4 个 脉 冲 , 释 放 发 7 个 脉 冲(转弯复位)<br />

;<br />

LCALL REMOTE<br />

JNB P1.2,KEYOUT1<br />

LCALL DL10MS<br />

JNB P1.2,KEYOUT1<br />

LCALL KEYFUN05<br />

RET<br />

KEYFUN03: MOV A,#05H ; 按 下 发 5 个 脉 冲 , 释 放 发 7 个 脉 冲(转弯复位)<br />

LCALL REMOTE<br />

JNB P1.3,KEYOUT1<br />

LCALL DL10MS<br />

JNB P1.3,KEYOUT1;<br />

LCALL KEYFUN05;<br />

RET<br />

KEYOUT1: LJMP KEYOUT<br />

;<br />

KEYFUN04: JNB P1.4,KEYFUN04 ; 按 下 发 6 个 脉 冲 , 进 入自动驾驶<br />

;<br />

LCALL DL10MS<br />

JNB P1.4,KEYFUN04<br />

MOV A,#06H<br />

LCALL REMOTE<br />

RET<br />

KEYFUN05: MOV A,#07H<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

76


LCALL REMOTE<br />

RET<br />

KEYFUN06: MOV A,#08H<br />

;<br />

;<br />

LCALL REMOTE<br />

RET<br />

;*************************************<br />

;* *<br />

;* 编 码发送 *<br />

;* *<br />

;*************************************<br />

;<br />

REMOTE: MOV R1,A<br />

LJMP OUT3<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

OUT: MOV R0,#55H ; 1MS 脉 宽 定 时值<br />

OUT1: CLR P3.5<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

DJNZ R0,OUT1<br />

OUT2: SETB P3.5<br />

MOV R0,#55H ; 1MS 脉 宽 定 时值<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

DJNZ R0,OUT2<br />

DJNZ R1,OUT<br />

LCALL DL10MS<br />

RET<br />

OUT3: MOV R0,#0FFH ; 3MS 脉 宽 定 时值<br />

LJMP OUT1<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

77


;<br />

;*************************************<br />

;* *<br />

;* 延 时 255 X 2 = <strong>51</strong>2 us *<br />

;* *<br />

;*************************************<br />

DELAY: MOV R2,#0FFH<br />

DELAY1: DJNZ R2,DELAY1<br />

;<br />

RET<br />

;*************************************<br />

;* *<br />

;* 延 时 10ms *<br />

;* *<br />

;*************************************<br />

DL10MS: MOV R3,#14H<br />

DL10MS1: LCALL DELAY<br />

DJNZ R3,DL10MS1<br />

RET<br />

DL500MS: MOV R4,#32H<br />

DL500MS1: LCALL DL10MS<br />

;<br />

;<br />

DJNZ R4,DL500MS1<br />

RET<br />

END<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

78


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

; *************************************<br />

; * *<br />

; * 遥 控 接 收 解 码 *<br />

; * 采 用 AT89C20<strong>51</strong> *<br />

; * *<br />

; *************************************<br />

;<br />

; P1.0-P1.1 为电机前后驱动,P1.2-P1.3 为 左 右 转 弯驱动,P1.4 为自动驾驶指示,<br />

; 编码输入从 P3.1 和 p3.2( int0) 口,P3.0 和 P3.5 分 别 为 前 后 红外线探头,在自动<br />

; 驾驶时以控制小汔车前进倒退。<br />

;*************************************<br />

;* *<br />

;* 主 程序和中断程序入口 *<br />

;* *<br />

;*************************************<br />

;<br />

ORG 0000H<br />

ORG 0003H<br />

ORG 000BH<br />

LJMP START<br />

LJMP INTEX0<br />

RETI<br />

ORG 0013H<br />

RETI<br />

ORG 001BH<br />

RETI<br />

ORG 0023H<br />

RETI<br />

ORG 002BH<br />

RETI<br />

;***************************<br />

;* *<br />

;* 初 始化程序 *<br />

;* *<br />

;****************************<br />

CLEARMEMIO: CLR A<br />

MOV P1,A<br />

DEC A<br />

MOV P3,A<br />

SETB P1.4<br />

CLR 00H<br />

CLEARMEM: MOV IE,#00H ;关 所有中断<br />

SETB EX0<br />

SETB EA<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

79


;<br />

CLR F0<br />

RET<br />

;*************************************<br />

;* *<br />

;* 主 程 序 *<br />

;* *<br />

;*************************************<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

START: LCALL CLEARMEMIO ;初 始化<br />

MAIN: JB 00H,AUTO2<br />

LJMP MAIN<br />

NOP ;PC 值 出 错处理<br />

NOP<br />

LJMP START<br />

AUTO2: LJMP AUTO<br />

;******************************<br />

;<br />

; 接 收 程 序<br />

;<br />

;******************************<br />

INTEX0: CLR EX0<br />

JNB P3.1,READ1<br />

READOUTT0: SETB EX0<br />

;<br />

RETI<br />

READ1: CLR A<br />

MOV DPH,A<br />

MOV DPL,A<br />

HARD1: JB P3.1,HARD11<br />

INC DPTR<br />

NOP<br />

NOP<br />

AJMP HARD1<br />

HARD11: MOV A,DPH<br />

JZ READOUTT0 ; 若 脉 宽 大 于 1.5MS, 是 第 一个肪冲<br />

CLR A<br />

READ11: INC A<br />

READ12: JNB P3.1,READ12<br />

MOV R1,#06H<br />

READ13: JNB P3.1,READ11<br />

LCALL DELAY<br />

DJNZ R1,READ13 ; 高 电 平 肪 宽 大 于 3MS, 计数结束<br />

DEC A<br />

DEC A<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

80


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

JZ FUN0 ; 收 到 2 个 肪 冲 , 执 行 前 进功能<br />

DEC A<br />

JZ FUN1 ; 收 到 3 个 肪 冲 , 执 行 后 退 功能<br />

DEC A<br />

JZ FUN2 ; 收 到 4 个 肪 冲 , 执 行 左转功能<br />

DEC A<br />

JZ FUN3 ; 收 到 5 个 肪 冲 , 执 行 右 转功能<br />

DEC A<br />

JZ FUN4 ; 收 到 6 个 肪 冲 , 执 行自动驾驶功能<br />

DEC A<br />

JZ FUN5 ; 收 到 7 个 肪 冲 , 执 行 转 弯 复位功能<br />

DEC A<br />

JZ FUN6 ; 收 到 8 个 肪 冲 , 执 行 停 车 功能<br />

NOP<br />

NOP<br />

LJMP READOUTT0<br />

FUN0: CPL F0<br />

JNB F0,FUNN0<br />

SETB P1.0<br />

LJMP READOUTT0<br />

FUNN0: CLR P1.0<br />

LJMP READOUTT0<br />

FUN1: CPL F0<br />

JNB F0,FUNN1<br />

SETB P1.1<br />

LJMP READOUTT0<br />

FUNN1: CLR P1.1<br />

LJMP READOUTT0<br />

FUN2: SETB P1.2<br />

LJMP READOUTT0<br />

FUN3: SETB P1.3<br />

LJMP READOUTT0<br />

FUN4: CPL 00H<br />

JB 00H,AUTO1 ; 00H=1, 进 入自动驾驶<br />

CLR P1.0 ; 00H=0, 时入遥控驾驶<br />

CLR P1.1<br />

CLR P1.2<br />

CLR P1.3<br />

SETB P1.4<br />

LJMP READOUTT0<br />

AUTO1: CLR P1.4 ; 开自动驾驶指示灯<br />

SETB EX0<br />

RETI<br />

AUTO: JNB P3.0,BL ; 自动驾驶控制程序<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

81


SETB P1.0<br />

CLR P1.1<br />

CLR P1.2<br />

CLR P1.3<br />

JNB 00H,OUT1<br />

AJMP AUTO<br />

BL: CLR P1.0<br />

SETB P1.1<br />

SETB P1.2<br />

CLR P1.3<br />

JNB 00H,OUT1<br />

JNB P3.5,AUTO<br />

JNB 00H,OUT1<br />

AJMP BL<br />

OUT1: CLR P1.0<br />

CLR P1.1<br />

CLR P1.2<br />

CLR P1.3<br />

SETB P1.4<br />

LJMP MAIN<br />

FUN5: CLR P1.2<br />

CLR P1.3<br />

LJMP READOUTT0<br />

FUN6: CLR P1.0<br />

CLR P1.1<br />

CLR P1.2<br />

CLR P1.3<br />

LJMP READOUTT0<br />

;*************************************<br />

;* *<br />

;* 延 时 255 X 2 = <strong>51</strong>2 us *<br />

;* *<br />

;*************************************<br />

DELAY: MOV R0,#0FFH<br />

DELAY1: DJNZ R0,DELAY1<br />

;<br />

;<br />

RET<br />

END<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

82


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

例 10 汽 车 行 驶 信 息 发 送 与 接 收 器<br />

一 套 用 于 汽车在高速公路上行驶时前车转弯、刹车及后车超车信息的显示提<br />

醒电路,发送板要求如下:<br />

1. 设 有 三个开关,分别与汽车左转变、右转弯、刹车开关联动。<br />

2.当 某 个开关按下时 ,发送板能通 过红外线 发射管发射代表某一 开 关 状态的编<br />

码。<br />

接收板要求如下:<br />

1.设有三 个 指 示灯 ,分别代表前车左 转 , 前 车 右 转 , 前 车 刹 车 三个 状态,灯亮<br />

同时应有信响提醒。<br />

2.当前后车发 射 板 某 个开关按下时接 收 板 上 的 某 个 对应灯将点亮,前后车开关<br />

复位时熄灭。<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

83


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

; *************************************<br />

; * 汽 车通讯控制程序 *<br />

; * LOU RANMIAO *<br />

; * 2001.4.24 *<br />

; *************************************<br />

; *****************************************************************<br />

;* *<br />

;* 后 车信号接收 P1.0 * 1 40 * VCC *<br />

;* 前 车信号接收 P1.1 * 2 39 * P0.0 左 转开关(L) *<br />

;* P1.2 * 3 38 * P0.1 右 转开关(L) *<br />

;* P1.3 * 4 37 * P0.2 刹 车 开 关 (L) *<br />

;* P1.4 * 5 36 * P0.3 前 车 左转指示 *<br />

;* P1.5 * 6 35 * P0.4 前 车 右 转 指 示 *<br />

;* P1.6 * 7 34 * P0.5 后 车 超 车 指 示 *<br />

;* P1.7 * 8 33 * P0.6 前 车 刹 车 指 示 *<br />

;* RST * 9 32 * P0.7 *<br />

;* P3.0 * 10 <strong>MCS</strong>-<strong>51</strong> 31 * EA VDD *<br />

;* P3.1 * 11 30 * ALE *<br />

;* INTEX0 P3.2 * 12 29 * PSEN *<br />

;* INTEX1 P3.3 * 13 28 * P2.7 *<br />

;* P3.4 * 14 27 * P2.6 *<br />

;* remoteout P3.5 * 15 26 * P2.5 *<br />

;* P3.6 * 16 25 * P2.4 *<br />

;* P3.7 * 17 24 * P2.3 *<br />

;* XTAL2 * 18 23 * P2.2 *<br />

;* XTAL1 * 19 22 * P2.1 *<br />

;* VSS * 20 21 * P2.0 *<br />

;* *<br />

;* *<br />

; *****************************************************************<br />

;<br />

; 发 送 接 收 一 体 板 程 序<br />

;*************************************<br />

;* *<br />

;* 主 程序和中断程序入口 *<br />

;* *<br />

;*************************************<br />

ORG 0000H<br />

ORG 0003H<br />

ORG 000BH<br />

LJMP START<br />

LJMP INTEX0<br />

RETI<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

84


;<br />

ORG 0013H<br />

ORG 001BH<br />

ORG 0023H<br />

LJMP INTEX1<br />

LJMP INTT1<br />

RETI<br />

ORG 002BH<br />

RETI<br />

;***************************<br />

;* *<br />

;* 初 始化程序 *<br />

;* *<br />

;****************************<br />

CLEARMEMIO: CLR A<br />

DEC A<br />

MOV P1,A<br />

MOV P2,A<br />

MOV P3,A<br />

CLR P3.5<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

CLEARMEM: MOV SP,#70H ;设 堆栈基址<br />

;<br />

MOV IE,#00H ;关 所有中断<br />

MOV IP,#01H<br />

MOV TMOD,#22H<br />

MOV TH1,#0F3H<br />

MOV TL1,#0F3H<br />

SETB EX0<br />

SETB EX1<br />

CLR ET1<br />

SETB EA<br />

RET<br />

;*************************************<br />

;* *<br />

;* 主 程 序 *<br />

;* *<br />

;*************************************<br />

START: LCALL CLEARMEMIO ;初 始化<br />

;<br />

MAIN: LJMP KEYWORK<br />

;<br />

NOP ;PC 值 出 错处理<br />

NOP<br />

LJMP START<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

85


;*************************************<br />

;* *<br />

;* T1 中断服务程序 *<br />

;* *<br />

;*************************************<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

INTT1: CPL P3.5 ;40kHZ 信号<br />

;<br />

;<br />

RETI<br />

;*************************************<br />

;* *<br />

;* 主 程序 (扫 键程序) *<br />

;* *<br />

;*************************************<br />

;<br />

KEYWORK: SETB P0.2<br />

SETB P0.0<br />

SETB P0.1<br />

CLR 00H<br />

JNB P0.2,KEY3<br />

KEY4: JNB P0.0,KEY0<br />

JNB P0.1,KEY1<br />

KEY5: JB 00H,KEY2<br />

SETB EA<br />

SETB EX1<br />

SETB EX0<br />

LCALL DL10MS<br />

LCALL DL10MS<br />

LCALL DL10MS<br />

LCALL DL10MS<br />

LCALL DL10MS<br />

LCALL DL10MS<br />

KEY6: SETB P0.3<br />

SETB P0.4<br />

SETB P0.5<br />

SETB P0.6<br />

LJMP KEYWORK<br />

KEY3: LCALL DELAY<br />

JB P0.2,KEY5<br />

SETB 00H<br />

LJMP KEY4<br />

KEY0: LCALL DELAY<br />

JB P0.0,KEY5<br />

MOV A,#02H<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

86


LJMP REMOTE<br />

KEY1: LCALL DELAY<br />

JB P0.1,KEY5<br />

MOV A,#05H<br />

LJMP REMOTE<br />

KEY2: CLR 00H<br />

MOV A,#08H<br />

LJMP REMOTE<br />

;******************************<br />

; 接收程序<br />

;******************************<br />

INTEX0: PUSH ACC<br />

PUSH PSW<br />

CLR EX0<br />

CLR EX1<br />

CLR EA<br />

JNB P1.1,READ1<br />

READOUT0: POP PSW<br />

;<br />

POP ACC<br />

RETI<br />

READ1: CLR A<br />

MOV DPH,A<br />

MOV DPL,A<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

HARD1: JB P1.1,HARD11 ;8*255=2.04ms,>2.04MS 判 定 是起始位<br />

INC DPTR<br />

NOP<br />

NOP<br />

AJMP HARD1<br />

HARD11: MOV A,DPH<br />

JZ READOUT0<br />

CLR A<br />

READ11: INC A<br />

READ12: JNB P1.1,READ12<br />

MOV R1,#0AH<br />

READ13: JNB P1.1,READ11<br />

LCALL DELAY ;高 电 平宽大于 5MS 停 止 接收<br />

DJNZ R1,READ13<br />

DEC A<br />

DEC A<br />

JZ FLT<br />

DEC A<br />

DEC A<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

87


;<br />

DEC A<br />

JZ FRT<br />

DEC A<br />

DEC A<br />

DEC A<br />

JZ STOP<br />

CLR PX0<br />

SETB PX1<br />

LJMP READOUT0<br />

INTEX1: PUSH ACC<br />

PUSH PSW<br />

CLR EX1<br />

CLR EX0<br />

CLR EA<br />

JNB P1.0,READ2<br />

READOUT1: POP PSW<br />

POP ACC<br />

RETI<br />

READ2: CLR A<br />

MOV DPH,A<br />

MOV DPL,A<br />

HARD2: JB P1.0,HARD21<br />

INC DPTR<br />

NOP<br />

NOP<br />

AJMP HARD2<br />

HARD21: MOV A,DPH<br />

JZ READOUT1<br />

CLR A<br />

READ21: INC A<br />

READ22: JNB P1.0,READ22<br />

MOV R1,#0AH<br />

READ23: JNB P1.0,READ21<br />

;<br />

LCALL DELAY<br />

DJNZ R1,READ23<br />

DEC A<br />

DEC A<br />

JZ BLT<br />

CLR PX1<br />

SETB PX0<br />

LJMP READOUT1<br />

FLT: CLR P0.3<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

88


LJMP READOUT0<br />

FRT: CLR P0.4<br />

LJMP READOUT0<br />

BLT: CLR P0.5<br />

LJMP READOUT1<br />

STOP: CLR P0.6<br />

;<br />

LJMP READOUT0<br />

;********************************<br />

;<br />

; 载 波 发送程序<br />

;<br />

; *******************************<br />

;<br />

REMOTE: CLR EX0<br />

CLR EX1<br />

MOV R1,A<br />

LJMP OUT3<br />

OUT: MOV R0,#02H<br />

OUT1: SETB ET1<br />

SETB TR1<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

LCALL DELAY ;6(2)*0.5=3MS(1MS)<br />

DJNZ R0,OUT1<br />

MOV R0,#02H<br />

OUT2: CLR TR1<br />

CLR ET1<br />

CLR P3.5<br />

LCALL DELAY ;2*0.5=1MS<br />

DJNZ R0,OUT2<br />

DJNZ R1,OUT<br />

LCALL DL10MS<br />

LJMP KEY5<br />

OUT3: MOV R0,#06H<br />

;<br />

;<br />

LJMP OUT1<br />

;*************************************<br />

;* *<br />

;* 延 时 249 * 2+2 = 500 us *<br />

;* *<br />

;*************************************<br />

DELAY: MOV R7,#0F9H<br />

DELAY1: DJNZ R7,DELAY1<br />

RET<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

89


;<br />

;*************************************<br />

;* *<br />

;* 延 时 10 ms *<br />

;* *<br />

;*************************************<br />

DL10MS: MOV R6,#14H<br />

DL10MS1: LCALL DELAY<br />

;<br />

;<br />

DJNZ R6,DL10MS1<br />

RET<br />

END<br />

;*************************************<br />

;* *<br />

;* 主 程序和中断程序入口 *<br />

;* *<br />

;*************************************<br />

;<br />

ORG 0000H<br />

ORG 0003H<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

SEND 程 序 ( 单 独 发 送 板 用 )<br />

LJMP START<br />

RETI<br />

ORG 000BH<br />

RETI<br />

ORG 0013H<br />

RETI<br />

ORG 001BH<br />

ORG 0023H<br />

LJMP INTT1<br />

RETI<br />

ORG 002BH<br />

RETI<br />

;***************************<br />

;* *<br />

;* 初 始化程序 *<br />

;* *<br />

;****************************<br />

CLEARMEMIO: CLR A<br />

DEC A<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

90


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

MOV P0,A ;清 I/O 口<br />

MOV P1,A<br />

MOV P2,A<br />

MOV P3,A<br />

CLR P3.5<br />

CLEARMEM: MOV SP,#70H ;设 堆栈基址<br />

;<br />

MOV IE,#00H ;关 所有中断<br />

MOV IP,#01H<br />

MOV TMOD,#22H<br />

MOV TH1,#0F3H<br />

MOV TL1,#0F3H<br />

SETB EA<br />

RET<br />

;*************************************<br />

;* *<br />

;* 主 程序 *<br />

;* *<br />

;*************************************<br />

START: LCALL CLEARMEMIO ;初 始化<br />

;<br />

MAIN: LCALL KEYWORK ;主 体 程序<br />

;<br />

LJMP MAIN<br />

NOP ;PC 值 出 错处理<br />

NOP<br />

NOP<br />

LJMP START<br />

;*************************************<br />

;* *<br />

;* T1 中断服务程序 *<br />

;* *<br />

;*************************************<br />

INTT1: CPL P3.5 ;40kHZ 信号<br />

;<br />

;<br />

RETI<br />

;*************************************<br />

;* *<br />

;* 扫 键程序 *<br />

;* *<br />

;*************************************<br />

;<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

91


KEYWORK: SETB P0.0<br />

SETB P0.1<br />

SETB P0.2<br />

JNB P0.0,KEY0<br />

JNB P0.1,KEY1<br />

JNB P0.2,KEY2<br />

LJMP KEYWORK<br />

KEY0: LCALL DELAY<br />

JB P0.0,KEYWORK<br />

MOV A,#02H<br />

LJMP REMOTE<br />

KEY1: LCALL DELAY<br />

JB P0.1,KEYWORK<br />

MOV A,#05H<br />

LJMP REMOTE<br />

KEY2: LCALL DELAY<br />

JB P0.2,KEYWORK<br />

MOV A,#08H<br />

LJMP REMOTE<br />

;*************************************<br />

;<br />

; 载 波 发 送 程 序<br />

;<br />

; **********************************<br />

;<br />

REMOTE: MOV R1,A<br />

LJMP OUT3<br />

OUT: MOV R0,#19H<br />

OUT1: SETB ET1<br />

SETB TR1<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

DJNZ R0,OUT1<br />

MOV R0,#19H<br />

OUT2: CLR TR1<br />

CLR ET1<br />

CLR P3.5<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

92


NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

DJNZ R0,OUT2<br />

DJNZ R1,OUT<br />

LCALL DL10MS<br />

LCALL DL10MS<br />

LCALL DL10MS<br />

LJMP KEYWORK<br />

OUT3: MOV R0,#0FFH<br />

;<br />

LJMP OUT1<br />

;*************************************<br />

;* *<br />

;* 延 时 255 X 2 = <strong>51</strong>2 us *<br />

;* *<br />

;*************************************<br />

DELAY: MOV R0,#0FFH<br />

DELAY1: DJNZ R0,DELAY1<br />

;<br />

RET<br />

;*************************************<br />

;* *<br />

;* 延 时 10 ms *<br />

;* *<br />

;*************************************<br />

DL10MS: MOV R1,#14H<br />

DL10MS1: LCALL DELAY<br />

;<br />

;<br />

DJNZ R1,DL10MS1<br />

RET<br />

END<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

93


;*************************************<br />

;* *<br />

;* 主 程序和中断程序入口 *<br />

;* *<br />

;*************************************<br />

;<br />

ORG 0000H<br />

ORG 0003H<br />

ORG 000BH<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

INCEPT 程 序 ( 单 独 接 收 板 用 )<br />

LJMP START<br />

LJMP INTEX0<br />

RETI<br />

ORG 0013H<br />

ORG 001BH<br />

LJMP INTEX1<br />

RETI<br />

ORG 0023H<br />

RETI<br />

ORG 002BH<br />

RETI<br />

;***************************<br />

;* *<br />

;* 初 始化程序 *<br />

;* *<br />

;****************************<br />

CLEARMEMIO: CLR A<br />

DEC A<br />

MOV P0,A ;清 I/O 口<br />

MOV P1,A<br />

MOV P2,A<br />

MOV P3,A<br />

CLR P3.5<br />

CLEARMEM: MOV IE,#00H ;关 所有中断<br />

;<br />

MOV IP,#01H<br />

SETB EX0<br />

SETB EX1<br />

SETB EA<br />

RET<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

94


;*************************************<br />

;* *<br />

;* 主 程 序 *<br />

;* *<br />

;*************************************<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

START: LCALL CLEARMEMIO ;初 始化<br />

MAIN: LCALL DL10MS<br />

LCALL DL10MS<br />

SETB P0.3<br />

SETB P0.4<br />

SETB P0.5<br />

SETB P0.6<br />

SETB EA<br />

LJMP MAIN<br />

NOP ;PC 值 出 错处理<br />

NOP<br />

NOP<br />

LJMP START<br />

;******************************<br />

; 接 收 程 序<br />

;******************************<br />

INTEX0: CLR EA<br />

JNB P1.1,READ1<br />

READOUT0: SETB EA<br />

;<br />

RETI<br />

READ1: CLR A<br />

MOV DPH,A<br />

MOV DPL,A<br />

HARD1: JB P1.1,HARD11<br />

INC DPTR<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

AJMP HARD1<br />

HARD11: MOV A,DPH<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

95


JZ READOUT0<br />

CLR A<br />

READ11: INC A<br />

READ12: JNB P1.1,READ12<br />

MOV R1,#06H<br />

READ13: JNB P1.1,READ11<br />

;<br />

LCALL DELAY<br />

DJNZ R1,READ13<br />

DEC A<br />

DEC A<br />

JZ FLT<br />

DEC A<br />

DEC A<br />

DEC A<br />

JZ FRT<br />

DEC A<br />

DEC A<br />

DEC A<br />

JZ STOP<br />

RETI<br />

INTEX1: CLR EA<br />

JNB P1.0,READ2<br />

READOUT1: SETB EA<br />

RETI<br />

READ2: CLR A<br />

MOV DPH,A<br />

MOV DPL,A<br />

HARD2: JB P1.0,HARD21<br />

INC DPTR<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

AJMP HARD2<br />

HARD21: MOV A,DPH<br />

JZ READOUT1<br />

CLR A<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

96


READ21: INC A<br />

READ22: JNB P1.0,READ22<br />

MOV R1,#06H<br />

READ23: JNB P1.0,READ21<br />

;<br />

LCALL DELAY<br />

DJNZ R1,READ23<br />

DEC A<br />

DEC A<br />

JZ BLT<br />

RETI<br />

FLT: CLR P0.3<br />

CLR PX1<br />

SETB PX0<br />

RETI<br />

FRT: CLR P0.4<br />

CLR PX1<br />

SETB PX0<br />

RETI<br />

BLT: CLR P0.5<br />

CLR PX0<br />

SETB PX1<br />

RETI<br />

STOP: CLR P0.6<br />

;<br />

;<br />

;<br />

CLR PX1<br />

SETB PX0<br />

RETI<br />

;*************************************<br />

;* *<br />

;* 延 时 255 X 2 = <strong>51</strong>2 us *<br />

;* *<br />

;*************************************<br />

DELAY: MOV R0,#0FFH<br />

DELAY1: DJNZ R0,DELAY1<br />

;<br />

RET<br />

;*************************************<br />

;* *<br />

;* 延 时 10 ms *<br />

;* *<br />

;*************************************<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

97


DL10MS: MOV R1,#14H<br />

DL10MS1: LCALL DELAY<br />

;<br />

;<br />

DJNZ R1,DL10MS1<br />

RET<br />

END<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

98


说明:<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

例 11 数 控 调 频 发 射 台 的 设计<br />

新型数字化调频发射台具有频率稳定、发射频率在 88.0 MHZ 至 109.9MHZ 范围内任意<br />

可设等特点,可预置 11 个 频 道 ,发射频率调整最小值为 0.1MHZ, 具 有 单 声 道 /立 体声控制,<br />

比传统调频台应用更灵活可靠。单片机控制部分采用 AT89C52, 采用最小化应用系统设计,<br />

P0 口 和 P2 口 作为共阳 LED 数码管驱动用,P1 口 作为 16 键的键盘接口,其中 T0— T3 分 别<br />

为 百位、十位、个位、小数位的频率操作键,T4— T14 为发射频率预置键,T15 为单声道/<br />

立体声控制键。 P3.0、 P3.1、 P3.2 作为与 BH1415 的 通 讯 端口,用 于 传 送发射频率控制数据,<br />

P3.3 用 于 立 体声发射批示。采用 12MHZ 晶 振 ,模拟串口通讯。单片机控制部分电路如图 1<br />

调频调制发射部份采用 Rohm 公 司 最新生产的调频发射专用集成电路 BH1415F, 内 含<br />

立 体声信号调制、调频广播信号发射电路,BH1415F 内 有 前 置 补 偿 电路、限制器电路、低<br />

通滤波电路等,因此具有良好的音色,内置 PLL 系 统 调频发射电路,传输频率非常稳定。<br />

调 频 发 射 频 率 可 用 单 片 机 通 过 串 行 口 直 接 控 制 。 应 用 电 路 如 图 2。 从 11 脚 输<br />

出 的调频调制信号经高频放大后由天线发射输出,后级高频放大器的功率可根据接收的距离<br />

范围考虑。<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

99


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

100


;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

;***************************;<br />

; 数 控调频台控制器 ;<br />

;***************************;<br />

;26H-29H 放 显示个、十、百、千位 BCD 码数,24H-25H 放 频 率 控制数据(十六进制)<br />

;<br />

;<br />

;<br />

;<br />

;<br />

CONBITL EQU 21H ;频 率 控制字节低 8位<br />

CONBITH EQU 22H ;频 率 控制字节高 8位<br />

KEYWORD EQU 23H ;存 放键扫描时 P1 口 值<br />

ORG 0000H<br />

LJMP START<br />

ORG 0003H<br />

RETI<br />

ORG 000BH<br />

RETI<br />

ORG 0013H<br />

RETI<br />

ORG 001BH<br />

RETI<br />

ORG 0023H<br />

RETI<br />

ORG 002BH<br />

RETI<br />

CLEARMEN: MOV R0,#20H<br />

MOV R1,#0AH<br />

CLEARLOOP: MOV @R0,#00H<br />

INC R0<br />

DJNZ R1,CLEARLOOP<br />

MOV P0,#0FFH<br />

MOV P1,#0FFH<br />

MOV P2,#0FFH<br />

MOV P3,#0FFH<br />

CLR P3.0<br />

CLR P3.1<br />

CLR P3.2<br />

MOV 20H,#00H<br />

LCALL KEYFUN15<br />

CLEAR1: MOV PCON,#00H<br />

MOV 29H,#00H<br />

MOV 28H,#08H ;初 始值为 88GHZ<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

101


;<br />

MOV 27H,#08H<br />

MOV 26H,#00H<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

LCALL DISPUPDAT ;写 入 芯 片<br />

RET<br />

START: LCALL CLEARMEN<br />

MAIN: LCALL KEYWORK<br />

;<br />

;<br />

LCALL DISPLAY<br />

AJMP MAIN<br />

NOP<br />

NOP<br />

AJMP START<br />

KEYWORK: MOV P1,#0FFH ;4*4 行列扫描程序<br />

CLR P1.0<br />

MOV A,P1<br />

ANL A,#0F0H<br />

CJNE A,#0F0H,KEYCON ;行 扫 描<br />

SETB P1.0<br />

CLR P1.1<br />

MOV A,P1<br />

ANL A,#0F0H<br />

CJNE A,#0F0H,KEYCON ;有 键按下,转消抖<br />

SETB P1.1<br />

CLR P1.2<br />

MOV A,P1<br />

ANL A,#0F0H<br />

CJNE A,#0F0H,KEYCON<br />

SETB P1.2<br />

CLR P1.3<br />

MOV A,P1<br />

ANL A,#0F0H<br />

CJNE A,#0F0H,KEYCON<br />

SETB P1.3<br />

RET<br />

KEYCON: LCALL DL10MS ;消 抖 处 理<br />

KEYOUT: RET<br />

MOV A,P1<br />

ANL A,#0F0H<br />

CJNE A,#0F0H,KEYCHE<br />

KEYCHE: MOV A,P1<br />

MOV KEYWORD,A<br />

CJLOOP: LCALL DISPLAY<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

102


MOV A,P1<br />

ANL A,#0F0H<br />

CJNE A,#0F0H,CJLOOP<br />

MOV R7,#00H<br />

MOV DPTR,#KEYTAB<br />

CHEKEYLOOP: MOV A,R7<br />

MOVC A,@A+DPTR<br />

XRL A,KEYWORD<br />

JZ KEYOK<br />

INC R7<br />

CJNE R7,#10H,CHEKEYLOOP<br />

RET<br />

KEYOK: MOV A,R7<br />

MOV B,A<br />

RL A<br />

ADD A,B<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

MOV DPTR,#KEYFUNTAB ;加 3 处 理 JMP 3 字 节 指 令<br />

JMP @A+DPTR<br />

KEYFUNTAB: LJMP KEYFUN00<br />

LJMP KEYFUN01<br />

LJMP KEYFUN02<br />

LJMP KEYFUN03<br />

LJMP KEYFUN04<br />

LJMP KEYFUN05<br />

LJMP KEYFUN06<br />

LJMP KEYFUN07<br />

LJMP KEYFUN08<br />

LJMP KEYFUN09<br />

LJMP KEYFUN10<br />

LJMP KEYFUN11<br />

LJMP KEYFUN12<br />

LJMP KEYFUN13<br />

LJMP KEYFUN14<br />

LJMP KEYFUN15<br />

RET<br />

KEYTAB: DB 0EEH,0DEH,0BEH,7EH,0EDH,0DDH,0BDH,7DH<br />

;<br />

KEYFUN00: INC 29H<br />

DB 0EBH,0DBH,0BBH,7BH,0E7H,0D7H,0B7H,77H,0FFH,0FFH<br />

MOV A,29H<br />

CLR C<br />

CJNE A,#02H,FUN00<br />

FUN00: JC FUN00OUT<br />

MOV 29H,#00H<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

103


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

FUN00OUT: MOV A,29H ;千 位 为 0, 百位为 8。千位为 1,百位为 0<br />

XRL A,#01H<br />

JNZ F00OUT1<br />

MOV 28H,#00H<br />

AJMP F00OUT<br />

F00OUT1: MOV 28H,#08H<br />

F00OUT: LCALL DISPUPDAT ;写 入控制芯片<br />

RET<br />

KEYFUN01: INC 28H<br />

MOV A,28H<br />

CLR C<br />

CJNE A,#0AH,FUN01<br />

FUN01: JC FUN01OUT<br />

MOV 28H,#00H<br />

FUN01OUT: MOV A,29H<br />

XRL A,#01H<br />

JNZ F01OUT<br />

MOV 28H,#00H<br />

AJMP F001OUT<br />

F01OUT: MOV A,28H ;高 位 为 0 时,百位数大于 7<br />

XRL A,#08H<br />

JZ F001OUT<br />

MOV A,28H<br />

XRL A,#09H<br />

JZ F001OUT<br />

MOV 28H,#08H<br />

F001OUT: LCALL DISPUPDAT ;写 入控制芯片<br />

RET<br />

KEYFUN02: INC 27H<br />

MOV A,27H<br />

CLR C<br />

CJNE A,#0AH,FUN02<br />

FUN02: JC FUN02OUT<br />

MOV 27H,#00H<br />

FUN02OUT: LCALL DISPUPDAT ;写 入控制芯片<br />

RET<br />

KEYFUN03: INC 26H<br />

MOV A,26H<br />

CLR C<br />

CJNE A,#0AH,FUN03<br />

FUN03: JC FUN03OUT<br />

MOV 26H,#00H<br />

FUN03OUT: LCALL DISPUPDAT ;写 入控制芯片<br />

RET<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

104


KEYFUN04: MOV 29H,#01H<br />

MOV 28H,#00H<br />

MOV 27H,#09H<br />

MOV 26H,#00H<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

LCALL DISPUPDAT ;写 入控制芯片<br />

RET<br />

KEYFUN05: MOV 29H,#01H<br />

MOV 28H,#00H<br />

MOV 27H,#08H<br />

MOV 26H,#00H<br />

LCALL DISPUPDAT ;写 入控制芯片<br />

RET<br />

KEYFUN06: MOV 29H,#01H<br />

MOV 28H,#00H<br />

MOV 27H,#05H<br />

MOV 26H,#00H<br />

LCALL DISPUPDAT ;写 入控制芯片<br />

RET<br />

KEYFUN07: MOV 29H,#01H<br />

MOV 28H,#00H<br />

MOV 27H,#00H<br />

MOV 26H,#00H<br />

LCALL DISPUPDAT ;写 入控制芯片<br />

RET<br />

KEYFUN08: MOV 29H,#00H<br />

MOV 28H,#09H<br />

MOV 27H,#08H<br />

MOV 26H,#00H<br />

LCALL DISPUPDAT ;写 入控制芯片<br />

RET<br />

KEYFUN09: MOV 29H,#00H<br />

MOV 28H,#09H<br />

MOV 27H,#06H<br />

MOV 26H,#00H<br />

LCALL DISPUPDAT ;写 入控制芯片<br />

RET<br />

KEYFUN10: MOV 29H,#00H<br />

MOV 28H,#09H<br />

MOV 27H,#04H<br />

MOV 26H,#00H<br />

LCALL DISPUPDAT ;写 入控制芯片<br />

RET<br />

KEYFUN11: MOV 29H,#00H<br />

MOV 28H,#09H<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

105


MOV 27H,#02H<br />

MOV 26H,#00H<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

LCALL DISPUPDAT ;写 入控制芯片<br />

RET<br />

KEYFUN12: MOV 29H,#00H<br />

MOV 28H,#09H<br />

MOV 27H,#00H<br />

MOV 26H,#00H<br />

LCALL DISPUPDAT ;写 入控制芯片<br />

RET<br />

KEYFUN13: MOV 29H,#00H<br />

MOV 28H,#08H<br />

MOV 27H,#08H<br />

MOV 26H,#00H<br />

LCALL DISPUPDAT ;写 入控制芯片<br />

RET<br />

KEYFUN14: MOV 29H,#00H<br />

MOV 28H,#08H<br />

MOV 27H,#07H<br />

MOV 26H,#08H<br />

LCALL DISPUPDAT ;写 入控制芯片<br />

RET<br />

KEYFUN15: CPL 03H<br />

JNB 03H,MONO<br />

CLR P3.3<br />

LCALL PUTBIT<br />

RET<br />

MONO: SETB P3.3<br />

;<br />

LCALL PUTBIT<br />

RET<br />

DISPUPDAT: LCALL BCDB ;将 BCD 码 转 为十六进制数<br />

;<br />

LCALL CONCOMMAND ;与 5 位 控制码合成操作码<br />

LCALL PUTBIT ;写 入控制芯片<br />

RET<br />

BCDB: MOV CONBITL,#00H<br />

MOV CONBITH,#00H<br />

MOV CONBITL,26H<br />

MOV A,27H<br />

MOV B,#10<br />

LCALL MULLOOP<br />

MOV A,28H<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

106


MOV B,#100<br />

LCALL MULLOOP<br />

MOV A,29H<br />

JNZ ADD3E8<br />

RET<br />

ADD3E8: CLR C<br />

MOV A,#0E8H<br />

ADD A,CONBITL<br />

MOV CONBITL,A<br />

MOV A,#03H<br />

ADDC A,CONBITH<br />

MOV CONBITH,A<br />

RET<br />

MULLOOP: MUL AB<br />

CLR C<br />

ADD A,CONBITL<br />

MOV CONBITL,A<br />

MOV A,CONBITH<br />

ADDC A,B<br />

MOV CONBITH,A<br />

RET<br />

CONCOMMAND: ANL CONBITH,#07H<br />

;<br />

MOV A,20H<br />

ORL A,CONBITH<br />

MOV CONBITH,A<br />

RET<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

;; 显 示程序 ;;<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

;<br />

DISPLAY: MOV R1,#26H<br />

MOV R5,#0FEH<br />

PLAY: MOV A,R5<br />

MOV P2,A<br />

MOV A,@R1<br />

MOV DPTR,#TAB<br />

MOVC A,@A+DPTR<br />

MOV P0,A<br />

MOV A,R5<br />

JB ACC.1,PLAY1 ;是 十 位 ,显 示小数点<br />

CLR P0.7<br />

PLAY1: LCALL DL1MS<br />

INC R1<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

107


JNB ACC.3,ENDOUT<br />

RL A<br />

MOV R5,A<br />

SETB P0.7<br />

AJMP PLAY<br />

ENDOUT: MOV P2,#0FFH<br />

MOV P0,#0FFH<br />

RET<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

TAB: DB<br />

0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0FFH ;0-9 共阳段码表<br />

;<br />

;<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

;; 发 送控制字节子程序 ;;<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

;<br />

;<br />

PUTBIT: MOV A,CONBITL<br />

SETB P3.0<br />

LCALL PUT<br />

MOV A,CONBITH<br />

LCALL PUT<br />

CLR P3.2<br />

CLR P3.0<br />

CLR P3.1<br />

RET<br />

PUT: MOV R3,#8<br />

CLR C<br />

PUT1: RRC A<br />

MOV P3.2,C<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

SETB P3.1<br />

NOP<br />

NOP<br />

NOP<br />

NOP<br />

CLR P3.1<br />

DJNZ R3,PUT1<br />

RET<br />

DL<strong>51</strong>3: MOV R3,#0FFH<br />

DL<strong>51</strong>3LOOP: DJNZ R3,DL<strong>51</strong>3LOOP<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

108


RET<br />

DL1MS: MOV R4,#02H<br />

DL1MSLOOP: LCALL DL<strong>51</strong>3<br />

DJNZ R4,DL1MSLOOP<br />

RET<br />

DL10MS: MOV R6,#0AH<br />

DL10MSLOOP: LCALL DL1MS<br />

END<br />

DJNZ R6,DL10MSLOOP<br />

RET<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

109


说明:<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

例 12 大 屏 幕 比 赛 用 电 子 计 分器 的 设 计<br />

单片机遥控式电子计分器,采用二块 AT89C52, 一 块 用 于 操 作 及 发送遥控码,如图 1,<br />

其 中 P 2.0~P2.7 是 键 扫 描 端 口 , 有 8 个 功 能 操 作 键 ,( 15) 脚 作 为 遥 控 器 的 输 出<br />

口 ,用于输出 40KHz 载 波编码。另一块用于接收遥控码及显示时间、总分数。其中 P0.0—<br />

P0.6 作为数码管段码的输出口,P2.0— P2.6 作为数码管位选输出口。第(12)、( 11) 脚 为<br />

遥控码的输入口,电路见图示。<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

110


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

编 码的格式采用脉冲个数编码,分别代表清零、计分加 1、计分加 2、计分加 3、计分减 1 、<br />

分钟加 1、分钟减 1、暂停八种状态,其中清零为 2个脉冲,计分加 1为 3个脉冲,计分加<br />

2为 4个脉冲,计分加 3为 5个脉冲,计分减 1为 6个脉冲,分钟加 1为 7个脉冲,分钟减<br />

1为 8个脉冲。为了增加接收的可靠性,第一位码宽为 3mS,其余为 1mS,数据帧间隔大于<br />

10mS( 图 3)。<br />

10ms<br />

第 一 位<br />

3ms<br />

1ms<br />

1ms<br />

10ms<br />

停 止 位<br />

图 4 红外线接收器输出的一帧数据波形<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

111


;<br />

;<br />

发 送程序略,以下是接收处理程序:<br />

;*************************************<br />

;* *<br />

;* 大 屏幕计分器接收程序 *<br />

;* 2002.04 *<br />

;*************************************<br />

;<br />

;<br />

ORG 0000H<br />

LJMP START<br />

ORG 0003H<br />

LJMP INTEX0<br />

ORG 000BH<br />

LJMP INTT0<br />

ORG 0013H<br />

RETI<br />

ORG 001BH<br />

RETI<br />

ORG 0023H<br />

RETI<br />

ORG 002BH<br />

RETI<br />

;***********************<br />

; 主 程序 ;<br />

;***********************<br />

START: MOV IE,#03H<br />

MOV SP,#8FH<br />

MOV IP,#02H<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

MOV TMOD,#11H<br />

MOV TL0,#0B0H<br />

MOV TH0,#3CH<br />

CLR A<br />

MOV 70H, A<br />

MOV 71H, A<br />

MOV 72H, A<br />

MOV 73H, A<br />

MOV 74H, A<br />

MOV 75H, A<br />

MOV 76H, A<br />

MOV 77H, A<br />

MOV P2,A<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

112


DEC A<br />

MOV P1,A<br />

MOV P0,A<br />

MOV P3,A<br />

SETB EA<br />

MAIN1: LCALL DISPLY<br />

LJMP MAIN1<br />

NOP<br />

NOP<br />

LJMP START<br />

;***********************<br />

; 中 断接收<br />

;***********************<br />

INTEX0: PUSH ACC<br />

PUSH PSW<br />

PUSH DPH<br />

PUSH DPL<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

MOV PSW, #08H<br />

JNB P3.1,READ1<br />

READOUTT0: POP DPL<br />

POP DPH<br />

POP PSW<br />

POP ACC<br />

RETI<br />

READ1: CLR A<br />

MOV DPH,A<br />

MOV DPL,A<br />

HARD1: JB P3.1,HARD11<br />

INC DPTR<br />

NOP<br />

NOP<br />

AJMP HARD1<br />

HARD11: MOV A,DPH<br />

JZ READOUTT0<br />

CLR A<br />

READ11: INC A<br />

READ12: JNB P3.1,READ12<br />

MOV R1,#06H<br />

READ13: JNB P3.1,READ11<br />

LCALL DELAY<br />

DJNZ R1,READ13<br />

DEC A<br />

DEC A<br />

JZ FUN00<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

113


;<br />

DEC A<br />

JZ FUN1<br />

DEC A<br />

JZ FUN2<br />

DEC A<br />

JZ FUN3<br />

DEC A<br />

JZ FUN4<br />

DEC A<br />

JZ FUN5<br />

DEC A<br />

JZ FUN6<br />

DEC A<br />

JZ FUN7<br />

NOP<br />

NOP<br />

LJMP READOUTTO<br />

FUN0: LJMP FUN00<br />

FUN1: LJMP FUN01<br />

FUN2: LJMP FUN02<br />

FUN3: LJMP FUN03<br />

FUN4: LJMP FUN04<br />

FUN5: LJMP FUN05<br />

FUN6: LJMP FUN06<br />

FUN7: LJMP FUN07<br />

FUN00: CLR A<br />

MOV 74H,A<br />

MOV 75H,A<br />

MOV 76H,A<br />

MOV 70H,A<br />

MOV 71H,A<br />

MOV 72H,A<br />

MOV 73H,A<br />

CLR TR0<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

LJMP READOUTT0<br />

FUN01: MOV R0,#75H<br />

MOV B,#01H<br />

LCALL ADDBCD<br />

MOV B,#00H<br />

MOV B.0,C<br />

MOV R0,#77H<br />

LCALL ADDBCD<br />

LJMP READOUTT0<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

114


FUN02: MOV R0,#75H<br />

MOV B,#02H<br />

LCALL ADDBCD<br />

MOV B,#00H<br />

MOV B.0,C<br />

MOV R0,#77H<br />

LCALL ADDBCD<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

LJMP READOUTT0<br />

FUN03: MOV R0,#75H<br />

MOV B,#03H<br />

LCALL ADDBCD<br />

MOV B,#00H<br />

MOV B.0,C<br />

MOV R0,#77H<br />

LCALL ADDBCD<br />

LJMP READOUTT0<br />

FUN04: MOV R0,#75H<br />

MOV B,#99H<br />

LCALL ADDBCD<br />

CJNE R3,#99H,ENDF04<br />

MOV R0,#77H<br />

MOV B,#99H<br />

LCALL ADDBCD<br />

ENDF04: LJMP READOUTT0<br />

FUN05: MOV R0,#73H<br />

MOV B,#01H<br />

LCALL ADDBCD<br />

CJNE R3,#61H,FUN0<strong>51</strong><br />

MOV 72H,#00H<br />

MOV 73H,#00H<br />

FUN0<strong>51</strong>: MOV 70H,#00H<br />

MOV 71H,#00H<br />

LJMP READOUTT0<br />

FUN06: MOV R0,#73H<br />

MOV B,#99H<br />

LCALL ADDBCD<br />

CJNE R3,#99H,FUN061<br />

MOV 72H,#00H<br />

MOV 73H,#06H<br />

FUN061: MOV 70H,#00H<br />

MOV 71H,#00H<br />

LJMP READOUTT0<br />

FUN07: CPL TR0<br />

LJMP READOUTT0<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

115


;******************<br />

; 倒 计 时<br />

;******************<br />

INTT0: CLR EA<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PUSH ACC ;保 护<br />

PUSH PSW<br />

PUSH DPL<br />

PUSH DPH<br />

MOV PSW, #10H ;选 用第2组寄存器<br />

CLR TR0<br />

MOV A,#0B7H ;中 断误差校正<br />

ADD A,TL0<br />

MOV TL0,A<br />

MOV A,#3CH<br />

ADD A,TH0<br />

MOV TH0,A<br />

SETB TR0<br />

DJNZ R4, OUTT0<br />

MOV R4, #14H<br />

MOV R0, #71H<br />

MOV B, #99H ;秒 减 1<br />

ACALL ADDBCD<br />

CJNE R3,#00H,INTT01<br />

MOV A,72H<br />

JNZ INTT01<br />

MOV A,73H<br />

JNZ INTT01<br />

CLR P1.0<br />

CLR TR0<br />

LCALL DLAY1S<br />

SETB P1.0<br />

AJMP OUTT0<br />

INTT01: CJNE R3, #99H, OUTT0<br />

MOV 71H, #05H<br />

MOV 70H, #09H<br />

MOV R0, #73H<br />

MOV B, #99H<br />

ACALL ADDBCD ;分 减 1<br />

CJNE R3, #99H, OUTT0<br />

OUTT0: POP DPH ;恢 复<br />

POP DPL<br />

POP PSW<br />

POP ACC<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

116


;<br />

SETB EA<br />

RETI<br />

;**************<br />

; 加 1 ;<br />

;**************<br />

ADDBCD: MOV A, @R0<br />

DEC R0<br />

SWAP A<br />

ORL A, @R0<br />

ADD A, B<br />

DA A<br />

MOV R3, A<br />

ANL A, #0FH<br />

MOV @R0, A<br />

MOV A, R3<br />

INC R0<br />

SWAP A<br />

ANL A, #0FH<br />

MOV @R0, A<br />

RET<br />

;**************<br />

; 显 示<br />

;**************<br />

DISPLY: PUSH ACC<br />

PUSH PSW<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

MOV PSW, #18H ;选 用第3组寄存器<br />

MOV R0, #70H<br />

MOV R2, #01H<br />

DISP1: MOV A, @R0<br />

MOV DPTR, #TABLE1<br />

MOVC A, @A+DPTR<br />

MOV P0, A<br />

INC R0<br />

MOV A, R2<br />

MOV P2, A<br />

RL A<br />

MOV R2, A<br />

LCALL DL1MS<br />

JNB ACC.7, DISP1<br />

POP PSW<br />

POP ACC<br />

RET<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

117


;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

TABLE1: DB 0C0H,0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H, 80H, 90H,0FFH<br />

; "0", "1", ... ... "9", " "<br />

;<br />

;******************<br />

; 延 时<br />

;******************<br />

DELAY: MOV R7,#0FFH<br />

DELAY1: DJNZ R7,DELAY1<br />

RET<br />

DL1MS: MOV R3, #0F9H<br />

DL1MS1: NOP<br />

NOP<br />

NOP<br />

DJNZ R3, DL1MS1<br />

RET<br />

DLAY1S: MOV R6,#8EH<br />

DLAY1S1: LCALL DISPLY<br />

DJNZ R6,DLAY1S1<br />

RET<br />

END<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

118


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

例 13 可 在 线 修 改 程 序的 单 片 机 W78B<strong>51</strong>6E 设 计 实 例<br />

说明:<br />

W78E<strong>51</strong>6B 是 华邦公司 2000 年 发 布 的 一种可用于在线编程的 8位单片机,它的指令<br />

设置同 8052 标 准 完 全兼容。W78E<strong>51</strong>6B 包含一个 64K 字 节 的 主 闪 存 EPROM 和 一个特有的 4K<br />

字 节 的 附 加 闪 存 EPROM, 其 中 64K EPROM 中 的 内 容 可 被 装 在 4K 附 加 EPROM 中 的 装 载 程序更<br />

新;具有 <strong>51</strong>2 字 节 的在片 RAM; 4 个 8 位 的 双 向 可 位寻址 I/O 端口;1个附加的 4位 P4 端口;<br />

3个 16 位 的 定 时 /计 数器;1个串行口;6个向量二级中断结构;2种可用软件选择的低功耗<br />

模式。<br />

在线编程应用系统的硬件设计如上图 1<br />

采用串口连接实现计算机与单片机的通讯,串口电平转换器采用 MAX232, 计 算 机 使 用 超<br />

级 终 端 通 讯 口 , 传 送 文 件 ( .bin) 采用 xmodem 协议。单片机的晶振频率应低于 40MHz, 由<br />

于 串 口 用 于 在线编程调试,若应用系统需用串口可采用虚拟 I 2 C总线,具体的应用系统硬件<br />

应按实现功能设计。在 W78E<strong>51</strong>6B 单片机应用系统中,为了实现从应用模式到在线编程模式<br />

的相互转换,在 APROMR 和 LDROM 中 都 需 设计相应的控制程序,应用程序装入 0000H— FFFFH<br />

地址处,装载程序在 10000H— 10FFFH 处 ,在应用系统设计开发时,先用烧录器写入装载程<br />

序,然后即可用计算机的超级终端对应用系统进行应用程序的写入及修改。其主要的控制程<br />

序有:<br />

1. 装载程序<br />

1. 1命令获取程序模块:对接收到的字符命令进行比较、出错处理,并转入相应的功<br />

能模块。<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

119


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

1. 2 功能执行程序模块:有显示帮助信息功能;显示内存数据功能;设置波特率功能;<br />

擦除 64K APROM 功能;APROM 加 密 功能;mcu 信息显示功能;查空功能;程序代码更新<br />

功能;复位功能。<br />

1. 3串口中断服务程序模块:负责接收和发送字符。<br />

1.4 xmodem 协议接收程序:在计算机发送程序代码时(updat), 以 xmodem 协议接收。<br />

2. 应用程序中在线编程控制程序<br />

为了在应用系统工作时,能进入在线编程模式,在 应 用系统的应用程序中应有控制<br />

程序来执行这一功能,通常放在串口中断服务程序中,此程序负责接收口令代码并与相<br />

应设置的代码进行比较,相符时则进入在系统编程模式。<br />

以下是一个可以在线修改程序的 8×8点阵字符显示器程序,装载程序在 4K ROM<br />

中 , 应 用程序在 64K ROM 中。<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

120


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

装 载 程 序<br />

; *************************************<br />

; * *<br />

; * LOAD 程 序下载器 *<br />

; * *<br />

; * 创 建: 2001.10.20 陈 斌 *<br />

; * 修 改:2002.03.15 楼 然 苗 *<br />

; * *<br />

; * CPU: W78E<strong>51</strong>6 *<br />

; * *<br />

; *************************************<br />

;<br />

;********************************************************************<br />

;* ┏ ━━━━━━━━┓ *<br />

;* P1.0 1 40 VCC *<br />

;* P1.1 2 39 P0.0 *<br />

;* P1.2 3 38 P0.1 *<br />

;* P1.3 4 37 P0.2 *<br />

;* P1.4 5 36 P0.3 *<br />

;* P1.5 6 35 P0.4 *<br />

;* P1.6 7 34 P0.5 *<br />

;* P1.7 8 33 P0.6 *<br />

;* RST 9 32 P0.7 *<br />

;* RXD P3.0 10 <strong>MCS</strong>-<strong>51</strong> 31 EA VDD *<br />

;* TXD P3.1 11 30 ALE *<br />

;* INT0 P3.2 12 29 PSEN *<br />

;* INT1 P3.3 13 28 P2.7 *<br />

;* MCUDOG T0 P3.4 14 27 P2.6 *<br />

;* T1 P3.5 15 26 P2.5 *<br />

;* WR P3.6 16 25 P2.4 *<br />

;* RD P3.7 17 24 P2.3 *<br />

;* XTAL2 18 23 P2.2 *<br />

;* XTAL1 19 22 P2.1 *<br />

;* VSS 20 21 P2.0 *<br />

;* **<br />

;**********************************************************************<br />

;<br />

;<br />

;****************************************************<br />

;* *<br />

;* 变 量定义 *<br />

;* *<br />

;****************************************************<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

121


; 常 数 定 义<br />

;<br />

; 编 程 延 时<br />

MHz<br />

;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

RXBUFFSTART EQU 040H ; 接 收缓冲区队列首址 (170 字 节 )<br />

XBUFFSTART EQU 050H ; 接 收缓冲区队列首址 (170 字 节 )<br />

RXBUFFEND EQU 0F0H ; 接 收缓冲区队列末址<br />

COMMANDLEN EQU 008H ; 命 令 字符最大长度<br />

P15MS EQU 0C9H ; 11.0592 MHz 12.000 MHz 14.318<br />

P1US EQU 0FEH ;<br />

P50US EQU 0D1H ;<br />

; P15MS EQU 0B7H ; 18.4320 MHz 24.000 MHz<br />

; P1US EQU 0FDH ;<br />

; P50US EQU 0C2H ;<br />

;<br />

; 流 控字符<br />

; 控 制键<br />

; XMODEM 协 议关键字<br />

; 发 送端 -> 接 收端<br />

; 接 收端 -> 发 送端<br />

;<br />

; 芯 片 引 脚 定 义<br />

; WATCH DOG<br />

; 内 部 寄 存 器 定 义<br />

XON EQU 011H ; 继 续传送<br />

XOFF EQU 013H ; 停 止 传 送<br />

CTRLC EQU 003H ; CTRL_C 键<br />

ESC EQU 027H ; ESC 键<br />

BACKSPACE EQU 008H ; 退 后 删 除 键<br />

SOH EQU 001H ; 每 个 包 的 开始<br />

EOT EQU 004H ; 通 知 接收端结束<br />

ACK EQU 006H ; 包 成 功 接收<br />

NAK EQU 015H ; 包 出 错<br />

CAN EQU 018H ; 结 束传送操作<br />

CRC EQU 043H ; C<br />

BLKSIZE EQU 080H ; 每 包 的数据大小<br />

XMODEMMXAERROR EQU 01EH ; 最 大 错 误 次 数<br />

MCUDOG EQU P3.3 ; 看 门狗清零<br />

T2CON EQU 0C8H ; T2 控 制寄存器<br />

T2MOD EQU 0C9H ;<br />

TL2 EQU 0CCH ; T2 计 数寄存器低字节<br />

TH2 EQU 0CDH ; T2 计 数寄存器高字节<br />

TR2 EQU 0CAH ; T2 启 动 位<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

122


寄存器<br />

;<br />

; 控 制标志位定义<br />

;<br />

; 全 局变量定义<br />

; 串 口<br />

;<br />

; CRC<br />

;<br />

;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

RCAP2L EQU 0CAH ; T2 计 数重栽寄存器低字节<br />

RCAP2H EQU 0CBH ; T2 计 数重栽寄存器高字节<br />

CHPCON EQU 0BFH ; 在 系统编程控制寄存器<br />

CHPENR EQU 0F6H ; 编 程 状态下 MTP ROM 的 控制字节<br />

SFRAL EQU 0C4H ; 编 程 状态下的目标低地址<br />

SFRAH EQU 0C5H ; 编 程 状态下的目标高地址<br />

SFRFD EQU 0C6H ; 编 程 状态下 MTP ROM 的 编 程数据<br />

SFRCN EQU 0C7H ;<br />

TIME10MS EQU 01H ; 10ms 标 记<br />

TIME500MS EQU 02H ; 500ms 标 记<br />

KEYFUNFLAG EQU 03H ;<br />

TXOKFLAG EQU 04H ; 发 送 OK 标 记<br />

RXCOMMFLAG EQU 05H ;<br />

COMMSPACEFLAG EQU 06H ; 命 令 删 除 OK 标 记<br />

RXCOMMOKFLAG EQU 07H ;<br />

FBOOTFLAG EQU 08H ;<br />

RXBUFFTAIL EQU 3BH ; 接 收缓冲区尾指针<br />

RXBUFFHEAD EQU 3AH ; 接 收缓冲区头指针<br />

RXBUFFLEN EQU 39H ; 命 令长度计数<br />

TIMECOUNT EQU 38H ; 500 ms 时 间 计数<br />

CRCLO EQU 37H ;<br />

CRCHI EQU 36H ;<br />

BLKCHK EQU 35H ;<br />

TIMELO EQU 34H ;<br />

TIMEHI EQU 33H ;<br />

DPLO EQU 32H ;<br />

DPHI EQU 31H ;<br />

ORG 0000H<br />

LJMP START<br />

;****************************************************<br />

;* *<br />

;* 中 断向量入口 *<br />

;* *<br />

;****************************************************<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

123


;<br />

;<br />

;<br />

;<br />

;<br />

;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

ORG 0003H ; 中 断入口表<br />

RETI<br />

ORG 000BH<br />

LJMP INT_T0<br />

ORG 0013H<br />

RETI<br />

ORG 001BH<br />

LJMP INT_T1<br />

ORG 0023H<br />

LJMP INT_SIO<br />

ORG 002BH<br />

RETI<br />

ORG 0080H<br />

;****************************************************<br />

;* *<br />

;* 初 始化程序 *<br />

;* *<br />

;****************************************************<br />

START: MOV R0, #0F0H ; 清<br />

CLR A ; 00 到<br />

CLRAM: MOV @R0, A ; F0<br />

;<br />

DJNZ R0, CLRAM ; RAM<br />

MOV P1, #0FFH ; 清 P1<br />

; CLR PWRON ;<br />

许 接收<br />

CONUTER) 计 数方式<br />

MOV P2, #0FFH ; 置 P2<br />

MOV P3, #0FFH ; 置 P3<br />

MOV DPL, #00H ; 清 DPTR<br />

MOV DPH, #00H<br />

MOV PSW, #00H ; 设 第 一 组 寄 存 器<br />

MOV SP, #0F1H ; 设 置 堆栈指针<br />

MOV SCON, #01010000B ; 串 口 工 作方式 1 (8 BIT UART) 允<br />

MOV TMOD, #00010001B ; 定 时 器 工 作 方 式 1 (16 BIT<br />

MOV TH1, #0DBH ; 10ms 定 时 参 数<br />

MOV TL1, #0FFH ;<br />

MOV T2CON, #00110000B ; T2CON<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

124


;<br />

;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

MOV A, #01H ; 设 置 波 特 率 0: 38400 1: 19200<br />

LCALL INITBAUD ; 2: 9600 3: 4800<br />

SETB ES ; 允 许串口中断<br />

SETB ET0 ; 允 许定时器 0 中 断<br />

SETB ET1 ; 允 许定时器 1 中 断<br />

MOV IP, #00H ; 低 优 先 级<br />

SETB TR1 ; 启 动 定 时计数器 1<br />

SETB TR2 ; 启 动 定 时计数器 2<br />

SETB REN ; 启 动 串 口 接收中断<br />

CLR TI ; 清 串 口 发送中断标志位<br />

CLR RI ; 清 串 口 接收中断标志位<br />

SETB EA ; 开 放所有中断<br />

MOV RXBUFFHEAD, #RXBUFFSTART;<br />

MOV RXBUFFTAIL, #RXBUFFSTART;<br />

CLR RXCOMMFLAG ;<br />

MOV DPTR, #LOGOTBL ; 在 终 端上显示 LOGO 字 符<br />

LCALL DISPINFO ;<br />

MOV DPTR, #ROMMARKTBL ; 在 终 端上显示 ROM> 字 符<br />

LCALL DISPINFO<br />

;****************************************************<br />

;* *<br />

;* 主 程序 *<br />

;* *<br />

;****************************************************<br />

MAIN: LCALL WATDOG ; 清 看门狗<br />

LCALL GETCOMMAND<br />

MAINOUT: LJMP MAIN<br />

;<br />

;<br />

NOP<br />

NOP<br />

NOP<br />

LJMP START<br />

;****************************************************************************<br />

;////////////////////////////////////////////////////////////////////////////<br />

;////////////////////////////////////////////////////////////////////////////<br />

;****************************************************************************<br />

; 主 要处理程序<br />

;<br />

;****************************************************<br />

;* *<br />

;* 看 门狗 *<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

125


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

;* *<br />

;****************************************************<br />

WATDOG: CPL MCUDOG ; 清 看门狗<br />

;<br />

;<br />

RET<br />

;****************************************************<br />

;* *<br />

;* 获 取 命 令 *<br />

;* *<br />

;****************************************************<br />

GETCOMMAND: LCALL PUTCOMMSPACE ; 刷 新 命 令 符<br />

MOV A, RXBUFFTAIL ;<br />

XRL A, #RXBUFFSTART ;<br />

JZ GETCOMMOUT ; 接 收缓冲区空不处理<br />

JNB RXCOMMOKFLAG, GETCOMMOUT; 命 令 接收不成功不处理<br />

MOV A, RXBUFFLEN ;<br />

CLR C ;<br />

SUBB A, #COMMANDLEN ;<br />

JNC GETCOMMERROR ; 命 令 字符超长出错<br />

CLR A ;<br />

MOV R4, A ; 清 查 表 计数器<br />

MOV R5, #RXBUFFSTART ; 置 接收缓冲区首址<br />

MOV DPTR, #COMMANDTBL ; 置 命 令 表首址<br />

GETCOMMCOMP: MOV A, R4 ;<br />

MOVC A, @A+DPTR ; 查 表<br />

INC R4 ;<br />

MOV R6, A ; 暂 存 到 R6<br />

MOV A, R4 ;<br />

JNZ GETCOMMOVER ;<br />

INC DPH ; 计 数器溢出处理<br />

GETCOMMOVER: MOV A, R5 ;<br />

INC R5 ;<br />

MOV R0, A ;<br />

MOV A, @R0 ; 读 接收缓冲区<br />

MOV R7, A ; 暂 存 到 R7<br />

MOV A, R6 ;<br />

XRL A, #0FFH ;<br />

JZ GETCOMMERROR ; 是 否出错<br />

MOV A, R6 ;<br />

XRL A, #0AH ;<br />

JZ GETCOMMCOMPEND ; 比 较 成 功<br />

MOV A, R7 ;<br />

XRL A, R6 ;<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

126


;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

JZ GETCOMMCOMP ; 去 下 一个比较<br />

MOV A, R6 ;<br />

ADD A, #20H ; 小 写处理<br />

XRL A, R7 ;<br />

JZ GETCOMMCOMP ; 去 下 一个比较<br />

MOV R5, #RXBUFFSTART ;<br />

MOV A, R4 ;<br />

MOV B, #COMMANDLEN ;<br />

DIV AB ;<br />

MOV B, #COMMANDLEN ;<br />

INC A ;<br />

MUL AB ; 比 较 下 一个命令<br />

MOV R4, A ;<br />

LJMP GETCOMMCOMP ;<br />

GETCOMMCOMPEND: CLR A ; 初 始化<br />

MOV RXBUFFLEN, A ;<br />

MOV RXBUFFTAIL, #RXBUFFSTART;<br />

CLR RXCOMMOKFLAG ;<br />

MOV A, R4 ;<br />

MOV B, #COMMANDLEN ;<br />

DIV AB ; 调 整地址<br />

MOV B, A ;<br />

RL A ;<br />

ADD A, B ;<br />

MOV DPTR, #COMMFUNTBL ;<br />

JMP @A+DPTR ;<br />

GETCOMMOUT: RET ;<br />

;<br />

;<br />

GETCOMMERROR: MOV DPTR, #COMMERRORTBL ; 显 示 Bad command<br />

;<br />

;<br />

COMMFUNTBL: LJMP HELPFUN<br />

LCALL DISPINFO ;<br />

CLR A ; 初 始化<br />

MOV RXBUFFLEN, A ;<br />

MOV RXBUFFTAIL, #RXBUFFSTART;<br />

CLR RXCOMMOKFLAG ;<br />

LJMP DISPROM ;<br />

RET ;<br />

LJMP DISPROM<br />

LJMP RAMFUN<br />

LJMP SECFUN<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

127


;<br />

;<br />

LJMP SETBFUN<br />

LJMP INFOFUN<br />

LJMP ERASEFUN<br />

LJMP BLANKFUN<br />

LJMP RESETFUN<br />

LJMP UPDATFUN<br />

RET<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

;****************************************************<br />

;* *<br />

;* 定 时器 0 中 断服务程序 *<br />

;* *<br />

;****************************************************<br />

INT_T0: CLR TR0<br />

;<br />

;<br />

MOV TL0, TIMELO<br />

MOV TH0, TIMEHI<br />

RETI<br />

;****************************************************<br />

;* *<br />

;* 定 时器 1 中 断服务程序 *<br />

;* *<br />

;****************************************************<br />

INT_T1: PUSH PSW<br />

PUSH ACC<br />

MOV TH1, #0DBH ; 重 置 计数值<br />

MOV TL1, #0FFH ;<br />

INTKEY: CPL TIME10MS ; 10ms 标 志<br />

;<br />

INTT0OUT: POP ACC<br />

;<br />

;<br />

INC TIMECOUNT ;<br />

MOV A, TIMECOUNT ;<br />

CJNE A, #10H, INTT0OUT ;<br />

MOV TIMECOUNT, #00H ;<br />

CPL TIME500MS ; 500ms 标 志<br />

POP PSW<br />

RETI<br />

;============================================================================<br />

;////////////////////////////////////////////////////////////////////////////<br />

;////////////////////////////////////////////////////////////////////////////<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

128


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

;============================================================================<br />

; 命 令 解释器功能处理子程序<br />

;<br />

;****************************************************<br />

;* *<br />

;* 显 示帮助信息 *<br />

;* *<br />

;****************************************************<br />

HELPFUN: MOV DPTR, #HELPTBL ; 显 示帮助信息<br />

;<br />

;<br />

LCALL DISPINFO ;<br />

LCALL INITCOMMAND ;<br />

LJMP DISPROM ;<br />

;****************************************************<br />

;* *<br />

;* RAM 功 能处理 *<br />

;* *<br />

;****************************************************<br />

RAMFUN: CLR A ; 初 始化<br />

;<br />

;<br />

MOV R0, A ;<br />

MOV R1, A ;<br />

MOV R2, A ;<br />

MOV B, #01H ;<br />

LCALL DISPROMRAM ;<br />

LCALL INITCOMMAND ;<br />

LJMP DISPROM ;<br />

;****************************************************<br />

;* *<br />

;* SEC 功 能处理 *<br />

;* *<br />

;****************************************************<br />

SECFUN: MOV DPTR, #SECTBL ;<br />

LCALL DISPINFO ;<br />

MOV DPTR, #INPUTTBL ;<br />

LCALL DISPINFO ;<br />

SECLOOP: MOV RXBUFFTAIL, #RXBUFFSTART;<br />

LCALL READWAIT ;<br />

MOV R0, #RXBUFFSTART ;<br />

MOV R4, #59H ; 是 否 Y<br />

LCALL COMPASC ;<br />

JZ SECCAPS ;<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

129


;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

MOV R4, #4EH ; 是 否 N<br />

LCALL COMPASC ;<br />

JNZ SECERROR ;<br />

LJMP SECOUT ;<br />

SECCAPS: MOV DPTR, #SECOKTBL ;<br />

LCALL DISPINFO ;<br />

SECOUT: LCALL INITCOMMAND ;<br />

;<br />

LJMP DISPROM ;<br />

SECERROR: MOV DPTR, #SETERRORTBL ;<br />

;<br />

;<br />

LCALL DISPINFO ;<br />

LJMP SECLOOP ;<br />

;****************************************************<br />

;* *<br />

;* SETB 功 能处理 *<br />

;* *<br />

;****************************************************<br />

SETBFUN: MOV DPTR, #SETBFUNTBL ;<br />

LCALL DISPINFO ;<br />

MOV DPTR, #INPUTTBL ;<br />

LCALL DISPINFO ;<br />

SETBLOOP: LCALL READWAIT ;<br />

MOV R0, #RXBUFFSTART ;<br />

MOV A, @R0 ;<br />

MOV R7, A ;<br />

DEC R7 ;<br />

SETBLOOP1: INC R7 ;<br />

MOV RXBUFFTAIL, #RXBUFFSTART;<br />

LCALL WATDOG ;<br />

XRL A, R7 ;<br />

JNZ SETBLOOP1 ; 是 否有输入<br />

MOV A, @R0 ;<br />

SUBB A, #30H ;<br />

MOV B, A ;<br />

MOV A, B ;<br />

XRL A, #04H ; 是 否 Exit<br />

JZ SETBERROR ;<br />

MOV A, B ;<br />

CLR C ;<br />

SUBB A, #05H ; 大 于 5 重 输<br />

JNC SETBRELOAD ;<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

130


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

MOV A, B ;<br />

LCALL INITBAUD ; 设 置 Baud rate<br />

SETBERROR: LCALL INITCOMMAND ;<br />

;<br />

LJMP DISPROM ;<br />

SETBRELOAD: MOV RXBUFFTAIL, #RXBUFFSTART;<br />

;<br />

;<br />

MOV DPTR, #SETERRORTBL ;<br />

LCALL DISPINFO ;<br />

LJMP SETBLOOP ;<br />

;****************************************************<br />

;* *<br />

;* 显 示 MCU 信息 *<br />

;* *<br />

;****************************************************<br />

INFOFUN: MOV DPTR, #SYSINFOTBL ; 显 示 MCU 信 息<br />

LCALL DISPINFO ;<br />

CLR TR2 ;<br />

MOV A, RCAP2L ; 读 RCAP2L<br />

SETB TR2 ;<br />

MOV R2, A ;<br />

CLR A ;<br />

MOV R3, A ;<br />

MOV DPTR, #BAUDTBL ; 查 询 Baud rate<br />

GETBAUD: MOV A, R3 ;<br />

MOVC A, @A+DPTR ;<br />

INC A ;<br />

JZ INFOFUNOUT ; 是 否结束<br />

DEC A ;<br />

INC R3 ;<br />

XRL A, R2 ;<br />

JNZ GETBAUD ;<br />

DEC R3 ; 得 到 Baud rate<br />

MOV A, R3 ;<br />

MOV B, #18H ;<br />

MOV DPTR, #BAUDINFOTBL ;<br />

LCALL DISPMUL ;<br />

INFOFUNOUT: LJMP DISPROM ;<br />

;<br />

;<br />

;****************************************************<br />

;* *<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

131


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

;* RESET 功能处理 *<br />

;* *<br />

;****************************************************<br />

RESETFUN: MOV DPTR, #WARNINGTBL ;<br />

LCALL DISPINFO ;<br />

MOV DPTR, #INPUTTBL ;<br />

LCALL DISPINFO ;<br />

RESETLOOP: MOV RXBUFFTAIL, #RXBUFFSTART;<br />

;<br />

LCALL READWAIT ;<br />

MOV R0, #RXBUFFSTART ;<br />

MOV R4, #59H ; 是 否 Y<br />

LCALL COMPASC ;<br />

JZ RESETCAPS ;<br />

MOV R4, #4EH ; 是 否 N<br />

LCALL COMPASC ;<br />

JNZ RESETERROR ;<br />

LCALL INITCOMMAND ;<br />

LJMP DISPROM ;<br />

RESETCAPS: LCALL PUTENTER ; 显 示回车<br />

;<br />

LCALL PUTENTER ;<br />

MOV CHPENR,#87H ; 软 件 复位<br />

MOV CHPENR,#59H<br />

MOV CHPCON,#03H<br />

MOV CHPENR,#87H ; 软 件 复位<br />

MOV CHPENR,#59H<br />

MOV CHPCON,#83H<br />

RET<br />

RESETERROR: MOV DPTR, #SETERRORTBL ;<br />

;<br />

;<br />

LCALL DISPINFO ;<br />

LJMP RESETLOOP ;<br />

;****************************************************<br />

;* *<br />

;* ERASE 功 能处理 *<br />

;* *<br />

;****************************************************<br />

ERASEFUN: MOV CHPENR, #87H ;<br />

MOV CHPENR, #59H ;<br />

MOV CHPCON, #03H ;<br />

MOV CHPENR, #00H ;<br />

LCALL ERASECHIP ;<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

132


;<br />

;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

LCALL INITCOMMAND ;<br />

LJMP DISPROM ;<br />

;****************************************************<br />

;* *<br />

;* BLANK 功 能处理 *<br />

;* *<br />

;****************************************************<br />

BLANKFUN: MOV CHPENR, #87H ;<br />

;<br />

;<br />

MOV CHPENR, #59H ;<br />

MOV CHPCON, #03H ;<br />

MOV CHPENR, #00H ;<br />

LCALL BLANKCHIP ;<br />

LCALL INITCOMMAND ;<br />

LJMP DISPROM ;<br />

;****************************************************<br />

;* *<br />

;* UPDAT 功 能处理 *<br />

;* *<br />

;****************************************************<br />

UPDATFUN: MOV CHPENR, #87H ;<br />

式<br />

;<br />

MOV CHPENR, #59H ;<br />

MOV CHPCON, #03H ; 起 动 IN SYSTEM PROGRAMMING 模<br />

MOV CHPENR, #00H ;<br />

LCALL ERASECHIP ; 擦 除 芯 片<br />

LCALL BLANKCHIP ; 检 查芯片<br />

JZ UPDATOUT ;<br />

LCALL XMODEMDOWN ; 下 载 数 据<br />

JZ UPDATOUT ;<br />

MOV DPTR, #UPDATAOKTBL ;<br />

LCALL DISPINFO ;<br />

MOV DPTR, #VERIFYOKTBL ;<br />

LCALL DISPINFO ;<br />

LCALL PUTENTER ;<br />

LJMP DISPROM ;<br />

UPDATOUT: MOV DPTR, #VERIFYERRORTBL ;<br />

LCALL DISPINFO ;<br />

MOV DPTR, #UPDATAERRORTBL ;<br />

LCALL DISPINFO ;<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

133


;<br />

;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

LCALL PUTENTER ;<br />

LJMP DISPROM ;<br />

DISPROM: MOV DPTR, #ROMMARKTBL ; 显 示 ROM> 信 息<br />

;<br />

;<br />

LCALL DISPINFO<br />

RET<br />

;============================================================================<br />

;////////////////////////////////////////////////////////////////////////////<br />

;////////////////////////////////////////////////////////////////////////////<br />

;============================================================================<br />

; 串 口 操 作子程序<br />

; Osc Freq<br />

; 计 算公式: (RCAP2H, RCAP2L) = 65536 - ---------------------<br />

; 32 * Baud<br />

; DEMO:<br />

; FREQUENCY: 12 MHz<br />

; BAUD RATE: 9600 Baud<br />

;<br />

; 12 * 1000000<br />

; (RCAP2H, RCAP2L) = 65536 - ---------------------<br />

; 32 * 9600<br />

; = 65497 = FFD9H<br />

;<br />

; DB 0F7H, 0EEH, 0DCH, 0B8H, 0FFH ; 11.0592 MHz<br />

BAUDTBL: DB 0F6H, 0ECH, 0D9H, 0B2H, 0FFH ; 12.0000 MHz<br />

; DB 0F4H, 0E8H, 0D1H, 0A3H, 0FFH ; 14.3180 MHz<br />

; DB 0F1H, 0E2H, 0C4H, 087H, 0FFH ; 18.4320 MHz<br />

; DB 0ECH, 0D9H, 0B2H, 064H, 0FFH ; 24.0000 MHz<br />

; 38400 19200 9600 4800 END<br />

RET<br />

;****************************************************<br />

;* *<br />

;* 设 置 波 特率 *<br />

;* *<br />

;****************************************************<br />

; A 内 容 0: 38400 1: 19200 2: 9600 3: 4800<br />

; 设 置 串 口 波 特率<br />

INITBAUD: MOV DPTR, #BAUDTBL ;<br />

CLR TR2 ;<br />

MOVC A, @A+DPTR ;<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

134


;<br />

;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

MOV TL2, A ; TL2<br />

MOV RCAP2L, A ; RCAP2L<br />

CLR A ;<br />

DEC A ;<br />

MOV TH2, A ;<br />

MOV RCAP2H, A ;<br />

SETB TR2 ;<br />

RET<br />

;****************************************************<br />

;* *<br />

;* 串 口中断服务程序 *<br />

;* *<br />

;****************************************************<br />

; 串 口中断处理<br />

;<br />

INT_SIO: PUSH PSW<br />

;<br />

;<br />

PUSH ACC<br />

MOV PSW, #04H ; 设 第 二 组 寄 存 器<br />

JBC RI, RXINFO ; RI = 1 去 接收中断程序 RI = 0<br />

JNB TI, INTSIOOUT ;<br />

CLR TI ; 清 发送中断<br />

LJMP TXINFO<br />

RXINFO: JB RXCOMMFLAG, RXXMODEM ;<br />

RXCOMMAND: MOV R0, RXBUFFTAIL ; 接 收命令<br />

CLR RXCOMMOKFLAG ; 接 收状态<br />

MOV A, SBUF ;<br />

XRL A, #BACKSPACE ; 删 除 处 理<br />

JNZ RXCOMMAND1 ;<br />

SETB COMMSPACEFLAG ; 需 要 删 除 标 记<br />

DEC RXBUFFLEN ; 接 收队列调整<br />

MOV A, RXBUFFLEN ;<br />

INC A ;<br />

JNZ RXCOMMANDB1 ;<br />

CLR COMMSPACEFLAG ; 全 部 删 除<br />

INC RXBUFFLEN ;<br />

RXCOMMANDB1: DEC RXBUFFTAIL ;<br />

MOV A, RXBUFFTAIL ;<br />

INC A ;<br />

XRL A, #RXBUFFSTART ;<br />

JNZ INTSIOOUT ;<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

135


;<br />

;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

CLR COMMSPACEFLAG ; 全 部 删 除<br />

INC RXBUFFTAIL ;<br />

LJMP INTSIOOUT ;<br />

RXCOMMAND1: INC RXBUFFLEN ; 命 令长度计数<br />

INC RXBUFFTAIL ; 接 收缓冲区计数<br />

MOV A, RXBUFFLEN ;<br />

XRL A, #90H ; 命 令长度限制<br />

JZ RXCOMMERROR ;<br />

MOV A, SBUF ;<br />

MOV @R0, A ; 存 命 令 字符<br />

XRL A, #0DH ; 是 否结束<br />

JZ RXCOMMEND ;<br />

RXCOMMAND2: MOV A, SBUF ; 回 显收到的字符<br />

CLR TXOKFLAG ;<br />

MOV SBUF, A ;<br />

INTSIOOUT: POP ACC ;<br />

;<br />

;<br />

POP PSW ;<br />

RETI ;<br />

RXCOMMERROR: CLR A ; 出 错处理<br />

;<br />

MOV RXBUFFLEN, A ; 初 始化<br />

MOV RXBUFFTAIL, #RXBUFFSTART;<br />

LJMP INTSIOOUT ;<br />

RXCOMMEND: SETB RXCOMMOKFLAG ; 接 收成功<br />

;<br />

;<br />

LJMP INTSIOOUT ;<br />

RXXMODEM: MOV R0, RXBUFFTAIL ; XMODEM 协 议接收<br />

INC RXBUFFTAIL ; 接 收队列处理<br />

INC RXBUFFLEN ;<br />

MOV A, SBUF ;<br />

MOV @R0, A ;<br />

MOV A, BLKCHK ; 队 列 总 长 度<br />

ADD A, #BLKSIZE ;<br />

ADD A, #XBUFFSTART ;<br />

ADD A, #04H ;<br />

XRL A, RXBUFFTAIL ;<br />

JNZ INTSIOOUT ;<br />

MOV RXBUFFTAIL, #XBUFFSTART ; 写 队 列 满<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

136


;<br />

;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

LJMP INTSIOOUT ;<br />

TXINFO: SETB TXOKFLAG ; 发 送成功<br />

;<br />

;<br />

LJMP INTSIOOUT ;<br />

;****************************************************<br />

;* *<br />

;* 把 表 的 内 容写到串口 *<br />

;* *<br />

;****************************************************<br />

; DPTR 内 容是表的首址<br />

; 显 示表格内容<br />

DISPINFO: CLR A ;<br />

MOV R5, A ;<br />

READDISPCODE: MOV A, R5 ;<br />

MOVC A, @A+DPTR ; 查 表<br />

MOV R4, A ;<br />

INC R5 ; 计 数器加一<br />

MOV A, R5 ;<br />

JNZ READOVER ; 计 数器溢出处理<br />

INC DPH ;<br />

READOVER: MOV A, R4 ;<br />

DISPINFOOUT: RET<br />

;<br />

;<br />

INC A ;<br />

JZ DISPINFOOUT ; 读 到 结束符结束<br />

CLR TXOKFLAG ;<br />

DEC A ;<br />

LCALL PUTCHAR ; 发 送字符<br />

LJMP READDISPCODE ;<br />

;****************************************************<br />

;* *<br />

;* 刷 新 命 令 符 *<br />

;* *<br />

;****************************************************<br />

PUTCOMMSPACE: JNB COMMSPACEFLAG, PUTCOMOUT;<br />

CLR COMMSPACEFLAG ;<br />

MOV A, #BACKSPACE ; 置 光 标 到 前 一 字符<br />

LCALL PUTCHAR ;<br />

MOV A, #20H ; 用 空格覆盖<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

137


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

LCALL PUTCHAR ;<br />

MOV A, #BACKSPACE ; 调 整 光 标位置<br />

LCALL PUTCHAR ;<br />

PUTCOMOUT: RET ;<br />

;<br />

;<br />

;****************************************************<br />

;* *<br />

;* 发 送 一个字符 *<br />

;* *<br />

;****************************************************<br />

; A 内 容 待 发字符<br />

PUTCHAR: CLR TXOKFLAG ;<br />

;<br />

;<br />

MOV SBUF, A ;<br />

JNB TXOKFLAG, $ ;<br />

RET<br />

;****************************************************<br />

;* *<br />

;* 发 送字符串 *<br />

;* *<br />

;****************************************************<br />

; A 内 容 待 发字符首址<br />

; B 内 容 待 发字符个数<br />

PUTSTRING: MOV R0, A ;<br />

MOV R4, B ;<br />

PUTSTRLOOP: MOV A, @R0 ;<br />

;<br />

;<br />

INC R0 ;<br />

LCALL PUTCHAR ;<br />

DJNZ R4, PUTSTRLOOP ;<br />

RET<br />

;****************************************************<br />

;* *<br />

;* 接 收 一个字符 *<br />

;* *<br />

;****************************************************<br />

; A 内 容 接收字符<br />

; B 内 容超时次数<br />

GETCHAR: MOV A, RXBUFFLEN ;<br />

JNZ GETCHAROUT ;<br />

JB TIME500MS, $ ;<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

138


;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

LCALL WATDOG ;<br />

JNB TIME500MS, $ ;<br />

DEC B ;<br />

MOV A, B ;<br />

JNZ GETCHAR ;<br />

RET<br />

GETCHAROUT: MOV R0, RXBUFFHEAD ;<br />

INC RXBUFFHEAD ;<br />

DEC RXBUFFLEN ;<br />

MOV A, #BLKSIZE ;<br />

ADD A, BLKCHK ;<br />

ADD A, #54H ;<br />

XRL A, RXBUFFHEAD ;<br />

JNZ GETCHAREND ;<br />

MOV RXBUFFHEAD, #XBUFFSTART ;<br />

GETCHAREND: MOV A, @R0 ;<br />

;<br />

;<br />

RET ;<br />

;****************************************************<br />

;* *<br />

;* 显 示回车 *<br />

;* *<br />

;****************************************************<br />

; 向 串 口 发送回车<br />

PUTENTER: MOV A, #0DH ;<br />

;<br />

;<br />

LCALL PUTCHAR ;<br />

MOV A, #0AH ;<br />

LCALL PUTCHAR ;<br />

RET<br />

;****************************************************<br />

;* *<br />

;* 显 示查表 *<br />

;* *<br />

;****************************************************<br />

; DPRT 显 示信息首址<br />

; A 内 容 数 据<br />

; B 内 容 长 度<br />

DISPMUL: MUL AB ;<br />

LCALL DPTRADDC ;<br />

LCALL DISPINFO ; 显 示<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

139


;<br />

;<br />

RET<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

;****************************************************<br />

;* *<br />

;* 显 示存储器 ADDER *<br />

;* *<br />

;****************************************************<br />

; R2 内 容高地址 R1 内 容低地址<br />

; 显 示成 XXXX:<br />

DISPADD: LCALL PUTENTER ; 显 示回车<br />

;<br />

;<br />

MOV A, R2 ;<br />

LCALL DISPHEX ;<br />

MOV A, R1 ;<br />

LCALL DISPHEX ;<br />

MOV A, #3AH ;<br />

LCALL PUTCHAR ; 发 送 :<br />

MOV A, #20H ;<br />

LCALL PUTCHAR ;<br />

MOV A, #20H ;<br />

LCALL PUTCHAR ;<br />

RET<br />

;****************************************************<br />

;* *<br />

;* 显 示 BIN *<br />

;* *<br />

;****************************************************<br />

; A 内 容是 BCD 码<br />

; 显 示成 XXXXXXXX 二 进 制 格 式<br />

DISPBIN: MOV R3, #08H ; 字 节 计数<br />

BINRL: RLC A ; 得 到 每 一 位<br />

;<br />

JC ONE ;<br />

MOV A, #30H ;<br />

LCALL PUTCHAR ; 发 送 0<br />

LJMP BINRL1 ;<br />

ONE: MOV A, #31H ;<br />

LCALL PUTCHAR ; 发 送 1<br />

BINRL1: DJNZ R3, BINRL ; 是 否结束<br />

MOV A, #42H ;<br />

LCALL PUTCHAR ; 发 送 B<br />

RET<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

140


;<br />

;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

;****************************************************<br />

;* *<br />

;* 单 字节十六进制转十进制 *<br />

;* *<br />

;****************************************************<br />

; A: 待 转换的单字节十六进制数<br />

; A: 高 四 位 的 ASCII 码 R4: 低 四 位 的 ASCII 码<br />

HEX2ASC: MOV R4, A ; 暂 存 待 转换的单字节十六进制数<br />

LCALL HEX2ASC1 ; 转 换低四位<br />

XCH A, R4 ; 存 放低四位的 ASCII 码<br />

SWAP A ; 准 备转换高四位<br />

HEX2ASC1: ANL A, #0FH ; 将 累 加 器的低四位转换成 ASCII<br />

码<br />

;<br />

;<br />

ADD A, #90H ;<br />

DA A ;<br />

ADDC A, #40H ;<br />

DA A ;<br />

CLR C ;<br />

RET ;<br />

;****************************************************<br />

;* *<br />

;* 显 示 HEX *<br />

;* *<br />

;****************************************************<br />

; A 内 容是 BCD 码<br />

; 显 示成 XX 十 六进制格式<br />

DISPHEX: LCALL HEX2ASC ;<br />

;<br />

;<br />

LCALL PUTCHAR ;<br />

MOV A, R4 ;<br />

LCALL PUTCHAR ;<br />

RET ;<br />

;****************************************************<br />

;* *<br />

;* 显 示 RAMASC *<br />

;* *<br />

;****************************************************<br />

; 显 示 RAM or ROM 内 容<br />

; R0 内 容是 R2R1 地 址的内容<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

141


; ASC 方 式<br />

; 格 式: 0123456789ABCDEF<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

DISPRAMASC: MOV R6, #08H ;<br />

MOV R0, A ;<br />

RAMSPACE: MOV A, #20H ; 显 示 8 个 空格<br />

LCALL PUTCHAR ;<br />

DJNZ R6, RAMSPACE ;<br />

MOV A, R0 ;<br />

SUBB A, #10H ; 指 针减一列长度<br />

MOV R0, A ;<br />

MOV R6, #10H ; 一 列计数<br />

RAMASC: MOV A, B ;<br />

;<br />

JZ ROMASC ; ROM RAM 处 理<br />

MOV A, @R0 ;<br />

LJMP ROMRAMASC ;<br />

ROMASC: MOV A, R0 ;<br />

;<br />

MOVC A, @A+DPTR ;<br />

ROMRAMASC: MOV R4, A ;<br />

CLR C ;<br />

SUBB A, #2EH ; 过 虑 小 于 #2EH ASC<br />

MOV A, R4 ;<br />

JNC RAMASC1 ;<br />

RAMASC0: MOV A, #2EH ;<br />

;<br />

LJMP RAMASC2 ;<br />

RAMASC1: CLR C ;<br />

MOV A, R4 ;<br />

SUBB A, #7FH ; 过 虑 大 于 #7FH ASC<br />

MOV A, R4 ;<br />

JNC RAMASC0 ;<br />

RAMASC2: LCALL PUTCHAR ; 显 示 ASC<br />

;<br />

;<br />

INC R0 ;<br />

DJNZ R6, RAMASC ;<br />

RET<br />

;****************************************************<br />

;* *<br />

;* 显 示 RAM ROM *<br />

;* *<br />

;****************************************************<br />

; 显 示 RAM or ROM 内 容<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

142


; R2 内 容高位地址 R1 内 容低位地址<br />

; R0 内 容是 R2R1 地 址的内容<br />

; HEX 方 式<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

; 格 式 : XXXX: 10 11 12 13 14 15 16 17-18 19 1A 1B 1C 1D 1E 1F<br />

DISPROMRAM: LCALL DISPADD ; 显 示地址<br />

MOV R6, #10H ; 一 行计数<br />

READRAMLOOP: MOV A, B ;<br />

;<br />

JZ READROM ;<br />

MOV A, @R0 ;<br />

LJMP READRAMROMEND ;<br />

READROM: MOV A, R0 ;<br />

MOVC A, @A+DPTR ;<br />

READRAMROMEND: INC R0 ;<br />

;<br />

LCALL DISPHEX ; 显 示 HEX<br />

MOV A, R0 ;<br />

MOV A, R6 ;<br />

XRL A, #09H ;<br />

JNZ RAMROM16 ; 8 列 处 理<br />

MOV A, #2DH ; 显 示 -<br />

LCALL PUTCHAR ;<br />

LJMP RAMROM8 ;<br />

RAMROM16: MOV A, #20H ; 显 示空格<br />

LCALL PUTCHAR ;<br />

RAMROM8: DJNZ R6, READRAMLOOP ;<br />

;<br />

;<br />

MOV A, R0 ;<br />

LCALL DISPRAMASC ;<br />

LCALL WATDOG ;<br />

MOV A, R1 ;<br />

ADD A, #10H ;<br />

MOV R1, A ;<br />

JNZ DISPROMRAM ; 是 否结束<br />

INC DPH ;<br />

MOV A, DPH ;<br />

MOV R2, A ;<br />

RET<br />

;****************************************************<br />

;* *<br />

;* 初 始化串口(COMMAND) *<br />

;* *<br />

;****************************************************<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

143


; 初 始化串口数据<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

INITCOMMAND: CLR A ;<br />

;<br />

;<br />

MOV RXBUFFLEN, A ; 初 始化<br />

CLR RXCOMMOKFLAG ;<br />

MOV RXBUFFTAIL, #RXBUFFSTART;<br />

CLR RXCOMMFLAG ; 起 动 COMMAND 接 收<br />

LCALL PUTENTER ; 显 示回车<br />

RET<br />

;****************************************************<br />

;* *<br />

;* 读 等待 *<br />

;* *<br />

;****************************************************<br />

; 死 读 缓冲区一直到有数据<br />

READWAIT: MOV RXBUFFTAIL, #RXBUFFSTART;<br />

CLR A ;<br />

MOV A, RXBUFFLEN ;<br />

READWAIT1: LCALL WATDOG ;<br />

MOV A, RXBUFFTAIL ;<br />

XRL A, #RXBUFFSTART ;<br />

JZ READWAIT1 ; 接 收缓冲区空 LOOP<br />

READLOOP: LCALL WATDOG ;<br />

;<br />

;<br />

LCALL PUTCOMMSPACE ;<br />

JNB RXCOMMOKFLAG, READLOOP ; 命 令 接收不成功不处理<br />

MOV R0, #RXBUFFSTART ;<br />

RET ;<br />

;****************************************************<br />

;* *<br />

;* 比 较 单 个 字符 *<br />

;* *<br />

;****************************************************<br />

; R0 内 容 为 地址<br />

; R4 内 容 为 源<br />

; A 内 容 为 零 : 成 功 ; 非 零 : 失 败<br />

COMPASC: MOV A, @R0 ;<br />

XRL A, R4 ; 是 否大写<br />

JZ COMPASCOUT ;<br />

MOV A, R4 ; 是 否小写<br />

ADD A, #20H ;<br />

MOV R4, A ;<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

144


COMPASCOUT: RET<br />

;<br />

;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

MOV A, @R0 ;<br />

XRL A, R4 ;<br />

;****************************************************<br />

;* *<br />

;* 是 否数字 *<br />

;* *<br />

;****************************************************<br />

; R0 内 容 为 地址<br />

; R4 内 容 为 源<br />

; A 内 容 为 零 : 成 功 ; 非 零 : 失 败<br />

ISDIGIT: MOV A, @R0 ;<br />

;<br />

CLR C ;<br />

SUBB A, #30H ;<br />

JC ISDIGITOUT ;<br />

MOV A, @R0 ;<br />

CLR C ;<br />

SUBB A, #3AH ;<br />

JNC ISDIGITOUT ;<br />

CLR A ;<br />

RET ;<br />

ISDIGITOUT: CLR A ;<br />

;<br />

;<br />

DEC A ;<br />

RET ;<br />

;****************************************************<br />

;* *<br />

;* DPTR ADDC *<br />

;* *<br />

;****************************************************<br />

; DPTR = DPTR + A<br />

; IF DPTR > 0FFFFH CY = 1<br />

DPTRADDC: PUSH ACC ;<br />

ADD A, DPL ; DPL + ACC<br />

MOV DPL, A ;<br />

MOV A, DPH ;<br />

ADDC A, #000H ; DPH = DPH + CY<br />

MOV DPH, A ;<br />

POP ACC ;<br />

RET<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

145


;<br />

;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

;****************************************************<br />

;* *<br />

;* PAUSE *<br />

;* *<br />

;****************************************************<br />

MYPAUSE: JNB TIME500MS, $<br />

;<br />

;<br />

LCALL WATDOG<br />

JB TIME500MS, $<br />

DEC A<br />

JNZ MYPAUSE<br />

RET<br />

;============================================================================<br />

;////////////////////////////////////////////////////////////////////////////<br />

;////////////////////////////////////////////////////////////////////////////<br />

;============================================================================<br />

; XMODEM 子 程序<br />

;<br />

;****************************************************<br />

;* *<br />

;* XMODEM DOWNLOAD *<br />

;* *<br />

;****************************************************<br />

; 以 XMODEM 协 议接收数据<br />

XMODEMDOWN: LCALL PUTENTER ;<br />

CLR A ;<br />

MOV DPLO, A ;<br />

MOV DPHI, A ;<br />

MOV R7, #XMODEMMXAERROR ; 最 大 错 误 次 数<br />

MOV RXBUFFTAIL, #XBUFFSTART ;<br />

MOV RXBUFFHEAD, #XBUFFSTART ;<br />

CLR RXCOMMOKFLAG ;<br />

CLR A ;<br />

MOV RXBUFFLEN, A ;<br />

INC A ;<br />

MOV BLKCHK, A ; 1: CRC 0: CheckSum<br />

MOV R5, A ; 存 包 号<br />

MOV R6, #CRC ; 发 送字符 C 请 求 字符 CRC<br />

SETB RXCOMMFLAG ; 起 动 XMODEM 协 议接收<br />

XDOWNLOOP: MOV A, R6 ;<br />

LCALL PUTCHAR ;<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

146


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

MOV B, #05H ; TIMEOUT<br />

LCALL GETCHAR ; 读 入字符<br />

MOV R3, A ;<br />

MOV A, B ;<br />

JNZ XDOWNREAD ; 是 否超时<br />

MOV A, R7 ;<br />

CLR C ;<br />

SUBB A, #0AH ;<br />

JNC XDOWNLOOPEND ; 继 续 发送 CRC 字 符<br />

MOV R6, #NAK ;<br />

CLR A ;<br />

MOV BLKCHK, A ; 发 送 CheckSum 字 符<br />

XDOWNLOOPEND: DJNZ R7, XDOWNLOOP ;<br />

XDOWNCAN: MOV A, #CAN ; 错 误 太 多 中断<br />

;<br />

LCALL PUTCHAR ;<br />

CLR A ;<br />

LJMP XDOWNEND2 ;<br />

XDOWNEND1: LCALL PUTENTER ;<br />

CLR A ;<br />

DEC A ;<br />

XDOWNEND2: CLR RXCOMMFLAG ; 起 动 COMMAND 接 收<br />

;<br />

MOV RXBUFFTAIL, #RXBUFFSTART;<br />

MOV RXBUFFHEAD, #RXBUFFSTART;<br />

MOV RXBUFFLEN, #00H ;<br />

RET<br />

XDOWNEND: MOV A, #ACK ;<br />

;<br />

LCALL PUTCHAR ;<br />

LJMP XDOWNEND1 ;<br />

XDOWNREAD: MOV R6, #NAK ;<br />

MOV A, R3 ;<br />

XRL A, #SOH ; 是 否包头<br />

JZ XDOWNPACK ;<br />

MOV A, R3 ;<br />

XRL A, #EOT ; 是 否包结束<br />

JZ XDOWNEND ;<br />

MOV A, R3 ;<br />

XRL A, #CAN ; 是 否发送端中断<br />

JZ XDOWNCAN ;<br />

MOV A, #05H ;<br />

LCALL MYPAUSE ;<br />

LJMP XDOWNLOOPEND ;<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

147


;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

XDOWNPACK: MOV A, #BLKSIZE ; 包 处 理<br />

ADD A, BLKCHK ;<br />

ADD A, #03H ;<br />

MOV R4, A ; 计 算包长度<br />

XDOWNPACKLOOP: MOV B, #03H ;<br />

;<br />

;<br />

LCALL GETCHAR ;<br />

MOV A, B ;<br />

JZ XDOWNLOOPEND ;<br />

DJNZ R4, XDOWNPACKLOOP ; 读 入 一 包 数 据<br />

MOV R0, #XBUFFSTART ;<br />

INC R0 ;<br />

MOV A, @R0 ; 读 入 包 号<br />

MOV B, A ;<br />

INC R0 ;<br />

MOV A, @R0 ; 读 入 包 号 反 值<br />

ADD A, B ;<br />

XRL A, #0FFH ; 校 验 包 号<br />

JNZ XDOWNLOOPEND ;<br />

MOV A, B ; 是 否当前包号<br />

XRL A, R5 ;<br />

JZ XDOWNCHECK ; 是 转 CRC 计 算<br />

MOV A, R5 ;<br />

DEC A ; 是 否上次包号<br />

XRL A, B ;<br />

JNZ XDOWNLOOPEND ;<br />

MOV R6, #ACK ; 是 发 握手信号<br />

LJMP XDOWNLOOP ;<br />

XDOWNCHECK: MOV A, BLKCHK ;<br />

;<br />

JZ XDOWNCHECKSUM ; CheckSum 处 理<br />

LCALL XCRCCHECK ; 计 算 CRC<br />

JNZ XDOWNLOOPEND ;<br />

LJMP XDOWNNEXTPACK ; 是 读下一包<br />

XDOWNCHECKSUM: LCALL XCHECKSUM ; 计 算 CheckSum<br />

JNZ XDOWNLOOPEND ;<br />

XDOWNNEXTPACK: MOV R6, #ACK ; 是 发 握手信号<br />

LCALL PROGRAMCHIP ;<br />

JZ XDOWNCAN1 ;<br />

INC R5 ; 初 始化<br />

CLR A ;<br />

MOV R7, #XMODEMMXAERROR ; 最 大 错 误 次 数<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

148


;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

MOV RXBUFFTAIL, #XBUFFSTART ;<br />

MOV RXBUFFHEAD, #XBUFFSTART ;<br />

CLR A ;<br />

MOV RXBUFFLEN, A ;<br />

CLR RXCOMMOKFLAG ;<br />

LJMP XDOWNLOOP ;<br />

XDOWNCAN1: LJMP XDOWNCAN ;<br />

;<br />

;<br />

;***************************************************************************<br />

;///////////////////////////////////////////////////////////////////////////<br />

;///////////////////////////////////////////////////////////////////////////<br />

;***************************************************************************<br />

; CRC16 子 程序 16 位 CRC CCITT - 12<br />

; CheckSum 子 程序<br />

;<br />

CRC16TBL: DW 00000H, 01021H, 02042H, 03063H, 04084H, 050A5H, 060C6H, 070E7H<br />

DW 08108H, 09129H, 0A14AH, 0B16BH, 0C18CH, 0D1ADH, 0E1CEH, 0F1EFH<br />

DW 01231H, 00210H, 03273H, 02252H, 052B5H, 04294H, 072F7H, 062D6H<br />

DW 09339H, 08318H, 0B37BH, 0A35AH, 0D3BDH, 0C39CH, 0F3FFH, 0E3DEH<br />

DW 02462H, 03443H, 00420H, 01401H, 064E6H, 074C7H, 044A4H, 05485H<br />

DW 0A56AH, 0B54BH, 08528H, 09509H, 0E5EEH, 0F5CFH, 0C5ACH, 0D58DH<br />

DW 03653H, 02672H, 01611H, 00630H, 076D7H, 066F6H, 05695H, 046B4H<br />

DW 0B75BH, 0A77AH, 09719H, 08738H, 0F7DFH, 0E7FEH, 0D79DH, 0C7BCH<br />

DW 048C4H, 058E5H, 06886H, 078A7H, 00840H, 01861H, 02802H, 03823H<br />

DW 0C9CCH, 0D9EDH, 0E98EH, 0F9AFH, 08948H, 09969H, 0A90AH, 0B92BH<br />

DW 05AF5H, 04AD4H, 07AB7H, 06A96H, 01A71H, 00A50H, 03A33H, 02A12H<br />

DW 0DBFDH, 0CBDCH, 0FBBFH, 0EB9EH, 09B79H, 08B58H, 0BB3BH, 0AB1AH<br />

DW 06CA6H, 07C87H, 04CE4H, 05CC5H, 02C22H, 03C03H, 00C60H, 01C41H<br />

DW 0EDAEH, 0FD8FH, 0CDECH, 0DDCDH, 0AD2AH, 0BD0BH, 08D68H, 09D49H<br />

DW 07E97H, 06EB6H, 05ED5H, 04EF4H, 03E13H, 02E32H, 01E<strong>51</strong>H, 00E70H<br />

DW 0FF9FH, 0EFBEH, 0DFDDH, 0CFFCH, 0BF1BH, 0AF3AH, 09F59H, 08F78H<br />

DW 09188H, 081A9H, 0B1CAH, 0A1EBH, 0D10CH, 0C12DH, 0F14EH, 0E16FH<br />

DW 01080H, 000A1H, 030C2H, 020E3H, 05004H, 04025H, 07046H, 06067H<br />

DW 083B9H, 09398H, 0A3FBH, 0B3DAH, 0C33DH, 0D31CH, 0E37FH, 0F35EH<br />

DW 002B1H, 01290H, 022F3H, 032D2H, 04235H, 05214H, 06277H, 07256H<br />

DW 0B5EAH, 0A5CBH, 095A8H, 08589H, 0F56EH, 0E54FH, 0D52CH, 0C50DH<br />

DW 034E2H, 024C3H, 014A0H, 00481H, 07466H, 06447H, 05424H, 04405H<br />

DW 0A7DBH, 0B7FAH, 08799H, 097B8H, 0E75FH, 0F77EH, 0C71DH, 0D73CH<br />

DW 026D3H, 036F2H, 00691H, 016B0H, 06657H, 07676H, 04615H, 05634H<br />

DW 0D94CH, 0C96DH, 0F90EH, 0E92FH, 099C8H, 089E9H, 0B98AH, 0A9ABH<br />

DW 05844H, 04865H, 07806H, 06827H, 018C0H, 008E1H, 03882H, 028A3H<br />

DW 0CB7DH, 0DB5CH, 0EB3FH, 0FB1EH, 08BF9H, 09BD8H, 0ABBBH, 0BB9AH<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

149


;<br />

;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

DW 04A75H, 05A54H, 06A37H, 07A16H, 00AF1H, 01AD0H, 02AB3H, 03A92H<br />

DW 0FD2EH, 0ED0FH, 0DD6CH, 0CD4DH, 0BDAAH, 0AD8BH, 09DE8H, 08DC9H<br />

DW 07C26H, 06C07H, 05C64H, 04C45H, 03CA2H, 02C83H, 01CE0H, 00CC1H<br />

DW 0EF1FH, 0FF3EH, 0CF5DH, 0DF7CH, 0AF9BH, 0BFBAH, 08FD9H, 09FF8H<br />

DW 06E17H, 07E36H, 04E55H, 05E74H, 02E93H, 03EB2H, 00ED1H, 01EF0H<br />

RET<br />

;****************************************************<br />

;* *<br />

;* 校 验 包 的 CRC *<br />

;* *<br />

;****************************************************<br />

; CRCHI AND CRCLO 内 容 为 0: OK ELSE: FAIL<br />

XCRCCHECK: MOV R0, #XBUFFSTART ;<br />

INC R0 ;<br />

INC R0 ;<br />

INC R0 ;<br />

CLR A ;<br />

MOV CRCLO, A ;<br />

MOV CRCHI, A ;<br />

MOV A, #BLKSIZE ;<br />

INC A ;<br />

INC A ;<br />

MOV R4, A ; 计 算包长度<br />

XCRCLOOP: MOV A, @R0 ;<br />

INC R0 ;<br />

XRL A, CRCHI ;<br />

MOV DPTR, #CRC16TBL ;<br />

LCALL DPTRADDC ; 调 整 DW 地 址<br />

LCALL DPTRADDC ;<br />

CLR A ;<br />

MOVC A, @A+DPTR ; 查 表<br />

XRL A, CRCLO ;<br />

MOV CRCHI, A ; 获 得高 CRC<br />

CLR A ;<br />

INC A ;<br />

MOVC A, @A+DPTR ;<br />

MOV CRCLO, A ; 获 得低 CRC<br />

DJNZ R4, XCRCLOOP ;<br />

MOV A, CRCLO ;<br />

JNZ XCRCERROR ;<br />

MOV A, CRCHI ;<br />

JNZ XCRCERROR ;<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

150


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

XCRCERROR: RET ;<br />

;<br />

;<br />

;****************************************************<br />

;* *<br />

;* 校 验 包 的 CheckSum *<br />

;* *<br />

;****************************************************<br />

XCHECKSUM: MOV R0, #XBUFFSTART ;<br />

INC R0 ;<br />

INC R0 ;<br />

INC R0 ;<br />

CLR A ;<br />

MOV CRCHI, A ;<br />

MOV A, #BLKSIZE ;<br />

MOV R4, A ; 计 算包长度<br />

XSUMLOOP: MOV A, @R0 ;<br />

;<br />

;<br />

ADD A, CRCHI ;<br />

MOV CRCHI, A ;<br />

INC R0 ;<br />

DJNZ R4, XSUMLOOP ;<br />

MOV A, @R0 ;<br />

XRL A, CRCHI ;<br />

RET<br />

;============================================================================<br />

;////////////////////////////////////////////////////////////////////////////<br />

;////////////////////////////////////////////////////////////////////////////<br />

;============================================================================<br />

; IN-SYSTEM-PROGRAMMING 子 程序<br />

;<br />

;****************************************************<br />

;* *<br />

;* ERASE CHIP *<br />

;* *<br />

;****************************************************<br />

ERASECHIP: MOV TIMEHI, #P15MS ; About 15ms<br />

MOV TIMELO, #0FFH ;<br />

MOV TL0, TIMELO ;<br />

MOV TH0, TIMEHI ;<br />

MOV SFRCN, #22H ; 擦 除 64K APROM 模 式<br />

SETB TR0 ;<br />

ORL PCON, #01H ;<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

1<strong>51</strong>


;<br />

;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

MOV DPTR, #ERASETBL ; 显 示 OK<br />

LCALL DISPINFO ;<br />

ANL PCON, #0FEH ;<br />

RET<br />

;****************************************************<br />

;* *<br />

;* BLANK CHIP *<br />

;* *<br />

;****************************************************<br />

; A = 0: ERROR A = FF: OK<br />

BLANKCHIP: CLR A ;<br />

MOV SFRCN, A ; 读 64K APROM 模 式<br />

MOV SFRAH, A ;<br />

MOV SFRAL, A ;<br />

CLR TR0 ;<br />

DEC A ;<br />

MOV TIMEHI, A ; About 1.5us<br />

MOV TIMELO, #P1US ;<br />

MOV TL0, TIMELO ;<br />

MOV TH0, TIMEHI ;<br />

BLANKLOOP: SETB TR0 ;<br />

;<br />

ORL PCON, #01H ; 调 用空闲模式<br />

MOV A, SFRFD ; 读 一 字 节<br />

CJNE A, #0FFH, BLANKERROR ; 比 较 是否为空<br />

INC SFRAL ; 下 一地址<br />

MOV A, SFRAL ;<br />

JNZ BLANKLOOP ;<br />

LCALL WATDOG ;<br />

INC SFRAH ;<br />

MOV A, SFRAH ;<br />

CJNE A, #00H, BLANKLOOP ; 结 束地址 FFFF<br />

MOV DPTR, #BLANKOKTBL ; 成 功<br />

LCALL DISPINFO ;<br />

MOV A, #0FFH ;<br />

ANL PCON, #0FEH ;<br />

RET<br />

BLANKERROR: MOV DPTR, #BLANKERRORTBL ; 失 败<br />

LCALL DISPINFO ;<br />

ANL PCON, #0FEH ;<br />

CLR A ;<br />

RET ;<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

152


;<br />

;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

;****************************************************<br />

;* *<br />

;* PROGRAM CHIP *<br />

;* *<br />

;****************************************************<br />

;<br />

PROGRAMCHIP: MOV R3, #03H ;<br />

REPROGRAM: MOV SFRCN, #21H ; 编 程 64K APROM 模 式<br />

MOV TIMELO, #P50US ; About 50us<br />

MOV TIMEHI, #0FFH ;<br />

MOV TL0, TIMELO ;<br />

MOV TH0, TIMEHI ;<br />

MOV R1, #XBUFFSTART ;<br />

INC R1 ;<br />

INC R1 ;<br />

INC R1 ;<br />

MOV R4, #BLKSIZE ;<br />

PROGRAMLOOP: MOV SFRAL, DPLO ; 低 字 节 地址<br />

MOV A, @R1 ;<br />

MOV SFRFD, A ; 读 一 字 节<br />

SETB TR0 ;<br />

ORL PCON, #01H ;<br />

INC DPLO ; 下 一地址<br />

INC R1 ;<br />

DJNZ R4, PROGRAMLOOP ; 写 一 包 数 据<br />

LCALL WATDOG ;<br />

MOV TIMELO, #P1US ; 初 始化校验<br />

MOV TIMEHI, #0FFH ; About 1.5us<br />

MOV TL0, TIMELO ;<br />

MOV TH0, TIMEHI ;<br />

MOV R1, #XBUFFSTART ;<br />

INC R1 ;<br />

INC R1 ;<br />

INC R1 ;<br />

MOV R4, #BLKSIZE ;<br />

MOV SFRCN, #00H ; 读 64K APROM 模 式<br />

MOV A, DPLO ;<br />

DEC A ;<br />

SUBB A, #7FH ;<br />

MOV R2, A ; 计 算 校 验起始地址<br />

VERIFYLOOP: MOV SFRAL, R2 ;<br />

SETB TR0 ;<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

153


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

ORL PCON, #01H ;<br />

MOV A, @R1 ;<br />

INC R1 ;<br />

INC R2 ;<br />

CJNE A, SFRFD, PROGRAMERROR ; 比 较<br />

DJNZ R4, VERIFYLOOP ;<br />

MOV A, DPLO ;<br />

JNZ PROGRAMOUT ;<br />

INC DPHI ; 高 字 节 地址<br />

MOV SFRAH, DPHI ;<br />

PROGRAMOUT: CLR A ; 成 功<br />

;<br />

DEC A ;<br />

LCALL WATDOG ;<br />

ANL PCON, #0FEH ;<br />

RET ;<br />

PROGRAMERROR: LCALL WATDOG ;<br />

;<br />

;<br />

DJNZ R3, REPROGRAM ; 出 错重试三次<br />

CLR A ;<br />

ANL PCON, #0FFH ;<br />

RET ;<br />

;***************************************************************************<br />

;///////////////////////////////////////////////////////////////////////////<br />

;///////////////////////////////////////////////////////////////////////////<br />

;***************************************************************************<br />

; 系 统 显示信息<br />

;<br />

;****************************************************<br />

;* *<br />

;* 系 统 显示信息 *<br />

;* *<br />

;****************************************************<br />

COMMANDTBL: DB "?", 00DH, 00AH, 0FFH, 0FFH, 0FFH, 0FFH, 0FFH<br />

DB 00DH, 00AH, 0FFH, 0FFH, 0FFH, 0FFH, 0FFH, 0FFH<br />

DB "RAM", 00DH, 00AH, 0FFH, 0FFH, 0FFH<br />

DB "SEC", 00DH, 00AH, 0FFH, 0FFH, 0FFH<br />

DB "SETB", 00DH, 00AH, 0FFH, 0FFH<br />

DB "INFO", 00DH, 00AH, 0FFH, 0FFH<br />

DB "ERASE", 00DH, 00AH, 0FFH<br />

DB "BLANK", 00DH, 00AH, 0FFH<br />

DB "RESET", 00DH, 00AH, 0FFH<br />

DB "UPDAT", 00DH, 00AH, 0FFH<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

154


;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

DB 0FFH, 0FFH, 0FFH, 0FFH<br />

RET<br />

LOGOTBL: DB " <strong>MCS</strong>-<strong>51</strong> Updata Code Ver 1.00", 00DH, 00AH<br />

;<br />

DB " Input ? to Help", 0FFH<br />

RET<br />

ROMMARKTBL: DB 00DH, 00AH, "ROM>", 0FFH<br />

;<br />

RET<br />

HELPTBL: DB 00DH, 00AH<br />

DB "**************************************************************************",00DH, 00AH<br />

DB "* ? Online help command ", 00DH, 00AH<br />

DB "* RAM View mcu interram * SEC Security mcu code *", 00DH, 00AH<br />

DB "* SETB Set mcu baud rate * INFO View mcu info *", 00DH, 00AH<br />

DB "* ERASE Erase mcu rom * BLANK View mcu rom blank *", 00DH, 00AH<br />

DB "* RESET Reset mcu * UPDAT Updata mcu romcode *", 00DH, 00AH<br />

DB "**************************************************************************", 0FFH, 0FFH<br />

;<br />

RET<br />

COMMERRORTBL: DB 00DH, 00AH, "Bad command", 0FFH<br />

;<br />

RET<br />

WARNINGTBL: DB 00DH, 00AH, "Are you sure (Y/N)", 0FFH<br />

RET<br />

SECTBL: DB 00DH, 00AH, "Are you security (Y/N)", 0FFH<br />

RET<br />

INPUTTBL: DB 00DH, 00AH, "Input: ", 0FFH<br />

;<br />

RET<br />

SYSINFOTBL: DB 00DH, 00AH, "Winbond W78E<strong>51</strong>6 <strong>51</strong>2/64K"<br />

;<br />

DB 00DH, 00AH, " Ver 1.00", 0FFH<br />

RET<br />

BAUDINFOTBL: DB 00DH, 00AH, " Baud rate 38400", 00DH, 00AH, 0FFH<br />

DB 00DH, 00AH, " Baud rate 19200", 00DH, 00AH, 0FFH<br />

DB 00DH, 00AH, " Baud rate 9600 ", 00DH, 00AH, 0FFH<br />

DB 00DH, 00AH, " Baud rate 4800 ", 00DH, 00AH, 0FFH<br />

RET<br />

SETBFUNTBL: DB 00DH, 00AH, "0) 38400 1) 19200 2)9600 3)4800 4)Exit Input:<br />

", 0FFH<br />

RET<br />

SETERRORTBL: DB 00DH, 00AH, "Error !!! Input: ", 0FFH<br />

RET<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

155


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

SFRNAMETBL: DB 00DH, 00AH, " PSW = ", 0FFH<br />

DB " IE = ", 0FFH, 0FFH, 0FFH<br />

DB " TCON = ", 0FFH, 0FFH<br />

DB " TMOD = ", 0FFH, 0FFH<br />

DB 00DH, 00AH, " SCON = ", 0FFH<br />

DB " SBUF = ", 0FFH, 0FFH, 0FFH<br />

DB " T2CON = ", 0FFH, 0FFH<br />

DB " T2MOD = ", 0FFH, 0FFH<br />

DB 00DH, 00AH, " PCON = ", 0FFH<br />

DB " SP = ", 0FFH, 0FFH, 0FFH<br />

DB " DPL = ", 0FFH, 0FFH<br />

DB " DPH = ", 0FFH, 0FFH<br />

DB 00DH, 00AH, " P0 = ", 0FFH<br />

DB " P1 = ", 0FFH, 0FFH, 0FFH<br />

DB " P2 = ", 0FFH, 0FFH<br />

DB " P3 = ", 0FFH, 0FFH<br />

RET<br />

UPDATAOKTBL: DB 00DH, 00AH, " Updata Ok !!! ", 0FFH<br />

RET<br />

UPDATAERRORTBL: DB 00DH, 00AH, " Updata Error !!! ", 0FFH<br />

RET<br />

ERASETBL: DB 00DH, 00AH, " Erase Ok !!! ", 0FFH<br />

RET<br />

BLANKOKTBL: DB 00DH, 00AH, " Blank Ok !!! ", 0FFH<br />

RET<br />

BLANKERRORTBL: DB 00DH, 00AH, " Blank Error !!! ", 0FFH<br />

RET<br />

VERIFYOKTBL: DB 00DH, 00AH, " Verify Ok !!! ", 0FFH<br />

RET<br />

VERIFYERRORTBL: DB 00DH, 00AH, " Verify Error !!! ", 0FFH<br />

RET<br />

SECOKTBL: DB 00DH, 00AH, " Security Ok !!! ", 0FFH<br />

RET<br />

SECERRORTBL: DB 00DH, 00AH, " Security Error !!! ", 0FFH<br />

RET<br />

;****************************************************<br />

;* 结 束 *<br />

;****************************************************<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

END<br />

156


<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

应 用程 序 (含 在线 编 程 控 制 程 序 )<br />

; *************************<br />

; * 可 在系统修改程序 *<br />

; * 电 子屏字符显示器 *<br />

; * “ 电子设计” *<br />

; * 2001.10.23 LRM *<br />

; *************************<br />

; 四 个显示字符数据表以在 50H— 6FH 单 元内,字符用 8*8 点阵,R4( 30H) 用 于<br />

; 控 制显示静止字的时间,R5( 31H) 静止字显示跳转地址步距,B内放显示首址<br />

;<br />

;************;<br />

;中 断入口程序;<br />

;************;<br />

;<br />

ORG 0000H<br />

LJMP START<br />

ORG 0003H<br />

RETI<br />

ORG 000BH<br />

RETI<br />

ORG 0013H<br />

RETI<br />

ORG 001BH<br />

RETI<br />

ORG 0023H<br />

LJMP INTS<br />

ORG 002BH<br />

RETI<br />

T2CON EQU 0C8H ; T2 控 制寄存器<br />

T2MOD EQU 0C9H ;<br />

TL2 EQU 0CCH ; T2 计 数寄存器低字节<br />

TH2 EQU 0CDH ; T2 计 数寄存器高字节<br />

TR2 EQU 0CAH ; T2 启 动 位<br />

RCAP2L EQU 0CAH ; T2 计 数重栽寄存器低字节<br />

RCAP2H EQU 0CBH ; T2 计 数重栽寄存器高字节<br />

CHPCON EQU 0BFH ; 在 系统编程控制寄存器<br />

CHPENR EQU 0F6H ; 编 程 状态下 MTP ROM 的 控制字节<br />

寄存器<br />

SFRAL EQU 0C4H ; 编 程 状态下的目标低地址<br />

SFRAH EQU 0C5H ; 编 程 状态下的目标高地址<br />

SFRFD EQU 0C6H ; 编 程 状态下 MTP ROM 的 编 程数据<br />

SFRCN EQU 0C7H ;<br />

TXOKFLAG EQU 003H<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

157


;<br />

;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

CLEARMEN: MOV PSW, #00H ; 设 第 一 组 寄 存 器<br />

许 接收<br />

MOV SP, #0F1H ; 设 置 堆栈指针<br />

MOV SCON, #01010000B ; 串 口 工 作方式 1 (8 BIT UART) 允<br />

MOV T2CON, #00110000B ; T2CON<br />

MOV A,#0ECH<br />

MOV TL2, A ;设 置 波 特率 ( 19200)<br />

MOV RCAP2L, A ;<br />

MOV A,#0FFH<br />

MOV TH2, A ;<br />

MOV RCAP2H, A ;<br />

SETB ES ; 允 许串口中断<br />

MOV IP, #00H ; 低 优 先 级<br />

SETB TR2 ; 启 动 定 时计数器 2<br />

SETB REN ; 启 动 串 口 接收中断<br />

CLR TI ; 清 串 口 发送中断标志位<br />

CLR RI ; 清 串 口 接收中断标志位<br />

SETB EA ; 开 放所有中断<br />

RET<br />

CLEARMEN1: MOV A,#0FFH<br />

MOV P1,A<br />

MOV P2,A<br />

MOV P3,A<br />

MOV P0,A<br />

MOV DPTR,#TAB2<br />

CLR A<br />

MOV 20H,A<br />

MOV 21H,A<br />

MOV 22H,A<br />

MOV 23H,A<br />

MOV R3,A<br />

MOV R1,#50H<br />

MOV R2,#20H<br />

CLLOOP: MOVC A,@A+DPTR<br />

MOV @R1,A<br />

MOV A,R3<br />

INC A<br />

MOV R3,A<br />

INC R1<br />

DJNZ R2,CLLOOP<br />

MOV 30H,#0A0H<br />

MOV 31H,#08H<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

158


;<br />

RET<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

START: LCALL CLEARMEN ;<br />

LCALL CLEARMEN1<br />

START1: LCALL DISP1<br />

AJMP START1<br />

PUTPASS: MOV DPTR,#PASSTBL ;<br />

LCALL DISPINFO ;<br />

AJMP LOOP3 ;<br />

APROM: LJMP APROMOUT ;<br />

;<br />

;<br />

DISP1: MOV B,#50H<br />

MOV R4,30H<br />

MOV R5,31H<br />

LOOP: JBC 04H,APROM ;<br />

LOOP3: LCALL DISPLAY<br />

JBC 05H,PUTPASS ;<br />

DJNZ R4,LOOP<br />

MOV R4,30H<br />

MOV A,B<br />

CJNE A,#68H,CONT<br />

RET<br />

CONT: ADD A,R5<br />

;<br />

;<br />

MOV B,A<br />

AJMP LOOP<br />

DISPLAY: MOV A,#0FFH<br />

MOV P0,A<br />

MOV P2,A<br />

MOV R6,#0FEH<br />

MOV R0,B<br />

MOV R7,#08H<br />

DISLOOP: MOV A,@R0<br />

MOV P0,A<br />

MOV P2,R6<br />

LCALL DL1MS<br />

INC R0<br />

MOV A,R6<br />

RL A<br />

MOV R6,A<br />

DJNZ R7,DISLOOP<br />

RET<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

159


;<br />

;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

DL1MS: MOV R3,#0FFH ;256*4<br />

LOOPK: NOP<br />

;<br />

;<br />

NOP<br />

DJNZ R3,LOOPK<br />

RET<br />

TAB1: DB 0EFH,83H,0ABH,83H,0ABH,83H,0EEH,0E0H ; 电<br />

;<br />

DB 0FFH,0C7H,0EFH,83H,0EFH,0EFH,0CFH,0EFH ; 子<br />

DB 0B1H,0B5H,04H,0BFH,0B1H,0B5H,9BH,0A4H ; 设<br />

DB 0BBH,0BBH,1BH,0A0H,0BBH,0BBH,9BH,0BBH ; 计<br />

DB 00H,00H,00H,00H<br />

TAB2: DB 0F7H,0EFH,0C1H,0D5H,000H,0D5H,0D9H,0BDH ;舟<br />

;<br />

DB 0FFH,0F7H,0F7H,0F7H,0D5H,0D5H,0C1H,0FFH ;山<br />

DB 0F7H,0EFH,0C1H,0D5H,000H,0D5H,0D9H,0BDH ;舟<br />

DB 0FFH,0F7H,0F7H,0F7H,0D5H,0D5H,0C1H,0FFH ;山<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

;; 进 入 4K— LDROM 的程序 ;;<br />

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />

INTS: PUSH PSW<br />

;<br />

PUSH ACC<br />

PUSH B<br />

MOV PSW,#08H<br />

JBC RI,RXINTS<br />

JNB TI,INTSOUT<br />

CLR TI<br />

SETB TXOKFLAG<br />

LJMP INTSOUT<br />

RXINTS: MOV A,SBUF<br />

XRL A,#0DH<br />

JNZ PASSFLAG<br />

SETB 04H<br />

INTSOUT: POP B<br />

POP ACC<br />

POP PSW<br />

RETI<br />

PASSFLAG: SETB 05H<br />

;<br />

LJMP INTSOUT<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

160


;<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

PASSTBL: DB " pass ERROR ! ",0DH,0AH,0FFH,0FFH,0FFH,0FFH,0FFH<br />

RET<br />

; DPTR 内 容是表的首址<br />

; 显 示表格内容<br />

DISPINFO: CLR A ;<br />

MOV R2, A ;<br />

READDISPCODE: MOV A, R2 ;<br />

MOVC A, @A+DPTR ; 查 表<br />

MOV R1, A ;<br />

INC R2 ; 计 数器加一<br />

MOV A, R2 ;<br />

JNZ READOVER ; 计 数器溢出处理<br />

INC DPH ;<br />

READOVER: MOV A, R1 ;<br />

DISPINFOOUT: RET<br />

; A 内 容 待 发字符<br />

INC A ;<br />

JZ DISPINFOOUT ; 读 到 结束符结束<br />

CLR TXOKFLAG ;<br />

DEC A ;<br />

LCALL PUTCHAR ; 发 送字符<br />

LJMP READDISPCODE ;<br />

PUTCHAR: CLR TXOKFLAG ;<br />

MOV SBUF, A ;<br />

JNB TXOKFLAG, $ ;<br />

RET<br />

APROMOUT: MOV CHPENR,#87H ;进 入 LDROM 方式<br />

MOV CHPENR,#59H<br />

MOV CHPCON,#03H<br />

MOV TCON,#00H ;关 T0、 T1<br />

MOV T2CON,#00H ;关 T2<br />

MOV IP,#00H ;同 优 先 级<br />

MOV IE,#82H ;允 许 T0 中断,总中断开放<br />

MOV TL0,#0FBH ;装 初 值,定时为 5UF<br />

MOV TH0,#0FFH<br />

MOV TMOD,#01H ;T0 为 16 位 定 时器<br />

MOV TCON,#10H ;开 启 T0<br />

MOV PCON,#01H ;进 入在线编程模式,等待唤醒后进入 4K— LDROM 程序<br />

END<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

161


本 书 编 著 参考书籍:<br />

<strong>MCS</strong>-<strong>51</strong> 系 列 单 片 机 设 计 实 例<br />

何立民. 单 片机高级教程— 应用与设计. 2000.8<br />

何 立 民 . 单 片机中级教程— 原理与应用. 2000.6<br />

何 立 民 . <strong>MCS</strong>--<strong>51</strong> 单片机应用系统设计. 1990.1<br />

李勋、刘源. 单 片机实用教程.2000.6<br />

徐爱钧. 智 能化测量控制仪表原理与设计. 1995.11<br />

徐永权. FLASH 单片机原理及应用. 1997.10<br />

王福瑞. 单 片微机测控系统设计大全. 1999.3<br />

PDF created with FinePrint pdfFactory trial version http://www.fineprint.com<br />

162

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!