仿真版本:proteus 7.8
程序编译器:keil 4/keil 5
编程语言:C语言
设计编号:S0008
主要功能
本设计系统是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度。
- 第三次按下“确定键”进入正常温度显示。
讲解视频
包含仿真讲解和代码讲解
仿真图
硬件设计:
主控制模块
主控制最系统电路如图4所示。
图4 单片主控电路
显示模块电路
显示采用四位数码管显示,当位选打开时,送入相应的段码,则相应的数码管打开,关掉位选,打开另一个位选,送入相应的段码,则数码管打开,而每次打开关掉相应的位选时,时间间隔低于20ms,从人类视觉的角度上看,就仿佛是全部数码管同时显示的一样。显示电路如图5
图5 数码管显示
数码管显示驱动电路
三极管8550来驱动4位数码管,不仅简单,而且价格便宜。
程序设计
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。这样可以在一秒之内测量一次被测温度,主程序的主要功能是负责温度的实时显示,读出并处理DS18B20的当前温度值,与设定的报警温度比较,其程序流程见图9所示。
通过调用读温度子程序把存入内存储中的整数部分与小数部分开分存放在不的的两个单元中,然后通过调用显示子程序显示出来。
程序代码
/****************主函数***************/
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工作之前需要进行初始化,流程图如下:
/*************读取温度的值 读出来的是小数***************/
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 <<= 8; //把温度的高位左移8位
value |= low; //把读出的温度低位放到value的低八位中
value *= 0.625; //转换到温度值 小数
return value; //返回读出的温度 带小数
}
设计报告
摘要
随着时代的进步和发展,单片机技术已经普及到我们生活、工作、科研、各个领域,已经成为一种比较成熟的技术, 本文主要介绍了一个基于STC89C52单片机的温度报警系统,详细描述了利用温度传感器DS18B20开发测温系统的过程,重点对传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,对各部分的电路也一一进行了介绍,该系统可以方便的实现温度采集和显示,并可根据需要任意设定报警温度,它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度控制,也可以当作温度处理模块嵌入其它系统中,作为其他主系统的辅助扩展。DS18B20与STC89C52结合实现最简温度控制系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度的控制,有广泛的应用前景。
**关键词:**单片机;温度控制;STC89C52;DS18B20;
资料清单&&下载链接
资料下载链接