标题: 求教各路大佬,单片机串行通信+AD转换 接收到的数据有误咋办 [打印本页]

作者: xchaiwxy    时间: 2020-2-13 15:30
标题: 求教各路大佬,单片机串行通信+AD转换 接收到的数据有误咋办
要求是做到  
当收到上位机发送来的1后,向上位机发送字符串Turn on ad同时间隔1s读取一次AD的值,换算成实际电压浮点数,并且从串口发送到上位机。
当收到上位机发送来的2后,向上位机发送字符串Turn off ad,然后停止发送电压
当收到上位机发送来的任何数后,向上位机发送字符串error
现在是按下面的单片机代码无论发送什么都为error

//////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
曾对串行口函数 if  处进行过修改,
if(date==1)
  {
   flag_on=0;
  }
  if(date==2)
  {
   flag_on=1;
  }
if(date==3)
  {
   flag_on=2;
  }
现象是无论上位机收到任何数,都会输出Turn on ad,并且读取AD值,



#include "reg52.h"                        
#include"XPT2046.h"        
#include"stdio.h"
typedef unsigned int u16;         
typedef unsigned char u8;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 date,flag,flag_on;
u16 time_num,flag_time,ad_val;
u8 disp[4];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
float ad_vo;


void delay(u16 i)     //延时函数
{
        while(i--);        
}


void init()          //串行口定时器0初始化
{
TMOD=0X21;
TH1=0XF3;
TL1=0XF3;
TH0=0XFC;        
TL0=0X18;
PCON=0X80;
TR1=1;

SCON=0X50;
EA=1;
ES=1;
ET0=1;                        
  
}


void datapros()  //数据处理函数
{

        disp[0]=smgduan[ad_val/1000];//?λ
        disp[1]=smgduan[ad_val%1000/100];//??λ
        disp[2]=smgduan[ad_val%1000%100/10];//??λ
        disp[3]=smgduan[ad_val%1000%100%10];               
}



void DigDisplay()       //数码管显示函数
{
        u8 i;
        for(i=0;i<4;i++)
        {
                switch(i)         
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; break;
                        case(1):
                                LSA=1;LSB=0;LSC=0; break;
                        case(2):
                                LSA=0;LSB=1;LSC=0; break;
                        case(3):
                                LSA=1;LSB=1;LSC=0; break;
                }
                P0=disp[3-i];
                delay(100);
                P0=0x00;
        }               
}





void main()
{
init();
while(1)
{
   if(flag==1)
   {
        ES=0;
        TI=1;
        switch(flag_on)
        {
          case(0):puts("Turn on ad\n");TR0=1;break;
          case(1):printf("Turn off ad\n");TR0=0;break;
          case(2):puts("Error\n");break;
        }
        while(!TI);
        TI=0;
        ES=1;
        flag=0;
   }
if(flag_time==1)
{
flag_time=0;
   ad_val= Read_AD_Data(0x94);  //Read_AD_Data(0x94)读取函数 无问题
   ad_vo=(float)ad_val*5.0/4095.0;
   ES=0;
   TI=1;
   printf("The voltage is %fV\n",ad_vo);
   while(!TI);
   TI=0;
   ES=1;
}
  datapros();
  DigDisplay();
}
}




  void  Timer0()interrupt  1  
{

  TH0=0XFC;        
  TL0=0X18;
  time_num++;
  if(time_num==1000)//1s
  {
   time_num=0;
   flag_time=1;
  }
}

void ser()interrupt  4    //串行口中断
{
  RI=0;
  date=SBUF;
                 
  flag=1;
  if(date==1)
  {
   flag_on=0;
  }
  else if(date==2)
  {
   flag_on=1;
  }
  else
  {
   flag_on=2;
  }
}

51hei图片222222222.png (227.57 KB, 下载次数: 76)

51hei图片222222222.png

AD转换串口通信.rar

28.7 KB, 下载次数: 7






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1