串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。标准有RS232,RS422,RS485。
在单片机中,串口扮演了一个很重要的角色——传话筒。通过串口,单片机得以和计算机可以通话。接下来来探讨一下使用串口需要配置什么。
1.配置串口工作模式为模式1。即设置SCON寄存器(SM0,SM1,REN位),SCON |= 0X50;(SM0 = 0,SM1 = 1,REN =1).
SM0 = 0,SM1 = 0 方式0:同步移位串行方式:波特率= SYSclk / 12.
SM0 = 0,SM1 = 1 方式1:8位UART,波特率可变: 波特率 = (2^SMOD / 32) * (定时器1的溢出率)
SM0 = 1,SM1 = 0 方式2:9位UART: 波特率 = (2^SMOD / 64) * (SYSclk系统工作时钟频率)
SM0 = 1,SM1 = 1 方式3: 8位UART,波特率可变: 波特率 = (2^SMOD / 32) * (定时器1的溢出率)
注意:
当单片机工作在12T模式时,定时器1的溢出率 = SYSclk / 12 / (256 - TH1);
当单片机工作在1T模式时,定时器1的溢出率 = SYSclk / 6 / (256 - TH1);
SMOD默认为0。具体作用参考数据手册。
2.配置定时器1为模式2,即自动重装载模式。TMOD &= 0X0F; TMOD |= 0X20.
3.根据波特率计算TH1,TL1的初值,如果有需要可使用PCON进行波特率加倍(PCON最高位为波特率加倍位)。
计算公式:TH1 = TL1 = 256 - 晶振值 / 12 / 2 / 16 / 波特率;
如果波特率加倍则:PCON |= 0X80; 计算公式:TH1 = TL1 = 256 - 晶振值 / 12 / 16 / 波特率;
4.打开定时器控制寄存器TR1,启动定时器。即TR1=1。
在这张图中,可以得知:在发送数据的时候TI一直为零,当数据发送结束的时候便变为1了。RI也是同样由0到1.故而我们可以通过TI和RI的状态来判断数据是否发送完全。并且当TI和RI变为1的时候是不会主动变成0的,故而我们需要手动对TI和RI的值进行调整,手动清零。这一点在后方的范例中由展示。
范例:
#include<reg52.h>
#include<string.h>
#include<stdio.h>
void delay()//延时函数
{
int i;
int j;
for(i=0;i<100;i++)
{
for(j=0;j<500;j++)
{
}
}
}
void initUnrt()
{
SCON =0x50;//配置为可以通讯的模式
TMOD=0x20;
TR1 =1;
TH1=TL1=0xFD;
}
void sendmsg(char *a)
{
int len;
int i;
len=strlen(a);
for(i=0;i<len;i++)
{
SBUF=*a;//在此处,SUBF充当一个嘴的作用,用来向上位机发送数据
while(TI!=1);
TI=0; //手动清零
a++;
delay();
}
}
int main()
{
char *c;
int i;
i=0;
initUnrt();
*c=SBUF; //在这里的SBUF作为一个耳朵的作用,用来听取上位机向单片机发送的数据
RI=0;//由于接收完数据R1为1,所以手动清零
if(c=='1')
{
sendmsg("hello");
}
return 0;
}
该代码实现了上位机向单片机发送1的时候,单片机回复上位机一个hallo。也是初步的使用串口。