找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5398|回复: 13
打印 上一主题 下一主题
收起左侧

C51或C52单片机的波特率怎么设置,以500K为例?

  [复制链接]
回帖奖励 40 黑币 回复本帖可获得 2 黑币奖励! 每人限 1 次(中奖概率 90%)
跳转到指定楼层
楼主
本帖最后由 123fanfanfan 于 2020-6-15 15:47 编辑

我要通过串口发送数据,下边的2400波特率是怎么设置的。如果改成500K程序该怎么写
void Init_UART  (void)
{
    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
    TMOD  = 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
    TH1   = 0xF3;               // TH1:  重装值 2400 波特率 晶振 12MHz  
    TR1   = 1;                  // TR1:  timer 1 打开                        
    EA    = 1;                  //打开总中断
   // ES    = 1;                  //打开串口中断
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:768770 发表于 2020-6-16 08:31 | 只看该作者
51单片机波特率计算的公式和方法51单片机芯片的串口可以工作在几个不同的工作模式下,其工作
模式的设置就是使用SCON寄存器。它的各个位的具体定义如下: SMOSM1SM2RENTB8RB8TIRIS
M0、SM1为串行口工作模式设置位,这样两位可以对应进行四种模式的设置。串行口工作模式设
置。波特率在使用串口做通讯时,-个很重要的参数就是波特率,只有上下位机的波特率一样时才可
以进行正常通讯。波特率是指串行端口每秒内可以传输的波特位数。这里所指的波特率,如标准960
0不是每秒种可以传送9600个字节,而是指每秒可以传送9600个二进位,而一个字节要8个二进位,
如用串口模式1来传输那么加上起始位和停止位,每个数据字节就要占用10个二进位,9600波特率
用模式1传输时,每秒传输的字节数是9600+ 10= 960字节。51芯片的串口工作模式0的波特率是固
定的,为fosc/12,以一个12M的晶振来计算,那么它的波特率可以达到1M。模式2的波特率是固定
在fosc/64或fosc/32,具体用那一种就取决于PCON寄存器中的SMOD位,如SMOD为0,波特率focs/64,SMOD为1,波特率为focs/32。模式1和模式3的波特率是可变的,取决于定时器1或2 (52芯片)的溢出速率,就是说定时器1每溢出一-次,串口发送一次数据。 那么我们怎么去计算这两个模式的波特率设置时相关的寄存器的值呢?可以用以下的公式去计算。上式中如设置 了PCON寄存器中的SMOD
回复

使用道具 举报

板凳
ID:491577 发表于 2020-6-16 10:20 | 只看该作者
到STC网站下载:stc-isp-15xx-v6.87E.exe,里面有相关程序。直接复制粘贴就好。
回复

使用道具 举报

地板
ID:426861 发表于 2020-6-16 11:29 | 只看该作者
有软件可用的

捕获.PNG (93.05 KB, 下载次数: 36)

捕获.PNG
回复

使用道具 举报

5#
ID:780879 发表于 2020-6-16 12:04 | 只看该作者
51单片机波特率计算的公式和方法51单片机芯片的串口可以工作在几个不同的工作模式下,其工作 模式的设置就是使用SCON寄存器。它的各个位的具体定义如下: SMOSM1SM2RENTB8RB8TIRIS M0、SM1为串行口工作模式设置位,这样两位可以对应进行四种模式的设置。串行口工作模式设 置。波特率在使用串口做通讯时,-个很重要的参数就是波特率,只有上下位机的波特率一样时才可 以进行正常通讯。波特率是指串行端口每秒内可以传输的波特位数。这里所指的波特率,如标准960 0不是每秒种可以传送9600个字节,而是指每秒可以传送9600个二进位,而一个字节要8个二进位, 如用串口模式1来传输那么加上起始位和停止位,每个数据字节就要占用10个二进位,9600波特率 用模式1传输时,每秒传输的字节数是9600+ 10= 960字节。51芯片的串口工作模式0的波特率是固 定的,为fosc/12,以一个12M的晶振来计算,那么它的波特率可以达到1M。模式2的波特率是固定 在fosc/64或fosc/32,具体用那一种就取决于PCON寄存器中的SMOD位,如SMOD为0,波特率focs/64,SMOD为1,波特率为focs/32。模式1和模式3的波特率是可变的,取决于定时器1或2 (52芯片)的溢出速率,就是说定时器1每溢出一-次,串口发送一次数据。 那么我们怎么去计算这两个模式的波特率设置时相关的寄存器的值呢?可以用以下的公式去计算。上式中如设置 了PCON寄存器中的SMOD
回复

使用道具 举报

6#
ID:24758 发表于 2020-6-16 13:13 | 只看该作者
建议看看串口的工作原理,最好知道为什么那么去设置定时器T1的初值。

有个公式:

你把晶振频率,SMOD 和需要的波特率待入到上面公式计算,得到的X就是定时器T1的初始值。

另外:在串行通信中,晶振最好选11.0592MHz的,这样可以减小误差。

你给的程序中,用的是12MHz的晶振,初始值是F3,产生的波特率是2404,而非2400。而用11.0592MHz的晶振算出来的值是F4。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

7#
ID:123289 发表于 2020-6-16 15:47 | 只看该作者
看来你不知道串行的CLK是什么,取自何处,去查一下书吧,对你理解这个问题有好处。
回复

使用道具 举报

8#
ID:779648 发表于 2020-6-17 13:46 | 只看该作者
得先看你晶振了,举例:
1:晶振为11.0592Mhz
我们知道T1可以作为波特率发生器,也知道波特率计算公式(方式1、3):2的SMOD的次方除以32再乘T1溢出率(晶振频率除以12乘(256-TH1));
即:波特率=(2的SMOD次方/32)X晶振频率/[12x(256-TH1)]

我们可以轻松的算出TH1和TL1内的值,列如:
计算9600bps ,设SMOD=1;

9600bps=(2/32)X[11059200/12X(256-TH1)]
算得(256-TH1)=6,则TH1=250 (0XFA);

计算波特率为9600、串口工作方式为方式1的程序:
void init_serial()
{
     TMOD=0X20;//设置T1工作方式为8位自动重装
     SCON=0X50;//设置串口工作方式为10位异步收发器
     PCON=0X80;//SMOD置为1
     TH1=(256-6);//6的由来[(11059200/12)/16]/9600 (9600为所求波特率)
     TL1=(256-6);
     EA=1;//开总中断
     ES=1;//开串口中断
     TR1=1;//启动T1
}
2:晶振为12Mhz
如果我们继续将T1作为波特率发生器,那么计算的公式也没变化。
列如:
波特率为2400,SMOD=1;
2400bps=(2/32)X[12000000/12X(256-TH1)]
算得(256-TH1)=26.041666,是个无限循环小数,如果取26带进公式里算,波特率四舍五入后是2404,误差不是很大。
void init_serial()
{
    TMOD=0X20;//设置T1工作方式为8位自动重装
    SCON=0X50;//设置串口工作方式为10位异步收发器
    PCON=0X80;//SMOD置为1
    TH1=(256-26);
    TL1=(256-26);
    EA=1;//开总中断
    ES=1;//开串口中断
    TR1=1;//启动T1
}



如果4800bps,SMOD=1;
4800bps=(2/32)X[12000000/12X(256-TH1)]

算得(256-TH1)=13.0208333,也是个无限循环小数,取13,算出波特率约为4808,误差也不大。

void init_serial()
{
    TMOD=0X20;//设置T1工作方式为8位自动重装
    SCON=0X50;//设置串口工作方式为10位异步收发器
    PCON=0X80;//SMOD置为1
    TH1=(256-13);
    TL1=(256-13);
    EA=1;//开放总中断
    ES=1;//开放串口中断
    TR1=1;//启动T1
}
回复

使用道具 举报

9#
ID:519089 发表于 2020-6-30 13:59 | 只看该作者
到不了500K,,超过单片机允许范围了
回复

使用道具 举报

10#
ID:636538 发表于 2020-7-2 09:17 | 只看该作者
单片机爱好者223 发表于 2020-6-30 13:59
到不了500K,,超过单片机允许范围了

这个500K是什么意思,1s500K字节
回复

使用道具 举报

11#
ID:699464 发表于 2020-7-3 11:01 | 只看该作者
感觉串口到不了500K,RS232应该是跑不了那么大的,其他没了解过
回复

使用道具 举报

12#
ID:633896 发表于 2020-7-7 11:24 | 只看该作者
我们教的比较浅。

123123.png (842.31 KB, 下载次数: 17)

123123.png
回复

使用道具 举报

13#
ID:519089 发表于 2021-7-14 19:13 | 只看该作者
SKYLAR123 发表于 2020-7-2 09:17
这个500K是什么意思,1s500K字节

1秒500K bit 位
回复

使用道具 举报

14#
ID:81196 发表于 2021-7-15 13:52 | 只看该作者
void init_serial(u32 baud)
{
     TMOD=0X20;//设置T1工作方式为8位自动重装
     SCON=0X50;//设置串口工作方式为10位异步收发器
     PCON=0X80;//SMOD置为1
     TH1=(256-6);//6的由来[(11059200/12)/16]/baud (baud为所求波特率)
     TL1=(256-6);
     EA=1;//开总中断
     ES=1;//开串口中断
     TR1=1;//启动T1
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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