微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ds18b20电冰箱控制系统

ds18b20电冰箱控制系统

时间:12-01 来源:互联网 点击:

CtrlElec=(CtrlList[i].AlarmTemp>

if(sj[k]>

注:继电器原理图来自百度百科->

if(temp_data[1]>

for (i = 8 ; i > 0 ; i--)
{
DQ2 = 0 ; // 给脉冲信号
dat >>= 1 ;
DQ2 = 1 ; // 给脉冲信号

if(DQ2)
dat |= 0x80 ;
delay(7) ;
}
return (dat) ;
}
/*******************************DS复位函数******************************/
void ow_reset(void)
{
uchar presence=1;

while(presence)
{
while(presence)
{
DQ=1; //DQ复位
DQ=0; //单片机将DQ拉低
delay(50); //延时550毫秒
DQ=1; //拉高总线
delay(6);
presence=DQ; //如果=0则初始化成功 =1则初始化失败
}
delay(45);
presence=~DQ;
}
DQ=1;
}
/*****************************DS写命令函数*********************************/
void write_byte(uchar dat) //向1-WIRE总线上写一字节
{
uchar i = 0 ;
for (i = 8 ; i > 0 ; i--)
{
DQ = 0 ;
DQ = dat&0x01 ;
delay(7) ; //0时序延时至少60US
DQ = 1 ;
dat>>=1 ;
}
}
/*******************************DS读一字节函数****************************************************/
uchar read_byte(void)
{
uchar i = 0 ;
uchar dat = 0 ;

for (i = 8 ; i > 0 ; i--)
{
DQ = 0 ; // 给脉冲信号
dat >>= 1 ;
DQ = 1 ; // 给脉冲信号

if(DQ)
dat |= 0x80 ;
delay(7) ;
}
return (dat) ;
}

/******************************读出温度函数*************************************************/
void read_temp(void)
{
ow_reset();
write_byte(0xcc);//skip ROM
write_byte(0x44);// 启动温度转换

ow_reset();
write_byte(0xcc);
write_byte(0xbe); //读取温度寄存器

temp_data[0]=read_byte(); //温度低8位
temp_data[1]=read_byte(); //温度高8位

}

/*****************第二个ds18b20处理函数******************/

/******************************读出温度函数*************************************************/
void read_temp2(void)
{
ow_reset2();
write_byte2(0xcc);//skip ROM
write_byte2(0x44);// 启动温度转换

ow_reset2();
write_byte2(0xcc);
write_byte2(0xbe); //读取温度寄存器

temp_data[0]=read_byte2(); //温度低8位
temp_data[1]=read_byte2(); //温度高8位

}
/********************************计算温度子函数**********************************************/
void temp_work2(void)
{
disp_buff[4]=10;

if(temp_data[1]>127)
{temp_data[1]=(255-temp_data[1]);temp_data[0]=(255-temp_data[0])+1;disp_buff[4]=11;} //负温度求补码
tt2=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<4) ;
disp_buff[5]=tt2/10;
disp_buff[6]=tt2%10;
disp_buff[7]=0;

if(!disp_buff[5])
disp_buff[5]=10;

}
/**********eeprom函数******************/
////////延时//////////////////////////////////
voidflash()
{ ; ; }
void x24c02_init() //24c02初始化子程序
{
scl=1; //拉高
flash(); //延时
sda=1;
flash();//同上
}
void start() //启动I2C总线
{
sda=1;
flash();
scl=1;
flash();
sda=0;
flash();
scl=0;
flash();
}
void stop() //停止I2C总线
{
sda=0;
flash();
scl=1;
flash();
sda=1;
flash();
}
void writex(uchar j) //写一个字节
{
uchar i,temp;
temp=j;
for (i=0;i<8;i++)
{
temp=temp<1;
scl=0;
flash();
sda=CY;
flash();
scl=1;
flash();
}

scl=0;
flash();
sda=1;
flash();
}
char readx() //读一个字节
{
char i,j,k=0;
scl=0;
flash();
sda=1;
for (i=0;i<8;i++)
{
flash();
scl=1;
flash();
if (sda==1) j=1;
else j=0;
k=(k<1)|j;
scl=0;
}
flash();
return(k);
}
void clock() //I2C总线时钟,在此作第个时钟
{

scl=1;
flash();
while (sda==1);//如果SDA为0即收到应答则跳过,为1则等应答
scl=0;
flash();
}

////////从24c02的地址address中读取一个字节数据/////

char x24c02_read(uchar address)
{
char i;
start();
writex(0xa0);
clock();//第9个时钟
writex(address);//选中24C02
clock();
start();
writex(0xa1); //选中24C02中的存储器地址
clock();
i=readx();
stop();
delay(10);
return(i);
}

void x24c02_write(char address,char info)
{
EA=0;
start();
writex(0xa0);
clock();
writex(address);
clock();
writex(info);
clock();
stop();
EA=1;
delay(50);
}

/*******************************主函数**********************************************************/
void main (void)
{
char i,num1,num2;
TMOD=0x11; //定时器0设置方式1,定时器1设置方式1
TH0=0xf4; //定时3ms 为了计数值显示的需要
TL0=0x48;

TH1=0xbf; //定时16.6ms 为了计数值显示的需要
TL1=0x28;

EA=1; //开总中断
ET0=1; //定时器中断使能
ET1=1;
TR0=1; //启动定时器0
TR1=1;

P2=0x00;

kmbj=0;
motordc=0;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top