利用DS18B20测温,并通过LCD1602 显示 proteus仿真 +DS1302时钟模块

最新更新时间:2022-08-11来源: csdn关键字:DS18B20测温  LCD1602  时钟模块 手机看文章 扫描二维码
随时随地手机看文章

main.c 


#include

#include

#include

#include

 

#define uchar unsigned char

#define uint unsigned int

 

 

uchar code Write_addr [] ={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//写地址

uchar code Read_addr [] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//读地址

uchar Time [7] = {0x50,0x59,0x23,0x07,0x06,0x02,0x22};//初始值设置

//                 秒   分   时    日   月   星期  年

 

//-----------------------------------变量区---------------------------------

uint Temp;//温度变量

 

//-----------------------------------函数区---------------------------------

 

void Int_DS1302()

{

uchar i;

Write_Ds1302_Byte( 0x8e,0x00 );

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

{

Write_Ds1302_Byte( Write_addr [i],Time [i] );

}

Write_Ds1302_Byte( 0x8e,0x80 );

}

 

void Read_DS1302_Time()

{

uchar i;

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

{

Time [i] = Read_Ds1302_Byte( Read_addr [i] );

}

}

 

void Display_Time()

{

LCD_ShowNum(2,15,Time [0]%16,1);

LCD_ShowNum(2,14,Time [0]/16,1);

LCD_ShowChar(2 ,13,':');

LCD_ShowNum(2,12,Time [1]%16,1);

LCD_ShowNum(2,11,Time [1]/16,1);

LCD_ShowChar(2 ,10,':');

LCD_ShowNum(2,9,Time [2]%16,1);

LCD_ShowNum(2,8,Time [2]/16,1);

LCD_ShowChar(2 ,7,'-');

LCD_ShowNum(2,6,Time [3]%16,1);

LCD_ShowNum(2,5,Time [3]/16,1);

LCD_ShowChar(2 ,4,'-');

LCD_ShowNum(2,3,Time [4]%16,1);

LCD_ShowNum(2,2,Time [4]/16,1);

}

 

void main()

{

Int_DS1302();

LCD_initial();

while(1)

{

Read_DS1302_Time();

Temp = Read_Temp();

string(0x82,"Temp");

LCD_ShowChar(1 ,7,':');

LCD_ShowChar(1 ,11,'C');

LCD_ShowNum(1,8,Temp,3);//第一行直接显示温度占四个单元格

//---------------------------------显示时间----------------------------------------

Display_Time();

}

}


onewire.c


#include "reg52.h"

#include

 

#define uchar unsigned char

#define uint unsigned int

 

sbit DQ = P3^3;  //单总线接口

 

//单总线延时函数

void Delay_OneWire(unsigned int t)  //STC89C52RC

{

while(t--);

}

 

//通过单总线向DS18B20写一个字节

void Write_DS18B20(unsigned char dat)

{

unsigned char i;

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

{

DQ = 0;

DQ = dat&0x01;

Delay_OneWire(12);

DQ = 1;

dat >>= 1;

}

Delay_OneWire(5);

}

 

//从DS18B20读取一个字节

unsigned char Read_DS18B20(void)

{

unsigned char i;

unsigned char dat;

  

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

{

DQ = 0;

dat >>= 1;

DQ = 1;

if(DQ)

{

dat |= 0x80;

}     

Delay_OneWire(5);

}

return dat;

}

 

//DS18B20设备初始化

bit init_ds18b20(void)

{

  bit initflag = 0;

 

  DQ = 1;

  Delay_OneWire(12);

  DQ = 0;

  Delay_OneWire(80);

  DQ = 1;

  Delay_OneWire(10); 

    initflag = DQ;     

  Delay_OneWire(5);

  

  return initflag;

}

 

 

uint Read_Temp()

{

uint high,low,Date_T;

init_ds18b20();

Write_DS18B20(0xcc);

Write_DS18B20(0x44);

Delay_OneWire(225); 

init_ds18b20();

Write_DS18B20(0xcc);

Write_DS18B20(0xbe);

low = Read_DS18B20();

high = Read_DS18B20();

Date_T = high<<8;

Date_T = Date_T+low;

Date_T = Date_T * 0.0625+0.5;//

return Date_T;

}


onewire.h


#ifndef __ONEWIRE_H

#define __ONEWIRE_H

 

#define uchar unsigned char

#define uint unsigned int

 

unsigned char rd_temperature(void);  //; ;

unsigned char Read_DS18B20(void);

void Write_DS18B20(unsigned char dat);

bit init_ds18b20(void);

uchar Read_Temp(void);

#endif

LCD.c


#include

#include

 

#define uchar unsigned char

#define uint unsigned int

#define  out P2

sbit rs = P1^5;

sbit rw = P1^4;

sbit e =  P1^3;

 

void delay(uint j)

{

uchar i=250;

for(;j>0;j--)

{

while(--i);

i=249;

while(--i);

i=250;

}

}

 

void check_busy(void)

{

uchar dt;

do

{

dt=0xff;

e=0;

rs=0;

rw=1;

e=1;

dt=out;

}while(dt&0x80);

e=0;

}

 

void write_command(uchar com)//写命令

{

check_busy();

e=0;

rs=0;

rw=0;

out=com;

e=1;

_nop_();

e=0;

delay(1);

}

void write_data(uchar dat)//写数据 

{

check_busy();

e=0;

rs=1;

rw=0;

out=dat;

e=1;

_nop_();

e=0;

delay(1);

}

void LCD_initial(void)//初始化

{

delay(2);

write_command(0x38);

delay(1);

write_command(0x38);

write_command(0x08);

write_command(0x01);

write_command(0x06);

write_command(0x0c);

//delay(1);

}

void string(uchar ad,uchar *s)//显示字符

 {

write_command(ad);

while(*s>0)

{

write_data(*s++);

delay(100);

}

}

 

int LCD_Pow(uint x,uint y)//

{

unsigned char i = 0;

int result = 1;

for(i=0;i {

result *= x;

}

return result;

}

 

void LCD_SetCursor(uchar Line,uchar Columu)//行选择

{

if(Line == 1)

{

write_command(0x80|(Columu-1));

}

else

{

write_command(0x80|( Columu-1)+0x40);

}

}

 

 

//                       行           格      数字      长度

void LCD_ShowNum(uchar Line,uchar Columu,uint Num,uint Length)//显示数字

{

uint i = 0;

 

LCD_SetCursor(Line,Columu);

 

for(i=Length;i>0;i--)

{

write_data('0'+Num/LCD_Pow(10,i-1)%10);

}

}

 

void LCD_ShowChar(unsigned char Line , unsigned char Columu , unsigned char Char)//写一个字符

{

LCD_SetCursor(Line,Columu);

 

write_data(Char);

}


LCD.h


#ifndef __LCD_H__

#define __LCD_H__

 

#define uchar unsigned char

#define uint unsigned int

 

void check_busy(void);

void write_command(unsigned char com);

void write_data(uchar dat);

void LCD_initial(void);

void string(uchar ad ,uchar *s);

void lcd_test(void);

void delay(uint);

void LCD_ShowNum(uchar Line,uchar Columu,uint Num,uint Length);//显示数字

void LCD_SetCursor(uchar Line,uchar Columu);

int LCD_Pow(uchar x,uchar y);

void LCD_ShowChar(unsigned char Line , unsigned char Columu , unsigned char Char);//写一个字符

#endif


ds1302.c


#include

#include

 

sbit SCK = P3^1;

sbit SDA = P3^2;

sbit RST = P3^0;   // DS1302复位

 

#define uchar unsigned char

#define uint unsigned int

//uchar code Write_addr [] ={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//写地址

//uchar code Read_addr [] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//读地址

//uchar Time [7] = {0x50,0x59,0x23,0x00,0x00,0x00,0x00};//初始值设置

                 秒   分   时    日   月   星期  年

 

void Write_Ds1302(unsigned  char temp) 

{

unsigned char i;

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

SCK=0;

SDA=temp&0x01;

temp>>=1; 

SCK=1;

}

}   

 

void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     

{

  RST=0; _nop_();

  SCK=0; _nop_();

  RST=1; _nop_();  

  Write_Ds1302(address);

  Write_Ds1302(dat);

  RST=0; 

}

 

unsigned char Read_Ds1302_Byte ( unsigned char address )

{

  unsigned char i,temp=0x00;

  RST=0; _nop_();

  SCK=0; _nop_();

  RST=1; _nop_();

  Write_Ds1302(address);

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

  {

SCK=0;

temp>>=1;

  if(SDA)

  temp|=0x80;

  SCK=1;

  RST=0; _nop_();

  SCK=0; _nop_();

SCK=1; _nop_();

SDA=0; _nop_();

SDA=1; _nop_();

return (temp);

}


 


ds1302.h


#ifndef __DS1302_H

#define __DS1302_H

 

void Write_Ds1302(unsigned char temp);

void Write_Ds1302_Byte( unsigned char address,unsigned char dat );

unsigned char Read_Ds1302_Byte( unsigned char address );

 

#endif

仿真图

关键字:DS18B20测温  LCD1602  时钟模块 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic618743.html

上一篇:51单片机外接ADC0808制作简易电压表
下一篇:利用定时器使P1^0口输出指定占空比、周期矩形脉冲

推荐阅读

51单片机 LCD1602调试工具
本章博客讲述的是关于LCD1602的调试,使用它是为了更加直观的表示出代码所要实现的功能1.首先,需要添加两份驱动文件到新建的工程中来,再插入到新建的工程中来将其复制到新建文件的同一目录下,在进行添加2.写出以下代码进行编译查看效果#include <REGX52.H>#include "LCD1602.h"void main(){ LCD_Init(); LCD_ShowChar(1,1,'A'); LCD_ShowString(1,3,"Hello"); LCD_ShowNum(1,9,123,3); //高位补零,如果最后一位是2则显示23 LCD_
发表于 2022-09-28
51单片机 <font color='red'>LCD1602</font>调试工具
C51(DHT11)温湿度+LCD1602
前言:软件延时真的很坑,校园网真的很烂直接上码LCD1602部分(1).LCD1602.C#include <reg52.h>#include <LCD1602.h>#include <INTRINS.h>sbit LCD_RS=P2^6;sbit LCD_RW=P2^5;sbit LCD_E=P2^7;#define LCD_DatrPort P0//指令函数void LCD_WeitrCommand(unsigned char Command){LCD_RS=0;//0写指令,1写数据LCD_RW=0;//write modeLCD_DatrPort=Command;LCD_E=1; LCD_
发表于 2022-09-28
C51(DHT11)温湿度+<font color='red'>LCD1602</font>
MSP430笔记2——时钟模块UCS
时钟信号的产生时钟源:LFXT1CLK 外部低频振荡器 32.768KHZXT2CLK 外部高频振荡源 4MHZDCOCLK 内部数字控制振荡源(1MHZ、8MHZ、12MHZ、16MHZ已校准)VLOCLK 内部低耗低频振荡源 10KHZ时钟信号:时钟源经过分频得到 可对时钟源分频1、2、4、8有些型号不支持XT2CLKUCS的操作说明开机上电默认时钟:ACLK:XT1(无效时,低频REFO,其他DCO)MCLK:DOCCLKDIV(DOC分频得到)SMCLK:DOCCLKDIV//配置时钟代码#include <msp430.h>int main(void){ WDTCTL = WDTPW | WDTHOLD; //
发表于 2022-09-26
MSP430笔记2——<font color='red'>时钟</font><font color='red'>模块</font>UCS
基于51单片机+LCD1602显示
LCD1602介绍LCD1602相关引脚LCD1602写命令、写数据相关操作图根据上面时序图和时序参数图我们可以写出 写命令代码 和写数据代码写命令 代码写命令void write_com(char command){ RS = 0; RW = 0; //高读低写 LCD = command; delay5ms(); //这里延时最低要30纳秒 我们直接给5ms E = 1;//使能拉高 delay5ms(); //最低要求延迟150纳秒 我们直接给5ms E = 0;}写数据 代码写数据void write_data(char data){ RS = 1; RW = 0; LCD = data; delay5ms(); //这里延
发表于 2022-09-21
基于51单片机+<font color='red'>LCD1602</font>显示
基于51单片机+红外遥控解码+LCD1602显示
基本介绍什么是红外线?人的眼睛能看到的可见光按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫。其中红光的波长范围为0.62~0.76μm;紫光的波长范围为0.38~0.46μm。比紫光波长还短的光叫紫外线,比红光波长还长的光叫红外线.红外线遥控就是利用波长为0.76~1.5μm之间的近红外线来传送控制信号的。红外线系统的组成红外线系统一般由红外发射装置和红外接收设备两大部分组成。红外发射装置又可由键盘电路、红外编码芯片、电源和红外发射电路组成。红外接收设备可由红外接收电路、红外解码芯片、电源和应用电路组成。通常为了使信号更好的被发射端发送出去,经常会将二进制数据信号调制成为脉冲信号,通过红外发射管发射。常用的有通过脉冲宽度来实现
发表于 2022-09-20
基于51单片机+红外遥控解码+<font color='red'>LCD1602</font>显示
基于51单片机+DHT11温湿度+LCD1602显示
DHT11温湿度相关介绍DHT11产品概述DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传 感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高 的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测 温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快 响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的 湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内 部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集 成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使 其成为各类应用甚至最为苛刻的
发表于 2022-09-20
基于51单片机+DHT11温湿度+<font color='red'>LCD1602</font>显示
小广播
设计资源 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved