TLC2543采集的数据用12864显示,结果不准确!!!求大神指.....

2019-07-15 19:07发布

#include <reg52.h>
#include <intrins.h>
#include <math.h>
#include "12864.c"

#define uint unsigned int
#define uchar unsigned char
       
sbit clock = P1^0;   
sbit input = P1^1;     
sbit output = P1^2;     
sbit CS = P1^3;   

uchar voltage=0;
uint u,data0=0;//,datal,datah;  //转换结果,低位,高位
uchar data disp_buf[] ={"0000"};//显示缓冲区
uchar data disp_buf1[] ={"0.00"};

void delay(uchar N)
     {  
       while(N--);
     }

uint read2543(uchar CON_WORD) //通道号
{     
       uint ad=0;
       uchar i;  
       CON_WORD<<=4;
       clock=0;
       CS=0;  
     for(i=0;i<12;i++) //默认12位ADC,输出十二个二进制数
       {      
                   if(output==1)   
                   ad=ad|0x01;     
                   if(CON_WORD&0x80)        
                   input=1;     
                      else         
                       input=0;     
                    clock=1;     
                    delay1(10);        
                    clock=0;     
                    delay1(10);      
                    CON_WORD<<=1;   
                    ad<<=1;
       }
   CS=1;
   ad>>=1;
    return(ad);
}
                  
void calculate()
{                                                                 
uchar temp1,temp2;
        disp_buf[0]=(uchar)((data0/1000)+'0');                    //千位
  temp1=(data0%1000);
  disp_buf[1]=(uchar)((temp1/100)+'0');                //百位
  temp2=(temp1%100);
  disp_buf[2]=(uchar)((temp2/10)+'0');                     //十位
  disp_buf[3]=(uchar)((temp2%10)+'0');                  //个位
        //u=(uint)(data0+'0');//disp_buf[0]*1000+disp_buf[1]*100+disp_buf[2]*10+disp_buf[3];
        voltage=(uchar)(((data0*5)/4096)+'0');
        disp_buf1[0]=(uchar)(voltage+'0');       
}

void Display()
{
        uchar i;
        lcd_pos(1,0);             //设置显示位置为第一行
        for(i=0;i<4;i++)
    {
       lcd_wdat(disp_buf);
       delay(10);
    }
               
        lcd_pos(2,0);
        for(i=0;i<4;i++)
    {
       lcd_wdat(disp_buf1);
       delay(10);
    }       
               
                delay(30);
}

void main()
{          
        lcd_init();
        while(1)   
        {                 
                data0=read2543(0); //0表示通道号,可以改变。 data0是测得的AD转换数据
                calculate();
                Display();                        //调显示函数                                                                                                                                                                                                                                                                                                        
        }
}
/*******************************************************************************
*  描述:                                                                       *
*      12864标准字库液晶演示 数据p1,控制p2                                     *
********************************************************************************/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
/************* 12864LCD引脚定义 *************/
#define LCD_data  P0       //数据口
sbit LCD_RS  =  P2^4;      //寄存器选择输入
sbit LCD_RW  =  P2^3;      //液晶读/写控制
sbit LCD_EN  =  P2^2;      //液晶使能控制
sbit LCD_PSB =  P3^6;      //串/并方式控制
sbit LCD_RST =  P3^7;      //液晶复位端口          
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};


void delay2(int ms)
{
    while(ms--)
        {
      uchar i;
          for(i=0;i<150;i++)  
           {
          _nop_();                          
                _nop_();
                _nop_();
                _nop_();
           }
        }
}       
/*******************************************************************/
/*  延时函数                                                       */
/*******************************************************************/
void delay1(int ms)
{
    while(ms--)
        {
      uchar y;
          for(y=0;y<100;y++) ;
        }
}                       
/*******************************************************************/
/*检查LCD忙状态                                                    */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */
/*******************************************************************/
bit lcd_busy()
{                          
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delayNOP();
    result = (bit)(P0&0x80);
    LCD_EN = 0;
    return(result);
}
/*******************************************************************/
/*写指令数据到LCD                                                  */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{                          
   while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_();
    P0 = cmd;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;  
}
/*******************************************************************/
/*写显示数据到LCD                                                  */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
/*******************************************************************/
void lcd_wdat(uchar dat)
{                          
   while(lcd_busy());
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = dat;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;
}                                                            
/*********************************/
/* LCD初始化设定                 */  
/*********************************/

void lcd_init()
{
    LCD_PSB = 1;         //并口方式

        LCD_RST = 0;                 //液晶复位
    delay2(3);                  
    LCD_RST = 1;      
    delay2(3);

    lcd_wcmd(0x34);      //扩充指令操作
    delay2(5);
    lcd_wcmd(0x30);      //基本指令操作
    delay2(5);
    lcd_wcmd(0x0C);      //显示开,关光标
    delay2(5);
    lcd_wcmd(0x01);      //清除LCD的显示内容
    delay2(5);
}
/*********************************************************/
/* 设定显示位置                                          */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{                          
   uchar  pos;
   if (X==1)
     {X=0x80;}
   else if (X==2)
     {X=0x90;}
   else if (X==3)
     {X=0x88;}
   else if (X==4)
     {X=0x98;}
   pos = X+Y ;

   lcd_wcmd(pos);     //显示地址
}
/*********************************************************
* 闪烁函数                                               *
*********************************************************/

void  clr_screen()
{
   lcd_wcmd(0x34);      //扩充指令操作
   delay2(5);   
   lcd_wcmd(0x30);      //基本指令操作
   delay2(5);
   lcd_wcmd(0x01);      //清屏
   delay2(5);     
}





5V的时候显示:
QQ图片20140719153547.jpg




0V的时候显示:
QQ图片20140719153552.jpg





3.3V的时候显示:
QQ图片20140719153600.jpg



0V和5V的时候显示都是准确的,可是他们之间的电压显示就有误差,有各位大神指点!!!!!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
bigbigmule
1楼-- · 2019-07-15 22:08
有很多方面的原因,提高精度减少误差的办法在软件方面可以通过软件滤波的方式对采集到的数据进行处理(你可以百度常用软件滤波)或者自己采集数据利用matlab建模的方式解决,硬件方面的处理简单可以通过接个0.1uf以及10uf的电容,一般都得用运放做个缓冲处理,最直接的看看数据手册中有什么电路
zhuyinguo06
2楼-- · 2019-07-16 01:09
好像是读取数据的那部分程序有错
Ljj剧透了
3楼-- · 2019-07-16 04:32
你上边那是全部的程序?
戒戒朱大王
4楼-- · 2019-07-16 08:02
结果再乘
5000/4096

一周热门 更多>