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

📄 jkb.c

📁 此程序是一底层开发驱动代码,里面包括了I2C芯片(MAX5417)及1 wire sensor、AD驱动的源代码!稍作改动就能用于自己的产品开发中!
💻 C
📖 第 1 页 / 共 3 页
字号:

//-----------------------------------------------------------------------------
//MAX5417写
//-----------------------------------------------------------------------------
void i2o_write(unsigned short t,unsigned short s)
{
   int i,m;
	unsigned short p;//命令字;写入易失性存贮器中,输出更新
	p=0x11;
   scl=1;
   for(i=0;i<255;i++){;}
   sda=1;
	for(i=0;i<255;i++){;}
	sda=0;
	for(i=0;i<255;i++){;}
	scl=0;
	for(m=0;m<8;m++)
	{
	   if((s&0x80)==0)
 	       sda=0;
		else
		    sda=1;
		scl=1;
		for(i=0;i<255;i++){;}
		scl=0;
		for(i=0;i<255;i++){;}
	   s=s<<1;
   }
	scl=1;
	for(i=0;i<255;i++){;}
	scl=0;
	for(i=0;i<255;i++){;}
   for(m=0;m<8;m++)
	{
	   if((p&0x80)==0)
 	       sda=0;
		else
		    sda=1;
		scl=1;
		for(i=0;i<255;i++){;}
		scl=0;
		for(i=0;i<255;i++){;}
	   p=p<<1;
   }
	scl=1;
	for(i=0;i<255;i++){;}
	scl=0;
	for(i=0;i<255;i++){;}
	for(m=0;m<8;m++)
	{
	   if((t&0x80)==0)
 	       sda=0;
		else
		    sda=1;
		scl=1;
		for(i=0;i<255;i++){;}
		scl=0;
		for(i=0;i<255;i++){;}
	   t=t<<1;
   }
	scl=1;
	for(i=0;i<255;i++){;}
	scl=0;
	for(i=0;i<255;i++){;}
	scl=1;
	for(i=0;i<255;i++){;}
   sda=1;
	for(i=0;i<255;i++){;}
}
/*void i2o_write(unsigned short t  ,unsigned short s)
{
   EA=1;//开中断
   while(BUSY);                      //写数字电位器1
   BUSY = 1;                           // SMB忙设置
   SMB0CN = 0x44;                     // SMB使能, ACK置低
   COMMAND = t;                   //从地址W/R字节
   OP_CODE = 0x11;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 //命令字节
   WORD = (char)t;                //数据字节
   STO = 0;
   STA = 1; 
  
}

void SMBUS_ISR (void) interrupt 7
{
   switch (SMB0STA)
   {                    
      case 0X08:
         SMB0DAT = (COMMAND & 0xFE); 
		   //printf("aa\n");
         STA = 0;                         
         SI = 0;                          
         break;
      case 0X10:
         SMB0DAT = COMMAND;
		 //printf("bb");
         STA = 0;                         
         SI = 0;
         break;
      case 0X18:
         SMB0DAT = OP_CODE;
		   printf("cc");
         SI = 0;                         
         break;
      case 0X20:
         STO = 1;
         STA = 1;
         SI = 0; 
        // printf("dd");                
         break;
      case 0X28:
         SMB0DAT=WORD;
		 while(!SI);
		 printf("ee");
		 STO=1;
		 SI=0;
         BUSY=0;
         break;
      case 0X30:
         STO = 1;
         STA = 1;
         SI = 0; 
         printf("ff");               
         EA=0;
      }

}

 */
//-----------------------------------------------------------------------------
//MAX5417读
//-----------------------------------------------------------------------------
void i2o_read()
{
}

//-----------------------------------------------------------------------------

/*
//-----------------------------------------------------------------------------
//延时
//-----------------------------------------------------------------------------
void Delay1us(unsigned char us)
{
	while (us)
	{
      _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
	  --us;
	}
}

void Delay15us(void)  
{
	Delay1us(15);
}


void Delay10us(void)
{	
	Delay1us(10);
}

//-----------------------------------------------------------------------------
//复位
//-----------------------------------------------------------------------------
bit RstDS1820(void)  //返回0-有设备连接1-无设备连接
{
    unsigned char i;
    bit RstFlag;
	RstFlag=1;	
	DataPortDS1820=0;
	for (i=0;i<100;i++)	//480us
		Delay15us(); 
	DataPortDS1820=1;
	for (i=0;i<4;i++)	//15us-60us
	{
		Delay15us();
	}
	for (i=0;i<16;i++)	//60us-240us
	{
		Delay15us();
		if (DataPortDS1820==0) RstFlag=0;
	}
	for (i=0;i<16;i++)	//240us
	{
		Delay15us();
	}
	return RstFlag;	
}

//-----------------------------------------------------------------------------
//向总线上写一个字节
//-----------------------------------------------------------------------------
void WriteDS1820(unsigned char ch)
{
unsigned char i;
	DataPortDS1820=1;
	Delay1us(1);
	for (i=0;i<8;i++)
	{
		EA=0;
		DataPortDS1820=0;
		Delay15us();
		DataPortDS1820=ch&0x1;
		EA=1;
		Delay15us();Delay15us();Delay15us();
		DataPortDS1820=1;
		ch=ch>>1;
		Delay1us(1);
	}	
}

//-----------------------------------------------------------------------------
//从总线上读取一个字节
//-----------------------------------------------------------------------------
unsigned char ReadDS1820(void)
{
unsigned char i,ch;
	ch=0;
	DataPortDS1820=1;
	Delay1us(1);
	for (i=0;i<8;i++)
	{
		EA=0;
		DataPortDS1820=0;
		Delay10us();
		DataPortDS1820=1;
		Delay1us(2);
		ch=ch>>1;
		if (DataPortDS1820==1)
		{
			ch=ch+0x80;
		}
		EA=1;
		Delay15us();Delay15us();Delay15us();
	}	
	return ch;
}


void SkipROMCode(void)
{
	RstDS1820();
	WriteDS1820(0xcc); 
}
void StartADC(void)
{

	RstDS1820();		//复位
	WriteDS1820(0xcc);  //广播
	WriteDS1820(0x44); 	//启动AD转换 12bit700ms
}

//-----------------------------------------------------------------------------
//读取温度
//-----------------------------------------------------------------------------
 float  GetTempValue(void)
{
    unsigned char i,j;
    int T;
	SkipROMCode();
	WriteDS1820(0xBE); 
	i=ReadDS1820();
	j=ReadDS1820();
	StartADC();
	T=i+j*256;
	if (T==0xffff) return 0xffff;
	if (T>0x8000) 
	{
		T=-T;
		return (0x8000+T*5/8);
	}
	else
		return (T*5/8);
}*/

