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

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

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


实验目的


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


实验内容


1、搭建实验电路,利用proteus仿真

image.png

**效果1:**利用定时器的定时功能,用6位数码管实现时、分、秒的显示及更新;

**效果2:**制定通信协议,PC机发送数据给单片机,根据发送的指令控制数码管显示时间值的“暂停”及“重启”

代码

#include<reg52.h>
#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);
  }

实验结果

image.png

相关文章
|
存储 数据处理 数据格式
51单片机双机通信实现
51单片机双机通信实现
828 1
|
网络协议 数据处理 数据格式
51单片机ESP8266云端通信的实现
51单片机ESP8266云端通信的实现
839 1
【期末不挂科-单片机考前速过系列P7】(第七章:11题速过串行口基本概念/结构/工作方式/双机通信例题)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P7】(第七章:11题速过串行口基本概念/结构/工作方式/双机通信例题)经典例题盘点(带图解析)
|
网络协议 数据格式
【通信协议讲解】单片机基础重点通信协议解析与总结之ModBus(五)
【通信协议讲解】单片机基础重点通信协议解析与总结之ModBus(五)
316 1
|
IDE 开发工具
【通信协议讲解】单片机基础重点通信协议解析与总结之CAN(四)
【通信协议讲解】单片机基础重点通信协议解析与总结之CAN(四)
498 1
【通信协议讲解】单片机基础重点通信协议解析与总结之串口通信(三)
【通信协议讲解】单片机基础重点通信协议解析与总结之串口通信(三)
203 1
【通信协议讲解】单片机基础重点通信协议解析与总结之SPI(二)
【通信协议讲解】单片机基础重点通信协议解析与总结之SPI(二)
174 1
【通信协议讲解】单片机基础重点通信协议解析与总结之IIC(一)
【通信协议讲解】单片机基础重点通信协议解析与总结之IIC(一)
191 1
|
C语言 芯片 数据格式
C语言课设项目-51单片机-红外通信
C语言课设项目-51单片机-红外通信
322 0
|
存储 开发框架 前端开发
单片机与HC-05蓝牙模块通信
单片机与HC-05蓝牙模块通信
438 0