找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1541|回复: 0
打印 上一主题 下一主题
收起左侧

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);
        
  }





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表