|
发表于 2023-7-13 22:09:11
|
显示全部楼层
如果发送和接收需要不同的波特率。有两种方法。89C系列单片机可用T2做接收波特率或者发送波特率,可用T1定时器做接收或者发送波特率。你仔细看T2CON的RCLK时钟标志的定义就知道了。当RCLK=1,定时器做串口1的接收波特率。当TCLK=1,定时器做串口1的发送波特率; 另外一种方法就是用:STC12C系列 晶振11.0592 串口1 2400波特率 8位数据
独立波特率发生器 倍速SMOD打开 定时器时钟12T
ORL PCON,#80H ;使能波特率倍速位SMOD
MOV SCON,#50H ;8位数据,可变波特率
ANL AUXR,#0FBH ;定时器时钟12T模式
ORL AUXR,#01H ;串口1使用独立波特率发生器
ORL AUXR,#10H ;启动独立波特率发射
;思路 初始化检测拨码定位当前接收波特率。
;串口RXD接收完,再改固定2400波特率发送,发完了再检测拨码改回去
MOV BRT,#0E8H ;2400重载值
MOV BRT,#0F4H ;4800重载值
MOV BRT,#0FAH ;9600重载值
MOV BRT,#0FFH ;115200重载值
以上成功,但不能用1T模式,速率稍慢
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
下面再改进:
11.0592 串口1通用 8位数据 定时器1-8位自动重载 不倍增 选择1T模式
ANL PCON,#7FH ;波特率不倍速
MOV SCON,#50H ;8位数据,可变波特率
ORL AUXR,#40H ;定时器时钟1T模式
ANL AUXR,#0FEH ;串口1选择定时器1为波特率发生器
ANL TMOD,#0FH ;设置定时器模式
ORL TMOD,#20H ;设置定时器模式
CLR ET1 ;禁止定时器中断
SETB TR1 ;定时器1开始计时
MOV TL1,#070H ;2400设置定时初始值
MOV TH1,#070H ;2400设置定时重载值
MOV TL1,#0B8H ;4800设置定时初始值
MOV TH1,#0B8H ;4800设置定时重载值
MOV TL1,#0DCH ;9600设置定时初始值
MOV TH1,#0DCH ;9600设置定时重载值
MOV TL1,#0FDH ;115200设置定时初始值
MOV TH1,#0FDH ;115200设置定时重载值
以上成功,但1T模式,4800 9600停止码还是乱码,改成12T试试(不能115200)换回此程序
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
下面再改进:
11.0592 串口1通用 8位数据 定时器1-8位自动重载 倍增,倍增才能产生115200 选择12T模式
ANL PCON,#80H ;波特率倍速
MOV SCON,#50H ;8位数据,可变波特率
ANL AUXR,#0BFH ;定时器时钟12T模式
ANL AUXR,#0FEH ;串口1选择定时器1为波特率发生器
ANL TMOD,#0FH ;设置定时器模式
ORL TMOD,#20H ;设置定时器模式
CLR ET1 ;禁止定时器中断
SETB TR1 ;定时器1开始计时
MOV TL1,#0E8H ;2400设置定时初始值
MOV TH1,#0E8H ;2400设置定时重载值
MOV TL1,#0F4H ;4800设置定时初始值
MOV TH1,#0F4H ;4800设置定时重载值
MOV TL1,#0FAH ;9600设置定时初始值
MOV TH1,#0FAH ;9600设置定时重载值
MOV TL1,#0FFH ;115200设置定时初始值 11.0592 12T模式 倍增出来的115200误差50%无法用
MOV TH1,#0FFH ;115200设置定时重载值
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
程序初始化的时候:接收的时候选择T1做波特率,
串口中断产生后,进接收程序,接收完后转发前,修改T1定时器做发送波特率的数值。发送完再改回来接收的波特率。我试过可以的。很好用。
|
|