(完整版)基于51单片机的温度报警器设计毕业设计 下载本文

/*****延时子程序*****/ void Delay_DS18B20(int num) {

while(num--) ; }

void delay()//5微秒延时函数 { ;; }

void start() //开始信号 { }

void stop() //终止信号 { }

SDA=1; delay(); SCL=1; delay(); SDA=0; delay();

SDA=0; delay(); SCL=1; delay(); SDA=1; delay();

void respons() //应答 {

uc i; SCL=1; delay();

while((SDA==1)&&(i<250))i++;//如果SDA为低应答有效,或者超过一定时间默

认应答有效 }

void init24c04()//I2C总线初始化 { }

void write_byte(uc date)//写操作 {

SCL=0; delay();

SDA=1; delay(); SCL=1; delay();

uc i,temp; temp=date; for(i=0;i<8;i++) {

temp=temp<<1; SCL=0;

}

delay(); } SCL=0; delay(); SDA=1; delay();

SDA=CY; delay(); SCL=1; delay();

uc read_byte()//读操作 {

uc i,k; SCL=0; delay(); SDA=1; delay();

for(i=0;i<8;i++) {

SCL=1; delay();

k=(k<<1)|SDA; SCL=0; delay();

}

}

return k;

void write_add(uc address,uc date)//往任意地址存数据 { }

uc read_add(uc address)//读随意地址内容 {

start();

write_byte(0xa0);//0xa0代表写入 respons();

write_byte(address); respons(); write_byte(date); respons(); stop();

uc date; start();

write_byte(0xa0);//0xa0代表写入 respons();

write_byte(address); respons(); start();

write_byte(0xa1);//0xa1代表读出 respons();

}

date=read_byte(); stop();

return date;//返回值

/*****初始化DS18B20*****/ void Init_DS18B20(void) {

uc w=0;

DQ = 1; //DQ复位 Delay_DS18B20(8); //稍做延时 DQ = 0; //单片机将DQ拉低

Delay_DS18B20(80); //精确延时,大于480us DQ = 1; //拉高总线 Delay_DS18B20(14);

w = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败 Delay_DS18B20(20); }

/*****读一个字节*****/

unsigned char ReadOneChar(void) {

uc i=0; uc dat = 0; for (i=8;i>0;i--) {

DQ = 0; // 给脉冲信号