1、 串口的概念:
串行接口,为有线通信,特点为数据是一位一位传输的,线路简单,可以双向通信,速度较慢。
2、串口的原理:以二进制传输数据
例 pc机把数据8传到C51单片机上,8的二进制为0000 0100 ,由低到高传递,传递0时,Pc机上的TX把电平拉低,传递1时,TX把电平拉高,C51上的RX可以检测电平的高低,如果为低则为0,高则为1,就这样可以实现数据的传递
3、串口的通信协议:就是怎么传递这个二进制数据
包括数据格式和波特率
数据格式:
数据位、8位 二进制
起始位、1位
停止位、1位
奇偶校验位、无
4、串口的通信寄存器SCON配置(数据位的配置):看芯片手册配置通信协议的参数和原理图
第8章,串口通信需要用到的寄存器,SCON、PCON
SCON:配置8位数据位 串口寄存器 工作方式1
B7 B6 B5 B4 B3 B2 B1 B0
SMO SM1 SM2 REN TB8 RB8 TI RI
0 1 X 1 X X 0 0
SCON=01010000
SCON=0X50(16进制数)采用8421法
例00010010,把B6位变成高电平,二进制任何数或上1,都变为1
SCON |=0X01<<6
判断数据是否发完或收完
TI:(c51往PC机发)当数据往外发完时,TI变为1(内部硬件置1),需要在程序中手动置0
RI: 当数据接收完时,RI变为1(内部硬件置1)
// PCON:设置波特率是否加倍与B7有关(不配)
SBUF:数据缓存寄存器 (8位) PC机发送数据到C51上,(想要发送的数据存放)到SBUF中。
SBUF=(想要放的数据) //往SBUF中放入数据,硬件开始发送工作
如果T1==0;说明没发送完毕,T1等于1说明数据发送完毕,之后需要手动软件置0,即T1=0
5、串口波特率计算:定时器一做波特率发生器 可以算出TH1(16进制)例 253=0XFD
(2的SMOD次方/32)*(定时器的溢出率)=9600 定时器的溢出率=SYSclk/12/(256-TH1) SYSclk是系统的晶振时钟(系统频率=11059200) SMOD是PCON中的B7位
6、单片机发送数据到电脑:例c51发送16进制的0xA给PC,每隔一会。 或者 发送一串字符
串口初始化:
void initUart()
{
SCON=0x50;//串口工作方式1,波特率位9600
TMOD=0x20; //定时器1的工作模式寄存器(例 8位 定时器工作在模式二)TH1=oxFD;
TH1=0xFD:
TL1=0xFD;
TR1 =1; //在PCON 中 ,运行控制位//允许串口接收数据
` }
void delay()
{
int i;
for(i=0;i<10000;i++);
}
void sendByte(char c)
{
SBUF=c; //往SBUF中存放数据,硬件开始工作
while(TI==0)
{
//一直查询TI的值,当TI值位1时接收完毕,退出循环,进入下一次发送
}
TI=0;
}
void sendString(char *str)
{
while(*str!=’\n’)
{
sengByte(*str);
str++;
}
}
int main()
{
initUart();
delay();
sendByte(0xA);
//sendString("hello world\r\n"); 传送字符串
return 0;
}
7、电脑发送数据控制单片机:
例:当电脑发送数据1时,单片机上为111111hello
发送2时,单片机上为22222hello
int cmd=0;
if(RI==1)//收到数据,硬件置1
{
RI=0;// 需要手动置0
cmd=SBUF;//读取PC发送的数据存放在cmd中
if(cmd=1)
{
sendString(“111111hello”);
}else (cmd=2)
{
sendString(“22222hello”);
}
}