关于AD转换的数值问题?我写了个模数转换程序可是显示有...

2019-07-15 18:27发布

本帖最后由 新时代工程师 于 2014-9-24 21:41 编辑

关于AD转换的数值问题和显示问题,请教一下诸位大神:(1)AD转换后输入到单片机的是二进制数值?它与输入的模拟电压有什么关系,可以仔细说一下吗?给个参考资料也行!(2)对于5V的参考电压,8位的ADC芯片,为什么编程是转换数据是  X(二进制代码)255*500,为什么是乘以500?其他位数如12位的单片机也是这样吗?(3)对于8位的单片机来说,12位的ADC芯片转换后如何处理?(4)如果要显示三位如999~0.001要如何编程?或者说显示小数位要如何编程?  如果能给分资料那就更加好了,谢谢!!!
我写的这个程序是两个按键,对应于两路AD间的切换,运行没有什么太大的问题,就是显示的第二路,数值不正确,望高手解答,谢谢!!!

这是我写的程序
#include<reg52.h>            //52头文件申明
#define uchar unsigned char
#define uint  unsigned int

sbit le = P2^0;     
sbit clk = P2^1;         //ADC0809的时钟信号输入端
sbit adda = P3^4;        //ADC0809的地址输入端
sbit addb = P3^5;
sbit addc = P3^6;
sbit start_ad = P2^5;    //ADC0809启动信号,高脉冲启动
sbit eoc = P2^6;         //ADC0809转换结束信号
sbit oe = P2^7;          //ADC0809读数据控制端
sbit key1 = P3^0;
sbit key2 = P3^1;
sbit NOA = P2^2;
sbit NOB = P2^3;
sbit NOC = P2^4;

uchar bai = 0, shi = 0, ge = 0;       //定义显示全局变量
uchar getdata = 0;
uchar a = 0, b = 0, c = 0;

uchar code seg7[]={   0x3f,0x06,0x5b,0x4f,
                      0x66,0x6d,0x7d,0x07,
                      0x7f,0x6f,0x77,0x7c,
                      0x39,0x5e,0x79,0x71
                   };    //共阴极数码管显示编码

void delay(uint x)     //微秒级延时子程序
{
  uint i,j;
  for(i=x;i>0;i--)
      for(j=110;j>0;j--);
}

void display(uchar bai,uchar shi,uchar ge)  //数码管显示函数
{

   le = 1;
   NOA = 0;
   NOB = 1;
   NOC = 0;
   P0=(seg7[bai]|0x80);  //段选数据,和0x80相与表示显示小数点
   le = 0;
   delay(12);


   le = 1;
   NOA = 1;
   NOB = 0;
   NOC = 0;
   P0=seg7[shi];
   le = 0;
   delay(12);


   le = 1;
   NOA = 0;
   NOB = 0;
   NOC = 0;
   P0=seg7[ge];
   le = 0;
   delay(12);
}

void key_scan()
{
    if(key1 == 0)
    {
        delay(5);
        if(key1 == 0)
        {
            while(!key1);
            a = 0;
            b = 0;
            c = 0;
        }
    }
    if(key2 == 0)
    {
        delay(5);
        if(key2 == 0)
        {
            while(!key2);
            a = 0;
            b = 0;
            c = 1;
        }
    }
}

int main(void)
{

    uint temp;
        le = 0;
    TMOD=0x20;  //定时器1工作在方式2
    TH1=255-200;
    TL1=255-200;
    EA=1;
    EX0=1;
    IT0=1;
    ET1=1;
    TR1=1;  //启动定时器1
    while(1)
   {
    key_scan();                                  //adda=0;  //输入模拟电压通道地址
    adda = a;                                           //addb=0;
    addb = b;
    addc = c;                                         //addc=0;
    oe=0;
    start_ad=0;  //启动AD
    start_ad=1;
    start_ad=0;
    display(bai,shi,ge);  //数码管显示程序
    temp=getdata*1.0/255*500; //数据转化
    ge=temp%10;   //提取个位数字
    shi=temp%100/10;  //提取十位数字
    bai=temp/100;     //提取百位数字
   }
   return 0;
}

void t1(void) interrupt 3
{
  clk=~clk;
  }

void ex0_int() interrupt 0
{
    oe=1;        //读AD转换数据
    getdata=P1;
    oe=0;

}
通道0的电压值与显示的是相同的 通道0的电压值与显示的是相同的
通道1的电压值与显示的是不相同的 通道1的电压值与显示的是不相同的
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。