大学毕业后从事了PLC电气编程工作,但一直热爱单片机,一直在自学,今天终于对串口通讯有了一个简单的理解,写篇文章纪念一下,同时也感谢CSDN一直这一来的帮助。
实例一,通过单片机A向单片机B发送0-3数字,双机均循环显示输出到P2口的7段数码管上。
电路图
A机程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
char code map[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
main()
{
uchar i;
uint j,k;
TMOD=0x20; //设置定时器1工作在模式2
TL1=0xfd;
TH1=0xfd; //根据传输的波特率设置定时器1初值9600
PCON=0x00; //不加倍
SCON=0x50; //选择工作方式1,使能收发功能
TR1=1; //启动定时器1
while(1)
{
for(i=0;i<4;i++)
{
SBUF=map[i]; //发送数据
while(TI==0);
TI=0; //将标志位TI清0
P2=map[i]; //将发送数取反
for(j=0;j<12500;j++)
{for(k=0;k<10;k++);
}
}
}
}
B机程序
#include<reg52.h>
unsigned char buf;
void main(void)
{
SCON=0x50; //SM0 SM1 SM2 REN TB8 RB8 TI RI 2#0101 0000 串口工作方式1(10位异步通讯);允许接收控制位1,允许接收。
PCON=0x00; //SMOD - - - GF1 GF0 PD TDL SMOD为波特率选择位,=0,不加倍;=1,加倍;
TMOD=0x20; //定时器1 工作方式2:8位自动重装
EA=1;
ES=1;
TL1=0xfd; //19200 0xfd*2 ;9600 0xfd;4800 0xfa; 2400 0xf4; 1200 0xe8;
TH1=0xfd;
TR1=1;
while(1);
}
//串口受收到数据,触发中断
void service() interrupt 4
{
ES=0; //关闭串口中断
RI=0; //清零标志位,硬件置1;软件清0
buf=SBUF;
P2=buf;
ES=1; //开串口中断
}
测试结果