}
//************************************
//LCD1602测忙
//************************************
voidcheck_busy(void)
{
while
(1)
{
P1=0xff;
E=0;
_nop_();
RS=0;
_nop_();
_nop_();
RW=1;
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
_nop_();
_nop_();
if((P1&0x80)==0)
{
break;
}
E=0;
}
}
//************************************
//LCD1602写命令
//************************************
voidwrite_command(uchartempdata)
{
E=0;
_nop_();
_nop_();
RS=0;
_nop_();
_nop_();
RW=0;
P1=tempdata;
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
E=0;
_nop_();
check_busy();
}
//************************************
//LCD1602写数据
//************************************
voidwrite_data(uchartempdata)
{
E=0;
_nop_();
_nop_();
RS=1;
_nop_();
_nop_();
RW=0;
P1=tempdata;
_nop_();
_nop_();
E=1;
_nop_();
_nop_();
E=0;
_nop_();
check_busy();
}
//************************************
//初始化LCD1602
//************************************
voidinit_lcd1602()
{
write_command(0x01);//清除屏幕
write_command(0x38);//功能设定(8位,2行,5*7点阵式)
write_command(0x0c);//显示器ON,光标OFF,闪烁OFF
write_command(0x06);//地址加1
}
//************************************
//初始化ds18b20
//************************************
bitresetpulse(void)
{
DQ=0;
delay(40);//延时500us
DQ=1;
delay(4);//延时60us
return(DQ);//读取P1.0的状态
}
voidds18b20_init(void)
{
while
(1)
{
if(!
resetpulse())//收到ds18b20的应答信号
{
DQ=1;
delay(40);//延时240us
break;
}
else
resetpulse();//否则再发复位信号
}
}
//************************************
//读ds18b20一位
//************************************
ucharread_bit(void)
{
DQ=0;
_nop_();
_nop_();
DQ=1;
delay
(2);
return(DQ);
}
//************************************
//读ds18b20一个字节
//************************************
ucharread_byte(void)
{
uchari,m,receive_data;
m=1;
receive_data=0;
for(i=0;i<8;i++)
{
if(read_bit())
{
receive_data=receive_data+(m<
}
delay(7);
}
return(receive_data);
}
//************************************
//向ds18b20写一位
//************************************
voidwrite_bit(ucharbitval)
{
DQ=0;
if(bitval==1)
DQ=1;
delay(5);
DQ=1;
}
//************************************
//向DS18B20写一个字节命令
//************************************
voidwrite_byte(ucharval)
{
uchari,temp;
for(i=0;i<8;i++)
{
temp=val>>i;
temp=temp&0x01;
write_bit(temp);
delay(5);
}
}
//*************************************
//64位的ROM序列号匹配
//*************************************
bitmatch_rom(uchar*rom)
{
uchari;
ds18b20_init();
write_byte(0x55);
for(i=8;i>0;i--)
{
write_byte(*(rom+i-1));
}
return1;
}
//************************************
//从ds18b20中读出64位序列号
//************************************
/*uchar*read_rom(void)
{
ucharrom[8],i;
ds18b20_init();
write_byte(0x33);
for(i=8;i>0;i--)
{
rom[i-1]=read_byte();
}
return&rom[0];
}*/
//*************************************
//将64位序列号显示在LCD上显示出来
//*************************************
/*voidprint_char(uchara)
{
if(a>=0&&a<=9)
write_data(a+0x30);
elseif(a>=0x0a&&a<=0x0f)
write_data(a+0x37);
}*/
//*************************************
//温度转换,将从ds18b20中读出来的温度值
//转化成十进制的温度值,并存放显示缓存
//*************************************
voidconvert_T(uchartemp_data_h,uchartemp_data_l)
{
uchartemp;
if((temp_data_h&0xf0)==0xf0)//如果温度寄存器里的高位为1,
{//则温度为负
temp_data_l=~temp_data_l;//负温度将补码转成二进制,
if(temp_data_l==0xff)//取反再加1
{
temp_data_l=temp_data_l+0x01;
temp_data_h=~temp_data_h;
temp_data_h=temp_data_h+0x01;
}
else
{
temp_data_l=temp_data_l+0x01;
temp_data_h=~temp_data_h;
}
LCD_0='℃';//查表得小数位的值
temp=((temp_data_l&0xf0)>>4)|((temp_data_h&0x0f)<<4);
LCD_3='-';//显示"-"号
LCD_2=LCDData[(temp%100)/10];//查表得负温度温度十位
LCD_1=LCDData[(temp%100)%10];//查表得负温度个位
}
else//温度为正
{
LCD_0='℃';//查表得小数位的值
temp=((temp_data_l&0xf0)>>4)|((temp_data_h&0x0f)<<4);
LCD_3=LCDData[temp/100];//查表得温度百位
LCD_2=LCDData[(temp%100)/10];//查表得温度十位
LCD_1=LCDData[(temp%100)%10];//查表得温度个位
}
}
voiddisplay(void)
{
uchari;
write_command(0x80);
for(i=0;i<16;i++)
{
write_data(first_line[i]);
}
write_command(0xc0);
for(i=0;i<16;i++)
{
write_data(second_line[i]);
}
}
voidmain(void)
{
uchartemp_data_l,temp_data_h;
/*uchar*ds18b20_rom;*/
init_lcd1602();
/*while
(1)
{
uchari;
ds18b20_rom=read_rom();//读序列号
write_command(0x80);
for(i=0;i<8;i++)
{
ds18b20_romA[i]=*ds18b20_rom;
ds18b20_rom++;
}
write_command(0x80);
for(i=0;i<8;i++)//显示序列号
{
print_char(ds18b20_romA[i]/16);
print_char(ds18b20_romA[i]%16);
}
}*/
while
(1)
{
ds18b20_init();
write_byte(0xcc);
write_byte(0x44);//启动温度转换
delay(700);
match_rom(ds18b20_romA);//匹配第一路
write_byte(0xbe);//读温度
temp_data_l=read_byte();//温度低8位
temp_data_h=read_byte();//温度高8位
convert_T(temp_data_h,temp_data_l);
first_line[2]=LCD_3;//温度转换后的各位
first_line[3]=LCD_2;//分别存入显示缓存数组中
first_line[4]=LCD_1;
first_line[6]=LCD_0;
match_rom(ds18b20_romB);//匹配第二路
write_byte(0xbe);//读温度
temp_data_l=read_byte();//温度低8位
temp_data_h=read_byte();//温度高8位
convert_T(temp_data_h,temp_data_l);
first_line[10]=LCD_3;//温度转换后的各位
first_line[11]=LCD_2;//分别存入显示缓存数组中
first_line[12]=LCD_1;
first_line[14]=LCD_0;
display();
match_rom(ds18b20_romC);//匹配第三路
write_byte(0xbe);//读温度
temp_data_l=read_byte();//温度低8位
temp_data_h=read_byte();//温度高8位
convert_T(temp_data_h,temp_data_l);
second_line[2]=LCD_3;//温度转换后的各位
second_line[3]=LCD_2;//分别存入显示缓存数组中
second_line[4]=LCD_1;
second_line[6]=LCD_0;
match_rom(ds18b20_romD);//匹配第四路
write_byte(0xbe);//读温度
temp_data_l=read_byte();//温度低8位
temp_data_h=read_byte();//温度高8位
convert_T(temp_data_h,temp_data_l);
second_line[10]=LCD_3;//温度转换后的各位
second_line[11]=LCD_2;//分别存入显示缓存数组中
second_line[12]=LCD_1;
second_line[14]=LCD_0;
display();
}
}
*****************************************************
//按键测试与控制温度设定温度//
*****************************************************
voidkey_test()
{
if(SET==0)
{delay(100);
while(~SET)
{DISPLAY();
if(INC_A==0)
{delay(100);
if(INC_A==0)
{SET_A++;
if(SET_A==10)
{
SET_A=0;
}
while(INC_A==0)DISPLAY();
}
}
if(INC_B==0)
{delay(100);
if(INC_B==0)
{SET_B++;
if(SET_B==10)
{
SET_B=0;
}
while(INC_B==0)DISPLAY();
}
}
}
}
set_tempA=SET_A;
set_tempB=SET_B;
}
**************************************
//温度上升或下降显示//
**************************************