當前位置:編程學習大全網 - 編程語言 - 51單片機,LCD1602顯示單線接三個DS18B20的C語言編程

51單片機,LCD1602顯示單線接三個DS18B20的C語言編程

給妳四個DS1B820的程序(單總線實現的)。LCD1602顯示,但是沒有報警哦。

#include<reg51.h>

#include<intrins.h>

#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,0x37,0x28};

uchar code LCDData[] ="0123456789";

//************************************

//延時程序

//************************************

void delay(unsigned int N)

{

unsigned int i;

for(i=0;i<N;i++);

}

//************************************

//LCD1602測忙

//************************************

void check_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寫命令

//************************************

void write_command(uchar tempdata)

{

E=0;

_nop_();

_nop_();

RS=0;

_nop_();

_nop_();

RW=0;

P1=tempdata;

_nop_();

_nop_();

E=1;

_nop_();

_nop_();

E=0;

_nop_();

check_busy();

}

//************************************

//LCD1602寫數據

//************************************

void write_data(uchar tempdata)

{

E=0;

_nop_();

_nop_();

RS=1;

_nop_();

_nop_();

RW=0;

P1=tempdata;

_nop_();

_nop_();

E=1;

_nop_();

_nop_();

E=0;

_nop_();

check_busy();

}

//************************************

//初始化LCD1602

//************************************

void init_lcd1602()

{

write_command(0x01); //清除屏幕

write_command(0x38); //功能設定(8位,2行,5*7點陣式)

write_command(0x0c); //顯示器ON,光標OFF,閃爍OFF

write_command(0x06);//地址加1

}

//************************************

//初始化ds18b20

//************************************

bit resetpulse(void)

{

DQ=0;

delay(40); //延時500us

DQ=1;

delay(4); //延時60us

return(DQ); //讀取P1.0的狀態

}

void ds18b20_init(void)

{

while(1)

{

if(!resetpulse()) //收到ds18b20的應答信號

{

DQ=1;

delay(40); //延時240us

break;

}

else

resetpulse(); //否則再發復位信號

}

}

//************************************

//讀ds18b20壹位

//************************************

uchar read_bit(void)

{

DQ=0;

_nop_();

_nop_();

DQ=1;

delay(2);

return(DQ);

}

//************************************

//讀ds18b20壹個字節

//************************************

uchar read_byte(void)

{

uchar i,m,receive_data;

m=1;

receive_data=0;

for(i=0;i<8;i++)

{

if(read_bit())

{

receive_data=receive_data+(m<<i);

}

delay(7);

}

return(receive_data);

}

//************************************

//向ds18b20寫壹位

//************************************

void write_bit(uchar bitval)

{

DQ=0;

if(bitval==1)

DQ=1;

delay(5);

DQ=1;

}

//************************************

//向DS18B20寫壹個字節命令

//************************************

void write_byte(uchar val)

{

uchar i,temp;

for(i=0;i<8;i++)

{

temp=val>>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;

}

void main(void)

{

uchar temp_data_l,temp_data_h;

init_lcd1602();

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();

}

}

  • 上一篇:問壹下,濰坊有哪個培訓學校可以培訓PLC?
  • 下一篇:兒童編碼是什麽
  • copyright 2024編程學習大全網