首先,了解一些基本概念。
RS232电平:逻辑1(MARK)=-3V~-15V,逻辑0(SPACE)=+3~+15V
TTL电平:+5V等价于逻辑“1”,0V等价于逻辑“0”
TXD
:发送数据 Transmit Data,单片机的P31
RXD
:接收数据 Receive Data,单片机的P30
波特率 :单片机或计算机在串口通信时的速率,定义为每秒传输二进制代码的位数,单位bts
UART :通用异步收发器。51单片机的串行口是一个可编程全双工的通信接口,具有UART的全部功能,能同时进行数据的发送和接收,也可作为同
步移位寄存器使用。
SBUF : 串行数据缓冲寄存器
经常使用的都是通信方式1(10位数据的异步通信,波特率可变,定时器1),因此必须掌握~~~
定时器1通常用方式2,当溢出后,单片机会自动为其装初值,方式1需要手动装初值
附:常用波特率初值表
/* 发送字符 @L2 2016/08/08 */
#include
unsigned char word[19] = "Nice to meet you! ";
void init();
void Delay10ms(unsigned int c);
void main()
{
unsigned char i;
init();
while(1)
{
for(i=0; i<19; i++)
{
SBUF = word[i]; //将要发送的数据放入到发送寄存器
while(!TI); //等待发送数据完成:当串行发送第8位数据结束时,内部硬件置1。
TI=0; //清除发送完成标志位:软件清零
}
Delay10ms(50); //延时一下再发
}
}
void init() // 设置串口
{
SCON=0X50; //设置为工作方式1 SMO SM1 SM2 REN=0 1 0 1
TMOD=0X20; //设置定时器1工作方式2
PCON=0X80; //波特率加倍 SMOD=1
TH1=0XE6; //计数器初始值设置,此处波特率是2400
TL1=0XE6;
// ES=1; //打开接收中断
// EA=1; //打开总中断
TR1=1; //打开计数器
}
void Delay10ms(unsigned int c) //误差 0us
{
unsigned char a, b;
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
/** 将接收到发送回电脑上面。@L2 2016/08/08 **/
#include
void init() // 设置串口
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置,注意波特率是4800的
TL1=0XF3;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}
void Usart() interrupt 4 // 串行口中断,串行端口完成一帧字符发送/接收后引起
{
unsigned char receiveData;
receiveData=SBUF; //出去接收到的数据
RI = 0; //清除接收中断标志位
SBUF=receiveData; //将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
}
void main()
{
init();
while(1)
{
}
}