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

[复制链接]
4118|6
 楼主| greeni 发表于 2007-6-5 20:44 | 显示全部楼层 |阅读模式
最近正在学习使用keil做些程序设计,不知道各位有没有使用过tlc2543,12位A/D做过数据采集,方便的话希望能够提供源程序,谢谢:)<br /><br />工作时序:<br />开始时,CS片选为高,I/O&nbsp;CLOCK、DATA&nbsp;INPUT被禁止,DATA&nbsp;OUT&nbsp;呈高阻状,EOC为高。使CS变低,I/O&nbsp;CLOCK、DATA&nbsp;INPUT使能,DATA&nbsp;OUT脱离高阻状态。12个时钟信号从I/O&nbsp;CLOCK端依次加入,随着时钟信号的加入,控制字从DATA&nbsp;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<br /><br />#define&nbsp;&nbsp;&nbsp;&nbsp;Wait1us&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_nop_();<br />#define&nbsp;&nbsp;&nbsp;&nbsp;Wait2us&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{_nop_();_nop_();}<br />#define&nbsp;&nbsp;&nbsp;&nbsp;Wait4us&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{Wait2us;Wait2us;}<br />#define&nbsp;&nbsp;&nbsp;&nbsp;Wait8us&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{Wait4us;Wait4us;}<br />#define&nbsp;&nbsp;&nbsp;&nbsp;Wait10us&nbsp;&nbsp;{Wait8us;Wait2us;}<br /><br />#i&nbsp;nclude&nbsp;&quot;INTRINS.H&quot;<br /><br />/************定义接口总线**************/<br />sbit&nbsp;Clock&nbsp;=&nbsp;P3&nbsp;^&nbsp;4;&nbsp;//时钟口线<br />sbit&nbsp;DataIn&nbsp;=&nbsp;P3&nbsp;^&nbsp;2;&nbsp;//数据输入口线<br />sbit&nbsp;DataOut&nbsp;=&nbsp;P3&nbsp;^&nbsp;5;&nbsp;//数据输出口线<br />sbit&nbsp;ChipSelect&nbsp;=&nbsp;P3&nbsp;^&nbsp;3;&nbsp;//片选口线<br />sbit&nbsp;EOC&nbsp;=&nbsp;P2&nbsp;^&nbsp;7;&nbsp;//转换完成口线<br />/************接口总线定义结束**********/<br /><br />/*********函数名称:ADCSelChannel********<br />*<br />*功能:转换指定通道的模拟量为数字量<br />*<br />*说明:<br />*<br />*位置:1<br />*<br />****************************************/<br />unsigned&nbsp;int&nbsp;ADCSelChannel(unsigned&nbsp;char&nbsp;Channel)<br />{<br />&nbsp;unsigned&nbsp;int&nbsp;ConvertValue;<br />&nbsp;unsigned&nbsp;char&nbsp;i,&nbsp;Chan;<br />&nbsp;unsigned&nbsp;char&nbsp;ConvertValueL,&nbsp;ConvertValueH;<br />&nbsp;unsigned&nbsp;char&nbsp;delay;<br />&nbsp;<br />&nbsp;ConvertValueL&nbsp;=&nbsp;ConvertValueH&nbsp;=&nbsp;0;&nbsp;//初始化转换结果<br />&nbsp;delay&nbsp;=&nbsp;0;<br />&nbsp;if&nbsp;(EOC)<br />&nbsp;{<br />&nbsp;&nbsp;Clock&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;ChipSelect&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;Wait2us;<br />&nbsp;&nbsp;ChipSelect&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;Wait2us;<br />&nbsp;&nbsp;Channel&nbsp;=&nbsp;Channel&nbsp;&lt&lt&nbsp;4;<br />&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;4;&nbsp;i&nbsp;++)&nbsp;//输入需要转换的通道的编码<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;Chan&nbsp;=&nbsp;Channel;<br />&nbsp;&nbsp;&nbsp;Chan&nbsp;=&nbsp;Chan&nbsp;&gt&gt&nbsp;7;<br />&nbsp;&nbsp;&nbsp;DataIn&nbsp;=&nbsp;(bit)Chan;<br />&nbsp;&nbsp;&nbsp;Wait2us;<br />&nbsp;&nbsp;&nbsp;Clock&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;Clock&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;Channel&nbsp;=&nbsp;Channel&nbsp;&lt&lt&nbsp;1;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;6;i&nbsp;++)&nbsp;//输入转换时钟<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;Clock&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;Clock&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;ChipSelect&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;//开始检测转换结束标志,或者转换超时出错<br />&nbsp;&nbsp;while&nbsp;((!EOC)&nbsp;&&&nbsp;(delay&nbsp;&lt&nbsp;10))<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;Wait10us;<br />&nbsp;&nbsp;&nbsp;delay&nbsp;++;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;if&nbsp;(delay&nbsp;==&nbsp;10)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;return&nbsp;(0xFFFF);&nbsp;//转换超时,返回错误代码<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;else<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;Wait10us;<br />&nbsp;&nbsp;&nbsp;Clock&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;ChipSelect&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;Wait1us;<br />&nbsp;&nbsp;&nbsp;ChipSelect&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;Wait1us;<br />&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;2;&nbsp;i&nbsp;++)&nbsp;//读取高二位bit值<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;Clock&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;DataOut&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;ConvertValueH&nbsp;&lt&lt=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(DataOut)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConvertValueH&nbsp;|=&nbsp;0x1;<br />&nbsp;&nbsp;&nbsp;&nbsp;Clock&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;Wait1us;<br />&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;8;&nbsp;i&nbsp;++)&nbsp;//读取低八位bit值<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;Clock&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;DataOut&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;ConvertValueL&nbsp;&lt&lt=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(DataOut)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConvertValueL&nbsp;|=&nbsp;0x1;<br />&nbsp;&nbsp;&nbsp;&nbsp;Clock&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;Wait1us;<br />&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;ChipSelect=1;<br />&nbsp;&nbsp;&nbsp;ConvertValue&nbsp;=&nbsp;ConvertValueH;<br />&nbsp;&nbsp;&nbsp;ConvertValue&nbsp;&lt&lt=&nbsp;8;<br />&nbsp;&nbsp;&nbsp;ConvertValue&nbsp;|=&nbsp;ConvertValueL;<br />&nbsp;&nbsp;&nbsp;return&nbsp;(ConvertValue);&nbsp;//返回转换结果<br />&nbsp;&nbsp;}<br />&nbsp;}<br />}<br />/************ADCSelChannel函数结束**********/
 楼主| greeni 发表于 2007-6-5 21:03 | 显示全部楼层

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

  
dai_weis 发表于 2007-6-10 21:57 | 显示全部楼层

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

可以尽量大些(如果对速度要求不高)
ayb_ice 发表于 2007-6-11 15:03 | 显示全部楼层

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

  
 楼主| greeni 发表于 2007-6-14 10:01 | 显示全部楼层

谢谢啦:)

  
whhfmh 发表于 2010-4-24 21:37 | 显示全部楼层
不对吧,输入和输出是同时进行的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

13

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部