单片机串口通讯

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;//数据回显,用于调试
}
原文地址:https://www.cnblogs.com/ywf520/p/7263273.html