基于AT89C51单片机和DS18B20温度传感器,LCD1602液晶显示的高精度数字温度计程序,用C语言编程

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-02
基于AT89C51单片机和DS18B20温度传感器、LCD1602液晶显示的高精度数字温度计程序,用C语言编程

/***********ds18b20子程序*************************/

/***********ds18b20延迟子函数(晶振12MHz )*******/
#include
sbit DQ=P1^2;
#define uchar unsigned char

void delay_18B20(unsigned int i)
{
while(i--);
}

/**********ds18b20初始化函数**********************/

void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay_18B20(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay_18B20(4);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay_18B20(20);
}

/***********ds18b20读一个字节**************/

unsigned char ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}

/*************ds18b20写一个字节****************/

void WriteOneChar(uchar dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(5);
DQ = 1;
dat>>=1;
}
}

/**************读取ds18b20当前温度************/

ReadTemp(void)
{float val;
uchar temp_value,value;
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;

Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换

delay_18B20(100); // this message is wery important

Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度

delay_18B20(100);

a=ReadOneChar(); //读取温度值低位
b=ReadOneChar(); //读取温度值高位
temp_value=b<<4;
temp_value+=(a&0xf0)>>4;
value=a&0x0f;
val=temp_value+value;
return(val);

}
以上是DS18B20的驱动程序。然后在主程序中直接调用函数就可以了。
以上是在主程序中的调用,你看关于温度的那个就可以。
#include "reg51.h"
#include "18b20.h"
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="Welcome To" ;//初始化日期和星期
uchar code table1[]="Our System!";//初始化时间

uchar code table2[]="Temperature is:";//初始化时间

//以下三个是定义LCD的引脚
sbit lcden=P2^2;
sbit lcdwrite=P2^1;
sbit lcdrs=P2^0;

char wendu;

