ad采集的数据通过串口发送问题

2019-07-15 08:52发布

目前遇到一个问题,我的大程序不加串口是可以ad采集并液晶显示的,现在把串口部分加到大程序里,发现无法把ad采集的数据发送给串口。我的串口程序是可以的,在大程序里while(1)里,单独测试过,如单独发send(3)是收到3的,如果发送Send(date_tab[0]);就不行,串口助手没有任何数据,哪个大佬答疑解惑,非常感谢!
下面附上adc.c、uart.c和main.c程序,求大佬指导一二。
#include<reg51.h>
#include<intrins.h>
#include<string.h>
#include "delay.h"
#include "lcd.h"
#include "adc.h"
#include "key.h"
#include "display.h"
#include "uart.h"

uchar  data date_tab[8];


uint flag=0;//按键标志位


uint TestDisMode=0;
uint PresValue=0;
void  main()
{
        uart_init();//串口初始化
        TH0=(65536-1000)/256; //1ms初值
        TL0=(65536-1000)%256;
        ET0=1;
        //TR0=1;//初始化时关闭T0,等按下开始再启动T0
        TR0=0;//初始化T0停止
        EA=1;//开总中断

        lcd_init();
        display_start();
        delay_ms(10);
       
   while(1)
   {         
           keyscan();
           if(TestDisMode==1)
     {
                               
                           TR0=1;//按下开始键后T0开启
                          
                           Volt_pressure_display();
                               
                                 if(enable=1)//如果上位机按下开始采集,则发送0x01给下位机
                                 {
                                               
                                          Send(date_tab[4]);//发送压力千位
                                          Send(date_tab[5]);//发送压力百位
                                          Send(date_tab[6]);//发送压力十位
                                          Send(date_tab[7]);//发送压力个位
                                 }
                                 if(enable==0)//如果没有收到01,则关闭ad采集,不发送数据
                                 {
                                       
            TR0=0;
                                 }
                    
       }                 
       else
       {
                         TR0=0;
                                 
             }                 
   }
}


void timer0() interrupt 1   
{
        uchar t0;//t0控制pwm信号时间变量
        uchar t1;//t1控制采样频率时间变量
        TH0=(65536-1000)/256;      //1ms初值
        TL0=(65536-1000)%256;
       

        t0++;
       
       
        t1++;
        if(t1==100)  //采样频率是100ms
        {
                 t1=0;
                 Volt_collect();                     
        }                 
       


}


#include<reg51.h>
#include<intrins.h>
#include<string.h>

#include "uart.h"





/*************串口初始化函数*******************************/
void uart_init(void)
{
                TMOD=0x21;        //定计0工作方式1,定计1工作方式2
                TH1=0XFD;          //定计1赋初值
                TL1=0XFD;
                SCON=0X50;         //串口控制寄存器:SM0=0,SM1=1,REN=1
          TR1=1;                 //开定计器1
                EA=1;                 //开总中断
                ES=1;                 //开串口中断
       
}

/*************串口中断服务子程序*******************************/
void uart_Interrupt() interrupt 4
{
        if(RI==1)
        {
                RI=0;
                if(SBUF == 0x01)//下位机收到01,则开始采集
                {
                        enable = 1;
                }
                if(SBUF == 0x02)//下位机收到02,则停止采集
                {
                        enable = 0;
                }
        }       
}

/*************************串口字符发送函数********************************/

void Send(uint dat)
{
        SBUF=(dat)+ 48;                // 发送 千 位
        while(!TI);
        TI=0;
       
}



#include<reg51.h>
#include<intrins.h>
#include<string.h>
#include "adc.h"
#include "display.h"

uint  recieve_volt;
extern uchar data date_tab[8];
extern uint PresValue;
/*******************************************************************/
/*                                                                 */
/*  启动AD转换子程序                                               */                                                         
/*******************************************************************/
void start_ad(void)
{       cs=0;                 //允许进行A/D转换
        wr=0;_nop_();wr=1; //WR由低变高时,AD开始转换
        //while(intr);          //查询转换结束产生INTR 信号(低电平有效)
        cs=1;                 //停止AD转换
}
/*******************************************************************/
/*                                                                 */
/* 读A/D数据子程序                                              */                                                         
/*******************************************************************/
unsigned int read_ad()
{       uint ad_data;
        ad0_7=0xff;
        cs=0;                 //允许读
        rd=0;                 //读取转换数据结果数据结果
        _nop_();
        ad_data=ad0_7;         //把数据存到ad_data中
        rd=1;cs=1;            //停止A/D读取
        return(ad_data);
}

/*******************************************************************/
/*                                                                 */
/*电压采集子程序                                           */                                                         
/*******************************************************************/
void  Volt_collect()
{

       start_ad();
        recieve_volt=read_ad();              
        recieve_volt=recieve_volt*196;         
        date_tab[0] =recieve_volt/10000;     //整数                          
        date_tab[1]=recieve_volt%10000/1000; // 十分位                     
        date_tab[2]=recieve_volt%1000/100;   // 百分位                  
        date_tab[3]=recieve_volt%100/10;     //千分位

}




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
人中狼
2019-07-15 18:15
先解决上电串口助手就收到数据的问题,按你的程序结构,应该是有对应的按键按下,并且上位机发采集命令,单片机才会采集并返回数据。
void Send(uint dat)
{
        SBUF=(dat)+ 48;  
这里不太明白,或许去掉dat的括号试试。
另外按你说的单独发send(3)是收到3的,好像也不对,SBUF=(dat)+ 48;  所以发送3,应该收到3+48=51才对

一周热门 更多>