串口通信
需要知道几个基础知识点。
波特率 起始位 停止位 校验位,具体的可以去查书。
串口通信为串行通信方式,即每次只能发送一位,且为单工,一端固定为发送端,另一端为接收端。
51单片机的串口需要配置的寄存器可以直接通过STC-ISP这个软件配置,选择好晶振的频率和波特率直接生成就可以了
下面直接贴代码
bit uart1_busy=0;
void UartInit(void) //115200bps@12.000MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x01; //串口1选择定时器2为波特率发生器
AUXR |= 0x04; //定时器2时钟为Fosc,即1T
T2L = 0xE6; //设定定时初值
T2H = 0xFF; //设定定时初值
AUXR |= 0x10; //启动定时器2
}
void uart1_sendByte(char byte) //串口发送一个字节
{
while (uart1_busy);
uart1_busy = 1;
SBUF = byte;
TI = 0;
}
void uart1_sendstring(char* str) //串口发送字符串
{
while(*str)
{
uart1_sendByte(*str++);
}
}
char putchar(char c) // 用于printf函数
{
uart1_sendByte(c);
return c;
}
void UART1_IRQ_Handle(void) interrupt 4 using 1
{
if (TI)
{
TI = 0;
uart1_busy = 0;
}
if (RI)
{
RI = 0;
}
}
void Delay100ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 5;
j = 144;
k = 71;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
UartInit(); //初始化串口
EA = 1; //开总中断
ES=1; //打开串口中断
while (1)
{
uart1_sendstring("Hellow World!\n");
Delay100ms();
printf("Hello World!\n"); //串口打印结果
}
}
51单片机用SBUF来储存发送和接收的到的数据,所以可以直接将需要发送的值赋值给SBUF。另外如果想要使用printf函数,需要重定义一下putchar函数才行。