简易温度计设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
wei1=1;
wei2=1;
wei3=1;
}
//主函数
void main()
{
//定义变量存储当前温度
int tp=0;
//定义变量存储设定温度
int set=300;
//定义变量存储显示模式,显示当前温度还是显示设定温度
int mode;
do
{
//开始转化温度
tmpchange();
//获取当前温度
{
delay(50);
if(k2==0)set--;
}
//改变显示的内容(当前温度还是设定温度)
if(k3==0)
{
delay(50);
if(k3==0)mode++;
if(mode>2)mode=0;
}
//如果当前温度大于设定温度提示报警
if(tp>set)
{
led1=1;
led2=0;
}else if(tp<set)//如果当前温度小于设定温度提示加热
0x87,0xff,0xef};
//延时函数
void delay(uint count) //delay
{
uint i;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
//18b20复位初始化函数
void dsreset(void) //send reset and initialization command
信息与电气工程学院
课程设计说明书
(2014 /2015学年第二学期)
课程名称:《单片机原理及应用》课程设计
题目:简易温度计设计
专业班级:
学生姓名:
学号:
指导教师:
设计周数:2周
设计成绩:
年月日
1、实验目的
设计并制作出一个以单片机为核心的简易温度计系统
2、主要任务
1、确定整体设计方案;
2、设计键盘输入电路;
5、程序流程图
6、系统硬件电路原理图
6.1 时钟电路
晶振电路由一个晶振与两个电容连接组成,与单片机的18、19管脚相连,另一端接地,电路图为:
电容大小没有固定值,一般5到30pf,晶振是给单片机提供工作信号脉冲的。这个脉冲就是单片机的工作速度。一般用内部振荡方式,这种方式比较稳定。晶振频率为12MHZ,单片机工作速度就是每秒12M。单片机的工作频率是有范围的,不能太大,一般24M就不上去了,不然不稳定。
//定义按键
sbit k1=P1^0;
//定义按键
sbit k2=P1^1;
//定义按键
sbit k3=P1^2;
//定义led指示灯
sbit led1=P1^3;
//定义led指示灯
sbit led2=P1^4;
//共阳极数码管编码
unsigned char code tb[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uint tmp() //get the temperature
{
float tt;
uchar a,b;
dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread();
b=tmpread();
temp=b;
temp<<=8; //two byte compose a int variable
{
led1=0;
led2=1;
}else //如果当前温度等于设定温度不执行动作
{
led1=1;
led2=1;
}
} while(1);
}
8、心得体会
本次的简易温度计课程设计不仅使我们进一步巩固了书本上的知识,做到了学以致用,还学到了许多课本上学不到的知识。我还学到了做事必须严谨的的精神,尤其是我们学工科的同学,不严谨结果就要有很大的偏差,就得不到想要的结果。通过自己动手设计的电路和系统仿真软件protues和keil软件,使我们进一步了解了单片机的设计制作过程,其中软件部分,即编程部分,我们上网找了好多资料,虽然经过自己的修改,但还是有很多功能不能实现。由于protues并不是很熟练,在使用的过程中有很多原件的名称不知道,从而花费了大量的时间在网上查找,今后应该在这方面多多努力。总结经验的时候我们得出这样的结论,学习应该学以致用,有目的的去学习,如果学了不用等于没学。在课设中学会了又问题请教别人与一起讨论,因为以后很多东西的工程量都是很大的,单靠个人力量要实现是很困难的,而且时间有限,这就要求我们必须学会具有团队精神,相互学习,因为很多困扰你的问题在讨论中便会迎刃而解。在专业知识与研究方法方面为日后的毕业设计乃至毕业后的工作奠定良好的基础。
课程设计
评语
课程设计
成绩
指导教师
(签字)
年月日
注:此表必须在同一页面。
由于DS18B20单线通信功能是分时完成的,所以有严格的时隙概念,读写时序很重要。系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。
6.4显示电路
7、源程序代码
#include <reg52.h>
#define uchar unsigned char
电路图为:
6.3 DS18b20温度传感电路
此部分电路负责温度信号的采集、将温度信号转换成数字代码储存在温度控制寄存器中,向单片机发送温度数据等重要功能,主要由DS18b20芯片来完成,该电路的电路图为:
其中DQ为DS18b20的数据输入/输出端引脚,与单片机的P3.5口相连,单片机通过P3.5口向DS18b20发出各种命令,并读取其转换后的温度数据。
3、设计显示电路;
4、合理分Leabharlann Baidu地址,编写系统程序;
5、采用Proteus进行仿真,软硬件联机调试。
3、技术要求
(1)以MCS-51单片机为核心,18b20为敏感元件,设计出一简易温度计;
(2)使用三位数码管显示温度,并能进行温度设置;
4、以MCS-51单片机为核心设计简易温度计的简介
传统的温度检测以热敏电阻为温度敏感元件,需要后续信号处理电路,而且可靠性相对较差,测温准确度低,检测系统也有一定误差。以MCS-51为核心,18b20为测温传感器,通过3位共阳极LED数码管传送数据,实现温度显示。具有读数方便,测温范围广,测温精确,数字显示,可靠性高等特点。
{
dsreset();
delay(1);
tmpwritebyte(0xcc); // address all drivers on bus
tmpwritebyte(0x44); // initiates a single temperature conversion
}
//18b20底层函数,获取当前温度
wei1=1;
wei2=1;
wei3=1;
P2=0x7f&tb[temp%100/10];//显示十位
wei1=1;
wei2=0;
wei3=1;
delay(10);
wei1=1;
wei2=1;
wei3=1;
P2=tb[temp%10];//显示个位
wei1=1;
wei2=1;
wei3=0;
delay(10);
}
return(dat);
}
//18b20底层函数,写一个字节
void tmpwritebyte(uchar dat) //write a byte to ds18b20
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
6.2 复位电路
复位电路由一个有极性电容、一个电阻与一个按键连接而成,一端连单片机的RST端,另一端接电源,电源另一端接单片机的EA。
其中电容是通过充放电来实现维持一段时间的高电平,电容充电时间与R C的值成正比,当按下按键时,由于电容充电,RST维持一段时间高电平以达到复位的目的。
一般情况下,选择大小为10到30uF的电容,而电阻一般选用1到10KΩ的。
dat=DS;
i=8;while(i>0)i--;
return (dat);
}
//18b20底层函数,读一个字节
uchar tmpread(void) //read a byte date
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里
9、参考文献
1、张毅刚主编,单片机原理及应用,高等教育出版社
2、何立民主编,单片机中级教程,北京航空航天大学出版社
3、丁元杰主编,单片机原理与应用,机械工业出版社。
4、孙育才主编,MCS-51系列单片微型计算机及其应用,东南大学出版社
5、[51单片机学习网http://www.8951.com/TEST/XL1000/xl1000623.htm
{
uint i;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
//18b20底层函数,读一位
bit tmpreadbit(void) //read a bit
{
uint i;
bit dat;
DS=0;i++; //i++ for delay
DS=1;i++;i++;
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
return temp;
}
//数码管显示子程序
void display(uint temp)//显示程序
{
//dula=0;
P2=tb[temp/100];//显示百位
wei1=0;
wei2=1;
wei3=1;
delay(10);
tp=tmp();
//根据mode变量显示设定温度或者当前温度
if(mode==0)display(set);
else display(tp);
//设定温度增加
if(k1==0&&mode==0)
{
delay(50);
if(k1==0)set++;
}
//设定温度降低
if(k2==0&&mode==0)
if(testb) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //write 0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
//18b20底层函数,开始转换温度
void tmpchange(void) //DS18B20 begin change
#define uint unsigned int
uchar wei;
//18b20接口
sbit DS=P3^5; //define interface
//sbit dula=P2;
//定义数码管位选
sbit wei1=P1^5;
//定义数码管位选
sbit wei2=P1^6;
//定义数码管位选
sbit wei3=P1^7;
相关文档
最新文档