打印

基于TLC2543的数据采集的C51程序

[复制链接]
3700|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
greeni|  楼主 | 2007-6-5 20:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近正在学习使用keil做些程序设计,不知道各位有没有使用过tlc2543,12位A/D做过数据采集,方便的话希望能够提供源程序,谢谢:)

工作时序:
开始时,CS片选为高,I/O CLOCK、DATA INPUT被禁止,DATA OUT 呈高阻状,EOC为高。使CS变低,I/O CLOCK、DATA INPUT使能,DATA OUT脱离高阻状态。12个时钟信号从I/O CLOCK端依次加入,随着时钟信号的加入,控制字从DATA INPUT一位一位地在时钟信号的上升沿时被送入TLC2543(高位先送入),同时上一周期转换的A/D数据,即输出数据寄存器中的数据从DATAOUT一位一位地移出。TLC2543收到第4个时钟信号后,通道号也已收到,此时TLC2543开始对选定通道的模拟量进行采样,并保持到第12个时钟的下降沿。在第12个时钟下降沿,EOC变低,开始对本次采样的模拟量进行A/D转换,转换时间约需10μS,转换完成后EOC变高,转换的数据在输出数据寄存器中,待下一个工作周期输出。

相关帖子

沙发
greeni|  楼主 | 2007-6-5 20:54 | 只看该作者

请问这个程序可以么?

http://blog.21ic.com/user1/2750/archives/2006/18112.html

#define    Wait1us        _nop_();
#define    Wait2us        {_nop_();_nop_();}
#define    Wait4us        {Wait2us;Wait2us;}
#define    Wait8us        {Wait4us;Wait4us;}
#define    Wait10us  {Wait8us;Wait2us;}

#i nclude "INTRINS.H"

/************定义接口总线**************/
sbit Clock = P3 ^ 4; //时钟口线
sbit DataIn = P3 ^ 2; //数据输入口线
sbit DataOut = P3 ^ 5; //数据输出口线
sbit ChipSelect = P3 ^ 3; //片选口线
sbit EOC = P2 ^ 7; //转换完成口线
/************接口总线定义结束**********/

/*********函数名称:ADCSelChannel********
*
*功能:转换指定通道的模拟量为数字量
*
*说明:
*
*位置:1
*
****************************************/
unsigned int ADCSelChannel(unsigned char Channel)
{
 unsigned int ConvertValue;
 unsigned char i, Chan;
 unsigned char ConvertValueL, ConvertValueH;
 unsigned char delay;
 
 ConvertValueL = ConvertValueH = 0; //初始化转换结果
 delay = 0;
 if (EOC)
 {
  Clock = 0;
  ChipSelect = 1;
  Wait2us;
  ChipSelect = 0;
  Wait2us;
  Channel = Channel << 4;
  for (i = 0; i < 4; i ++) //输入需要转换的通道的编码
  {
   Chan = Channel;
   Chan = Chan >> 7;
   DataIn = (bit)Chan;
   Wait2us;
   Clock = 1;
   Clock = 0;
   Channel = Channel << 1;
  }
  for (i = 0; i < 6;i ++) //输入转换时钟
  {
   Clock = 1;
   Clock = 0;
  }
  ChipSelect = 1;
  //开始检测转换结束标志,或者转换超时出错
  while ((!EOC) && (delay < 10))
  {
   Wait10us;
   delay ++;
  }
  if (delay == 10)
  {
   return (0xFFFF); //转换超时,返回错误代码
  }
  else
  {
   Wait10us;
   Clock = 0;
   ChipSelect = 1;
   Wait1us;
   ChipSelect = 0;
   Wait1us;
   for (i = 0; i < 2; i ++) //读取高二位bit值
   {
    Clock = 1;
    DataOut = 1;
    ConvertValueH <<= 1;
    if (DataOut)
      ConvertValueH |= 0x1;
    Clock = 0;
    Wait1us;
   } 
   for (i = 0; i < 8; i ++) //读取低八位bit值
   {
    Clock = 1;
    DataOut = 1;
    ConvertValueL <<= 1;
    if (DataOut)
      ConvertValueL |= 0x1;
    Clock = 0;
    Wait1us;
   } 
   ChipSelect=1;
   ConvertValue = ConvertValueH;
   ConvertValue <<= 8;
   ConvertValue |= ConvertValueL;
   return (ConvertValue); //返回转换结果
  }
 }
}
/************ADCSelChannel函数结束**********/

使用特权

评论回复
板凳
greeni|  楼主 | 2007-6-5 21:03 | 只看该作者

不过,我设计的电路没有用到Eoc端

使用特权

评论回复
地板
dai_weis| | 2007-6-10 21:57 | 只看该作者

使用软件延时来代替EOC,等待时间参考数据手册

可以尽量大些(如果对速度要求不高)

使用特权

评论回复
5
ayb_ice| | 2007-6-11 15:03 | 只看该作者

对着DATASHEET要不了多少时间。。。

使用特权

评论回复
6
greeni|  楼主 | 2007-6-14 10:01 | 只看该作者

谢谢啦:)

使用特权

评论回复
7
whhfmh| | 2010-4-24 21:37 | 只看该作者
不对吧,输入和输出是同时进行的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

13

帖子

0

粉丝