制定通信协议,实现单片机与PC机通信

制定通信协议,实现单片机与PC机通信

实验目的

利用PROTUES仿真软件、串口调试助手、虚拟串口,搭建单片机与PC通信仿真平台,熟悉单片机串口的配置及与PC机的通信方法;尝试制定通信协议,单片机根据通信协议解析接收到的内容,并根据接收的指令执行相应的操作。

实验内容

1、搭建实验电路,利用proteus仿真
制定通信协议,实现单片机与PC机通信_第1张图片2、实现以下效果
**效果1:**利用定时器的定时功能,用6位数码管实现时、分、秒的显示及更新;
**效果2:**制定通信协议,PC机发送数据给单片机,根据发送的指令控制数码管显示时间值的“暂停”及“重启”

代码

#include

#define u8 unsigned char 
#define u16 unsigned int 

sbit SW1=P0^0; 
sbit SW2=P1^1; 
sbit SW3=P2^2; 
sbit LED=P3^7;
bit Flag=0;

u8 Data[]={
      0x3f  , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d, 
			0x7d , 0x07 , 0x7f  , 0x6f , 0x77 , 0x7c ,
			0x39 , 0x5e , 0x79 , 0x71 , 0x00 } ;
u8 Wei[]={
     0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
u8 Hour,Min,Sec;
u8 A;



u8 SetTime;
#define Confirm  0 
#define Set_sec  1 
#define Set_min  2 
#define Set_hour 3 


void Delay( u16 z );
void Display(u8 Hour,u8 Min,u8 Sec);
void Key();
void Init();

void Putchar(u8 a);
void Putstr(u8 *s);
void Uartinit();

main()
{
      
	u8 i;
  Uartinit();
	Putstr("Program start");
	P2=0;
	
	Init();

	while(1)
	{
     
	  
	 
		Key();
    Display( Hour, Min, Sec);


	}





}

void Init()
{
     
//************初始化定时器**********
   TMOD |=0X01; //定时器工作方式1
   TH0=0X3C;  //定时器初始值
   TL0=0XAF;
   ET0=1;	   //中断允许
   EA=1;
   TR0=1;      //启动定时器0

//************串口**********

}

void Timer0 () interrupt 1 //时间函数
{
     
    static u8 count=0;
	count++;
	if(count==2)
	{
     
		count=0;
		Sec++;
		if(Sec>59)
		{
     
			Sec=0;
			Min++;
			if(Min>59)
			{
     
				Min=0;
				Hour++;
				if(Hour>23)
				{
     
					Hour=0;
				}
			
			}
		}	
	
	
	}
	TH0=0X3C;  //定时器初始值
    TL0=0XAF;	 


}

void Delay( u16 z ) //延时函数
{
     
	u16 x,y;
	for(x=0;x<z;x++)
		for(y=0;y<110;y++)
		{
     
			;
		}
}

void Display(u8 Hour,u8 Min,u8 Sec)  //显示函数
{
     
	 u8  Hour_shi,Hour_ge,Min_shi,Min_ge,Sec_shi,Sec_ge;
	  Hour_shi=Hour/10;
	  Hour_ge=Hour%10;
	  Min_shi=Min/10;
	  Min_ge=Min%10;
	  Sec_shi=Sec/10;
	  Sec_ge=Sec%10;



//**********时************
	
	P2=0xff;
	P1=Data[Hour_shi];
	P2=0xfe;
	if(SetTime==Set_hour)
	{
     
		Delay( 1 );
	}
	else
	{
     
		Delay( 10 );
	}
	
	P2=0xff;
	P1=Data[Hour_ge];
	P2=0xfd;
	if(SetTime==Set_hour)
	{
     
		Delay( 1 );
	}
	else
	{
     
		Delay( 10 );
	}

//**********分************
	P2=0xff;
	P1=Data[Min_shi];
	P2=0xfb;
	if(SetTime==Set_min)
	{
     
		Delay( 1 );
	}
	else
	{
     
		Delay( 10 );
	}

	P2=0xff;
	P1=Data[Min_ge];
	P2=0xf7;
	if(SetTime==Set_min)
	{
     
		Delay( 1 );
	}
	else
	{
     
		Delay( 10 );
	}

 //**********秒************

	P2=0xff;
	P1=Data[Sec_shi];
	P2=0xef;
	if(SetTime==Set_sec)
	{
     
		Delay( 1 );
	}
	else
	{
     
		Delay( 10 );
	}


	P2=0xff;
	P1=Data[Sec_ge];
	P2=0xdf;
	if(SetTime==Set_sec)
	{
     
		Delay( 1 );
	}
	else
	{
     
		Delay( 10 );
	}


	
	
	


}
void Key()  //按键函数
{
     
	if(SW1==0)
   {
     
   	  Delay(10); 
	  if(SW1==0)	//消除抖动
	  {
     
   	  	LED=~LED;
		SetTime++;
		if(SetTime>Set_hour)
		{
     
			SetTime=Confirm; //0
		}


	  }
	  while(SW1==0)	//松手检测
	  {
     
	  	Display( Hour, Min, Sec);
	  }
   
   }

 //Confirm Set_hour   Set_sec Set_min  
   if(SW2==0)   //加1
   {
     
   	  Delay(10);
	  if(SW2==0)
	  {
     
	   	switch(SetTime)
		{
     
			case Set_hour:  	//3
				if(Hour>=23)
				{
     
				  Hour=0;
				} 
				else
				{
     
				 Hour++;	     
			 	}
				break;

			 case Set_min:	 //2
				if(Min>=59)
				{
     
				  Min=0;
				} 
				else
				{
     
					Min++;
				}
				break;

			case Set_sec:
				if(Sec>=59)
				{
     
				  Sec=0;
				} 
				else
				{
     
				 Sec++;
				 }
				 break;

			 case Confirm:	break;

			 default: break;
	   
	   	  }
	   
	  }
   }	 
	while(SW2==0)	//松手检测
   {
     
  	 Display( Hour, Min, Sec);
   }
   
   
   if(SW3==0)   //减1
   {
     
   	  Delay(10);
	  if(SW3==0)
	  {
     
	   	switch(SetTime)
		{
     
			case Set_hour:
				if(Hour<=0)
				{
     
				  Hour=0;
				} 
				else
				{
     
				 Hour--;	     
			 	}
				break;

			 case Set_min:
				if(Min<=0)
				{
     
				  Min=0;
				} 
				else
				{
     
					Min--;
				}
				break;

			case Set_sec:
				if(Sec<=0)
				{
     
				  Sec=0;
				} 
				else
				{
     
				 Sec--;
				 }
				 break;

			 case Confirm:	break;

			 default: break;
	   
	   	  }
	   
	  }
   }	 
	while(SW3==0)	//松手检测
   {
     
  	 Display( Hour, Min, Sec);
   }
   
   
}

void Uartinit()  //初始化串口
{
     
	TMOD |=0X20; //T1 工作方式2,自动重装载 TMOD&0X0F|0X20;
	TH1=0XFD;
	TL1=0XFD; //初始值 波特率9600
	TR1=1;     //启动定时器
	SCON=0X50;
	PCON&=0X7F;
	EA=1;
	ES=0;

}
void Putchar(u8 a)  //接收数据
{
     
	ES=0;
	SBUF=a;// 'A' " dsfsdfsd"   A
	while(TI==0);
	TI=0;
	ES=1;
}

void Putstr(u8 *s)  //Putstr("Program start");
{
     
   while(*s!='\0')
   {
     
   		Putchar(*s);
		s++;
   }
}

void Uart() interrupt 4  //串口中断
{
     
	if(RI==1)
	{
     
	  RI=0;
	  A=SBUF;
		if(A=='p')
		{
     
			TR0=0;
		}
		if(A=='r')
		{
     
			TR0=1;
		}
	  Putchar(A);
	}

实验结果

制定通信协议,实现单片机与PC机通信_第2张图片
ps:关注并私信我免费发仿真图已经完整工程

你可能感兴趣的:(51单片机,#,串口通信,单片机,串口通信)