3086|3

45

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

tlc549 AD转换中的一个问题? [复制链接]

#include
#include
#define  uint  unsigned int
#define  uchar unsigned char
sbit   clock=P1^1;                  // 时钟信号(数据输入)
sbit   date_out=P3^2;          // 数据输出
sbit   cs=P1^0;           // 片选信号
uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};
uchar code table_d[10] = {0x02, 0x9e, 0x24, 0x0c, 0x98, 0x48, 0x40, 0x1e, 0x00, 0x08};                   //带点数码管显示
uchar volt;//电压转换1000后的值。
//延时函数。一次1ms
void delay(uint del)
{
        uchar i, j;
        for(i=0; i         for(j=0; j<=148; j++);
               
}
//ad的驱动程序,temp为读出电压,
uchar tlc549_qudong(void)
{
    uchar i,temp;
        cs=1;
        clock=0;
        cs=0;                   // cs置底电平。 同时date_out为高。(=1).
        _nop_();
        _nop_();                //延时大约1.4us,开始转换。
        for(i=0;i<8;i++)        //开始串行数据的输入;
        {
           temp<<=1;
           temp|=date_out;
           clock=1;
           _nop_();
           _nop_();
           clock=0;           //CLK transition time  Max 0.1us
        }
        cs=1;
        for(i=17;i>0;i--)          //延时17us后读出数据。         
        _nop_();
        return(temp) ;
}


//数据扩大1000倍,为了方便读出
void  date_conversation(void)
{
  uchar  AD_Data;
  AD_Data=tlc549_qudong();
  volt=5.0/256*AD_Data*1000;
  
}

//数据转化成数码管显示的数字。
void main()
{
   
   while(1)       
   {
   //P2=0X00;
   date_conversation();
   P2=0x04;
   P0=table_d[volt/100];
   delay(10);

   P2=0x02;                                                                 
   P0=table[volt/10%10]        ;
   delay(10);

   P2=0x01;
   P0=table[volt%10];
   delay(10);
   }
}
为什么我在实验板上做的时候,只是一个值而已,我旋转AD上面的那个按钮的时候,值也不会改变。

最新回复

你这句话不对 volt=5.0/256*AD_Data*1000; 要改 int volt ; 个位 T1=AD_Data/51; 小数点第一位  T2=(AD_Data%51)/5 if(T2==10) { T2=0 ; T1=T1+1; } 小数点第二位 T3=(AD_Data%51)%5 *2 上面算法 精确到小数点后两位 volt=T1*1000+T2*100+T3*10扩大1000倍   详情 回复 发表于 2009-12-19 21:58
点赞 关注

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
先去买菜,晚上QQ 聊,告诉你问题所在,
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
楼主还是应该把时序搞清楚,给个AD采集 并且显示的例子

电压从0-5V连续变化,低三位数码管显示0-255,并且数字无不抖动现象
#include
#define uchar unsigned char
uchar code segtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x8c,0xff};
uchar dbuf[3];//三位存储
uchar bdata adin;//bdata 是位寻址存储类型,可位寻址,相应单元20――2FH

sbit adin0=adin^0;
sbit AD_CS=P1^4;
sbit AD_CLK=P1^2;
sbit AD_DAT=P1^3;

void delay(void)
{
uchar i;
for(i=0;i<20;i++);

}


uchar getad(void) // A/D转换程序
{
uchar i;
AD_CS=0; //令CS为低选中TLC549
delay(); //延时

//循环读取8位A/D转换结果 //
for(i=0;i<8;i++)
{
adin0=AD_DAT;//读取数据线的一位数据        
AD_CLK=1; //令CLK引脚为高
delay();
adin=adin<<1;//先读取高位,后读低位
AD_CLK=0; //令CLK恢复为低

}
AD_CS=1;
return adin;
}

void disp(void)
{
uchar i,n,bsel;
bsel=0x01; //首先点亮最低位
for(n=0;n<3;n++)
{

P3=segtab[dbuf[n]];//将显示缓存的数据转换为字段码显示
P2=bsel; //位选口
for(i=1;i<200;i++);//延时
bsel=bsel<<1; //准备显示下一位
P3=0xff; //熄灭所有字段

}
}

void main(void)
{
    uchar ad;
while(1)
{
ad=getad(); //读取A/D转换结果
dbuf[2]=ad/100;//将转换结果转换为三位BCD码送显示缓存
ad=ad%100;
dbuf[1]=ad/10;
dbuf[0]=ad%10;
disp();

}
}
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

4
 
你这句话不对
volt=5.0/256*AD_Data*1000;

要改


int volt ;


个位 T1=AD_Data/51;
小数点第一位  T2=(AD_Data%51)/5
if(T2==10)
{
T2=0 ;
T1=T1+1;
}
小数点第二位 T3=(AD_Data%51)%5 *2

上面算法 精确到小数点后两位
volt=T1*1000+T2*100+T3*10扩大1000倍

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表