51单片机波特率如何设置啊
看了不少说法,还是不明白如何算1\51单片机为12M2\要发送八个数128,128,82,0,0,0,82,03\想在T1的工作方式24\希望波特率为9600(因为与之通...
看了不少说法,还是不明白如何算
1\51单片机为12M
2\要发送八个数 128,128,82,0,0,0,82,0
3\想在T1的工作方式2
4\希望波特率为9600(因为与之通讯的东东原来就是9600的)
5\串口的工作方式为2(波特率固定)
书上要求输送位数又是TH1,TL1的设定
公式都不知代那个进去
请原谅小菜的问题,
最好能够详细地说明一下
非常感谢
我用的是学习板,这个是没办法改的了
这样:
=256-12000000/(96000*12*32)=252.744
就取253=FDH?
12与32分别是什么意思?
为什么有人说与发送的位数有关?
串口的工作方式2是11位吧? 展开
1\51单片机为12M
2\要发送八个数 128,128,82,0,0,0,82,0
3\想在T1的工作方式2
4\希望波特率为9600(因为与之通讯的东东原来就是9600的)
5\串口的工作方式为2(波特率固定)
书上要求输送位数又是TH1,TL1的设定
公式都不知代那个进去
请原谅小菜的问题,
最好能够详细地说明一下
非常感谢
我用的是学习板,这个是没办法改的了
这样:
=256-12000000/(96000*12*32)=252.744
就取253=FDH?
12与32分别是什么意思?
为什么有人说与发送的位数有关?
串口的工作方式2是11位吧? 展开
5个回答
展开全部
串行口的四种工作方式对应三种波特率。由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同。
方式0的波特率 = fosc/12
方式2的波特率 =((2^SMOD)/64)• fosc
方式1的波特率 =((2^SMOD)/32)•(T1溢出率)
方式3的波特率 =((2^SMOD)/32)•(T1溢出率)
注意:SMOD为PCON寄存器的最高位(即PCOM<7>)。
T1 溢出率 = fosc /{12×[256 -(TH1)]} --将该公式代人方式1或3
最后推出公式:TH1=256-(fosc*2^SMOD)/(baudrate*12*32);
呵呵
如果你用方式2(波特率 =((2^SMOD)/64)• fosc )的话
12M的晶振就不能得到9600波特率了(除非你改变你的晶振,但是那样的晶振好像没有卖) 所以你只能选择方式1或3
而且12M的晶振在串口传输时会有误差,就如你上面算的那样结果会有小数点
TH1又只能是整数的 所以传输时会有误差.
参考:
#include<reg51.h>
#define baudrate 9600UL
#define fosc 11059200UL//其中,UL是不能省略的,代表长整型。
unsigned char a,flag;
void serial_init(void)
{ unsigned char S_MOD=1;
TMOD=0x20;//T1工作在方式2
SCON=0x50;//SM0=0 SM1=1->串口通信在模式1,
//SM2=0->多级通信中使用的位,REN=1;
PCON=0;
if((PCON&0x80)==0x80) S_MOD=2;
TH1=256-(fosc*S_MOD)/(baudrate*12*32);//其中SMOD=0,
TL1=256-(fosc*S_MOD)/(baudrate*12*32);
TR1=1;ES=1;EA=1;
}
方式0的波特率 = fosc/12
方式2的波特率 =((2^SMOD)/64)• fosc
方式1的波特率 =((2^SMOD)/32)•(T1溢出率)
方式3的波特率 =((2^SMOD)/32)•(T1溢出率)
注意:SMOD为PCON寄存器的最高位(即PCOM<7>)。
T1 溢出率 = fosc /{12×[256 -(TH1)]} --将该公式代人方式1或3
最后推出公式:TH1=256-(fosc*2^SMOD)/(baudrate*12*32);
呵呵
如果你用方式2(波特率 =((2^SMOD)/64)• fosc )的话
12M的晶振就不能得到9600波特率了(除非你改变你的晶振,但是那样的晶振好像没有卖) 所以你只能选择方式1或3
而且12M的晶振在串口传输时会有误差,就如你上面算的那样结果会有小数点
TH1又只能是整数的 所以传输时会有误差.
参考:
#include<reg51.h>
#define baudrate 9600UL
#define fosc 11059200UL//其中,UL是不能省略的,代表长整型。
unsigned char a,flag;
void serial_init(void)
{ unsigned char S_MOD=1;
TMOD=0x20;//T1工作在方式2
SCON=0x50;//SM0=0 SM1=1->串口通信在模式1,
//SM2=0->多级通信中使用的位,REN=1;
PCON=0;
if((PCON&0x80)==0x80) S_MOD=2;
TH1=256-(fosc*S_MOD)/(baudrate*12*32);//其中SMOD=0,
TL1=256-(fosc*S_MOD)/(baudrate*12*32);
TR1=1;ES=1;EA=1;
}
展开全部
51单片机波特率设置主要有以下两种方式:1) 工作方式0 ,2)工作方式1 。
1) 工作方式0
SM0=0且SM1=0时,串口选择工作方式0,实质这是一种同步移位寄存器模式。 其数据传输的波特率固定为Fosc/12,数据由RXD引脚输入或输出,同步时钟由TXD引脚输出。
2)工作方式1
当SM0=0且SM1=1时,串口选择工作方式1,其数据传输的波特率由定时/计数器T1、T2的溢出速率决定,可通过程序设定。当T2CON寄存器中的RCLK和TCLK置位时,用T2作为发送和接收波特率发生器,而RCLK=TCLK=0时,用T1作为波特率发生器,两者还可以交叉使用,即发送和接收采用不同的波特率。数据由TXD引脚发送,由RXD引脚接收。
1) 工作方式0
SM0=0且SM1=0时,串口选择工作方式0,实质这是一种同步移位寄存器模式。 其数据传输的波特率固定为Fosc/12,数据由RXD引脚输入或输出,同步时钟由TXD引脚输出。
2)工作方式1
当SM0=0且SM1=1时,串口选择工作方式1,其数据传输的波特率由定时/计数器T1、T2的溢出速率决定,可通过程序设定。当T2CON寄存器中的RCLK和TCLK置位时,用T2作为发送和接收波特率发生器,而RCLK=TCLK=0时,用T1作为波特率发生器,两者还可以交叉使用,即发送和接收采用不同的波特率。数据由TXD引脚发送,由RXD引脚接收。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
51MCU-方式1:10位通用异步通信
一帧信息为10位:1位为起始位(0),8位数据位,1位停止位(1)
采用定时器T1(1个16位计数器)作为串行口接收和发送的波特率发生器,数据传输波特率可调,由T1的溢出决定,可用程序设定。
波特率设定:
波特率=(2^smod)*(定时器T1溢出率)/32
溢出率=溢出周期的倒数
溢出周期=12*(256-X)/Fosc
波特率=(2^smod * Fosc)/(32 *12*(256-X))
初值X=256-(Fosc*2^smod)/384*波特率
如:11.0592MHz,波特率为9600的初值:TH1=0FFH,TL1=0FDH
强调:51串行口方式1为由定时器T1的计数溢出率来决定,T1为16位定时器,故TH1,TL1均需设值,
一帧信息为10位:1位为起始位(0),8位数据位,1位停止位(1)
采用定时器T1(1个16位计数器)作为串行口接收和发送的波特率发生器,数据传输波特率可调,由T1的溢出决定,可用程序设定。
波特率设定:
波特率=(2^smod)*(定时器T1溢出率)/32
溢出率=溢出周期的倒数
溢出周期=12*(256-X)/Fosc
波特率=(2^smod * Fosc)/(32 *12*(256-X))
初值X=256-(Fosc*2^smod)/384*波特率
如:11.0592MHz,波特率为9600的初值:TH1=0FFH,TL1=0FDH
强调:51串行口方式1为由定时器T1的计数溢出率来决定,T1为16位定时器,故TH1,TL1均需设值,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
波特率是单片机通信中必设置的地方
至于对应不同的波特率设置TH/TL
可以查表就能找到
至于对应不同的波特率设置TH/TL
可以查表就能找到
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在烧程序的软件中设置。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询