keil c编译 51
#define uchar unsigned char
#define uint unsigned int
#include “reg51.h”
#include “intrins.h”
sbit Scl=P3^3; //串行时钟
sbit Sda=P3^4; //串行数据
/*发送开端条件*/
void Start(void) /*开端条件*/
{
Sda=1;
Scl=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
Sda=0;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
}
void Stop(void) /*中止条件*/
{
Sda=0;
Scl=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
Sda=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
}
void Ack(void) /*应对位*/
{
Sda=0;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
Scl=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
Scl=0;
}
void NoAck(void) /*反向应对位*/
{
Sda=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
Scl=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
Scl=0;
}
void Send(uchar Da
{
uchar BitCounter=8; /*位数操控*/
uchar temp; /*中心变量操控*/
do
{
temp=Da
Scl=0;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
if((temp&0x80)==0x80)/* 假如最高位是1*/
Sda=1;
else
Sda=0;
Scl=1;
temp=Da
Da
BitCounter–;
}while(BitCounter);
Scl=0;
}
uchar Read(void) /*读一个字节的数据,并回来该字节值*/
{
uchar temp=0;
uchar temp1=0;
uchar BitCounter=8;
Sda=1;
do{
Scl=0;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
Scl=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
if(Sda) /*假如Sda=1;*/
temp=temp|0x01; /*temp的最低方位1*/
else
temp=temp&0xfe; /*不然temp的最低位清0*/
if(BitCounter-1)
{ temp1=temp<<1;
temp=temp1;
}
BitCounter–;
}while(BitCounter);
return(temp);
}
////////////////////////////////////////////////
void WrToROM(uchar Da
{
uchar i=0;
uchar *PData;
PData=Da
Start();
Send(0xa0);
Ack();
Send(Address);
Ack();
for(i=0;i
Send(*(PData+i));
Ack();
}
Stop();
}
void RdFromROM(uchar Da
{
uchar i=0;
uchar *PData;
PData=Da
for(i=0;i
Start();
Send(0xa0);
Ack();
Send(Address+i);
Ack();
Start();
Send(0xa1);
Ack();
*(PData+i)=Read();
Scl=0;
NoAck();
Stop();
}
}
/////////////////////////////////END of IIC/////////////////////////////////
////////////////////start of DS1621/////////////////////////////////
void delay_ms(unsigned char temp)
{
while(temp–);
}
void temp_config(unsigned char temp)
{
Start();
Send(0x90);
Ack();
Send(0xac);
Ack();
Send(temp);
Ack();
Stop();
delay_ms(110);
}
void init_temp()
{
Scl=1; //串行时钟
Sda=1;
Start();
Send(0x90);
Ack();
Send(0xee);
Ack();
Stop();
temp_config(8);
}
void read_temp() ////// Returns degrees F (0-255)
{
unsigned char datah,datal;
////温度数据读入开端
Start(); //
Send(0x90);
Ack();
Send(0xaa);
Ack();
Start();
Send(0x91);
Ack();
datah=Read();
Ack();
datal=Read();
Stop();
///温度数据读入完毕
if((datah&0x80)!=0)
{
word1[3]=-;
datah=datah-1;
datah=~datah;
word1[4]=datah/100+48;
word1[5]=((datah/10)%10)+48;
word1[6]=datah%10+48;
word1[7]=C;
}
else
{
word1[3]=+;
word1[4]=datah/100+48;
word1[5]=((datah/10)%10)+48;
word1[6]=datah%10+48;
word1[7]=C;
}
}
AVR
void Start() //I2C总线的开端条件
{Set_SDA(1); //SDA=1;
Set_SCL(1); //SCL=1;
delay(100); //等候时钟信号变高
Set_SDA(0); //SDA=0;
delay(100);
Set_SCL(0); // SCL=0;
}
void Stop() //I2C总线完毕条件
{Set_SDA(0); //SDA=0;
delay(100);
Set_SCL(1); //SCL=1;
delay(100); //等候时钟信号变低
Set_SDA(1); //SDA=1;
delay(100);
Set_SCL(0); //SCL=0;
}
void Ack() //I2C总线应对
{Set_SDA(0); //SDA=0;
delay(50);
Set_SCL(1); //SCL=1;
delay(100);
Set_SCL(0); //SCL=0;
delay(50);
Set_SDA(1); //SDA=1;
}
void Nack() //I2C总线应对非
{Set_SDA(1); //SDA=1;
delay(50);
Set_SCL(1); //SCL=1;
delay(100);
Set_SCL(0); //SCL=0;
delay(50);
Set_SDA(0); //SDA=0;
}
void Check_Ack() //I2C总线应对查看
{Set_SDA(1); //SDA=1;
Set_SCL(1); //SCL=1;
Ack_Flag=0; //铲除应对标志;
DDRA&=0xbf; //设置SDA为输入
if(!((PINA & 0x40)>>6))
{delay(50);
Set_SCL(0); //SCL=0;
delay(100);}
else
{Ack_Flag=1; //收到应对;
delay(50);
Set_SCL(0); //SCL=0;
delay(100);}
DDRA |=0xff; //从头设置SDA为输出
}
void Write_Bit0() //写1bit数据:0
{Set_SDA(0); //SDA=0;
Set_SCL(1); //SCL=1;
delay(100);
Set_SCL(0); //SCL=0;
}
void Write_Bit1() //写1bit数据:1
{Set_SDA(1); //SDA=1;
Set_SCL(1); //SCL=1;
delay(100);
Set_SCL(0); //SCL=0;
Set_SDA(0); //SDA=0;
}
void Write_Byte(uchar Da
{uchar i;
for(i=0;i<8;i++)
{if(Da
else Write_Bit0();
Da
}
uchar Read_Byte() //读一字节数据:回来值即读的数据
{uchar Read_Da
uchar j;
for (j=0;j<8;j++)
{Set_SDA(1);
Set_SCL(1);
DDRA &=0xbf;
if((PINA & 0x40)==0)
{Read_Da
Read_Da
Set_SCL(0);}
else
{Read_Da
Read_Da
Set_SCL(0);}}
DDRA |=0x40;
return(Read_Da
}
//***************************写一字节数据****************************//
//向从地址为Slave的IIC器材的Address地址写一字节数据Da
void Write_1byte(uchar Slave,uchar Address,uchar Da
{Start(); //开端
Write_Byte(Slave); //写I2C器材地址
do Check_Ack(); //查看应对位
while(Ack_Flag==1);
Write_Byte(Address); //送寄存器地址
do Check_Ack(); //查看应对位
while(Ack_Flag==1);
Write_Byte(Da
do Check_Ack(); //查看应对位
while(Ack_Flag==1);
Stop(); //中止
}
//***************************写两字节数据****************************//
//向从地址为Slave的IIC器材的Address地址开端写两字节数据Da
void Write_2byte(uchar Slave,uchar Address,uchar Da
{Start(); //开端
Write_Byte(Slave); //写I2C器材地址
do Check_Ack(); //查看应对位
while(Ack_Flag==1);
Write_Byte(Address); //送寄存器地址
do Check_Ack(); //查看应对位
while(Ack_Flag==1);
Write_Byte(Da
do Check_Ack(); //查看应对位
while(Ack_Flag==1);
Write_Byte(Da
do Check_Ack(); //查看应对位
while(Ack_Flag==1);
Stop(); //中止信号
}
//***************************读一字节数据****************************//
//从从地址为Slave的IIC器材的Address地址处读一字节数据
uchar Read_1byte(uchar Slave,uchar Address)
{uchar da
do{
Start(); //开端信号
Write_Byte(Slave); //写I2C器材地址
Check_Ack(); //查看应对位
}while(Ack_Flag);
do{
Write_Byte(Address); //写寄存器地址
Check_Ack(); //查看应对位
}while(Ack_Flag);
do{
Start(); //开端
Write_Byte(Slave+1); //写I2C器材地址(+1表明为读操作)
Check_Ack(); //查看应对位
}while(Ack_Flag);
da
Nack(); //读完发送一个Not Ack应对
Stop(); //中止
return da
}