蓝桥杯单片机串口通信综合示例

模块:数码管 串口通信

 功能:计算机以十六进制发送数据 单片机接收后 以十进制在数码管上显示,并且将数据加一再发送到计算机

#include <reg52.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char
uint num; // 申明全局变量
sbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选

//共阴数码管段选表0-9
uchar code SMGduan[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
//数码管位选码
uchar code SMGwei[] = {0xfe, 0xfd, 0xfb};
void timer () //定时器1 的初始化函数
{
  EA = 1;	  //总中断开关
  ET0 = 1;	  // 定时器1中断开关 
  TR0 = 1;  
  REN = 1;//允许串口接收
  TMOD |= 0x01;	// 定时器1 16模式
  TH0 = 0xee;
  TL0 = 0x00; // 定时50ms

}

void UART ()  // 串口通信中断
{
  EA = 1;	 //总中断开关
  ES = 1;	//串口中断开关
  SM0 = 0;  SM1 = 1; 
  REN = 1;	//允许串口接收    
  TR1 = 1;        
  TMOD |= 0x20;
  TH1 = 0xfd;
  TL1 = 0xfd;
 
}
void display(uchar i)
{
	static uchar wei; 		
	P0 = 0XFF;//清除断码
	WE = 1;//打开位选锁存器
	P0 = SMGwei[wei];
	WE = 0;//锁存位选数据
	switch(wei)
	{
		case 0: DU = 1; P0 = SMGduan[i / 100]; DU = 0; break;
		case 1: DU = 1; P0 = SMGduan[i % 100 / 10]; DU = 0; break;	
		case 2: DU = 1; P0 = SMGduan[i % 10]; DU = 0; break;		
	}
	wei++;
	if(wei == 3)
		wei = 0;
}
void main ()
{  
	timer ();
	UART ();
	while(1); 
}
void time () interrupt 1 // 定时中断函数
{
  TH0 = 0xee;
  TL0 = 0x00; // 定时50ms
  display(num); //数码管显示
}
void UART1 () interrupt 4
{
  if(RI)
  {
    uint temp;
	RI = 0;
	num = SBUF; // 接收数据
	temp = num;
	temp++;
	SBUF = temp; // 发送数据
  }	  
    if(TI)
	TI = 0;
}
发布了9 篇原创文章 · 获赞 2 · 访问量 2692

猜你喜欢

转载自blog.csdn.net/weixin_42432428/article/details/104053631