导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→我昨天刚编的程序,没有仿真过,请参考,并指正

* 35482: C51编程:谁有TLC0834的程序例程?发给我一份吧。在此先谢过了!clair@vip.sina.com

   alan103 
alan103发表的帖子 

 我昨天刚编的程序,没有仿真过,请参考,并指正
/************************************************************* 
文件名称:tlc0834.c
适用范围:模拟量信号的采集
*************************************************************/   

#include  <reg52.h>  
#include  <intrins.h>  

#define unsigned char uchar
#define unsigned int  uint

/* 常量定义,此部分以后要归到总头文件 */
/* AD转换的入口参数,仅低4位有意义,高4位恒0,低4位意义依次为:StartBit|SGL|ODD|SelectBit
其中起始位恒为1,这里不归入此字节 */
#define DIFFERENTIAL_0_1 0x08  //差分输入,CH0 + ,CH1 -,下三类似
#define DIFFERENTIAL_1_0 0x0a
#define DIFFERENTIAL_2_3 0x09
#define DIFFERENTIAL_3_2 0x0b

#define COMMEN_CHANNEL_0 0x0c  //单一通道采集,通道0相对于GND
#define COMMEN_CHANNEL_1 0x0e
#define COMMEN_CHANNEL_2 0x0d
#define COMMEN_CHANNEL_3 0x0f

/* 定义tlc0834的控制线 */
sbit AD_CLK  = 
sbit AD_DI   =
//sbit AD_SARS = //此管脚自动变高变低,不占用I/O口
sbit AD_DO   =
sbit AD_CS   =

/* 函数声明部分 */
uchar Gather(uchar ucDt);
uchar AD0834(void);


/*************************************************************
函数功能:该函数用来从tlc0834采集数据
应用范围:外部调用
入口参数:AD转换的入口参数,确定采集的通道和方式
出口参数:采集的数据
*************************************************************/
uchar Gather(uchar ucChnl)
{
 unsigned char ucDt = 0; 
 unsigned char ucDt1 = 0;
 ucDt = AD0834(ucChnl);  //采集一次
 if (ucDt)
  ucDt1 = ucDt;  //返回值不为0,有效
 delay(50);
 ucDt = AD0834(ucChnl);  
 while(ucDt1 != ucDt)
 {
  if(ucDt) 
   ucDt1 = ucDt;
  delay(50);
  ucDt = AD0834(ucChnl);
   
 }
 return(ucDt1); 
 
}


/*************************************************************
函数功能:该函数用来从tlc0834中得到一次采集的数据
应用范围:内部使用
入口参数:所要采集的通道和方式
出口参数:一次采集后的数据
*************************************************************/
uchar AD0834(uchar ucDt)
{
 unsigned char i,ucMask = 0x80;
 unsigned char ucMask1 = 0x08;
 unsigned char ucDt1 = 0;
 unsigned char ucDt2 = 0;
 AD_CS = 0;
 AD_CLK = 1;
 _nop_();_nop_();
 for(i = 0;i   < 4;i++)  //先输入采样的通道和方式
 {
  AD_CLK = 0;
  _nop_();_nop_(); 
  if(ucDt & ucMask1)
   DI = 1;
  else 
   DI = 0;
  AD_CLK = 1;
  ucMask >  >  = 1;  
 }
 AD_CLK = 0;   //空一个CLOCK,再去读数据
 _nop_();_nop_();
 AD_CLK = 1; 
 for(i = 0;i   < 7; i++)  //先读高7位到ucDt1
 {
  AD_CLK = 0;
  if(AD_DO) 
   ucDt1 |= ucMask;
  ucMask >  >  = 1;
  AD_CLK = 1;
 }
 AD_CLK = 0;
 if(AD_DO)
 {
  ucDt1 |= ucMask; //再读bit0到ucDt1  
  ucDt2 |= ucMask; //读bit0到ucDt2
 }
// AD_SARS = 0;
 AD_CLK = 1;
 for(i = 0;i   < 7; i++)
 {
  ucMask   <  <= 1;
  AD_CLK = 0;
  if(AD_DO) 
   ucDt1 |= ucMask;
  AD_CLK = 1;  
 }
 AD_CS = 1;
 if(ucDt1 == ucDt2)
  return(ucDt1);
 else
  return(0);
 
}

发表时间:2003年6月24日13:49:13

  
回复该帖

本主题共有 2 帖,分页:>>>>>该主题的所有内容[2]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

[上一篇帖子]:另外,不知道SARS脚悬空有没有关系,请赐教!看资料SARS脚应该是自动变高变低的,但是我不敢确定,
[下一篇帖子]:Protel求助!画PCB,需要把连线的铜皮露出来镀金,用什么方法实现好??