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

