52单片机串口波特率设置函数
51单片机串行通信T1、T2常用波特率设置

22.1184MHZ时RCAP的选值 24MHZ时RCAP的选值 波特率 RCAP2H RCAP2L 波特率 RCAP2H RCAP2L 误差 4800 FF 70 4800 FF 64 0.25 9600 FF B8 9600 FF B2 0.13 14400 FF D0 14400 FF CC 0.08 19200 FF DC 19200 FF D9 0.06 38400 FF EE 38400 FF EC 0.48 57600 FF F4 57600 FF F3 0.02 115200 FF FA 115200 FF F9× 0.49 注:打×的经本人调试是有问题的,大家最好不要选择。你可以自己测试下
波特率 4800 9600 14400 19200 38400
误差 0.04 0.02 0.32 0.49 0.26
T2定时器作波特率发生器
公式: 11.0592MHZ时RCAP的选值 波特率 RCAP2H RCAP2L 4800 FF B8 9600 FF DC 14400 FF E8 19200 FF EE 38400 FF F7 57600 FF FA 115200 FF FD 波特率 = fosc/(32*(65536 - (RCAP2H,RCAP2L))) 12MHZ时RCAP的选值 波特率 RCAP2H RCAP2L 误差 4800 FF B2 0.13 9600 FF D9 0.06 14400 FF E6 0.04 19200 FF EC 0.47 38400 FF F6 0.23 57600 FF F9× 0.49 115200 FF FD× 0.26
T1定时器作波特率发生器ห้องสมุดไป่ตู้
公式: 11.0592MHZ时TH1的选值 波特率 SMOD = 0 SMOD = 1 4800 FA F4 9600 FD FA 14400 FE FC 19200 FD 22.1184MHZ时TH1的选值 波特率 SMOD = 0 SMOD = 1 4800 F4 E8 9600 FA F4 14400 FC F8 19200 FD FA 38400 FD 波特率 = (2的SMOD次方/32)*fosc/(12*(256-TH1)) 12MHZ时TH1的选值 波特率 SMOD = 0 误差 SMOD = 1 误差 4800 F9× 0.49 F3 0.02 9600 FD× 0.26 F9× 0.49 14400 FE× 0.17 FC× 0.34 19200 FD× 0.26 24MHZ时TH1的选值 SMOD = 0 误差 SMOD = 1 F3 0.02 E6 F9× 0.49 F3 FC× 0.34 F7 FD× 0.26 F9× FE× 0.37 FD×
51单片机串口通信波特率设置

51单片机串口通信波特率设置51单片机串口通信波特率设置MCS-51单片机具有一个全双工的串行通信接口,能同时进行发送和接收。
它可以作为UART(通用异步接收和发送器)使用,也可以作为同步的移位寄存器使用。
1. 数据缓冲寄存器SBUFSBUF是可以直接寻址的专用寄存器。
物理上,它对应着两个寄存器,即一个发送寄存器一个接收寄存器,CPU写SBUF就是修改发送寄存器;读SBUF就是读接收寄存器。
接收器是双缓冲的,以避免在接收下一帧数据之前,CPU未能及时的响应接收器的中断,没有把上一帧的数据读走而产生两帧数据重叠的问题。
对于发送器,为了保持最大的传输速率,一般不需要双缓冲,因为发送时CPU是主动的,不会产生重叠问题。
2. 状态控制寄存器SCONSCON是一个逐位定义的8位寄存器,用于控制串行通信的方式选择、接收和发送,指示串口的状态,SCON即可以字节寻址也可以位寻址,字节地址98H,地址位为98H~9FH。
它的各个位定义如下:MSB LSBSM0和SM1是串口的工作方式选择位,2个选择位对应4种工作方式,如下表,其中Fosc是振荡器的频率。
SM2在工作方式2和3中是多机通信的使能位。
在工作方式0中,SM2必须为0。
在工作方式1中,若SM2=1且没有接收到有效的停止位,则接收中断标志位RI不会被激活。
在工作方式2和3中若SM2=1且接收到的第9位数据(RB8)为0,则接收中断标志RB8不会被激活,若接收到的第9位数据(RB8)为1,则RI置位。
此功能可用于多处理机通信。
REN为允许串行接收位,由软件置位或清除。
置位时允许串行接收,清除时禁止串行接收。
TB8是工作方式2和3要发送的第9位数据。
在许多通信协议中该位是奇偶位,可以按需要由软件置位或清除。
在多处理机通信中,该位用于表示是地址帧还是数据帧。
RB8是工作方式2和3中接收到的第9位数据(例如是奇偶位或者地址/数据标识位),在工作方式1中若SM2=0,则RB8是已接收的停止位。
串口调试关于波特率的设置

