找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1183|回复: 9
收起左侧

单片机串口1接收和发送波特率不一样?

[复制链接]
回帖奖励 2 黑币 回复本帖可获得 2 黑币奖励! 每人限 1 次
ID:1074735 发表于 2023-4-30 18:48 | 显示全部楼层 |阅读模式
请教用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 ;中断总开关


回复

使用道具 举报

ID:404160 发表于 2023-5-1 19:53 | 显示全部楼层
同一个串口不能实现你的要求。如要实现你说的功能,可以用两个串口实现,如S1设定波特率115200,用于接收数据;S2的波特率设定2400,用于发送数据
回复

使用道具 举报

ID:624769 发表于 2023-5-2 00:09 | 显示全部楼层
你想要收发使用不同波特率,
要么,用两个串口, (STC12C好像没有)
要么,用传统C51  通过配置 T2CON 寄存器来实现 一个串口 发送和接收使用不同的定时器,达到用不同的波特率收发的目的. (比如STC89C51)
要么,用软件模拟串口,
要么,半双工模式,平时 接收的波特率 等待收数据, 发送的时候 修改定时器换波特率再发送,发送完成后再修改波特率等待数据传入。
回复

使用道具 举报

ID:213173 发表于 2023-5-2 07:07 | 显示全部楼层
单向串口接收转发只要一个串口和一个定时器即可完成,设置定时器1波特率115200,用串口中断等待接收。接收完成后关闭串口中断,更改定时器1波特率为2400,经短暂延时后转发数据。发送完成后恢复波特率115200,开串口中断,继续等待接收。连接方式如图:
无标题.jpg

回复

使用道具 举报

ID:116103 发表于 2023-5-2 09:42 | 显示全部楼层
定时器是硬件,定时时间和软件运行时间没关系,你别搞混了
回复

使用道具 举报

ID:1034262 发表于 2023-5-2 14:34 | 显示全部楼层
楼主,你应该使用2个串口,一个115200,一个2400。如果只用一个串口,则要不断的改变波特率。
回复

使用道具 举报

ID:1074735 发表于 2023-6-16 18:02 | 显示全部楼层
188610329 发表于 2023-5-2 00:09
你想要收发使用不同波特率,
要么,用两个串口, (STC12C好像没有)
要么,用传统C51  通过配置 T2CON  ...

您好,我现在就是用这种方法。进来9600,出去2400,单独发8个字节一帧命令进来转出去都正常。如果进来的命令不断刷刷的9600波特率进来,转换出去的命令是错误的。请问有何办法?
回复

使用道具 举报

ID:849635 发表于 2023-6-16 18:15 | 显示全部楼层
定时器是硬件,定时时间和软件运行时间没关系
回复

使用道具 举报

ID:1034262 发表于 2023-6-16 21:15 | 显示全部楼层
收发都用同一个波特率,怎么可能不同?
回复

使用道具 举报

ID:624769 发表于 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的。应该就行了。这就全后台完成转发了,一般情况下应该够用了,如果你真的数据量很大,就必须要考虑硬件流控制来通知上位机忙,等待你转发完成再发送后续数据了。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表