蓝桥杯历届所有考过的模块(IIC,DS1302,DS18B20,NE555,串口模块)汇总(二)

       第二篇包括ds1302、iic、ds18b20。

代码:

   //ds18b20


void Delay100us() //@11.0592MHz
{
unsigned char i, j;


_nop_();
_nop_();
i = 2;
j = 15;
do
{
while (--j);
} while (--i);
}


void Delay500us() //@11.0592MHz
{
unsigned char i, j;


_nop_();
_nop_();
i = 6;
j = 93;
do
{
while (--j);
} while (--i);
}




//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay100us();
DQ = 1;
dat >>= 1;
}
Delay100us();
}


//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
  
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}     
Delay100us();
}
return dat;
}


//DS18B20设备初始化
void init_ds18b20(void)
{
  DQ = 0;
  Delay500us();
  DQ = 1;
  Delay500us(); 
}


uchar gettemp()
{
uchar temp,low,high;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);

init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low = Read_DS18B20();
high = Read_DS18B20();
temp = (high<<4)|(low>>4);

return temp;
}




//iic
//总线启动条件


void somenop()
{
_nop_();_nop_();_nop_();_nop_();_nop_();
}


void IIC_Start(void)
{
SDAI = 1;
SCL = 1;
somenop();
SDAI = 0;
somenop();
SCL = 0;
}


//总线停止条件
void IIC_Stop(void)
{
SDAI = 0;
SCL = 1;
somenop();
SDAI = 1;
}




//等待应答
bit IIC_WaitAck(void)
{
SDAI = 1;
somenop();
SCL = 1;
somenop();
if(SDAI)    
{   
SCL = 0;
IIC_Stop();
return 0;
}
else  

SCL = 0;
return 1;
}
}


//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
unsigned char i;
for(i=0;i<8;i++)
{   
if(byt&0x80) 
{
SDAI = 1;
}
else 
{
SDAI = 0;
}
somenop();
SCL = 1;
byt <<= 1;
somenop();
SCL = 0;
}
}


//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
unsigned char da;
unsigned char i;

for(i=0;i<8;i++)
{   
SCL = 1;
somenop();
da <<= 1;
if(SDAI) 
da |= 0x01;
SCL = 0;
somenop();
}
return da;
}


void iicwrite(uchar model,uchar add,uchar dat)
{
IIC_Start();
IIC_SendByte(model);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}


uchar iicread(uchar model,uchar add)
{
uchar temp=0;
IIC_Start();
IIC_SendByte(model);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Stop();

IIC_Start();
IIC_SendByte(model+1);
IIC_WaitAck();
temp = IIC_RecByte();
IIC_WaitAck();
IIC_Stop();

return temp*0.39;
}




//ds1302
void Write_Ds1302_Byte(unsigned  char temp) 
{
unsigned char i;
for (i=0;i<8;i++)     

SCK=0;
SDA=temp&0x01;
temp>>=1; 
SCK=1;
}
}   


void Write_Ds1302( unsigned char address,unsigned char dat )     
{
  RST=0;
_nop_();
  SCK=0;
_nop_();
  RST=1;
    _nop_();  
  Write_Ds1302_Byte(address);
  Write_Ds1302_Byte(dat);
  RST=0; 
}


unsigned char Read_Ds1302 ( unsigned char address )
{
  unsigned char i,temp=0x00;
  RST=0;
_nop_();
  SCK=0;
_nop_();
  RST=1;
_nop_();
  Write_Ds1302_Byte(address);
  for (i=0;i<8;i++)
  {
SCK=0;
temp>>=1;
  if(SDA)
  temp|=0x80;
  SCK=1;

  RST=0;
_nop_();
  RST=0;
SCK=0;
_nop_();
SCK=1;
_nop_();
SDA=0;
_nop_();
SDA=1;
_nop_();
return (temp);
}


void dsinit()
{
uchar i;
uchar add=0x80;
Write_Ds1302(0x8e,0x00);
for(i=0;i<7;i++)
{
Write_Ds1302(add,ds[i]);
add+=2;
}
Write_Ds1302(0x8e,0x80);


}


void gettime()
{
uchar i;
uchar add=0x81;
Write_Ds1302(0x8e,0x00);
for(i=0;i<7;i++)
{
time[i]=Read_Ds1302(add);
add+=2;
}
Write_Ds1302(0x8e,0x80);
}

你可能感兴趣的:(蓝桥杯历届所有考过的模块(IIC,DS1302,DS18B20,NE555,串口模块)汇总(二))