1、需求:实现电脑端控制单片机打开灯光风扇,显示单片机传递过来的数据【如温度、湿度等】
2、工具、平台软件:【驱动人生】、【VS2012】、【KEIL4】
3、下面就开始吧:
4、查看我们当前的通讯端口号:【如图:】
然后确定我们单片机的晶振,我是用的是11.0592M的【即9600】,差不多我们就可以开始我们的开发了
5、我们默认不定义复杂的通信协议
我们先来开发我们的单片机程序吧:
#include <reg52.h> #include <stdio.h> #include <stdlib.h> #include <string.h> sbit TEXT=P1^0; //测试 sbit FS=P1^1; //控制风扇 sbit DG=P1^2; //控制灯光 sbit JB=P1^3; //控制警报 sbit TEST5=P1^5; //测试 sbit TEST6=P1^6; //测试 sbit TEST7=P1^7; //测试 sbit PIN_RXD=P3^0; sbit PIN_TXD=P3^1; //sbit RxdEnd=0;//结束位 char TEMP;//接收缓存 unsigned char count=0;//串口接收计数的变量 unsigned char receive[6];//接收缓存 unsigned char *RxdBuf; unsigned char* chs ="1{wd=51.0 %RH,sd=26.0℃,jw=0.648560 V ,co=0.270703 V};2{wd=51.0 %RH,sd=26.0℃,jw=0.648560 V ,co=0.270703 V};3{wd=51.0 %RH,sd=26.0℃,jw=0.648560 V ,co=0.270703 V}"; //要发送的数据 void initSerialPort(); //串口初始化 void getDate();//接受数据 void getByteDate(void); void sendDate(char* chs);//发送数据 void main() { initSerialPort(); FS=1; DG=0; JB=1; while(1); } //串口中断函数 void open_led() interrupt 4 { if(RI==1)//接收到数据 { //getDate(); getByteDate(); RI=0;//清除标志位 } } //串口初始化 void initSerialPort() { SCON = 0x50;//SCON:使用模式1 8-bit UART 使能接受 TMOD |=0x20;//TMOD:timer 1,mode 2,8-bit 重装 TH1=0xFD; //TH1 :重装值 波特率:9600 11.0582M TR1=1; // timer 1 打开 EA=1; // 打开总中断 ES=1; //打开串口中断 } void getByteDate(void) { TEMP=SBUF; //if(state_machine == 0) // 协议解析状态机 if(TEMP!='o') { receive[count]=TEMP; if(count==1&&receive[count]=='1') { FS=0; }else if(count==1&&receive[count]=='0'){FS=1;} if(count==2&&receive[count]=='1') { DG=0; }else if(count==2&&receive[count]=='0'){DG=1;} if(count==3&&receive[count]=='1') { JB=0; }else if(count==3&&receive[count]=='0'){JB=1;} count++; } //count=0; SBUF=receive; }
在这里我没有写发送的代码:只写了接收的代码;
后面将会补充完整;
//说明: 单片机接收数据是按照一位一位的度一个字符一个字符的读, 所以我在如下代码中定义了一个中间变量TEMP来接收,当读到O时表示读完 void getByteDate(void) { TEMP=SBUF; //if(state_machine == 0) // 协议解析状态机 if(TEMP!='o') { receive[count]=TEMP; if(count==1&&receive[count]=='1') { FS=0; }else if(count==1&&receive[count]=='0'){FS=1;} if(count==2&&receive[count]=='1') { DG=0; }else if(count==2&&receive[count]=='0'){DG=1;} if(count==3&&receive[count]=='1') { JB=0; }else if(count==3&&receive[count]=='0'){JB=1;} count++; } //count=0; SBUF=receive;//数据回显,用于调试 }