//延时程序
void delay(uint z)
{ uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

//lcd的写指令
void write_com(uchar com)
{
lcdrs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}

//lcd的写数据
void write_data(uchar da)
{ lcdrs=1;
lcden=0;
P0=da;
delay(5);
lcden=1;
delay(5);
lcden=0;
}

//初始化
void init()
{
uchar num;

lcdwrite=0;
lcden=0;
write_com(0x38); //16*2显示,5*7点阵,8位数据
write_com(0x0c);//显示开,关光标
write_com(0x06); //移动光标
write_com(0x01);//清除LCD的显示内容

write_com(0x80);
for (num=0;num<10;num++)
{
write_data(table[num]);
delay(5);
}

write_com(0x80+0x40);

for (num=0;num<11;num++)
{
write_data(table1[num]);
delay(5);
}

}

void write_wendu(uchar add, char da)
{
uchar shi,ge;
shi=da/10;
ge=da%10;
write_com(0x80+0x40+add);
write_data(0x30+shi);
write_data(0x30+ge);
}

//主函数
void main ()
{

uchar num;

init();
delay(2000);

delay(2000);
delay(2000);

write_com(0x01);//清除LCD的显示内容

while(1)
{

write_com(0x80);
for (num=0;num<15;num++)
{
write_data(table2[num]);
delay(5);
}

wendu = ReadTemp( );
write_wendu(2,wendu);
}
}

你好!

这样的效果吗,私信联系吧

LCD驱动程序

/*************************************************************/
/* */
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据 */
/* */
/*************************************************************/
static bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(LCD_DB_Port&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/* */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
#ifdef LCD_8DB
LCD_DB_Port = cmd;
#endif

delayNOP();
LCD_EN = 1; //上跳沿时输入数据
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/* */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
#ifdef LCD_8DB
LCD_DB_Port = dat;
#endif

delayNOP();
LCD_EN = 1;
delayNOP(); //上跳沿时输入数据
LCD_EN = 0;
}
/*************************************************************/
/* */
/* LCD初始化设定 */
/* */
/*************************************************************/
void lcd_init()
{
delay(15); //等待电源稳定
lcd_wcmd(LCD_MODE); //设置显示模式
delay(5);
lcd_wcmd(LCD_MODE);
delay(5);
lcd_wcmd(LCD_MODE);
delay(5);
lcd_wcmd(0x0c); //显示开,关光标
delay(5);
lcd_wcmd(0x06); //移动光标
delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
}

哈哈
我有的
去我百度空间看看。然后QQ我
可以根据你的图修改哦

  • 用AT89C51单片机和温度传感器DS18B20S设计数字式温度计
    答:读DS1820温度传感器ROM中的编码(即64位地址)符合ROM 0x55 发出此命令之后,接着发出 64 位 ROM 编码,访问单总线上与该编码相对应的 DS1820 使之作出响应,为下一步对该 DS1820 的读写作准备。搜索ROM 0xF0 用于确定挂接在同一总线上 DS1820 的个数和识别 64 位 ROM 地址。为操作各器件作好准备。跳过RO...
  • 你那有基于AT89C51单片机和DS18B20温度传感器程序么
    答:/*初始化ds1820 *//* *//***/Init_DS18B20(void){ DQ = 1; //DQ复位 Delay(8); //稍做延时 DQ = 0; //单片机将DQ拉低 Delay(90); //精确延时大于480us DQ = 1; //拉高总线 Delay(8); presence = DQ; //如果=0则初始化成功 =1则初始化失败 Delay(100); DQ = 1; return(prese...
  • 基于AT89C51单片机和DS18B20温度传感器、LCD1602液晶显示的高精度数字温...
    答:DS18B20温度传感器、LCD1602液晶显示的代码 ;XRF多功能51单片机开发板 ;DS18B20测温程序(液晶显示,可测量0-99度);;TEMPER_L EQU 36H ;从DS18B20中读回高位,低位暂存区 TEMPER_H EQU 35H ;TEMPER_NUM EQU 60H;温度值存储 TEMPER_GE EQU 61H TEMPER_SHI EQU 62H TEMPER_SAVE EQU 63H FLAG1 ...
  • 求C语言程序,AT89C51单片机为核心,DS18B20测温度,实时用4位LED显示...
    答://温度正负标志 /***ds1820程序***/ void delay_18B20(unsigned int i) //延时1微秒 { while(i--); }void ds1820rst() /*ds1820复位*/ { unsigned char x=0; DQ = 1; //DQ复位 delay_18B20(4); //延时 DQ = 0; //DQ拉低 delay...
  • 用AT89C51,5个DS18B20传感器,数码管显示电路,按键控制电路,温度上下 ...
    答:ds1820wr(0x44); // 启温度转换 ds1820rst();ds1820wr(0xcc); // 跳读序列号 ds1820wr(0xbe); // 读取温度 a=ds1820rd();b=ds1820rd();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0x0fff)tflag=0;else { tvalue=~tvalue+2; tflag=1; //负温度 } tvalue...
  • 急救!!基于AT89C51单片机的多路DS18b20测温显示系统的所有相关资料_百 ...
    答:美国Dallas半导体公司的数字化温度传感器DS1820是世界上第一片支持 “一线总线”接口的温度传感器,在其内部使用了在板(ON-B0ARD)专利技术。全部传感元件及转换电路集成在形如一只三极管的集成电路内。“一线总线”独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。现在,...
  • 关于51单片机的多功能温度显示器论文中的摘要怎么写?
    答:硬件电路主要包括主控制器,测温电路和显示电路等,控制器采用单片机AT89C51,温度传感器采用美国DALLAS半导体公司生产的DS18B20,显示电路采用4位共阳极LED数码管以动态扫描法直读显示。系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。此外,还介绍了系统的...
  • 基于DS18B20和AT89C51使用PROTEUS制作的仿真,使用LCD1602显示的温度监...
    答:看书:51单片机工程师是怎么炼成的 最后一章:温度自动控制系统
  • 使用DS18B20和AT89C51编程时出问题了
    答://温度值/***ds18b20子程序***//***ds18b20延迟子函数(晶振12MHz )***/ void delay_18B20(unsigned int i){ while(i--);}/***ds18b20初始化函数***/void Init_DS18B20(void) { unsigned char x=0; DQ = 1; delay_18B20(8); DQ = 0; delay_18B20(80); DQ =...
  • proteus没有at89s52,用at89c51代替不能仿真成功,我用的温度传感器ds1820...
    答:51和52的区别是ram大小不一样,其他是一样的,如果程序没有用太多ram的话,那么实际上是一样的,仿真应该不会有问题,你试着单片机不加载程序看能否仿真。