//LED-->>PC6
U1_TX-->PA9 U1_RX-->>PA10 U2_TX-->>PA2 U2_RX-->>PA3
GPIO_Structure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_9; GPIO_Structure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Structure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA,&GPIO_Structure); //USART_AFIO_Config
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==0); LED4_OFF();
delay(2000000); LED4_ON(); delay(2000000);
在发送完数组里面的数据后,后面的单个发送不能正确发送。必须在发送完数组后加入一个 足够大的延时,后面的数据才能正常发送。 2012 年 5 月 12 日 18:26:40
void USART_SendString(USART_TypeDef* USARTx,uint8_t *point, uint16_t strle n) {
// Check the parameters uint16_t i; // Transmit Data for(i=0;i<strlen;i++) { USART_SendData(USARTx, (*point)); while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==0); // USART_ClearFlag(USARTx,USART_FLAG_TC); point++; } } 事实上,因为读一次 USART_SR 然后再写 USART_DR 时,TC 会自动清零,所以, USART_ClearFlag(USARTx,USART_FLAG_TC) 该语句可以不要。 由于在 FW3.5 的固件库里,USART_SendData()函数里面没有读 USART_SR 的函数: while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==0); 所以,在连续调用 USART_SENDDATA(USART1,'A')发送字符 A 时,同样会出现数据丢失。 如: USART_SendData(USART1,'A');
51单片机串口通信程序。。含详细例子

4.//////////////// /////////////////////////////////////////////////////////
pw.fpReadSign(); SendData();//通知上位机,送出读出器件特征字 }
void Erase()//擦除器件 {
pw.fpErase(); SendData();//通知上位机,擦除了器件 }
void Write()//写器件 {
BYTE n; pw.fpInitPro();//编程前的准备工作 SendData();//回应上位机表示进入写器件状态,
{
unsigned char c;
TMOD = 0x20; // 定时器 1 工作于 8 位自动重载模式, 用于产生波特率
TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate))); SCON = 0x50; PCON = 0x00; TR1 = 1; IE = 0x00; // 禁止任何中断 while(1) {
///////////////////////////////////////////////////////////////////////////////// //所支持的 FID,请在这里继续添加
///////////////////////////////////////////////////////////////////////////// extern void PreparePro00();//FID=00:AT89C51 编程器 extern void PreparePro01();//FID=01:AT89C2051 编程器 extern void PreparePro02();//FID=02:AT89S51 编程器
单片机89C52RC串口读取am2320温湿程序

// AM 系列读IIC 使用范例//单片机:AT89S52 或STC89C52RC// 功能:串口发送温湿度数据波特率9600// 晶振:12M (用户系统时钟如不是12M 请更改相关宏定义及注释的延时时间)// 编译环境: Keil3// 公司:奥松电子//****************************************************************//#include "reg52.h"#include <intrins.h>#define USE_T2#define FOSC 12000000#define BAUD 9600//端口位定义,可修改sbit SDA=P1A0;sbit SCL=P"1;//内部数据定义#define IIC_Add 0xB8 //器件地址#define IIC_RX_Length 15unsigned char IIC_TX_Buffer[]={0x03,0x00,0x04}; // 读温湿度命令(无CRC 校验) unsigned char IIC_RX_Buffer[IIC_RX_Length] = {0x00};// 读回的温湿度unsigned char Uart_RX_Buffer[30] = {0x00}; unsigned char *String;unsigned char WR_Flag;//字符串定义#define S_Function "Function: 03 04"#define S_Temp "Temp:"#define S_RH "RH:"#define S_CRCT "CRC: True"#define S_CRCF "CRC: Wrong"#define S_Data "Data: "#define S_NotS "Sensor Not Connected"void Ack(void);void NoAck(void); void delay10us(void) // 这个延时函数要大于5US 以上_nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); }void delay1ms(unsigned int t){unsigned int i;unsigned int j;for(j=t;j>0;j--) for(i=124;i>0;i--);}void InitUART(void) {unsigned int iTmpBaud;unsigned long lTmpBaud; iTmpBaud = 0;//首先选定定时器 2 作为波特率发生器 ,16位定时器 ,自动装载SCON = 0x50; //SM0 SM1 SM2 REN TB8 RB8 TI RI //0 1 0 1 0 00 0PCON = 0x00; //PCON 的地址是 87H, 这里 SMOD =0//TF2 EXF2 RCLK TCLK EXEN2 TR2 C(/T2) CP(/RL2) //0 0 1 1 0 0 0 // / / / / / / T2OE DCEN //0 0 0 0 0 0 0 0//fosc = 22.1184M,6T: 144, 设置波特率//(RCAP2H,RCAP2L) = 65536- fosc/(n*Baud) 。
51单片机串口通信程序。。含详细例子

