串行A/D转换TLC549的问题!


我试着做了一个有关串行AD转换TLC549的仿真,但是有些问题还弄不明白!希望高手帮忙看下!
顺便说一下,TLC549是8位的!
以下是源程序:
#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]   //这是基于51板的数码管的地址
#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结果函数
//TLC1549为10bitADC
unsigned int get_10bit(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++;   //为什么是这样?temp++怎么会和DA有关系?
    CK = 1;
  }
  CS = 1;
  return(temp);
}

//读取ADC结果函数
//TLC549为8bitADC
unsigned char get_8bit(void)
{
  unsigned char i;
  unsigned int temp = 0;
  CS = 0;   //开启控制电路,使能DA和CK IO引脚;
  for(i=0;i<8;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_8bit();
  //temp += get_10bit();
  i--;
  if(i==0)
  {   
   temp = temp / SUM;   
   temp = temp * VREF;   
   //temp = temp / 1023;//10bit
   temp = temp / 255;//8bit
   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
}
}

仿真电路图如下:


123.gif


这是基于51开发板的仿真,你可以不用管CPLD部分!那部分是通用的,没有错误!
为什么在电阻调到正中间的时候,数码管电压突变为0??这个问题困扰了我好长时间!请高手指点一下!谢谢!

4位数码显示电压表.rar
(2008-08-13 17:31:50, Size: 148 KB, Downloads: 5)


我也来说两句 查看全部回复

最新回复

  • 36447745 (2008-8-23 17:06:01)

    不错啊,,,,,,,,,,,,,,,,,,,,,,,,