IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于proteus的ds18b20+lcd -> 正文阅读

[嵌入式]基于proteus的ds18b20+lcd

实验电路图

请添加图片描述

实验代码

main.c

#include <reg52.h>
#include <ds18b20.h>
#include <LCD.h>
uint count_temp=0;//温度刷新计数
uint temp=0;
uchar table[]={0,0};
uchar table1[]={0,0};
uchar temper[]="temperature:";
void System_Init();
void Time0Init();
void Lcd_Display();
void main()
{	
	System_Init();//系统初始化
	while(1)
	{
		Lcd_Display();//lcd显示
		if(count_temp>749)
		{
			count_temp=0;
			temp=(float)ReadTemperature()*0.0625*100+0.5;//进行温度刷新
		}
	}
}

/***********************定时器初始化**************************/
void Time0Init()
{
	TMOD=0X01;
	TL0 = 0x18;	//设置定时初值
	TH0 = 0xFC;
	TF0 = 0;	
	TR0 = 1;
	ET0=1;//打开定时器中断
	EA=1;//打开总中断
}
/************************************************************/

/***********************中断服务函数*************************/
void Time0() interrupt 1//定时为1ms,作为程序运行的时基
{
	TL0 = 0x18;	//每次溢出之后要手动进行一次初始化。
	TH0 = 0xFC;
	count_temp++;
}
/**********************************************************/

/************************系统初始化***************************/
void System_Init()
{
	int i;
	for(i=0;i<79;i++)
		temp=(float)ReadTemperature()*0.0625*100+0.5;//温度初始化
	Time0Init();//定时器初始化
	init();//lcd初始化
}
/***********************************************************/

/*********************LCD显示******************************/
void Lcd_Display()
{
		uint i;
		table[0]=temp/1000;//修改显示的值
		table[1]=temp%1000/100;
		table1[0]=temp%1000%100/10;
		table1[1]=temp%10;	
		write_com(0x80);
		for(i=0;i<12;i++)
		{
			write_data(temper[i]);
			delay(5);		
		}
		write_com(0x80+0x40);
		write_data(table[0]+48);
		write_data(table[1]+48);
			delay(5);
		write_com(0x80+0x42);
		write_data('.');
		write_data(table1[0]+48);
		write_data(table1[1]+48);
			delay(5);
}
/***********************************************************/

LCD.h

#ifndef __LCD_H__
#define __LCD_H__
 
#include<reg52.h>     //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<intrins.h>
#include<ds18b20.h>
void write_com(uchar com);
void write_data(uchar dat);
void init();
sbit	RS=P3^1;
sbit	E=P3^2;
#endif

LCD.c

#include<LCD.h>

void write_com(uchar com){
	E=0;
	RS=0;
	P0=com;
	delay(5);
	E=1;
	delay(5);
	E=0;
}

void write_data(uchar dat){
	E=0;
	RS=1;
	P0=dat;
	delay(5);
	E=1;
	delay(5);
	E=0;
}

void init(){
  write_com(0x38);
	write_com(0x0c);
	write_com(0x06);
	write_com(0x01);
}

ds18b20.h

#ifndef __DS18B20_H__
#define __DS18B20_H__
 
#include<reg52.h>     //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<intrins.h>
 
#define uchar unsigned char
#define uint   unsigned int
/*------------------------------------------------
                    端口定义
------------------------------------------------*/
sbit DQ=P1^4;//ds18b20 端口
/*------------------------------------------------
                  函数声明
------------------------------------------------*/
unsigned int ReadTemperature(void);
bit Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
 void delay(ms);
#endif
#include"ds18b20.h"
/*------------------------------------------------
                    18b20初始化
------------------------------------------------*/

void DelayUs2x(unsigned char t)
{
	uchar i;
	for(i=0;i<t;i++)
	{
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
	}
}
bit Init_DS18B20(void)
{
 bit dat=0;
 DQ = 1;    //DQ复位
DelayUs2x(1);   //稍做延时
 DQ = 0;         //单片机将DQ拉低
DelayUs2x(20); //精确延时 大于 480us 小于960us
DelayUs2x(20);
 DQ = 1;        //拉高总线
 DelayUs2x(5); //15~60us 后 接收60-240us的存在脉冲
 dat=DQ;        //如果x=0则初始化成功, x=1则初始化失败
DelayUs2x(3); //稍作延时返回
 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(3);
 //  DelayUs2x(5); 换成5 10就初始化失败 温度显示0.063       25就 85度
 }
 return(dat);
}
/*------------------------------------------------
                    写入一个字节
------------------------------------------------*/
void WriteOneChar(unsigned char dat)
{
 unsigned char i=0;
 for (i=8; i>0; i--)
 {
  DQ = 0;
  DQ = dat&0x01;
	DelayUs2x(3);
  //  DelayUs2x(5); 换成这个就初始化失败 温度显示0.063
  DQ = 1;
  dat>>=1;
 }
	DelayUs2x(3);
}
 
/*------------------------------------------------
                    读取温度
------------------------------------------------*/
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay(10);
//DelayUs2x(25);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作 
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();   //低位
b=ReadOneChar();   //高位
 
b<<=8;
t=a+b;
 
return(t);
}
void delay(ms){
uint i,j;
	for(i=0;i<ms;i++){
	for(j=0;j<123;j++){
	}
 
	}
}
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-11-24 08:06:46  更:2021-11-24 08:07:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:20:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码