//-----------------------------------------------------------------------------
//延时
//-----------------------------------------------------------------------------
void delay(word useconds)
{
for(;useconds>0;useconds--);
}

//-----------------------------------------------------------------------------
//复位
//-----------------------------------------------------------------------------
byte ow_reset(void)
{
    byte presence;
    DQ = 0; //pull DQ line low
    delay(29); // leave it low for 480us
    DQ = 1; // allow line to return high
    delay(3); // wait for presence
    presence = DQ; // get presence signal
    delay(25); // wait for end of timeslot
    return(presence); // presence signal returned
} // 0=presence, 1 = no part

//-----------------------------------------------------------------------------
//从总线上读取一个字节
//-----------------------------------------------------------------------------
unsigned char read_byte(void)
{
    unsigned char i;
    unsigned char value = 0;
    for (i=8;i>0;i--)
    {
        value>>=1;
        DQ = 0; // pull DQ low to start timeslot
        DQ = 1; // then return high
        delay(1); //for (i=0; i<3; i++); 
        if(DQ)value|=0x80;
        delay(6); // wait for rest of timeslot
    }
    return(value);
}

//-----------------------------------------------------------------------------
//向总线上写一个字节
//-----------------------------------------------------------------------------
void write_byte(char val)
{
     byte i;
     for (i=8; i>0; i--) // writes byte, one bit at a time
     {
         DQ = 0; // pull DQ low to start timeslot
         DQ = val&0x01;
         delay(5); // hold value for remainder of timeslot
         DQ = 1;
         val=val/2;
     }
     delay(5);
}

//-----------------------------------------------------------------------------
//读取温度
//-----------------------------------------------------------------------------
void Read_Temperature(void)
{
  union{
    byte c[2];
    int x;
  }temp;

  ow_reset();
  write_byte(0xCC); // Skip ROM
  write_byte(0xBE); // Read Scratch Pad
  temp.c[1]=read_byte();
  temp.c[0]=read_byte();
  ow_reset();
  write_byte(0xCC); //Skip ROM
  write_byte(0x44); // Start Conversion
  lenduan= temp.x*10/16;//  ;
}

//-----------------------------------------------------------------------------
//端冷的温度值算
//-----------------------------------------------------------------------------
lenduanzhi()
{   
    if(lenduan&0xff)//lenduan值为温度值的补码,若符号位是"1"则,进行还原
    { 
		lenduan=~lenduan;
	 }
	 else{}
}

//-----------------------------------------------------------------------------
//采样程序
//-----------------------------------------------------------------------------
int chaiyang(void )
{
     int t;
	 for(t=0;t<0xffff;t++){;}//延时
	 for(t=0;t<0xffff;t++){;}//延时
	 
	 ADC0=0;
    // printf("adc0   :%x\n",ADC0);
  	 AD0EN=1;//允许ADC0
	 AD0INT=0;
	 AD0BUSY=1;
     while(AD0INT==0);//等待直到转换结束
     t=ADC0;
	// printf("chaiyangzhi   : %x\n",t);
	 AD0INT=0;
	 //P3=0xff;
	 return(t);
 }

//-----------------------------------------------------------------------------
//将采样值转换成电压值
//-----------------------------------------------------------------------------
float chaiyangjishuan(int t)
{
   int m;
   float data  r,u,y;
   int  data n;
  m=minlin;
  if(chanel_chanshu[((m-1)*3+1)]&0xf000)
  {  n=~chanel_chanshu[((m-1)*3+1)];
     //printf("%x\n",n);
     y=(float)(t+n)/(float)(chanel_chanshu[((m-1)*3+2)]+n);
   }
   else
   { y=(float)(t-chanel_chanshu[((m-1)*3+1)])/(float)(chanel_chanshu[((m-1)*3+2)]-chanel_chanshu[((m-1)*3+1)]);}
  switch(chanel_chanshu[m-1])
  {
       case  0:
         u=y*(82.13-39.24)+39.24;
	     return(u);
         break;
       case  1:
	     u=y*(164.27-78.49)+78.49;

⌨️ 快捷键说明

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