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

📄 tlc0838.c

📁 用51单片机实现的串行AD和DA的源程序
💻 C
字号:
///////////////////////////////////////////////////////////////////////////////////////////////
//                                               
//           H.C.H                            
//           NNU(南京师范大学通信工程)                               
//           TLC0838驱动程序TLC0838_II.c           
//           uchar adc_tlc0838(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 CS=P2^3;      //TLC0838---PIN18 
sbit DI=P2^2;      //TLC0838---PIN17
sbit CLK=P2^1;     //TLC0838---PIN16
sbit DO=P2^0;      //TLC0838---PIN14
                   //SE接成低电平
bit error=1;
uchar adc_tlc0838(uchar channel);

main()
{					 
   uchar result;
   while(1)
   {
   result=adc_tlc0838(7);
   }
}



uchar adc_tlc0838(uchar channel)
{
    uchar t,i;
    uchar temp1,temp2=1;
    if (channel==0)     t=0;
	else if(channel==1) t=1;
	else if(channel==2) t=4;
	else if(channel==3) t=5;
	else if(channel==4) t=2;
	else if(channel==5) t=3;
	else if(channel==6) t=6;
	else if(channel==7) t=7;
   
    CS=1;
   _nop_();_nop_();_nop_();_nop_();

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

    CLK=0;
    CS=0;          
    DI = 1;          
    CLK = 1;

    for(i=0;i<3;i++)
	{
      CLK = 0;
      if(t&1)DI=1;
	  else DI=0;
	  t=t>>1;       
      CLK = 1;
    }
    CLK=0;
    CLK=1;
     for(i=0;i<=6;i++)
	 {
         CLK = 0;                  //时钟为低电平
		 DO=1;
         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;
   return Temp1;

}


    

⌨️ 快捷键说明

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