找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1405|回复: 0
收起左侧

DS18B20+LCD1602的温度检测系统

[复制链接]
ID:565667 发表于 2020-5-13 11:54 | 显示全部楼层 |阅读模式
1.  main.c
#include <reg52.h> //调用头文件
#include <stdio.h>
#include "18b20.h"  //调用初始化函数
#include "1602.h"
#include "delay.h"
bitReadTempFlag; //温度显示
voidInit_Timer0(void);//中断函数

void main (void)
{                 
int temp;
float temperature;
char displaytemp[16];//

LCD_Init();          //调用初始化函数
DelayMs(20);         //延时20ms
LCD_Clear();         //清屏操作
Init_Timer0();
LCD_Write_String(0,0," wwwH2LWHcom ");
LCD_Write_Char(13,1,0x01);//显示temp
LCD_Write_Char(14,1,'C'); //显示C

while (1)        //无限循环
{
if(ReadTempFlag==1)
{
ReadTempFlag=0;
temp=ReadTemperature();

temperature=(float)temp*0.0625;
sprintf(displaytemp,"Temp  %7.3f",temperature);//输出温度显示值
LCD_Write_String(0,1,displaytemp);//把温度写入LCD
  }
}
}
void Init_Timer0(void)
{
TMOD |= 0x01;      //           
EA=1;            //接受中断
ET0=1;           //
TR0=1;           //
}
void Timer0_isr(void) interrupt 1
{
static unsignedint num;
TH0=(65536-2000)/256;        //重新赋值 2ms
TL0=(65536-2000)%256;
  num++;
if(num==300)        //
   {
    num=0;
   ReadTempFlag=1; //
    }
}

2.18b20.c
  #include"delay.h"
#include "18b20.h"
bit Init_DS18B20(void)
{
bit dat=0;
DQ = 1;    //释放总线,等待18b20的存在脉冲
DelayUs2x(5);   //让硬件反应
DQ = 0;         //RESET 拉低18b20单总线
DelayUs2x(200); //拉低400us
DelayUs2x(200);
DQ = 1;        
DelayUs2x(50); //等待50us
dat=DQ;      
DelayUs2x(25);
return dat;
}
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
  DQ = 0; // 给脉冲信号
  dat>>=1;
  DQ = 1; // 给脉冲信号
  if(DQ)
   dat|=0x80;
  DelayUs2x(25);
}
return(dat);
}
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0;i--)
{
  DQ = 0;
  DQ =dat&0x01;
  DelayUs2x(25);
  DQ = 1;
  dat>>=1;
}
DelayUs2x(25);
}
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); //
WriteOneChar(0x44); //
DelayMs(10);
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE); //
a=ReadOneChar();  //
b=ReadOneChar();  //
b<<=8;
t=a+b;
return(t);
}

1.1602.c
  #include"1602.h"   
#include "delay.h"
sbit RS = P1^0;  //定义1602寄存器选择端口为P2.4
sbit RW = P1^1;  //定义读写信号端口
sbit EN = P1^2;  //定义使能端口
#define RS_CLR RS=0 //宏定义选择1602指令寄存器
#define RS_SET RS=1 //数据寄存器
#define RW_CLR RW=0 //进行写操作
#define RW_SET RW=1 //进行读操作
#define EN_CLR EN=0 //执行命令
#define EN_SET EN=1 //读取信息
#define DataPort P0  //宏定义显示数据端口P0(1602的7-14脚)
/*------------------------------------------------
LCD1602初始化函数与显示函数
------------------------------------------------*/

    void  LCD1602_checkbusy() //液晶读忙状态
{
     unsignedchar  state;
       DataPort=0xff;    //数据口端口全电平
        RS_CLR;  //选择1602指令寄存器
       RW_SET;   //进行写操作
        do  
        {
               EN_SET;  //读取信息
               state=DataPort;  //变量state读取数据
              EN_CLR;    //执行命令
       }while(state&0x80);      //给硬件反应时间
}
void LCD_Write_Com(unsigned char com)  //设置模式或地址
{  
LCD1602_checkbusy();//忙则等待
RS_CLR;  //选择1602指令寄存器
RW_CLR;  //进行写操作
EN_SET;  //读取信息
DataPort=com;  //数据端口读取com口
_nop_();   //空操作一个周期,给硬件反应时间
EN_CLR;   //当EN有高电平跳变成低电平时,液晶模块开始执行命令
}
void LCD_Write_Data(unsigned char Data)  //向LCD1602写数据
{
LCD1602_checkbusy();// while(LCD_Check_Busy()); //忙则等待
RS_SET;  //数据寄存器
RW_CLR;  //进行写操作
EN_SET;  //读取信息
DataPort=Data;  //数据端口读取Data的数据
_nop_();   //空操作
EN_CLR;   //当EN有高电平跳变成低电平时,液晶模块开始执行命令
}
void LCD_Clear(void)  //请屏指令
{
LCD_Write_Com(0x01);   //将以前的显示内容清处
DelayMs(5);
}
void LCD_Write_String(unsigned char x,unsigned chary,unsigned char *s) //设置实际显示的地址
{     
if (y == 0)
   {  LCD_Write_Com(0x80 + x);     //显示第一行}
else
   {  LCD_Write_Com(0xC0+ x);      //显示第二行}        
while (*s)
   {     
LCD_Write_Data(*s);     
s ++;     
   }
}
void LCD_Write_Char(unsigned char x,unsigned chary,unsigned char Data)
{     
if (y == 0)
   {  LCD_Write_Com(0x80+ x);     }   
else
   {  LCD_Write_Com(0xC0+ x);     }        
LCD_Write_Data(Data);  
}
void LCD_Init(void)  //初始化操作
{  
  LCD_Write_Com(0x38);    //显示模式设置16*2,5*7,8位
   DelayMs(5);
  LCD_Write_Com(0x38);  
   DelayMs(5);
  LCD_Write_Com(0x38);
   DelayMs(5);
  LCD_Write_Com(0x38);  
  LCD_Write_Com(0x08);    //开显示,关光标
  LCD_Write_Com(0x01);    //清屏
  LCD_Write_Com(0x06);    //字符进入模式:屏不动,字符后移
   DelayMs(5);
  LCD_Write_Com(0x0C);    //开显示,开光标
   }

2.delay.c
#include "delay.h"    //调用.h初始化
void DelayUs2x(unsigned char t)   //us秒级延时
{   
while(--t);
}
void DelayMs(unsigned char t)    //s秒级延时
{  
while(t--)
{
     //大致延时1mS
    DelayUs2x(245);
  DelayUs2x(245);
}

温度监测仿真.zip

131.68 KB, 下载次数: 30, 下载积分: 黑币 -5

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表