51 单片机串行通讯中波特率的自动检测
附: 波特率自动检测程序(通过验证)
RX BIT P3.0 ;串行数据接收端
CharH EQU 30H ;计时数据高位 TH0
CharL EQU 31H ;计时数据低位 TL0
BaudRt EQU 32H ;波特率计算值
;subroutine
AutoBaud: MOV TMOD, #01H ;初始化“T0”为计时器
MOV TH0, #0
MOV TL0, #0
MOV TCON, #0
MOV CharH, #0
MOV CharL, #0
JB RX, $ ;等待通讯开始位
SETB TR0
CHK1: JBC TF0, CHK_END ;若溢出,则开始计算
JNB RX, $-2 ;检测串行数据上升沿
MOV CharH, TH0 ;捕获“T0”计时数
MOV CharL, TL0
JBC TF0, CHK_END ;若溢出,则开始计算
JB RX, $-2 ;检测串行数据下降沿
SJMP CHK1
CHK_END: CLR TR0 ;停止计数器
MOV DPTR, #baudtable
MOV BaudRt, #19
LOOP: MOV A, BaudRt ;
MOVC A, @A+DPTR ;取表格数据(高位)
DEC BaudRt ;索引地址减 1
CJNE A, CharH, CMP_1 ;检查结果范围
SJMP CMP_LOW
CMP_1: JC MATCH ;若表中值 计时值,则匹配
DJNZ BaudRt, LOOP
SJMP MATCH ;表查完,至结束查表程序
CMP_LOW: MOV A, BaudRt ;高位相等,比较低位
MOVC A, @A+DPTR
CJNE A, CharL, CMP_2
SETB C ;相等则匹配
CMP_2: JC MATCH ;若低位字节 计时值,则匹配
DJNZ BaudRt, LOOP
MATCH: MOV A, BaudRt ;转换为波特率索引值
CLR C
RRC A
MOV BaudRt, A ;保存
RET
;波特率索引表(LSB 在前,MSB 在后,晶振为11.0592MHz)
baudtable: DB 03CH,00H ;0-越限,值太小
DB 078H,00H ;1-波特率 38400
DB 0F0H,00H ;2-波特率 19200
DB 0E0H,01H ;3-波特率 9600
DB 0C0H,03H ;4-波特率 4800
DB 080H,07H ;5-波特率 2400
DB 00H,00FH ;6-波特率 1200
DB 00H,01EH ;7-波特率 600
DB 00H,03CH ;8-波特率 300
DB 00H,078H ;9-越限,值太大
END
- 关于RTX51 TINY的分析与探讨(05-30)
- 浅析8051模块化编程技巧(05-28)
- 基于DSP和单片机通信的液晶显示设计方案(07-20)
- 锁相环控制及初始化简析(08-27)
- 基于MSP430自动胀管控制器的研究(09-07)
- 嵌入式C实现延时程序的不同变量的区别(03-01)