制定通信协议,实现单片机与PC机通信
实验目的
利用PROTUES仿真软件、串口调试助手、虚拟串口,搭建单片机与PC通信仿真平台,熟悉单片机串口的配置及与PC机的通信方法;尝试制定通信协议,单片机根据通信协议解析接收到的内容,并根据接收的指令执行相应的操作。
实验内容
1、搭建实验电路,利用proteus仿真
2、实现以下效果
**效果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);
}
实验结果
ps:关注并私信我免费发仿真图已经完整工程