?? 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 + -