单片机串口发送字符串至电脑的实践与解析
1.TTL电平
TTL
是
Transistor-Transistor Logic
,即晶体管
–
晶体管逻辑的简称,它是计算机处理器控制的设备
内部各部分之间通信的标准技术。
TTL
电平信号应用广泛,是因为其数据表示采用二进制规定,
+5V
等价于逻辑
”1”
,
0V
等价于逻辑
”0”
。
数字电路中,由
TTL
电子元器件组成电路的电平是个电压范围,规定:
输出高电平
>=2.4V
,输出低电平
<=0.4V
;
输入高电平
>=2.0V
,输入低电平
<=0.8V
笔记本电脑通过
TTL
电平与单片机通信
TX
发送线(端口)
3.1
RX
接收线
(
端口)
3.0
USB
转
TTL
,使用
ch340
通信
2.串口接线方式及配置
RXD
:数据输入引脚,数据接受;
STC89
系列对应
P3.0
口
TXD
:数据发送引脚,数据发送;
STC89
系列对应
P3.1
口
接线方式
输入
/
输出数据缓冲器都叫做
SBUF
,
都用
99H
地址码,但是是两个独立的
8
位寄存器
代码体现为: 想要接收数据
char data = SBUF
想要发送数据
SBUF = data
发送数据过程:
发送数据时,发送时钟的下降沿将数据串行移位输出;
接收数据的过程:
接收数据时,接收时钟的上升沿开始对数据位采样。
串行数据缓冲器SBUF:
有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H。
串行发送数据时,CPU向SBUF写入数据,此时99H表示发送SBUF;串行接收数据时,CPU从SBUF读出数据,此时99H表示接收SBUF。
发送数据:
SBUF=0x88; //向SBUF写入数据,即将发送
接收数据:
unsigned char c;//char c;
while (!RI); //等待接收数据
RI=0; //需要软件清标志位
c=SBUF; //读取数据
由于UART是异步串行接口,通信双方的时钟频率不同,因为硬件不同所以就要约束他们的通信速度,就叫波特率
3. 数据的收发时序图
字符
'a'
是如何从单片机上传到
PC
的a
的
ASSII
码是
97
,
16
进制就是
0x61,
二进制是
01010001
,这个
8
位就是数据位串口工作模式
1
,一帧数据有
10
位,起始位(
0
),数据位,停止位(
1
)那么
a
的一帧数据就是
0 1000 1010 1
起始位,
a
的低位到高位,停止位他们将依次的从低位到高位进行收发
4.代码实现
#include <REGX52.H>
#include "intrins.h"
//#define SIZE 12
sfr AUXR = 0x8E;
sbit D5 = P3^7;
void UartInit(void) //9600bps@11.0592MHz
{
AUXR = 0x01;
SCON = 0x50; //配置串口工作方式1,REN使能接收
TMOD &= 0x0F;//按位与,高四位清零低四位不变
TMOD |= 0x20;//按位或定时器1工作方式位8位自动重装
TH1 = 0xFD;
TL1 = 0xFD;//9600波特率的初值
TR1 = 1;//启动定时器
EA = 1;//开启总中断
ES = 1;//开启串口中断
}
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void sendByte(char data_msg)
{
SBUF = data_msg;
while(!TI); //TI发送中断请求标志位,检测是否发送完
TI = 0; //TI为1,表示发送完数据
}
void sendString(char* str)
{
while( *str != '\0'){
sendByte(*str);
str++;
}
}
void main()
{
D5 = 1; //LED1熄灭
//配置C51串口的通信方式
UartInit();
while(1){
Delay1000ms();
//往发送缓冲区写入数据,就完成数据的发送
sendString("hello the world!\r\n"); //串口显示换行
}
}
注意串口换行\r\n,
发送数据时,内部数据并行写入SBUF(发),然后再串行送出。
接收数据时,外部数据串行送入移位寄存器,之后再并行送入SBUF(收) 。
发送缓冲器只能写入而不能读出,接收缓冲器只能读出而不能写入,因而两个缓冲器可共用一个地址码(99H)
作者:YunJIO