#include
#include
#define uchar unsigned char
sbit RS=P3^5; //定義LCD端口
sbit RW=P3^6;
sbit E=P3^7;
sbit DQ=P3^4; //定義單總線端口
uchar LCD_3,LCD_2,LCD_1,LCD_0;
uchar ds18b20_romA[8]={0x8e,0x00,0x00,0x00,0xb8,0xc5,0x30,0x28};
//四個DS18B20的64位ROM地址
uchar ds18b20_romB[8]={0x52,0x00,0x00,0x00,0xb8,0xc5,0x34,0x28};
uchar ds18b20_romC[8]={0x65,0x00,0x00,0x00,0xb8,0xc5,0x35,0x28};
uchar ds18b20_romD[8]={0x3c,0x00,0x00,0x00,0xb8,0xc5,0x36,0x28};
uchar code LCDData[] ="0123456789";
uchar code dot_tab[] ="0112334456678899";
uchar first_line[16]="A:000.0 B:000.0"; //LCD第一行顯示緩存數組
uchar second_line[16]="C:000.0 D:000.0"; //LCD第二行顯示緩存數組
//************************************
//延時程序
//************************************
void delay(unsigned int N)
{
unsigned int i;
for(i=0;i>i;
temp=temp&0x01;
write_bit(temp);
delay(5);
}
}
//*************************************
//64位的ROM序列號匹配
//*************************************
bit match_rom(uchar *rom)
{
uchar i;
ds18b20_init();
write_byte(0x55);
for(i=8;i>0;i--)
{
write_byte(*(rom+i-1));
}
return 1;
}
//************************************
//從ds18b20中讀出64位序列號
//************************************
/*uchar * read_rom(void)
{
uchar rom[8],i;
ds18b20_init();
write_byte(0x33);
for(i=8;i>0;i--)
{
rom[i-1]=read_byte();
}
return &rom[0];
}*/
//*************************************
//將64位序列號顯示在LCD上顯示出來
//*************************************
/*void print_char(uchar a)
{
if(a>=0&&a<=9)
write_data(a+0x30);
else if(a>=0x0a &&a<= 0x0f)
write_data(a+0x37);
}*/
//*************************************
//溫度轉換,將從ds18b20中讀出來的溫度值
//轉化成十進制的溫度值,并存放顯示緩存
//*************************************
void convert_T(uchar temp_data_h,uchar temp_data_l)
{
uchar temp;
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=dot_tab[temp_data_l&0x0f]; //查表得小數位的值
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=dot_tab[temp_data_l&0x0f]; //查表得小數位的值
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]; //查表得溫度個位
}
}
void display(void)
{
uchar i;
write_command(0x80);
for(i=0;i<16;i++)
{
write_data(first_line);
}
write_command(0xc0);
for(i=0;i<16;i++)
{
write_data(second_line);
}
}
void main(void)
{
uchar temp_data_l,temp_data_h;
/*uchar *ds18b20_rom;*/
init_lcd1602();
/*while(1)
{
uchar i;
ds18b20_rom=read_rom(); //讀序列號
write_command(0x80);
for(i=0;i<8;i++)
{
ds18b20_romA=*ds18b20_rom;
ds18b20_rom++;
}
write_command(0x80);
for(i=0;i<8;i++) //顯示序列號
{
print_char(ds18b20_romA/16);
print_char(ds18b20_romA%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();
}
}
這段程序想加個報警系統
初學者不知道從何下手 希望各位能指導下 報警由一個揚聲器和2個LED燈組成 |