📄 ds18b20-lcd1602-c51.c
字号:
WriteOneChar(0xBE); //读取温度寄存器
temp_data[0] = ReadOneChar(); //温度低8位
temp_data[1] = ReadOneChar(); //温度高8位
temp_alarm[0] = ReadOneChar(); //温度报警TH
temp_alarm[1] = ReadOneChar(); //温度报警TL
temp_comp=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
//取温度整数值
TR0=1; //开中断
}
/*******************************************************************/
/* */
/* 数据转换与温度显示 */
/* */
/*******************************************************************/
Disp_Temperature()
{
uchar s=0;
if(temp_data[1]>127) //温度为负值
{
temp_data[0]=(~temp_data[0])+1; //取反加一,将补码变成原码
if((~temp_data[0])>=0xff)
temp_data[1]=(~temp_data[1])+1;
else temp_data[1]=~temp_data[1];
s=1;
}
display[4]=temp_data[0]&0x0f;
display[0]=(display[4]*10/16)+0x30;
display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
display[3]=display[4]/100+0x30;
display[1]=display[4]%100;
display[2]=display[1]/10+0x30;
display[1]=display[1]%10+0x30;
if(display[3]==0x30) //高位为0,不显示
{
display[3]=0x20;
if(display[2]==0x30) //次高位为0,不显示
display[2]=0x20;
}
if(s)
display[3]=0x2d; //显示负号
lcd_pos(0x07);
lcd_wdat(display[3]); //百位数显示
lcd_wdat(display[2]); //十位数显示
lcd_wdat(display[1]); //个位数显示
lcd_wdat('.');
lcd_wdat(display[0]); //小数位数显示
lcd_wdat(0x00); //显示自定义字符
lcd_wdat('C'); //显示C
}
/*******************************************************************/
/* */
/* 蜂鸣器响一声 */
/* */
/*******************************************************************/
void beep()
{
unsigned char y;
for (y=0;y<100;y++)
{
Delay(70);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
Delay(25000);
}
/*******************************************************************/
/* */
/* ROMCORD 显示菜单 */
/* */
/*******************************************************************/
void RomCode_Menu ()
{
uchar m;
lcd_init(); //初始化LCD
lcd_pos(0); //设置显示位置为第一行
for(m=0;m<16;m++) //显示字符
lcd_wdat(cdis1[m]);
Read_RomCord(); //读取64位序列码
CRC8(); //CRC效验
if(crc==0) //CRC效验正确
{
Disp_RomCode(2); //显示64位序列码
}
}
/*******************************************************************/
/* */
/* DS18B20 ERROR 显示菜单 */
/* */
/*******************************************************************/
void Error_Menu ()
{
uchar m;
lcd_init(); //初始化LCD
lcd_pos(0); //设置显示位置为第一行的第1个字符
for(m=0;m<16;m++)
lcd_wdat(cdis3[m]); //显示字符
lcd_pos(0x40); //设置显示位置为第二行第1个字符
for(m=0;m<16;m++)
lcd_wdat(cdis4[m]); //显示字符
}
/*******************************************************************/
/* */
/* DS18B20 正常显示菜单 */
/* */
/*******************************************************************/
void Natural_Menu ()
{
uchar m;
lcd_init(); //初始化LCD
lcd_pos(0); //设置显示位置为第一行的第1个字符
for(m=0;m<16;m++)
lcd_wdat(cdis5[m]); //显示字符
lcd_pos(0x40); //设置显示位置为第二行第1个字符
for(m=0;m<16;m++)
lcd_wdat(cdis6[m]); //显示字符
Read_Temperature();
Disp_Temp_alarm(0x43,0); //显示TH值
Disp_Temp_alarm(0x4b,1); //显示TL值
Disp_Temperature(); //显示实时温度值
}
/*******************************************************************/
/* */
/* 主函数 */
/* */
/*******************************************************************/
void main()
{
uchar m;
TMOD=0x01; TH0=0x4c; TL0=0x00; //50ms定时
EA=1; ET0=1; TR0=1;
while(1)
{
Init_DS18B20();
if(presence)
{
Error_Menu ();
do
{
Init_DS18B20();
beep();
}
while(presence);
}
RomCode_Menu (); //显示RomCode
for(m=0;m<10;m++)
Delay(50000);
Natural_Menu ();
do
{
Read_Temperature();
Disp_Temperature();
temp_compare();
set_temp_alarm();
if(!K4)
{
beep();
while(!K4); //等待键释放
alarm_on_off=~alarm_on_off;
}
if(!K1)
{
beep();
while(!K1); //等待键释放
RomCode_Menu (); //显示RomCode
while(K2); //等待K2键按下
beep();
Natural_Menu ();
}
}
while(!presence);
}//end of while(1)
} //end of main()
/*********************************************************/
// 显示报警温度
/*********************************************************/
void Disp_Temp_alarm(uchar addr,uchar num)
{ //0=TH,1=TL
display1[2]=temp_alarm[num]/100+0x30;
display1[0]=temp_alarm[num]%100;
display1[1]=display1[0]/10+0x30;
display1[0]=display1[0]%10+0x30;
if(display1[2]==0x30) //高位为0,不显示
{
display1[2]=0x20;
if(display1[1]==0x30) //次高位为0,不显示
display1[1]=0x20;
}
lcd_pos(addr);
lcd_wdat(display1[2]); //百位数显示
lcd_wdat(display1[1]); //十位数显示
lcd_wdat(display1[0]); //个位数显示
}
/**********************************************************/
// Time0中断函数
/**********************************************************/
void Time0(void) interrupt 1 using 0
{
TH0=0x4c; //50ms定时
TL0=0x00;
timecount++;
if(timecount>9)
{
timecount=0;
flag=~flag;
}
}
/*********************************************************/
/* */
/*小喇叭闪动 */
/* */
/*********************************************************/
void spk(uchar addr)
{
if(flag)
{
lcd_pos(addr);
lcd_wdat(0x01); //小喇叭显示
}
else
{
lcd_pos(addr);
lcd_wdat(0x20); //清屏
}
}
/*********************************************************/
// 温度比较函数
/*********************************************************/
void temp_compare()
{
if(temp_comp >= temp_alarm[0]) //比较 TH 值
{
compare_th=1;
}
else compare_th=0;
if(temp_comp < temp_alarm[1]) //比较 TL 值
{
compare_tl=1;
}
else compare_tl=0;
if(compare_th)
{
spk(0x46); //小喇叭闪动
if(!alarm_on_off) //静音选择
beep();
}
else
{
lcd_pos(0x46);
lcd_wdat(0x20);
}
if(compare_tl)
{
spk(0x4e); //小喇叭闪动
if(!alarm_on_off) //静音选择
beep();
}
else
{
lcd_pos(0x4e);
lcd_wdat(0x20);
}
}
/*********************************************************/
// 温度报警值闪动
/*********************************************************/
void Set_tempalarm_Flash(uchar addr,uchar num)
{
if(flag)
{
temp_alarm[num]=count;
Disp_Temp_alarm(addr,num); //显示温度报警值
}
else
{
lcd_pos(addr);
lcd_wdat(0x20);
lcd_wdat(0x20);
lcd_wdat(0x20);
}
}
/*********************************************************/
// 设定报警值键函数
/*********************************************************/
void key_set(uchar num)
{
if(!K2) //加键
{
beep();
if(count!=num)
count++;
else
count=0;
}
if(!K1) //减键
{
beep();
if(count!=0)
count--;
else count=num;
}
}
/**********************************************************
温度报警值设定
***********************************************************/
void set_temp_alarm()
{
if(!K3)
{
beep();
temp_th=1;
count=temp_alarm[0]; //取实时TH报警值
}
while(temp_th)
{
key_set(120);
Set_tempalarm_Flash(0x43,0);
if(!K3)
{
beep();
temp_th=0;
temp_tl=1;
flag=1;
Set_tempalarm_Flash(0x43,0); //显示温度报警TH值
count=temp_alarm[1]; //取实时TL报警值
}
}
while(temp_tl)
{
key_set(120);
Set_tempalarm_Flash(0x4b,1);
if(!K3)
{
beep();
temp_tl=0;
flag=1;
Set_tempalarm_Flash(0x4b,1); //显示温度报警TL值
Write_Temperature_alarm(); //报警值写入DS18B20
count=0;
}
}
}
/**********************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -