课 题: 基51单片机数字温度计设计
专 业: 电子信息工程
班 级: 班
学 号:
姓 名:
指导教师:
设计日期:
成 绩:
XX学XX学院电气学院
基51单片机数字温度计设计
设计目
1掌握单片机电路设计原理组装调试方法
2掌握LED数码显示电路设计方法
3掌握DS18B20温度传感器工作原理方法
二设计求
1次单片机课程设计求51系列单片机核心开发板台
2设计数字式温度计求DS18B20温度传感器测量温度
3单片机处理求4位体阴LED数码设计显示电路显示测量温度值
4外求设计中加入报警系统果设计系统监控某设备设备温度超低设定温度值时系统会产生报警
5求设计中加入限警报温度设置电路
三 设计具体实现
1数字温度计设计方案
做数字温度计单片机电路中信号采集电路传感器非常容易实现采温度传感器DS18B20传感器容易直接读取测温度值进行转换满足设计求采集通51系列单片机数进行相应处理LED显示电路数进行显示
2系统设计框图
温度计电路设计总体设计方框图图示控制器采单片机AT89C51温度传感器采DS18B204位体阴LED数码串口传送数实现温度显示外添加报警系统温度实施监控
3控器AT89C51芯片
单片机选择考虑80318051系列8031没部RAM系统需量存存储数适AT89C51 低价位单片机提供许高性价应场合灵活应种控制领域简单测温系统已足够单片机AT89C51具低电压供电体积等特点四端口需两口满足电路系统设计需该器件INTEL公司生产MCS5l系列单片机中基础产品采CMOS工艺制造技术具高性8位单片机属标准MCS—51CMOS产品
AT8951脚图示:
AT89C51芯片脚图
4时钟电路
80C51时钟两种方式产生部方式外部方式80C51中构成部震荡器高增益反放器引脚XTAL1XTAL2分该放器输入端输出端次采部震荡电路瓷片电容采22PF晶振12MHZ
晶体震荡电路图
5 复位电路
单片机系统复位电路里采电+钮复位电路形式中电阻R采10KΩ阻值 电容采10μF电容值
复位电路
6 温度传感电路
DALLAS 新单线数字温度传感器DS18B20种新型线器件体积更更适种场合适电压更宽更济DALLAS 半导体公司数字化温度传感器DS18B20世界第片支持线总线接口温度传感器温度测量范围55~+125 摄氏度编程9位~12 位转换精度测温分辨率达00625摄氏度分辨率设定参数户设定报警温度存储EEPROM 中掉电然保存测温度符号扩展16位数字量方式串行输出
DS18B20部结构四部分组成:64位光刻ROM温度传感器非挥发温度报警触发器THTL配置寄存器DS18B20脚排列种封装形式DQ 数输入输出引脚开漏单总线接口引脚着寄生电源器件提供电源GND信号VDD选择VDD引脚工作寄生电源时引脚必须接图示
DS18B20脚图
7 显示电路
数字温度显示采4位体阴LED数码足够显示0~100中位数显示位数部分
4位LED数码显示
8 温度报警电路
数字温度计设计温度数字显示功外加入报警系统测量温度超低设定温度值时系统会产生报警亮红灯报警
电路图示
蜂鸣器红灯报警系统电路图
源程序:
********************************************************************
* 程序名 基51单片机温度计
* 功 : 实时测量温度超限报警报警温度手动调整K1
* 进入限调节模式K1进入限调节模式进入限
* 调节模式正常模式K2进入查限温度模式显示1s左右动
* 退出K3进入查限温度模式显示1s左右动退出K4消
* 键音启动键音调节限温度模式K2实现加1功
* K1实现减1功K3设定限温度正负
*********************************************************************
#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar max0x00min0x00 max限报警温度min限报警温度
bit s0 s调整限温度时温度闪烁标志位s0显示200mss1显示1s左右
bit s10 s1标志位限查时显示
void display1(uint z)
#includeds18b20h
#includekeyscanh
#includedisplayh
******************************************************
* 函数
*****************************************************
void main()
{
beer1 关闭蜂鸣器
led1 关闭LED灯
timer1_init(0) 初始化定时器1(未启动定时器1)
get_temperature(1) 首次启动DS18B20获取温度(DS18B20电动EEPROM中限温度复制THTL寄存器)
while(1)
{
keyscan()
get_temperature(0)
display(temptemp_d*0625)
alarm()
}
}
**********************************************************************
* 程序名 ds18b20数码动态显示头文件
* 功 : 通定时器0延时数码动态显示
**********************************************************************
#ifndef __ds18b20_display_H__
#define __ds18b20_display_H__
#define uint unsigned int 变量类型宏定义uint表示符号整形(16位)
#define uchar unsigned char 变量类型宏定义uchar表示符号字符型(8位)
sbit wei1P2^4 位寻址变量定义wei1表示P24口
sbit wei2P2^5 wei2表示P25口
sbit wei3P2^6 wei3表示P26口
sbit wei4P2^7 wei4表示P27口
uchar num0 定义num全局符号字符型变量赋初值0’
uchar code temperature1[]{ 0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f} 定义显示码表0~9
uchar code temperature2[]{ 0xbf0x860xdb0xcf0xe60xed0xfd0x870xff0xef} 带数点0~9
uchar code temperature3[]{ 0x000x800x400x760x38}次显示’’’H’L’
******************************************************
延时子函数
*****************************************************
void display_delay(uint t) 延时1ms左右
{
uint ij
for(iti>0i)
for(j120j>0j)
}
******************************************************
* 定时器1初始化函数
*****************************************************
void timer1_init(bit t)
{
TMOD0x10
TH00x3c
TL00xb0
EA1
ET11
TR1t 局部变量t1启动定时器10关闭定时器1
}
******************************************************
* 定时器1中断函数
*****************************************************
void timer1() interrupt 3
{
TH00x3c 重新赋初值定时50ms
TL00xb0
num++ 进入次定时器中断num加1(50ms加1次)
if(num<5)
{s1if(w1){beer1led1}else{beer1led1}}
else 进入4次中断定时200ms时报警标志位w1’启动报警1’启动
实现间歇性报警功
{s0if(w1){beer0led0}else{beer1led1}}
if(num>20) 进入20次中断定时1s
{
num0 num0重新定开始定时1s
s10 定时1s时间时动关闭报警限显示功
v11 定时1s时间时动关闭报警限查功
}
}
******************************************************
* 调整报警限选择函数
*****************************************************
void selsct_1(uchar fuchar k) 消百位0显示正负温度显示选择
{
if(f0) 正温度百位0显示百位0显示
{
if(k1000) P0temperature3[0]
else P0temperature1[k100]
}
if(f1) 负温度十位0百位显示否百位显示’
{
if(k100100) P0temperature3[0]
else P0temperature3[2]
}
}
void selsct_2(bit fuchar k) 消十位0显示正负温度显示选择
{
if(f0) 正温度百位十位均0显示十位否显示十位
{
if((k1000)&&(k100100))
P0temperature3[0]
else P0temperature1[k10010]
}
if(f1) 负温度十位0十位显示否十位显示’
{
if(k100100) P0temperature3[2]
else P0temperature1[k10010]
}
}
******************************************************
* 函数显示
*****************************************************
void display(uchar tuchar t_d) 实测温度限温度显示
{
uchar i
for(i0i<4i++) 次左右选通数码显示实现动态显示
{
switch(i)
{
case 0 选通第数码
wei21 关第二数码
wei31 关第三数码
wei41 关第四数码
wei10 开第数码
if(a0){selsct_1(ft)} a0第数码显示测量温度百位’
if(a1)
{
P0temperature3[3] a1第数码显示H’
}
if(a2)
{
P0temperature3[4] a2第数码显示L’
}
break
case 1 选通第二数码
wei11
wei31
wei41
wei20
if(a0){selsct_2(ft)} a0第二数码显示测量温度十位’
if(a1) a1第二数码显示限报警温度百位’
{
if(s0) selsct_1(f_maxmax)s0显示第二数码否显示
else P0temperature3[0] 通s标志位变化实现调节限报警温度时数码闪烁
if(s11) selsct_1(f_maxmax)s11显示第二数码(s1标志位限查时显示)
}
if(a2) a2第二数码显示限报警温度百位’
{
if(s0) selsct_1(f_minmin)
else P0temperature3[0]
if(s11) selsct_1(f_minmin)
}
break
case 2 选通第三数码
wei11
wei21
wei41
wei30
if(a0){P0temperature2[t10]}a0第三数码显示测量温度位
if(a1) a1第三数码显示限报警温度十位’
{
if(s0) selsct_2(f_maxmax)s0显示第三数码否显示
else P0temperature3[0]
if(s11) selsct_2(f_maxmax)s11显示第三数码
}
if(a2) a2第三数码显示限报警温度十位’
{
if(s0) selsct_2(f_minmin)
else P0temperature3[0]
if(s11) selsct_2(f_minmin)
}
break
case 3 选通第四数码
wei11
wei21
wei31
wei40
if(a0){P0temperature1[t_d]}a0第四数码显示测量温度数位
if(a1) a1第四数码显示限报警温度位
{
if(s0) P0temperature1[max10]s0显示第四数码否显示
else P0temperature3[0]
if(s11) P0temperature1[max10]s11显示第四数码
}
if(a2) a2第四数码显示限报警温度位
{
if(s0) P0temperature1[min10]
else P0temperature3[0]
if(s11) P0temperature1[min10]
}
break
}
display_delay(10) 数码显示3ms左右
}
}
******************************************************
* 开机显示函数
*****************************************************
void display1(uint z) 开机动画显示
{
uchar ij
bit f0
for(i0i
for(j0j<4j++) 次左右显示’
{
switch(j)
{
case 0
wei21
wei31
wei41
wei10 break
P0temperature3[2]第数码显示
case 1
wei11
wei31
wei41
wei20break
P0temperature3[2]第二数码显示
case 2
wei11
wei21
wei41
wei30break
P0temperature3[2]第三数码显示
case 3
wei11
wei21
wei31
wei40break
P0temperature3[2]第四数码显示
}
display_delay(400) 数码显示200ms左右
}
}
}
#endif
********************************************************************
* 程序名 DS18B20头文件
* 说 明:全局变量:符号字符型变量temp(测温度整数部分)temp_d
* (测温度数部分)标志位f(测量温度标志位0’表示正温度1’表
* 示负温度)标志位f_max(限温度标志位0’表示正温度1’表
* 示负温度)标志位f_min(限温度标志位0’表示正温度1’表
* 示负温度)标志位w(报警标志位1’启动报警0’关闭报警)
*********************************************************************
#ifndef __ds18b20_h__ 定义头文件
#define __ds18b20_h__
#define uint unsigned int
#define uchar unsigned char
sbit DQ P2^3 DS18B20接口
sbit beerP1^0 beer表示P10
sbit ledP1^1 led表示P11
uchar temp0 测量温度整数部分
uchar temp_d0 测量温度数部分
bit f0 测量温度标志位0’表示正温度 1’表示负温度)
bit f_max0 限温度标志位0’表示正温度 1’表示负温度)
bit f_min0 限温度标志位0’表示正温度1’表示负温度)
bit w0 报警标志位1’启动报警0’关闭报警
******************************************************
* 延时子函数
*****************************************************
void ds18b20_delayus(uint t) 延时μs
{
while(t)
}
void ds18b20_delayms(uint t) 延时1ms左右
{
uint ij
for(iti>0i)
for(j120j>0j)
}
******************************************************
* DS18B20初始化函数
*****************************************************
void ds18b20_init()
{
uchar c0
DQ1
DQ0 控制器DS18B20发低电脉
ds18b20_delayus(80) 延时1580μs
DQ1 控制器拉高总线
while(DQ) 等DS18B20拉低总线60240μs间
ds18b20_delayus(150) 延时等拉电阻拉高总线
DQ1 拉高数线准备数传输
}
******************************************************
* DS18B20字节读函数
*****************************************************
uchar ds18b20_read()
{
uchar i
uchar d0
DQ 1 准备读
for(i8i>0i)
{
d >> 1 低位先发
DQ 0
_nop_()
_nop_()
DQ 1 必须写1否读出预期数
if(DQ) 12us处读取数
d | 0x80
ds18b20_delayus(10)
}
return d 返回读取值
}
******************************************************
* DS18B20字节写函数
*****************************************************
void ds18b20_write(uchar d)
{
uchar i
for(i8i>0i)
{
DQ0
DQd&0x01
ds18b20_delayus(5)
DQ1
d >> 1
}
}
******************************************************
* 获取温度函数
*****************************************************
void get_temperature(bit flag)
{
uchar a0b0c0d0
uint i
ds18b20_init()
ds18b20_write(0xcc) DS18B20发跳读ROM命令
ds18b20_write(0x44) 写启动DS18B20进行温度转换命令转换结果存入部RAM
if(flag1)
{
display1(1) 开机动画耗时
}
else
ds18b20_delayms(1)
ds18b20_init()
ds18b20_write(0xcc)
ds18b20_write(0xbe)
ads18b20_read() 读部RAM (LSB)
bds18b20_read() 读部RAM (MSB)
if(flag1) 局部位变量f1时读线报警温度
{
maxds18b20_read() 读部RAM (TH)
minds18b20_read() 读部RAM (Tl)
}
if((max&0x80)0x80) 读取限温度高位(符号位)1’表明负温度
{f_max1max(max0x80)} 限温度符号标志位置1’表示负温度限温度装换成符号数
if((min&0x80)0x80)读取限温度高位(符号位)1’表明负温度
{f_min1min(min0x80)} 限温度符号标志位置1’表示负温度限温度装换成符号数
ib
i>>4
if (i0)
{
f0 i0正温度设立正温度标记
temp((a>>4)|(b<<4)) 整数部分
a(a&0x0f)
temp_da 数部分
}
else
{
f1 i1负温度设立负温度标记
a~a+1
b~b
temp((a>>4)|(b<<4)) 整数部分
a(a&0x0f) 数部分
temp_da
}
}
******************************************************
* 存储极限温度函数
*****************************************************
void store_t()
{
if(f_max1) 限温度负限温度转换成符号数 maxmax+0x80
if(f_min1) 限温度负限温度转换成符号数
minmin+0x80
ds18b20_init()
ds18b20_write(0xcc)
ds18b20_write(0x4e) DS18B20发写字节暂存器23(THTL)命令
ds18b20_write(max) 暂存器TH(限温度暂存器)写温度
ds18b20_write(min) 暂存器TL(限温度暂存器)写温度
ds18b20_write(0xff) 配置寄存器写命令进行温度值分辨率设置
ds18b20_init()
ds18b20_write(0xcc)
ds18b20_write(0x48) DS18B20发RAM中23字节容写入EEPROM
} DS18B20电会动EEPROM中限温度拷贝THTL暂存器
******************************************************
* 温度超限报警函数
*****************************************************
void alarm()
{ 限值正值
if(f_max0)
{
if(f_min0) 限值正值
{
if(f0) 测量值正值
{
if(temp
{w1TR11} 测量值值值时报警
if((temp
{w0} 测量值值值时报警
}
if(f1){w1TR11} 测量值负值时报警
}
if(f_min1) 限值负值
{
if(f0) 测量值正值
{
if(temp>max)测量值值时报警
{w1TR11}
if(temp
}
if(f1) 测量值负值
{
if(temp>min)测量值值时报警
{w1TR11}
if(temp
}
}
}
if(f_max1) 限值负值
{
if(f_min1) 限值负值
{
if(f1) 测量值负值
{
if((temp
{w1TR11} 测量值值值时报警
if((temp
{w0} 测量值值值时报警
}
if(f0){w1TR11} 测量值正值时报警
}
}
}
#endif
********************************************************************
* 程序名 基51单片机温度计
* 功 : 实时测量温度超限报警报警温度手动调整K1
* 进入限调节模式K1进入限调节模式进入限
* 调节模式正常模式K2进入查限温度模式显示1s左右动
* 退出K3进入查限温度模式显示1s左右动退出K4消
* 键音启动键音调节限温度模式K2实现加1功
* K1实现减1功K3设定限温度正负
*********************************************************************
#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar max0x00min0x00 max限报警温度min限报警温度
bit s0 s调整限温度时温度闪烁标志位s0显示200mss1显示1s左右
bit s10 s1标志位限查时显示
void display1(uint z) 声明display1()函数(displayh头文件中函数ds18b20h应先声明)
#includeds18b20h
#includekeyscanh
#includedisplayh
******************************************************
* 函数
*****************************************************
void main()
{
beer1 关闭蜂鸣器
led1 关闭LED灯
timer1_init(0) 初始化定时器1(未启动定时器1)
get_temperature(1) 首次启动DS18B20获取温度(DS18B20电动EEPROM中限温度复制THTL寄存器)
while(1)
{
keyscan()
get_temperature(0)
display(temptemp_d*0625)
alarm()
}
}
**********************************************************************
* 程序名 ds18b20keyscan函数
* 功 : 通键盘设定设定限报警温度
**********************************************************************
#ifndef __keyscan_H__ 定义头文件
#define __keyscan_H__
sbit key1P2^2
sbit key2P2^1
sbit key3P2^0
sbit key4P3^3
uchar i0 定义全局变量i功模式选择0’正常模式1’限调节模式2’限调节模式
uchar a0 定义全局变量a模式数码显示选择
bit k40 K4键双功选择位k40时K4键选择消键音功k41时K4键选择正负温度设定功
bit v0 K2K3键双功选择位v0时选择限查功v1时选择限温度加减功
bit v10 v11时定时1250ms时间动关闭报警限查功
bit v20 消键音功调整位0’时开键音1’时关键音
******************************************************
* 读键盘延时子函数
*****************************************************
void keyscan_delay(uint z) 延时1ms左右
{
uint ij
for(izi>0i)
for(j120j>0j)
}
******************************************************
* 温度调节函数
*****************************************************
int temp_change(int countbit f) 限温度调整
{
if(key20) 判断K2否
{
if(v20)beer0 v20开键音否消键音
keyscan_delay(10) 延时10ms
if(key20) 次判断K2否(实现键时消抖)
{
beer1 K2关键音
if(f0) 温度正
{
count++ K2温度调1
if(a1){if(count>125) count125}温度值125时调
if(a2){if(count>125) count125}
}
if(f0) 温度负
{
count++ K2温度调1
if(a1){if(count>55) count55}温度值55时调
if(a2){if(count>55) count55}
}
}
while(key20) K2松开键时消抖
keyscan_delay(10)
}
if(key30)
{
if(v20)beer0
keyscan_delay(10)
if(key30) K3键时消抖
{
beer1
count K3温度正时调1负时调1
if(a1){if(count<0) count0}温度值达0时调
if(a2){if(count<0) count0}
}
while(key30)
keyscan_delay(10) K3松开键时消抖
}
return count
}
******************************************************
* 读键盘函数
*****************************************************
void keyscan()
{
if(key10)
{
if(v20)beer0
keyscan_delay(10)
if(key10) K1键时消抖
{
beer1
TR11 开定时器1通s标志位变化实现限温度调整时温度显示时闪烁功
k41 温度调节功模式选择K4调整限温度正负功
v1 温度调节功模式选择K2K3温度加减功
i++ K1i加1i0’进入正常模式i1’进入调限模式i2’进入调限模式
if(i>2) K1三次退出调节模式
{
i0 进入正常模式
TR10 关定时器1
k40 正常模式选择K4消键音功
v0 正常模式选择K2K3查限报警温度功
store_t() 存储调整限报警温度
}
switch(i) 显示选择
{
case 0a0break a0选择显示测温度
case 1a1break a1选择显示限温度
case 2a2break a2选择显示限温度
defaultbreak
}
}
while(key10) K1松键时消抖
keyscan_delay(10)
}
if(a1&&v1) a1选择显示限温度v1时选择限温度加功
{led0maxtemp_change(maxf_max)}显示限温度
else if(a2&&v1) a2选择显示限温度v1时选择限温度减功
{led1mintemp_change(minf_min)}
else
if(k41) k41时K4键选择正负温度设定功
{
if(key40)
{
if(v20)beer0
keyscan_delay(5)
if(key40)
{
beer1
if(a1)
{if(max>55) f_max0else f_max~f_max}温度55度时设定正温度
if(a2)
{if(min>55) f_max0else f_min~f_min}温度55度时设定正温度
}
while(key40)
keyscan_delay(10)
}
}
if(v0) v0时选择限查功
{
if(key20)
{
if(v20)beer0
keyscan_delay(10)
if(key20)
{
beer1
a1 选择限显示
TR11 开定时器1开始定时分钟左右
s11 限显示闪烁显示分钟左右动退出
}
while(key20)
keyscan_delay(10)
}
if(key30)
{
if(v20)beer0
keyscan_delay(10)
if(key30)
{
beer1
a2 选择限显示
TR11 开定时器1开始定时1s
s11 限显示闪烁显示1s动退出
}
while(key30)
keyscan_delay(10)
}
if(v11) v11时定时1s时间动关闭报警限查功
{a0v10TR10} a0显示实测温度v1清零关定时器1
if(k40) k40时K4键选择消键音功
{
if(key40)
{
if(v20)beer0
keyscan_delay(10)
if(key40)
{
beer1
v2~v2 0’时开键音1’时关键音 }
while(key40)
keyscan_delay(10)
}
}
}
}
#endif
四 总结
单片机学应相关总结体会课设程中仅巩固时学单片机知识通断查阅相关资料学新知识说通次单片机实践学学单片机关知识现实生活中方面应更深层次认识学步入社会参加工作帮助
次课程设计进程中遇问题例开始确定课设题目编写程序时思路太清晰设计求中需新器件DS18B20智测温相关知识模糊甚说知通查找相关资料书寻求辅导老师帮助动思考理清思路终程序修改正确仿真时前数模电课设仿真验时课设进行利没受什阻碍
通次单片机课程设计明白理指导实践理需实践予证明盲目相信书事通思考推敲否会取进步时学生活中应该周围学相互学交流验遇会东西时切忌焦躁首先独立思考定想法查找相关资料书刊者找学讨果实解释找辅导老师遇问题解决问题程中断加强动脑力进指导动手力样思路清晰条理畅时候进行软件编写硬件操作工作起事半功倍效果
五 附录
系统硬件原理电路图
数字温度计设计器材表
单片机STC89C52
1
DS18B20
1
晶振12M
1
三极8850
1
电容30PF
2
电解电容10UF25V
1
蜂鸣器
1
LED ø5红
1
电阻10k3k2k1k510330
5
4位体阴数码
1
ACDC(5V1A)电源
1
IC插座40
1
9X15cm万板
1
六 参考文献
1李群芳编单片微型计算机接口技术[M]电子工业出版社
2楼然苗编51系列单片机设计实例[M]北京航空航天学出版社
3黄勤编计算机硬件技术基础实验教程[M]重庆学出版社
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档