51单片机DS18B20温度报警器proteus仿真设计

您所在的位置:网站首页 proteus数字电压表 51单片机DS18B20温度报警器proteus仿真设计

51单片机DS18B20温度报警器proteus仿真设计

2023-11-20 04:18| 来源: 网络整理| 查看: 265

51单片机DS18B20温度报警器proteus仿真设计_可调上下限

(仿真+源码+原理图+报告+讲解视频)

原理图:Altium Designer

仿真版本:proteus 7.8

程序编译器:keil 4/keil 5

编程语言:C语言

设计编号:S0008

目录标题 51单片机DS18B20温度报警器proteus仿真设计_可调上下限主要功能讲解视频仿真图硬件设计:主控制模块显示模块电路数码管显示驱动电路 程序设计设计报告资料清单&&下载链接

主要功能

本设计系统是18b20温度报警系统数码管显示,可设置温度上限高温报警和下限低温报警,报警温度可精确到0.1度,并具有掉电保存功能,数据保存在单片机内部EEPOM中,进入设置界面后如果没有键按下系统会在15秒后自动退出设置界面,人性化的按键设置,按键还具有连加、减功能。

按“确定键” :有两种操作方式

1)按下就松开,高温设置、低温设置、正常显示温度,

三个界面按一下就切换一次。

2)按下不松开,进入自动切换,每500ms自动切换一次,

按“加键” :有两种操作方式

1)按下就松开,设定的温度值就加0.1度。

2)按下不松开,进入按键连加功能,每500ms自动加一

次,前三次自动加0.1度,之后就是自动加1度。

按“减键” :有两种操作方式

1)按下就松开,设定的温度值就减0.1度。

2)按下不松开,进入按键连减功能,每500ms自动减一次,前三次自动减0.1度,之后就是自动减1度。

第一次按下“确定键”进入高温报警设置:

按下“加、减”键可设置高温报警,最高设置成99.0度,最低可设置成比低温报警高0.1度。

第二次按下“确定键”进入低温报警设置:

按下“加、减”键可设置低温报警,最低设置成1度,最高可设置成比高温报警低0.1度。

第三次按下“确定键”进入正常温度显示。 讲解视频

包含仿真讲解和代码讲解

51单片机DS18B20温度报警器proteus仿真设计

仿真图

image-20220902232800201

硬件设计:

img

主控制模块

主控制最系统电路如图4所示。

img

图4 单片主控电路

显示模块电路

显示采用四位数码管显示,当位选打开时,送入相应的段码,则相应的数码管打开,关掉位选,打开另一个位选,送入相应的段码,则数码管打开,而每次打开关掉相应的位选时,时间间隔低于20ms,从人类视觉的角度上看,就仿佛是全部数码管同时显示的一样。显示电路如图5

img

图5 数码管显示

数码管显示驱动电路

三极管8550来驱动4位数码管,不仅简单,而且价格便宜。

img

程序设计

img

主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。这样可以在一秒之内测量一次被测温度,主程序的主要功能是负责温度的实时显示,读出并处理DS18B20的当前温度值,与设定的报警温度比较,其程序流程见图9所示。

通过调用读温度子程序把存入内存储中的整数部分与小数部分开分存放在不的的两个单元中,然后通过调用显示子程序显示出来。

image-20220902233650289

程序代码

/****************主函数***************/ void main() { beep = 0; //开机叫一声 delay_1ms(150); P0 = P1 = P2 = P3 = 0xff; temperature = read_temp(); //先读出温度的值 init_eeprom(); //开始初始化保存的数据 delay_1ms(650); temperature = read_temp(); //先读出温度的值 dis_smg[0] = smg_du[temperature % 10]; //取温度的小数显示 dis_smg[1] = smg_du[temperature / 10 % 10] & 0x7f; //取温度的个位显示 dis_smg[2] = smg_du[temperature / 100 % 10] ; //取温度的十位显示 time_init(); //初始化定时器 while(1) { key(); //按键程序 if(key_can < 10) { key_with(); //设置报警温度 } if(flag_300ms == 1) //300ms 处理一次温度程序 { flag_300ms = 0; temperature = read_temp(); //先读出温度的值 clock_h_l(); //报警函数 if(menu_1 == 0) { smg_i = 3; dis_smg[0] = smg_du[temperature % 10]; //取温度的小数显示 dis_smg[1] = smg_du[temperature / 10 % 10] & 0x7f; //取温度的个位显示 dis_smg[2] = smg_du[temperature / 100 % 10] ; //取温度的十位显示 } } } }

DS18B20初始化程序流程图

在DS18B20工作之前需要进行初始化,流程图如下:

image-20220902233709197

/*************读取温度的值 读出来的是小数***************/ uint read_temp() { uint value; uchar low; //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序 init_18b20(); //初始化18b20 write_18b20(0xcc); //跳过64位ROM write_18b20(0x44); //启动一次温度转换命令 delay_uint(50); //500us init_18b20(); //初始化18b20 write_18b20(0xcc); //跳过64位ROM write_18b20(0xbe); //发出读取暂存器命令 EA = 0; low = read_18b20(); //读温度低字节 value = read_18b20(); //读温度高字节 EA = 1; value


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3