51单片机波特率设置 串口调试发送接收
计算一下就知道了。如我们要得到9600 的波特率,晶振为11.0592M 和12M,定时器1 为模式2,SMOD 设为1,分别看看那所要求的TH1 为何值。代入公式:
最终解决办法:
换用11.592MHz晶振!!!
/******************************************************************/
void UART_SER() interrupt 4
{
uchar Temp;//定义临时变量
if(RI)
{
RI=0;
//标志位清零
Temp=SBUF;
//读入gned char
/******************************************************************//*名称:主函数*/
/*内容:打开串口调试程序,将波特率设置为9600,无奇偶校验*/
/*晶振11.0592MHz,发送和接收使用的格式相同,如都使用*/
ES=1;
EA=1;
}
//*************
void main(void)
{
serial_init(); //初始化
while(1)
//主循环不做任何动作
{}
}
/******************************************************************//*串口中断程序*/
/*字符型格式,在发送框输入hello,ILoveMCU,在接*/
/*收框中同样可以看到相同字符,说明设置和通信正确*/
/******************************************************************/
//******波特率设置及串口初始化
#define baudrate 9600UL
11.0592M 9600=(2÷32)×((11.0592M/12)/(256-TH1)) TH1=250
12M 9600=(2÷32)×((12M/12)/(256-TH1)) TH1≈249.49
上面的计算可以看出使用12M 晶体的时候计算出来的TH1 不为整数,而TH1 的值只能取整数,这样它就会有一定的误差存在不能产生精确的9600 波特率。当然一定的误差是可以在使用中被接受的,就算使用11.0592M 的晶体振荡器也会因晶体本身所存在的误差使波特率产生误差,但晶体本身的误差对波特率的影响是十分之小的,可以忽略不计。
串口调试程序:(已通过编译)
//串口调试程序51单片机开发板(开发板用的是12MHz晶振)
/******************************************************************/
#include<reg52.h>//头文件调用,写程序时都要加上
#define uint unsigned int//宏定义,为了后面定义变量书写简便
串口调试程序(已通过编译)+关于51单片机开发板串口调试发送接收不一致问题:
关于51单片机开发板串口调试发送接收不一致问题:
这个问题不知道大家会不会遇到呢??
51单片机开发板用的是12MHz晶振
有人说是波特率问题
不同模式下晶振与波特率关系问题:
(来源:/link?url=CsHo7J9r3KrK2fwVedjliJn7Kh-GM02g2DcgVKpUXYGjirngm34eXaP_B4kQpHEZHNa01VVpKfZ8keNxm6p7z_)
P1=Temp;//把值输出到P1口,用于观察
SBUF=Temp;//把+接收到的值再发回电脑端
}
if(TI)
//如果是发送标志位,清零
TI=0;
}
但是:
标准的51单片机晶振是1.2M-12M,一般由于一个机器周期是12个时钟周期,所以先12M时,一个机器周期是1US,好计算,而且速度相对是最高的(当然现在也有更高频率的单片机)。
#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;
51单片机入门零基础1.3如何使用串口调试助手
1.3如何使用串口调试助手
串口调试助手,顾名思义是用来仿真串口的,到底如何使用呢,我们先打开串口调试助手软件,图标如图0-1所示。
图0-1 串口调试助手图标
打开后的界面如图0-2所示。
图0-2 串口助手打开界面
接下来我们设置下配置,首先将COM口设置为所连接的COM口,如何看COM口请参见错误!未找到引用源。
,这里不再讲解。
然后将波特率选择9600,最后将Receive As HEX勾选取出,如图0-3所示。
图0-3 串口助手的配置
将串口收发的程序下载到单片机中,过程上一节有详细介绍。
打开串口助手,按上述配置完成后,点击Open,我们在发送栏里输入“abab”,点击Send,在接收栏里出现“abab”现象如图0-4所示。
图0-4 串口助手之串口收发现象
这个软件用于检测串口程序,检测结束直接点击Close并关闭即可。
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是已接收的停止位。
单片机串口通信的发送与接收
单片机串口通信的发送与接收51单片机的串口,是个全双工的串口,发送数据的同时,还可以接收数据。
当串行发送完毕后,将在标志位TI 置1,同样,当收到了数据后,也会在RI 置1。
无论RI 或TI 出现了1,只要串口中断处于开放状态,单片机都会进入串口中断处理程序。
在中断程序中,要区分出来究竟是发送引起的中断,还是接收引起的中断,然后分别进行处理。
看到过一些书籍和文章,在串口收、发数据的处理方法上,很多人都有不妥之处。
接收数据时,基本上都是使用“中断方式”,这是正确合理的。
即:每当收到一个新数据,就在中断函数中,把RI 清零,并用一个变量,通知主函数,收到了新数据。
发送数据时,很多的程序都是使用的“查询方式”,就是执行while(TI ==0); 这样的语句来等待发送完毕。
这时,处理不好的话,就可能带来问题。
看了一些网友编写的程序,发现有如下几条容易出错:1.有人在发送数据之前,先关闭了串口中断!等待发送完毕后,再打开串口中断。
这样,在发送数据的等待期间内,如果收到了数据,将不能进入中断函数,也就不会保存的这个新收到的数据。
这种处理方法,就会遗漏收到的数据。
2.有人在发送数据之前,并没有关闭串口中断,当TI = 1 时,是可以进入中断程序的。
但是,却在中断函数中,将TI 清零!这样,在主函数中的while(TI ==0);,将永远等不到发送结束的标志。
3.还有人在中断程序中,并没有区分中断的来源,反而让发送引起的中断,执行了接收中断的程序。
对此,做而论道发表自己常用的方法:接收数据时,使用“中断方式”,清除RI 后,用一个变量通知主函数,收到新数据。
发送数据时,也用“中断方式”,清除TI 后,用另一个变量通知主函数,数据发送完毕。
这样一来,收、发两者基本一致,编写程序也很规范、易懂。
更重要的是,主函数中,不用在那儿死等发送完毕,可以有更多的时间查看其它的标志。
实例:求一个PC与单片机串口通信的程序,要求如下:1、如果在电脑上发送以$开始的字符串,则将整个字符串原样返回(字符串长度不是固定的)。
51单片机波特率设置
51系列的单片机中都有两个定时器T0和T1,网上的资料挺多的,52单片机比51单片机的资源多了一个定时器T2和128字节的ram。
定时器T2的功能比T1、T0都强大,但描述它的资料不多,可能是使用得比较少的缘故吧。
它是一个16位的具有自动重装和捕获能力的定时/计数器,它的计数时钟源可以是内部的机器周期,也可以是P1.0输入的外部时钟脉冲。
T2的控制寄存器的功能描述如下:T2CON(T2的控制寄存器),字节地址0C8H:符号TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RT2各位的定义如下:TF2:定时/计数器2溢出标志,T2溢出时置位,并申请中断。
只能用软件清除,但T2作为波特率发生器使用的时候,(即RCLK=1或TCLK=1),T2溢出时不对TF2置位。
EXF2:当EXEN2=1时,且T2EX引脚(P1.0)出现负跳变而造成T2的捕获或重装的时候,EXF2置位并申请中断。
EXF2也是只能通过软件来清除的。
RCLK:串行接收时钟标志,只能通过软件的置位或清除;用来选择T1(RCLK=0)还是T2(RCLK=1)来作为串行接收的波特率产生器TCLK:串行发送时钟标志,只能通过软件的置位或清除;用来选择T1(TCLK=0)还是T2(TCLK=1)来作为串行发送的波特率产生器EXEN2:T2的外部允许标志,只能通过软件的置位或清除;EXEN2=0:禁止外部时钟触发T2;EXEN2=1:当T2未用作串行波特率发生器时,允许外部时钟触发T2,当T2EX引脚输入一个负跳变的时候,将引起T2的捕获或重装,并置位EXF2,申请中断。
TR2:T2的启动控制标志;TR2=0:停止T2;TR2=1:启动T2C/T2:T2的定时方式或计数方式选择位。
只能通过软件的置位或清除;C/T2=0:选择T2为定时器方式;C/T2=1:选择T2为计数器方式,下降沿触发。
CP/RT2:捕获/重装载标志,只能通过软件的置位或清除。
51单片机串口设置及应用
51单片机串口设置及应用单片机的串口设置及应用是指通过单片机的串口功能来进行通信的一种方式。
串口通信是一种全双工通信方式,可以实现双向数据传输。
单片机通过串口可以与其他设备进行通信,如计算机、传感器、LCD显示屏等。
1. 串口设置:单片机的串口通信一般需要进行以下设置:(1)串口模式选择:要根据实际情况选择串口工作模式,一般有异步串口和同步串口两种。
(2)波特率设置:串口通信需要设置一个波特率,即数据传输速率。
常见的波特率有9600、19200、115200等,需要与通信的设备保持一致。
(3)数据位设置:设置传输的数据位数,常见的有8位、9位等。
(4)停止位设置:设置停止位的个数,常见的有1位、2位等。
(5)校验位设置:可以选择是否启用校验位,校验位主要用于检测数据传输的正确性。
2. 串口应用:串口通信在很多领域都得到广泛应用,下面列举几个常见的应用场景:(1)串口与计算机通信:通过串口可以实现单片机与计算机的通信,可以进行数据的读写、控制等操作。
例如,可以通过串口将传感器采集到的数据发送给计算机,由计算机进行进一步处理分析。
(2)串口与传感器通信:串口可以与各种传感器进行通信,可以读取传感器采集到的数据,并进行处理和控制。
例如,可以通过串口连接温度传感器,读取实时的温度数据,然后进行温度控制。
(3)串口与LCD显示屏通信:通过串口可以实现单片机与LCD显示屏的通信,可以将需要显示的数据发送给LCD显示屏进行显示。
例如,可以通过串口将单片机采集到的数据以数字或字符的形式显示在LCD上。
(4)串口与外部存储器通信:通过串口可以与外部存储器进行通信,可以读写存储器中的数据。
例如,可以通过串口读取SD卡中存储的图像数据,然后进行图像处理或显示。
(5)串口与其他设备通信:通过串口可以和各种其他设备进行通信,实现数据的传输和控制。
例如,可以通过串口与打印机通信,将需要打印的数据发送给打印机进行打印。
总结:单片机的串口设置及应用是一种实现通信的重要方式。
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();
51单片机串口通信连续发送接收字节
51单片机串口通信连续发送接收字节51单片机串口通信连续发送接收字节当使用单片机串口通信,连续发送字节时,如何处理呢?使用串口中断接收发送字节,中断内的程序尽可能简单,因为考虑到占用时间。
本文以连续发送4个字节为例,给出例程如下所示:本例程使用的单片机型号为:IAP15W4K58S//工作频率为11.0592MHz#include "reg51.h"#include "intrins.h"typedef unsigned char BYTE;typedef unsigned int WORD;#define FOSC 11059200L //系统频率//#define BAUD 115200 //#define BAUD 9600 //定义串口波特率#define Num_byte 4 //接收数据4个字节BYTE Data_temp[Num_byte]={0,0,0,0};sfr P0M1 = 0x93;sfr P0M0 = 0x94;sfr P1M1 = 0x91;sfr P1M0 = 0x92;sfr P2M1 = 0x95;sfr P2M0 = 0x96;sfr P3M1 = 0xb1;sfr P3M0 = 0xb2;sfr P4M1 = 0xb3;sfr P4M0 = 0xb4;sfr P5M1 = 0xC9;sfr P5M0 = 0xCA;sfr P6M1 = 0xCB;sfr P6M0 = 0xCC;sfr P7M0 = 0xE2;sfr AUXR = 0x8e; //辅助寄存器sfr T2H = 0xd6; //定时器2高8位sfr T2L = 0xd7; //定时器2低8位sfr P_SW1 = 0xA2; //外设功能切换寄存器1sbit LED1=P1^1;sbit LED2=P1^2;bit busy=0; //定义是否接收完4个字节BYTE num=0; //记录4个字节的数据void SendData(BYTE dat);void SendString(char *s);BYTE read_Byte();void delay();void main(){P0M0 = 0x00;P0M1 = 0x00;P1M0 = 0x00;P1M1 = 0x00;P2M0 = 0x00;P2M1 = 0x00;P3M0 = 0x00;P3M1 = 0x00;P4M0 = 0x00;P4M1 = 0x00;P5M0 = 0x00;P5M1 = 0x00;P6M0 = 0x00;P7M0 = 0x00;P7M1 = 0x00;P_SW1 &= 0x3F; //(P3.0/RxD, P3.1/TxD)SCON = 0x50; //8位可变波特率,允许接收T2L = (65536 - (FOSC/4/BAUD)); //设置波特率重装值T2H = (65536 - (FOSC/4/BAUD))>>8;AUXR = 0x15; //T2为1T模式, 并启动定时器2,选择定时器2为串口1的波特率发生器ES = 1; //使能串口1中断EA = 1;//SendString("STC15F2K60S2\r\nUart Test !\r\n");while(1){if(busy){ES=0;for(num=0;num<num_byte;num++)< p="">{SBUF= Data_temp[num]+0x05;while(!TI);TI=0;}num=0;ES=1;busy=0;}//SendData(3);//delay();//delay();;}/*----------------------------UART 中断服务程序-----------------------------*/void Uart() interrupt 4 using 1{ES=0;RI = 0; //清除RI位Data_temp[num++]= SBUF;if(num==Num_byte)busy=1;ES=1;}/*----------------------------发送串口数据----------------------------*/void SendData(BYTE dat){while (busy); //等待前面的数据发送完成SBUF = dat; //写数据到SBUF寄存器busy = 1;}/*----------------------------发送字符串----------------------------*/void SendString(char *s){while (*s) //检测字符串结束标志{SendData(*s); //发送当前字符s++;}//接收1个字节BYTE read_Byte(){ BYTE character; character = SBUF; return character;}void delay(){ BYTE i,j;for(i=220;i--;i>0)for(j=220;j--;j>0); }</num_byte;num++)<>。
8051单片机与电脑的串口接收发送程序
{
EA = 0;
if(RI == 1) //当硬件接收到一个数据时,RI会置位
{
LED_Buffer[com_dat] = SBUF; //把从串口读出的数存到数组
RI = 0;
com_dat++;
E = 0;
delay();
E = 1;
delay();
}
/********************************************************************
* 名称 : write(uchar del)
* 功能 : 1602写数据函数
L1602_string(1,5,"ab cd ef;")
* 输入 : 行,列,需要输入1602的数据
* 输出 : 无
***********************************************************************/
void L1602_string(uchar hang,uchar lie,uchar *p)
}
/********************************************************************
* 名称 : Com_Int()
* 功能 : 串口中断子函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
简述单片机串行口传输的波特率设置的方法。
简述单片机串行口传输的波特率设置的方法。
单片机串行口传输是很常见的一种通信方式,它可以用来和其他外设进行数据的交换。
这篇文章将会简述单片机串行口传输的波特率设置方法,以帮助初学者快速掌握这一基础知识。
一、什么是串行口传输串行口传输是指通过一个或多个数据线,按照一定的数据传输标准(例如UART)来传输数据的方式。
与之相对的是并行传输,它需要多个数据线同时传输数据。
串口通信的优势在于它所需的连线数量少,传输距离较长,无需定时同步机制,易于控制等。
二、什么是波特率波特率是串行通信的合流速率(Baud rate),它指的是每秒钟传输到接收端的比特位数。
如果以 9600bps 的波特率传输,每秒钟就会传送9600 比特。
波特率越高,则数据传输速率越快,但是误码率也会相应地增加,传输的距离也会受限制。
因此,在设置波特率的时候需要根据实际情况做出合理选择。
三、波特率的设置方法单片机串口通信时,需要设置合适的波特率以保证正确的数据传输。
下面是串行口传输的波特率设置方法。
3.1 计算波特率波特率可以通过计算得出,通过以下公式可以计算出波特率:波特率 = 系统时钟频率(CPU_Frequency)/ (16 * 波特率预分频值* (波特率分频值 + 1))其中,波特率预分频值和波特率分频值是用来调节波特率的两个寄存器。
3.2 设置波特率的寄存器不同型号的单片机,设置波特率的方法可能有所差异。
下面以ATmega8为例,介绍如何设置波特率。
ATmega8的波特率控制寄存器是UBRRH和UBRRL,这两个寄存器共16位。
如果使用一个8位寄存器来控制波特率,最大的波特率只能到达255(因为8位的寄存器最大只能存储255),这将非常不方便。
因此,ATmega8使用了两个8位的寄存器,可以设置的最大波特率可达到65535。
对于ATmega8来说,先用公式计算出UBRRH和UBRRL需要的值,然后把这两个寄存器分别设置为对应的值就可以了。
51单片机串口波特率计算
51单片机串口波特率计算
在51单片机中,串口通信可以通过设置波特率来控制数据传输速度。
波特率是指每秒钟传输的数据位数。
要计算51单片机串口的波特率,需要了解以下几个参数:
1.时钟频率:51单片机的时钟频率通常为12MHz或者11.0592MHz。
这是由外部晶振或者内部时钟发生器提供的。
2.波特率发生器(UART)的参数:波特率发生器的输入时钟频率为时
钟频率的12分频。
串口通信的常用波特率有1200、2400、4800、9600等。
接下来我们
以计算1200波特率为例进行说明。
首先,计算波特率发生器的输入时钟频率:
输入时钟频率=时钟频率/12
假设时钟频率为11.0592MHz,则输入时钟频率为:
输入时钟频率=11.0592MHz/12≈921.6kHz
然后,根据波特率公式计算波特率发生器的计数器初值:
计数器初值=输入时钟频率/(16*波特率)
对于1200波特率,计数器初值为:
计数器初值=921.6kHz/(16*1200)≈48
最后,将计数器初值设置到波特率发生器,即可达到1200波特率的
串口通信。
需要注意的是,以上计算是基于8位数据位、无校验位和1位停止位
的情况。
如果需要使用其他参数,则需要根据具体情况进行计算。
综上,通过以上计算可以得到51单片机串口的波特率。
根据不同的
时钟频率和波特率要求,可以使用相应的计数器初值来设置波特率发生器,实现串口通信。
