⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tlc0834.c

📁 用51单片机实现的串行AD和DA的源程序
💻 C
字号:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                               
//           H.C.H                            
//           NNU(南京师范大学通信工程)                               
//           TLC0834驱动程序TLC0834_II.c           
//           uchar adc_tlc0834(uchar channel);
//           函数说明:channel为通道的选择:0……CH0   1……CH1  2……CH2  3……CH3 
//                         当error=0时,返回的值为有效值,当error=1时,返回值无效                               
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int


sbit CLK=P1^0;    //TLC0834---PIN12
sbit DI=P1^1;      //TLC0834---PIN13
sbit DO=P1^2;     //TLC0834---PIN10
sbit CS=P1^3;      //TLC0834---PIN2


bit error=1;
uchar adc_tlc0834(uchar channel);

main()
{
   uchar result;
   result=adc_tlc0834(3);
   while(1);
}



uchar adc_tlc0834(uchar channel)
{
  uchar a[3];
  uchar i,Temp1=0,Temp2=0;
  if(channel==0)          //CH0
  {
    a[0]=1;
	a[1]=0;
	a[2]=0;
  }
  else if(channel==1)    //CH1
  {
     a[0]=1;
     a[1]=1;
     a[2]=0;
  }
  else if(channel==2)    //CH2
  {
     a[0]=1;
     a[1]=0;
     a[2]=1;
  }
  else if(channel==3)    //CH3
  {
     a[0]=1;
     a[1]=1;
     a[2]=1;
  }
   
    CS=1;
   _nop_();_nop_();_nop_();_nop_();

   
    CLK=0;
    CS=0;            //使AD通道打开
    DI = 1;                        //Start bit=1
    CLK = 1;
    _nop_();
    _nop_();

    for(i=0;i<3;i++)
	{
      CLK = 0;
      _nop_();
      _nop_();
      DI  = a[i];        
      CLK = 1;
      _nop_();
      _nop_();
    }


    CLK=0;
    _nop_();
    _nop_();
    CLK=1;
    _nop_();
    _nop_();


     for(i=0;i<=6;i++)
	 {
         CLK = 0;                  //时钟为低电平
         if(DO)
		 {                         //如果采集到的位为1
           Temp1=Temp1+1;          //给临时存储Temp1加1
           Temp1=Temp1<<1;
		 }         //临时存储器左移一位
         else
           Temp1=Temp1<<1;          //如果采集到的数位为0,临时存储器左移一位
		 _nop_();
         _nop_();
         _nop_();
         _nop_();
         CLK = 1;    
      }                             //时钟为高电平,完成一个时钟周期数据采集
       CLK = 0;
       if(DO)  Temp1=Temp1+1;
       if(DO)  Temp2=0x80;

       CLK = 1; 
                                      //采集数据校验          
       
       for(i=0;i<=6;i++)
         {
           CLK=0;
           if(DO){
             Temp2=Temp2>>1;
             Temp2=Temp2+0x80;  }
           else
             Temp2=Temp2>>1;
           CLK = 1; 
         }
   CS = 1;
   if(Temp1==Temp2)             //判断数据采集是否有效
   {  
      error=0;
      return Temp1;
	}
   else
   {
     error=1;
     return 0;
   }
}


    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -