采用方式2发送TBB为奇偶校验位发送波特率为375khz,晶振采用12mhz SMOD=1的子程序
时间: 2023-11-22 18:56:35 浏览: 39
以下是采用方式2发送TBB为奇偶校验位发送波特率为375khz,晶振采用12mhz SMOD=1的示例子程序:
```
; 设置波特率为375khz,晶振为12mhz,SMOD=1
MOV TMOD, #20H ; 设置定时器1为模式2
MOV TH1, #-17 ; 波特率 = 375000 / (32 * (256 - TH1)),TH1 = -17 对应波特率为375khz
SETB TR1 ; 启动定时器1
; 发送数据
SEND_DATA:
MOV A, TBB ; 将要发送的数据存入累加器中
MOV R7, #08H ; 设置循环次数为8次
SEND_BIT:
SETB P3.0 ; 发送起始位
MOV C, A ; 将累加器中的数据移动到进位标志位中
RRC A ; 将累加器中的数据右移一位,最低位填充进位标志位
JNC BIT_0 ; 如果进位标志位为0,则跳转到发送数据位0
CLR P3.0 ; 发送数据位1
SJMP BIT_DONE ; 跳转到发送完成
BIT_0:
SETB P3.0 ; 发送数据位0
BIT_DONE:
CLR P3.0 ; 发送结束位
DJNZ R7, SEND_BIT ; 循环发送8个数据位
RET
; 检查奇偶校验位
CHECK_PARITY:
MOV A, TBB ; 将要检查的数据存入累加器中
MOV R7, #08H ; 设置循环次数为8次
MOV R6, #0 ; 初始化奇偶校验位为0
CHECK_BIT:
MOV C, A ; 将累加器中的数据移动到进位标志位中
RRC A ; 将累加器中的数据右移一位,最低位填充进位标志位
JNC BIT_0 ; 如果进位标志位为0,则跳转到检查数据位0
CPL R6 ; 如果进位标志位为1,则取反奇偶校验位
BIT_0:
DJNZ R7, CHECK_BIT ; 循环检查8个数据位
MOV C, R6 ; 将奇偶校验位移动到进位标志位中
RET
; 发送数据和奇偶校验位
SEND_BYTE:
CALL CHECK_PARITY ; 检查奇偶校验位
MOV TBB, C ; 将奇偶校验位存入TBB中
CALL SEND_DATA ; 发送数据和奇偶校验位
RET
```
需要注意的是,此程序仅供参考,具体实现还需要根据具体的硬件平台和通信协议进行调整。同时,晶振频率和波特率的计算需要根据具体的计算公式进行计算,此处仅提供了一个大致的参考值。