LJMP INTST
MAINT: MOV SCON,#90H ;置工作方式2,并允许接收 MOV TMOD,#20H ;置T1工作方式2 MOV TH1,#0FDH MOV TL1,#0FDH
MOV DPTR,#ADDR ;设置数据块首址ADDR的地址指针
MOV R0,#120 ;设置发送字节数 MOV R1,#00H ;设置校验和的初值
MOV R2,#NAME SETB TB8 ;置位TB8位,作为发送地址桢信息特征 SETB TR1
SETB EA ;CPU开中断
SETB ES ;允许串行口中断 MOV A,R2 ;发送地址桢信息 MOV SBUF,A SJMP $
;中断服务程序
INTST: MOV A,TB8 ;判断是发送地址还是数据,若为数据则转
LOOP0
CJNE A,01H,LOOP0
CLR TI ;地址桢信息发送完后清发送中断
LOOP0:JB RI,LOOP1 ;检查是否是接受中断?若RI=1则转
入接受乙机发送应答信息
CLR TI ;因RI=0,表明是甲机发送中断数据的中断请
求。CPU响应中断,在中断服务程序中应清中断标志
MOV A,TB8; CJNE A,#01H,LOO3 ;若为发送数据中断则转LOOP3
继续发送数据 LJMP ENDT ;甲机发送一数据完毕跳至中断返回程序
LOOP1:CLR RI ;清接受中断标志 MOV A,TB8 ;判断是发送地址还是数据,若为数据则转
LOOP2
CJNE A,#01H,LOOP4;若TB8为0则接受的为乙机数
据校验应答 MOV A,SBUF ;取乙机的应答数据
CJNE A,@R2,LOOP2 ;若乙机应答信息不是从机地
址,则地址传送不正确,则转LOOP2程序重新发送地址信息,
否则清TB8,发送数据
CLR TB8
LOOP3:MOVX A,@DPTR ;取下一个数 MOV SBUF,A ;启动串行口,发送新的数据
XRL A,@R1 MOV @R1,A INC DPTR ;修改地址指针 DEC R0 ;修改发送字节数记数值
CJNE R0,#00H,ENDT ;判别120个字节数据都发送
完没有。如果没有发送完则跳至中断返回程序。继续发送
MOV A,@R1 MOV SBUF,A ;数据全部发送完毕则发送校验和 LJMP ENDT LOOP4:MOV A,SBUF ;取乙机的应答数据 CJNE A,#00H,LOOP5 ;若数据发送不正确,则
转LOOP5重新发送
CLR ES ;全部发送完毕,禁止串行口中断 LOOP5:MOV DPTR,#ADDR ;设置数据块首址ADDR的地址指针
MOV R0,#120 ;设置发送字节数 MOV R1,#00H ;设置校验和的初值 LJMP LOOP2 LOOP2:MOV A,R2 ;发送地址桢信息 MOV SBUF,A RETI ENDT: RETI
END
从机程序如下:
ORG 0000H
LJMP MAINR ;跳至主程序入口地址 ORG 0023H ;串行口中断服务程序入口 LJMP INTSR
MAINR:MOV SCON,#0B0H ;置工作方式2,并允许接收 MOV TMOD,#20H ;置T1工作方式2 MOV TH1,#0FDH MOV TL1,#0FDH
MOV DPTR,#ADDR ;设置数据块接收首址为ADDR
MOV R0,#120 ;设置接收字节数
MOV R2,#NAME MOV R1,#00H ;设置校验和的初值 SETB RB8 ;置位RB8位,作为接受地址信息特征 SETB TR1
SETB EA ;CPU开中断
SETB ES ;允许串行口中断 SJMP $
;中断服务程序
INTSR: MOV A, RB8 ;判断是接收地址还是数据,若为数据则转
LOOP0
CJNE A,01H,LOOP0
CLR RI ;地址桢信息接受完后清接收中断 MOV A,SBUF XRL A,@R2 JZ LOOP ;若地址相符则转LOOP,否则中断返回 LJMP ENDR
LOOP: CLR SM2 CLR RB8 MOV A,@R2 MOV SBUF,A ;想主机发送从机地址
LJMP ENDR
LOOP0:JB RI,LOOP1 ;检查是否是接受中断?若RI=1则转
入接受甲机发送的数据
CLR TI ;因RI=0,表明是乙机发送中断数据的中断请
求。CPU响应中断,在中断服务程序中应清中断标志
LJMP ENDR ;甲机发送一数据完毕跳至中断返回程序 LOOP1:CLR RI ;清接受中断标志 DEC @R0 JZ LOOP2 ;数据未接收完则中断返回,若接收完则转
LOOP2,校验 MOV A,SBUF ;取甲机发送的数据
MOVX @DPTR,A XRL A,@R1 MOV @R1,A LOOP2:MOV A,SBUF :取甲机发送的校验和 XRL A,@R1 JZ RIGHT LJMP WRONG
RIGHT:MOV MOV LJMP WRONG:MOV MOV
MOV
MOV LJMP ENDR: RETI END
A,#00H
SBUF,A ENDR A,#0FFH SBUF,A
DPTR,#ADDR ;设置数据块接收首址为ADDR R0,#120 ;设置接收字节数 ENDR
《单片机原理及应用》
1、分析程序的执行结果,将结果填写到空格中。
ORG 0000H
MOV 30H,#50H MOV R0,#30H MOV A,@R0 ;(A= 50H ) MOV A,#79H
MOV B,#20H ;(A= 79H B= 20H )
DIV AB ;(A= 03H B= 19H ) PUSH B MOV B,#0AH MUL AB ;(A= 1E B= 00H )
POP B ADD A,B ;(A= 37H B= 19H ) MOV 30H,A ;(30H单元的内容= 37H )
LOOP: AJMP LOOP 2、 MCS51内部RAM50H~55H单元存放的12个16进制数变为ASCII码,
放到2800H单元开始的外部RAM中。 MAIN: MOV R0,#50H MOV R2,#6
MOV DPTR, #2800H
HASC:
MOV A,@R0 ANL A,#0FH ;屏蔽高四位 ADD A,#0DH
MOVC A,@A+PC ;查表低四位转换为ASCII码 MOVX @DPTR,A ;送如外部RAM INC DPTR MOV A,@R0 ANL A,#0F0H SWAP A ADD A,#6
MOVC,@A+PC ;高四位转换为ASCII码 MOVX @DPTR,A INC R0 INC DPTR
DJNZ R2,HASC END
ASCTAB:DB 30H 31H 32H 33H 34 H 35H 36H 37H 38H 39H DB41H 42H 43H 44H 45H 46H
3、 编制四个十六进制单字节数相加后求平均的程序。
假设4个16进制的单字节分别为a,b,c,d,计算结果方到e中 #include
#define uchar unsigned char void main(void) {
uchar a,b,c,d,e; e=(a+b+c+d)/4; while(1); }
4、 用8031的T0定时/计数器,设计程序,实现在P1.0输出50ms的方波,
输出100个方波后停止输出。 #include
#define uchar unsigned char