标题: ADC0808两路采集,LM016L总是闪烁,时而显示正确的数,时而显示错误的数,有人知道... [打印本页]

作者: 小心台阶123    时间: 2021-6-16 21:14
标题: ADC0808两路采集,LM016L总是闪烁,时而显示正确的数,时而显示错误的数,有人知道...
#include"at89x51.h"
#include"absacc.h"


#define uchar unsigned char
#define uint unsigned int
#define IN7 XBYTE [0x7fff]//设置ADC0808的通道0的地址
#define IN0 XBYTE [0x7ff8]

sbit RS = P3 ^ 0;
sbit RW = P3 ^ 1;
sbit E = P3 ^ 5;


uchar ad_data;
uchar ad_dataa;
uint volt100,volt1000;
uchar bai, shi, ge;
uchar j;
uchar code welcode[] = {"--DC VOLTMETER--"}; //欢迎屏幕
uchar code number[] = {"0123456789"};
void delay(uchar i)
{
  while(i--);
}
//写指令
void wr_cmd(uchar cmd)
{
  E = 0;
  RS = 0;
  RW = 0;
  P1 = cmd;
  E = 1;
  E = 0;
}
//写数据
void wr_data(uchar dat)
{
  E = 0;
  RS = 1;
  RW = 0;
  P1 = dat;
  E = 1;
  E = 0;
}
//判忙
void  busy_lcd(void)
{
start:             //语句符号
  E = 0;       //使能端为低电平
  RS = 0;      //选择指令寄存器
  RW = 1;      //读操作
  P1 = 0xff;   //读P口之前,应先将P口全部置一
  E = 1;       //使能端由低电平变为高电平,进行读操作
  if (P1_7 == 0)
    return ;  //返回主调函数语句
  else
    goto start;//无条件跳转到标号为start的语句
}
//初始化
void LCD1602_initialize()
{
  busy_lcd();
  wr_cmd(0x38);
  busy_lcd();
  wr_cmd(0x08);
  busy_lcd();
  wr_cmd(0x01);
  busy_lcd();
  wr_cmd(0x06);
  busy_lcd();
  wr_cmd(0x0c);
}
//显示第一行
void disp_welcode(void)
{
  uchar i = 0;
  busy_lcd();
  wr_cmd(0x80);//送第一行地址
  while (welcode != '\0')
  {
    busy_lcd();
    wr_data(welcode);
    i++;
  }
}
//转换后的BCD处理
void data_BCD()
{
  j = volt100 / 100;
  bai = j + 48;
  j = volt100 % 100 / 10;
  shi = j + 48;
  j = volt100 % 10;
  ge = j + 48;
  /*
    bai=number[volt100/100];
    shi=number[volt100%100/10];
    ge=number[volt100%10];
  */
  /*
    bai=volt/100+0x30;
    shi=volt%100/10+0x30;
    ge=volt%10+0x30;

  */
}
void data_BCDD()
{
  j = volt1000 / 100;
  bai = j + 48;
  j = volt1000 % 100 / 10;
  shi = j + 48;
  j = volt1000 % 10;
  ge = j + 48;
}
//转换后的数据第二行显示
void disp_data(void)
{
  busy_lcd();
  wr_cmd(0xc0);


  busy_lcd();
  wr_data(bai);


  busy_lcd();
  wr_data('.');


  busy_lcd();
  wr_data(shi);


  busy_lcd();
  wr_data(ge);


  busy_lcd();
  wr_data('V');
}
//转换后的数据第二个第二行显示
void disp_dataa(void)
{
  busy_lcd();
  wr_cmd(0xc7);


  busy_lcd();
  wr_data(bai);


  busy_lcd();
  wr_data('.');


  busy_lcd();
  wr_data(shi);


  busy_lcd();
  wr_data(ge);


  busy_lcd();
  wr_data('V');
}

void main(void)
{
  uchar i;
  LCD1602_initialize();//液晶初始化
  disp_welcode();//欢迎屏幕

  while (1)
  {
        IN7 = 0x07; //写操作        
    while(P3_2==1);//等待ADC0808转换结束
    ad_data = IN7; //读ADC转换后的数字量数据 IN0={0x00~0xff 即(0~255之间)}
          volt100 = ad_data * 100; //扩大至0~25500之间        
         volt100 = volt100 / 51;        
    data_BCD();
        disp_data();
        
        for(i=0;i<20;i++)
        delay(50000);

        IN0 = 0x00;        
    while(P3_2==1);//等待ADC0808转换结束        
    ad_dataa = IN0; //读ADC转换后的数字量数据 IN0={0x00~0xff 即(0~255之间)}        
          volt1000 = ad_dataa * 100; //扩大至0~25500之间        
         volt1000 = volt1000 / 51;        
    data_BCDD();        
    disp_dataa();
        for(i=0;i<20;i++)
        delay(50000);
        
  }










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