ds18b20电冰箱控制系统
CtrlElec=(CtrlList[i].AlarmTemp> if(sj[k]> 注:继电器原理图来自百度百科-> if(temp_data[1]> for (i = 8 ; i > 0 ; i--) if(DQ2) while(presence) for (i = 8 ; i > 0 ; i--) if(DQ) /******************************读出温度函数*************************************************/ ow_reset(); } /*****************第二个ds18b20处理函数******************/ /******************************读出温度函数*************************************************/ ow_reset2(); } if(temp_data[1]>127) } scl=0; ////////从24c02的地址address中读取一个字节数据///// char x24c02_read(uchar address) void x24c02_write(char address,char info) /*******************************主函数**********************************************************/ TH1=0xbf; //定时16.6ms 为了计数值显示的需要 EA=1; //开总中断 P2=0x00;
{
DQ2 = 0 ; // 给脉冲信号
dat >>= 1 ;
DQ2 = 1 ; // 给脉冲信号
dat |= 0x80 ;
delay(7) ;
}
return (dat) ;
}
/*******************************DS复位函数******************************/
void ow_reset(void)
{
uchar presence=1;
{
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 ;
{
DQ = 0 ; // 给脉冲信号
dat >>= 1 ;
DQ = 1 ; // 给脉冲信号
dat |= 0x80 ;
delay(7) ;
}
return (dat) ;
}
void read_temp(void)
{
ow_reset();
write_byte(0xcc);//skip ROM
write_byte(0x44);// 启动温度转换
write_byte(0xcc);
write_byte(0xbe); //读取温度寄存器
temp_data[0]=read_byte(); //温度低8位
temp_data[1]=read_byte(); //温度高8位
void read_temp2(void)
{
ow_reset2();
write_byte2(0xcc);//skip ROM
write_byte2(0x44);// 启动温度转换
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;
{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();
}
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();
}
{
char i;
start();
writex(0xa0);
clock();//第9个时钟
writex(address);//选中24C02
clock();
start();
writex(0xa1); //选中24C02中的存储器地址
clock();
i=readx();
stop();
delay(10);
return(i);
}
{
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;
TL1=0x28;
ET0=1; //定时器中断使能
ET1=1;
TR0=1; //启动定时器0
TR1=1;
kmbj=0;
motordc=0;
ds18b20电冰箱控制系 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)