标题: 单片机串口1接收和发送波特率不一样? [打印本页]

作者: dbkdz    时间: 2023-4-30 18:48
标题: 单片机串口1接收和发送波特率不一样?
请教用STC 12C系列单片机,12T模式。怎么配置定时器?这个单片机时钟是1T的。

STC-ISP看不懂啊。我需求是用一颗单片机,串口1,进来的数据接收用15200波特率,转发数据波特率是2400,8位。

T1和T2这里我不知怎么配置。哎。

不知道应该怎么配置T1和T2?


程序这样
        mov        r6,#0
        djnz        r6,$
        djnz        r7,initd
        clr addrf        
        mov sp,#127
        clr a
        mov 20h,a
        mov 21h,a
        mov 22h,a
        mov 23h,a   
        CLR     IE0
        CLR     IE1
        MOV     TCON,#00H

        orl pcon,#80h           ;使能波特率倍速位SMOD
        mov scon,#50h           ;8位数据,可变波特率
        mov tmod,#00100001b     ;工作模式2,8位计数器自动重载初值
        ANL AUXR,#0BFH                ;定时器时钟12T模式
        ANL AUXR,#0FEH                ;串口1选择定时器1为波特率发生器
        ANL TMOD,#0FH                ;设置定时器模式
        ORL TMOD,#20H                ;设置定时器模式
        MOV TL1,#0FFH                ;设置定时初始值
        MOV TH1,#0FFH                ;设置定时重载值
        CLR        ET1                ;禁止定时器中断
                                    
        MOV SCON,#50H                ;8位数据,可变波特率
        ORL AUXR,#01H                ;串口1选择定时器2为波特率发生器
        ANL AUXR,#0FBH                ;定时器时钟12T模式
        MOV T2L,#040H                ;设置定时初始值
        MOV T2H,#0FFH                ;设置定时初始值
        ORL AUXR,#10H                ;定时器2开始计时

        setb es ;中断允许
        setb ea ;中断总开关



作者: 飞云居士    时间: 2023-5-1 19:53
同一个串口不能实现你的要求。如要实现你说的功能,可以用两个串口实现,如S1设定波特率115200,用于接收数据;S2的波特率设定2400,用于发送数据
作者: 188610329    时间: 2023-5-2 00:09
你想要收发使用不同波特率,
要么,用两个串口, (STC12C好像没有)
要么,用传统C51  通过配置 T2CON 寄存器来实现 一个串口 发送和接收使用不同的定时器,达到用不同的波特率收发的目的. (比如STC89C51)
要么,用软件模拟串口,
要么,半双工模式,平时 接收的波特率 等待收数据, 发送的时候 修改定时器换波特率再发送,发送完成后再修改波特率等待数据传入。
作者: wulin    时间: 2023-5-2 07:07
单向串口接收转发只要一个串口和一个定时器即可完成,设置定时器1波特率115200,用串口中断等待接收。接收完成后关闭串口中断,更改定时器1波特率为2400,经短暂延时后转发数据。发送完成后恢复波特率115200,开串口中断,继续等待接收。连接方式如图:



作者: wys91203    时间: 2023-5-2 09:42
定时器是硬件,定时时间和软件运行时间没关系,你别搞混了
作者: coody_sz    时间: 2023-5-2 14:34
楼主,你应该使用2个串口,一个115200,一个2400。如果只用一个串口,则要不断的改变波特率。
作者: dbkdz    时间: 2023-6-16 18:02
188610329 发表于 2023-5-2 00:09
你想要收发使用不同波特率,
要么,用两个串口, (STC12C好像没有)
要么,用传统C51  通过配置 T2CON  ...

您好,我现在就是用这种方法。进来9600,出去2400,单独发8个字节一帧命令进来转出去都正常。如果进来的命令不断刷刷的9600波特率进来,转换出去的命令是错误的。请问有何办法?
作者: XLXUN    时间: 2023-6-16 18:15
定时器是硬件,定时时间和软件运行时间没关系
作者: coody_sz    时间: 2023-6-16 21:15
收发都用同一个波特率,怎么可能不同?
作者: 188610329    时间: 2023-6-18 14:18
本帖最后由 188610329 于 2023-6-18 16:02 编辑
dbkdz 发表于 2023-6-16 18:02
您好,我现在就是用这种方法。进来9600,出去2400,单独发8个字节一帧命令进来转出去都正常。如果进来的 ...

因为,你进来是9600  出去是2400, 所以,发出1个字节的时间, 可能会收到 4个字节的数据,这种情况下,是必须有缓冲池支持才行的。并且,如果会长时间收到大量数据,那么还需要 流控制,基于你收发连接不同的设备,软件流xon xoff 是肯定不能用了,那么就要考虑硬件流控制了。先不说硬件流了,假定,你连续收到数据不会超过300字节,可以这么考虑:

XSEG AT 0000H
Uart_Buf:      DS    100H

Flag_Seg    Segment BIT
RSEG  Flag_Seg
TI_Busy:       DBIT  1

CSEG AT 0023H
PUSH   PSW
MOV    PSW,#08H
USING  1
PUSH   ACC
JNB   RI,TI_Roop
CLR   RI
MOV   A,SBUF
MOVX  @R1,A
INC    R1
TI_Roop:
JNB   TI,Check_Send
CLR   TI
CLR   TI_Busy
Check_Send:JB   TI_Busy,End_UartInt
MOV  A,R0
XRL   A,R1
JZ     End_UartInt
MOVX   A,@R0
MOV    SBUF,A
INC     R0
SETB   TI_Busy
End_UartInt:
POP  ACC
POP  PSW
RETI

主程序你自己写一下初始化串口的定时器,以及,把工作组1 的 R0,R1 初始化为0即可,其实如果你用了 STARTUP.A51 他默认也是清0的。应该就行了。这就全后台完成转发了,一般情况下应该够用了,如果你真的数据量很大,就必须要考虑硬件流控制来通知上位机忙,等待你转发完成再发送后续数据了。






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1