{ P3_4=0; P3_3=1;
} void RstPro()//编程器复位 {
pw.fpProOver();//直接编程结束 SendData();//通知上位机,表示编程器就绪,可以直接用此函数因为协议号(ComBuf[0])还没被修改,下同 }
void ReadSign()//读特征字 {
} void serial () interrupt 4 using 3 //串口接收中断函数 {
if (RI) { RI = 0 ; ch=SBUF; read_flag= 1 ; //就置位取数标志 }
} main()
{ init_serialcom(); //初始化串口 while ( 1 ) { if (read_flag) //如果取数标志已置位,就将读到的数从串口发出 { read_flag= 0 ; //取数标志清 0 send_char_com(ch); } }
while(RI == 0); RI = 0; c = SBUF; // 从缓冲区中把接收的字符放入 c 中 SBUF = c; // 要发送的字符放入缓冲区 while(TI == 0); TI = 0; } }
4.//////////////// /////////////////////////////////////////////////////////
SendData(); } else break;//等待回应失败 } pw.fpProOver();//操作结束设置为运行状态 ComBuf[0]=0;//通知上位机编程器进入就绪状态 SendData(); }
void Lock()//写锁定位
{
pw.fpLock();
SendData();
上位机和单片机串口编程---API函数编程

上位机和单片机串口编程---API函数编程上位机和单片机串口编程不用MSComm控件,那看起来只能是使用Windows API了,因为MFC貌似没有什么类封装了串口API函数的。
用Windows API 编写串口程序本身是有巨大优点的,因为控制能力会更强,效率也会更高,而且对于那些纯绿色软件追求者来说,没有ActiveX控件比什么都重要――呵呵,我也是这么认为。
API编写串口,过程一般是这样的:1、创建串口句柄,用CreateFile;2、对串口的参数进行设置,其中比较重要的是波特率(BaudRate),数据宽度(BytesBits),奇偶校验(Parity),停止位(StopBits),当然,重要的还有端口号(Port);3、然后对串口进行相应的读写操作,这时候用到ReadFile 和WriteFile函数;4、读写结束后,要关闭串口句柄,用CloseFile;下面依次大致讲讲个步骤的过程:第一步,从字面上去理解,大家也可以发现CreateFile实际上表明Windows是把串口当作一个文件来处理的,所以它也有文件那样的缓冲区、句柄、读写错误等,不同的是,这个文件名字只有固定的几个(一般为四个),而且始终存在(__G),而且在调用CreateFile的时候请注意它的参数。
CreateFile函数原型如下:HANDLE CreateFile(__ lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,__ITY___TES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile );lpFileName是你需要创建的端口号,默认情况下是COM1;dwDesiredAccess是表明你想让你创建的串口以何种方式存在于你的应用程序中,因为串口通常是可读可写的,所以这里必须设置为___READ|___WRITE;dwShareMode是用来设置串口共享属性的,因为串口属于临界资源,当然不能共享,所以这里也必须设置为0;lpSecurityAttributes是设置安全模式,一般采用默认的安全模式就可以了,选择NULL;dwCreationDisposition是设置是否打开新的“文件”(上面说过了,Windows是把串口等端口当作文件来处理的),因为串口属于硬件端口,当然不能随便重复创建,所以这里必须告诉Windows,每次创建的时候必须使用已经存在的串口,所以这里设置OPEN___G;dwFlagsAndAttributes,这个参数可以设置的值比较多,大家若需要深入了解可以查找MSDN,这里因为我们接下去要做的是异步通讯,所以需要设置FILE_FLAG___PED;最后一个参数hTemplateFile是指定模板文件,串口没有模板,选择NULL;所以最后我们设置的CreateFile函数如下:m_hCom=CreateFile(m_sPort,___READ|___WRITE,0,上位机和单片机串口编程NULL,OPEN___G,FILE_FLAG___PED,NULL);在创建完串口后,最后进行句柄测试:if(m_hCom==___HANDLE_VALUE){AfxMessageBox(“打开串口失败!");return;}上面说到了异步,那什么是异步呢?异步是相对同步这个概念而言的。
串口波特率设置说明

串口波特率设置说明:建议波特率不要设置太高,不是说设置高了不能用
波特率设置过高会导致传输数据不稳定,会出现丢包的现象。
怎么设置波特率的问题:这款芯片有两种方法来产生波特率
第一种:用定时器来产生波特率(脉冲信号),有弊端就是占用定时器。
第二种:用BRT寄存器(波特率专用定时器)来产生波特率,但是只有一个。
所以如果需要双串口同时通讯,则必须使用一个定时器,和一个BRT定时器。
一般串口发送数据都是选择模式一,或者模式三(波特率可变)。
(因为模式二和模式四波特率是固定的)。
所以在此我不多说波特率二和四。
T1X12这个标志位是来定义时钟分频(关系到定时器的速度,如果设置为1,则定时器不12倍分频,则波特率速度快12倍)。
默认为0,就是不设置,则定时器时钟12分频,和普通52速度一样。
BRTX12 这个标志位和T1X12差不多,只是它是来设置的快速波特率时钟分频,设置为1,不分频。
默认为0,则12分频,(波特率慢12倍)。
我自己理解的,错了请指正。
例:11.0592MHZ晶振,1T工作模式
波特率设置值=256 - INT(1105920/9600/(32+0.5))
=256 - 3
=253
十六进制,加上修正值是FD。