风轻云淡愿君赏,消尽烦忧心亮敞。夏去秋来添衣裳,一声问候祝安康!

Keil C51学习 8 A/D模数转换 TLC1549

AD 将连续变化的模拟信号转换为数字信号。

按工作原理划分:

  • 双积分型A/D转换器。
  • 逐次逼近比较型AD/转换器。
  • 并行A/D转换器。

 

 

一个5V满刻度的8位ADC能分辨输入电压变化最小值是5V×1/28 =19.53mV。

 

测量电压,四位数码管显示

#include <reg52.h>
#include <absacc.h>

#define uint unsigned int
#define SEG1 XBYTE[0xffec]
#define SEG2 XBYTE[0xffed]
#define SEG3 XBYTE[0xffee]
#define SEG4 XBYTE[0xffef]
#define SUM 50 //多次测量求平均值次数
#define VREF 4999//放大1000倍

code unsigned char ledmap[]= //共阴LED数码管译码表
{    
    0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,//0-9不带小数点
    0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10 //0-9带小数点    
};

//接口定义
sbit CS = P1^5;
sbit DA = P1^6;
sbit CK = P1^7;

//读取ADC结果函数
unsigned int get_data(void)
{
  unsigned char i;
  unsigned int temp = 0;
  CS = 0;   //开启控制电路,使能DA和CK IO引脚;
  for(i=0;i<10;i++)  //采集10次 ,即10bit
  { 
    CK = 0;        
    temp <<= 1;
    if(DA) temp++;  
    CK = 1;
  }
  CS = 1;
  return(temp);
}

void delay(unsigned char i) //延时子程序
{ 
    while(--i);
}


main()
{    
    unsigned long int temp;
    unsigned char i;
    CS = 1;  //禁止I/O CLOCK
    i = SUM;
    temp = 0;
    while(1)
    {
        temp += get_data();
        i--;
        if(i==0)
        {                
            temp = temp / SUM;    // 取平均值        
            temp = temp * VREF;    // 转换成电压值
            temp = temp / 1023;
            // 十进制译码送数码管显示
            SEG1 = ledmap[temp/1000%10 + 10];//+10表示该位带小数点
            SEG2 = ledmap[temp/100%10];
            SEG3 = ledmap[temp/10%10];
            SEG4 = ledmap[temp%10];
            i = SUM;
            temp = 0;
        }
        delay(10); //不使用延时,测量程序延时为28us
    }
}
TLC1549测量电压

 

posted on 2021-02-01 18:42  荣林  阅读(490)  评论(0编辑  收藏  举报

导航