天天看点

51单片机简单的串口通讯-1

大学毕业后从事了PLC电气编程工作,但一直热爱单片机,一直在自学,今天终于对串口通讯有了一个简单的理解,写篇文章纪念一下,同时也感谢CSDN一直这一来的帮助。

实例一,通过单片机A向单片机B发送0-3数字,双机均循环显示输出到P2口的7段数码管上。

电路图

51单片机简单的串口通讯-1

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;  //开串口中断
	   }
           

测试结果

51单片机简单的串口通讯-1
51单片机简单的串口通讯-1

继续阅读