📄 ds18b20-lcd1602-c51.c
字号:
{ display[0]=display[0]+0x37;}
else{display[0]=display[0]+0x30;}
lcd_wdat(display[0]); //高位数显示
display[1]=(Temp&0x0f);
if(display[1]>9)
{display[1]=display[1]+0x37;}
else {display[1]=display[1]+0x30;}
lcd_wdat(display[1]); //低位数显示
}
}
/*******************************************************************/
/* */
/* 读取温度 */
/* */
/*******************************************************************/
Read_Temperature(void)
{
uchar i;
TR0=0; //关中断,防止读数错误
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0x44); //启动温度转换
Init_DS18B20();
WriteOneChar(0x55); //匹配ROM命令
for(i=0;i<8;i++)
WriteOneChar(RomCode[i]);
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 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();
count=temp_alarm[0];
}
else
{
lcd_pos(0x46);
lcd_wdat(0x20);
}
if(compare_tl)
{
spk(0x4e); //小喇叭闪动
if(!alarm_on_off) //静音选择
beep();
count=temp_alarm[1];
}
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 main()
{
uchar m;
TMOD=0x01; TH0=0x4c; TL0=0x00; //50ms定时
EA=1; ET0=1; TR0=1;
P0=0;
P2&=0x1F;
Init_DS18B20();
Write_Temperature_alarm(); //设定报警上下限温度值
if(presence)
{
Error_Menu ();
do
{
Init_DS18B20();
beep();
}
while(presence);
}
RomCode_Menu (); //显示RomCode
for(m=0;m<10;m++)
Delay(50000);
Natural_Menu (); //正常显示界面
Delay(50000);
while(1)
{
Read_Temperature(); //读取当前温度
Delay(50000);
Disp_Temperature(); //更新当前温度
temp_compare(); //温度上下限比较
if(compare_th)
{
Set_tempalarm_Flash(0x43,0); //上限报警
}
if(compare_tl)
{
Set_tempalarm_Flash(0x4b,1); //下限报警
}
}//end of while(1)
} //end of main()
/**********************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -