晶振为11.0592MHZ,串行通信的波特率为9600bps民,定时器T1的工作方式2,波特率=((2的SMOD次方)x F)/(32x12x(256-N),
F是晶振频率,SMOD是特殊功能寄存器PCON的第7位,取1或0(波特率倍增,或不倍增)。
当SMOD取0,波特率=F/(32x12x(256-N)),
定时器初装值N =256-F/(波特率x32x12)=256-1105920/(9600x32x12)=253 ,即0FDh 即0xFD,
汇编语言程序如下:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INIT: ;初始化程
MOV TMOD,#20H ;定时器T1工作方式2(8位自动重载计数初值)
MOV TH1,#0FDH ;置入初装值
MOV TL1,#0FDH ;置入重装值
MOV SCON, #70H ;; 设定串口工作方式1,8位UART,接收允许
ANL PCON, #00H ;; 波特率不倍增
SETB TR1 ;; 启动定时器T1
MOV IE, #0 ;; 禁止任何中断
CALL DLY125 ;; 延时125ms
SETB TR1 ;启动T1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
T_X: ;;发送端的发送程序
MOV R3, #9 ;; 待发送字符个数
MOV DPTR, #TAB_TX ;; 数据表首址
TX_LP1: CLR A
MOVC A, @A+DPTR ;; A←数据表的1个字符
CLR TI ;; TI清零,允许发送
MOV SBUF,A ;; 发送1个字符
JNB TI, $ ;; 等待1个字符帧发送结束
DJNZ R3, TX_next
CALL DLY500 ;; 延时500ms
JMP T_X ;; 重复发送
TX_next: ;; 发送另一字符
INC DPTR ;; 数据表指针移动
SJMP TX_LP1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
R_X: ;; 接收端的接收程序
CLR RI ;; RI清零,允许接收字符
MOV R3, #4 ;; 待接收字符个数
MOV DPTR, #DAT_tab ;; 数据表首址
RX_1chr: ;; 接收1个字符
JNB RI, $ ;; 等待1个字符帧接收完毕
RX_check: ;; 检测收到的字符正确否
CLR A
MOVC A, @A+DPTR ;; A←数据表的1个字符
INC DPTR ;; 数据表指针移动
CLR RI ;; RI清零,允许接收字符
SJMP RX_1chr ;; 接收另一字符
RX_err: ;; 接收字符出错处理
CALL DLY500 ;; 延时500ms
AJMP R_X ;; 重新接收
|