设计一个串行方式2发送子程序(SMOD=0) 甲机每隔1s(fosc=6MHz 用T0中断)
问题详情
设计一个串行方式2发送子程序(SMOD=0),甲机每隔1s(fosc=6MHz,用T0中断)从P1口读入8位数据串行发送,第9数据位作为奇偶校验位。接到乙机核对正确的回复信号(用00H表示)后,置P3.5=1(正确指示灯亮)。否则置P3.5=0(正确指示灯灭),再重发一遍,直至乙机发回正确回复信号。
参考答案
程序如下:
ORG 0000H ;复位地址
LJMP ATRS ;转初始化程序
ORG 000BH ;T0中断入口地址
LJMP IT0 ;转T0中断服务程序
ORG 0023H ;串行中断入口地址
LJMP AIS ;转甲机串行中断服务程序
ORG 0100H ;初始化程序首地址
ATRS:MOV TMOD,#01H ;置T0定时器方式1
MOV TH0,#3CH ;置T0初值100ms
MOV TL0,#0B0H ;
SETB PT0 ;置T0为高优先级
MOV SCON,#90H ;置串行方式2,允许接收
MOV PCON,#00H ;置SMOD=0
MOV R7,#0AH ;置100ms计数器初值
SETB TR0 ;T0启动
MOV IE,#10010010B;T0、串口开中
LJMP MAIN ;转主程序,并等待T0、串口中断
ORG 0200H ;T0中断服务程序首地址
IT0:MOV TH0,#3CH ;重置T0初值
MOV TL0,#0B0H ;
DJNZ R7,CRET ;判1S到否?1S未到转返回
MOV R7,#0AH ;1S到,恢复100mS计数器初值
MOV A,P1 ;从P1口读数据
MOV B,A ;存备份
MOV C,PSW.0 ;奇偶标志送TB8
MOV TB8,C ;
MOV SBUF,A ;启动发送
GRET:RETI ;T0中断返回
ORG 0300H ;甲机串行中断服务程序首地址
AIS:JNB TI,AISR ;判发送/接收中断?接收中断,转接收处理
CLR TI ;发送中断,清发送中断标志
RETI ;串行中断返回
AISR:CLR RI ;清接收中断标志
MOV A,SBUF ;读乙机回复信号
JNZ A,AIST ;非0有错,转重发
SETB P3.5 ;全0正确,正确指示灯亮
RETI ;中断返回
AIST:CLR P3.5 ;正确指示灯灭
MOV A,B ;重读数据(备份)
MOV C,PSW.0 ;奇偶标志送TB8
MOV TB8,C ;
MOV SBUF,A ;重发
RETI ;串行中断返回