单片机的串口通信功能是比较常用的功能。

80C51的串行口
我在学习的过程中,觉得SBUF的使用方法是最难的,于是对着这个图和资料一步步理解,才搞明白一点“A=SBUF”和“SBUF=A”的意思。
51单片机通过特殊功能寄存器SBUF对串行接收或串行发送寄存器进行访问,两个寄存器共用一个地址99H,但在物理上是两个独立的寄存器。当接收数据时,写“A=SBUF”,单片机会自动将串口接收寄存器中的数据取走给A;当发送数据时,写“SBUF=A”,程序执行完这条语句便自动开始将串口发送寄存器中的数据一位位从串口发送出去。这些知识可以在书籍上面找到。

对定时器和串口初始化
void uasrinit()
{
TMOD=0X20;//选择为定时器1模式,工作方式1,仅用TR1打开启动。
TH1=0xfa; //波特率位4800 晶振频率为11.0592MHz
TL1=0Xfa;
// PCON=0x80; //把SMOD=1,该状态下串口方式1,2,3的波特率加倍
TR1=1;//打开定时器
SM0=0;
SM1=1; //串口通信方式1,10位异步收发(8位数据)
REN=1; //打开接收
ES=1; //串口中断打开
EA=1; //打开总中断
}
中断程序
void uasr() interrupt 4
{
int a;
a=SBUF;
RI=0; //接收中断,与发送中断类似
SBUF=a;
while(!TI);
TI=0; //发送中断标志,在方式1,2,3中由内部硬件置1,不清零就会一直发送。
}
全部程序
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include <intrins.h>
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
void uasrinit()
{
TMOD=0X20;//选择为定时器1模式,工作方式1,仅用TR1打开启动。
TH1=0xfa; //波特率位4800 晶振频率为11.0592MHz
TL1=0Xfa;
// PCON=0x80; //把SMOD=1,该状态下串口方式1,2,3的波特率加倍
TR1=1;//打开定时器
SM0=0;
SM1=1; //串口通信方式1,10位异步收发(8位数据)
REN=1; //打开接收
ES=1; //串口中断打开
EA=1; //打开总中断
}
void main()
{
uasrinit();
while(1);
}
void uasr() interrupt 4
{
int a;
a=SBUF;
RI=0; //接收中断,与发送中断类似
SBUF=a;
while(!TI);
TI=0; //发送中断标志,在方式1,2,3中由内部硬件置1,不清零就会一直发送。
}
程序运行后的效果
也可以让单片机固定发送指定内容
unsigned char flag,a,i;
unsigned char code table[]="I get ";
void init()
{
TMOD=0X20;//选择为定时器1模式,工作方式1,仅用TR1打开启动。
TH1=0xfd; //波特率位9600
TL1=0Xfd;
// ET1=1;//打开定时器0中断允许
EA=1;//打开总中断
TR1=1;//打开定时器
SM0=0;
SM1=1; //串口通信方式1,10位异步收发(8位数据)
REN=1; //打开接收
ES=1; //串口中断打开
}
void main()
{
init(); //初始化
while(1)
{
if(flag==1)
{
ES=0;
for(i=0;i<6;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
}
SBUF=a;
while(!TI);
TI=0;
ES=1;
flag=0;
}
}
}
void ti1() interrupt 4
{
RI=0;
a=SBUF;
flag=1;
}
效果
该程序案例来自郭天祥的《51单片机C语言教程》
总结:波特率很重要,在使用串口通信的之前一定要明白单片机的晶振频率。之前的学习因为波特率没有匹配正确,导致输出一段乱码。
版权声明:本文为qq_52771054原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。