• 单片机串口通讯


    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;//数据回显,用于调试
    }
  • 相关阅读:
    gcc 编译器常用的命令行参数一览
    linux下源代码分析和阅读工具比较
    Linux系统——C/C++开发工具及环境搭建
    GDB调试——经验总结
    gdb调试的艺术——Debug技巧
    命令__cp、scp(Secure Copy)
    常用shell脚本命令
    命令__查找、替换、删除
    UltraEdit 删除空行
    命令__shell数字-字符串比较
  • 原文地址:https://www.cnblogs.com/ywf520/p/7263273.html
Copyright © 2020-2023  润新知