51单片机,LCD1602显示单线接三个DS18B20的C语言编程
2个回答
展开全部
给你四个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();
}
}
#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();
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |