单片机/MCU论坛
直播中

金锦江

7年用户 140经验值
擅长:88551
私信 关注
[问答]

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

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

#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
#include
#include
#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;     //千分位

}




回帖(7)

金锦江

2018-3-7 09:17:00
附上uart.h
#ifndef  _UART__H
#define  _UART__H

#define uint unsigned int
#define uchar unsigned char
       
void uart_init();//´®¿Ú³õʼ»¯º¯Êý
void uart_Interrupt();//´®¿ÚÖжϺ¯Êý
void Send(uint dat);//´®¿Ú×Ö·û·¢Ëͺ¯Êý
extern  uint  enable;//´®¿Ú¿ª¹Ø¿ØÖÆ룬1Ϊ´ò¿ª
#endif

附上adc.h
#ifndef  _ADC__H
#define  _ADC__H
#include
#include
#define uint unsigned int
#define uchar unsigned char
          
#define      ad0_7      P1       //ADÊý¾Ý¿Ú





void start_ad(void);
unsigned int read_ad();       

#endif

举报

金锦江

2018-3-7 09:41:27
上电后,串口助手一直收到hhhhhhh
举报

lcdclass

2018-3-7 11:26:15
你用的哪款液晶屏,我这里推荐一款I2C接口的 RSCG12864B01, 支持12*12和16*16的中文字库,支持图片存储功能(用于开机画面及菜单使用)
举报

人中狼

2018-3-7 11:52:40
先解决上电串口助手就收到数据的问题,按你的程序结构,应该是有对应的按键按下,并且上位机发采集命令,单片机才会采集并返回数据。
void Send(uint dat)
{
        SBUF=(dat)+ 48;  
这里不太明白,或许去掉dat的括号试试。
另外按你说的单独发send(3)是收到3的,好像也不对,SBUF=(dat)+ 48;  所以发送3,应该收到3+48=51才对
举报

金锦江

2018-3-7 12:51:25
引用: 人中狼 发表于 2018-3-7 11:52
先解决上电串口助手就收到数据的问题,按你的程序结构,应该是有对应的按键按下,并且上位机发采集命令,单片机才会采集并返回数据。
void Send(uint dat)
{

恩,是的,我是按下开始键,下位机开始采集数据并显示,此时如果上位机发采集命令,则开始通过串口发数据。send函数应该是对的吧,我测试程序试过。
举报

金锦江

2018-3-7 12:53:33
引用: 人中狼 发表于 2018-3-7 11:52
先解决上电串口助手就收到数据的问题,按你的程序结构,应该是有对应的按键按下,并且上位机发采集命令,单片机才会采集并返回数据。
void Send(uint dat)
{

+48是刚好发字符3,对应ascii码是51
举报

金锦江

2018-3-7 12:54:44
引用: jjj648019770 发表于 2018-3-7 12:53
+48是刚好发字符3,对应ascii码是51

程序思路是按下下位机开始键,下位机开始采集数据并显示,然后如果此时上位机发来采集命令,则开始向串口发数据,send函数应该没问题吧,我测试程序也这么写的
举报

更多回帖

发帖
×
20
完善资料,
赚取积分