信息与电气工程学院课程设计说明书(2014 /2015学年第 二 学期)课程名称 :《单片机原理及应用》课程设计 题 目 : 简易温度计设计 专业班级 : 学生姓名 : 学 号: 指导教师 : 设计周数 : 2周 设计成绩 : 年月日1、 实验目的设计并制作出一个以单片机为核心的简易温度计系统2、 主要任务1、 确定整体设计方案;2、 设计键盘输入电路;3、 设计显示电路;4、 合理分配地址,编写系统程序;5、 采用Proteus进行仿真,软硬件联机调试3、 技术要求(1)以MCS-51单片机为核心,18b20为敏感元件,设计出一简易温度计;(2)使用三位数码管显示温度,并能进行温度设置;4、以MCS-51单片机为核心设计简易温度计的简介 传统的温度检测以热敏电阻为温度敏感元件,需要后续信号处理电路,而且可靠性相对较差,测温准确度低,检测系统也有一定误差。
以MCS-51为核心,18b20为测温传感器,通过3位共阳极LED数码管传送数据,实现温度显示具有读数方便,测温范围广,测温精确,数字显示,可靠性高等特点5、程序流程图开始初始化获取当前温度否是显示当前温度获取设定温度比较当前温度与设定温度并处理设定当前温度是否设定当前温度6、 系统硬件电路原理图 6.1 时钟电路晶振电路由一个晶振与两个电容连接组成,与单片机的18、19管脚相连,另一端接地,电路图为: 电容大小没有固定值,一般5到30pf,晶振是给单片机提供工作信号脉冲的这个脉冲就是单片机的工作速度一般用内部振荡方式,这种方式比较稳定晶振频率为12MHZ,单片机工作速度就是每秒 12M单片机的工作频率是有范围的,不能太大,一般 24M就不上去了,不然不稳定6.2 复位电路复位电路由一个有极性电容、一个电阻与一个按键连接而成,一端连单片机的RST端,另一端接电源,电源另一端接单片机的EA其中电容是通过充放电来实现维持一段时间的高电平,电容充电时间与R C的值成正比,当按下按键时,由于电容充电,RST维持一段时间高电平以达到复位的目的一般情况下,选择大小为10到30uF的电容,而电阻一般选用1到10KΩ的。
电路图为: 6.3 DS18b20温度传感电路 此部分电路负责温度信号的采集、将温度信号转换成数字代码储存在温度控制寄存器中,向单片机发送温度数据等重要功能,主要由DS18b20芯片来完成,该电路的电路图为: 其中DQ为DS18b20的数据输入/输出端引脚,与单片机的P3.5口相连,单片机通过P3.5口向DS18b20发出各种命令,并读取其转换后的温度数据 由于DS18B20单线通信功能是分时完成的,所以有严格的时隙概念,读写时序很重要系统对DS18B20的各种操作必须按协议进行操作协议为:初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据6.4显示电路7、源程序代码#include #define uchar unsigned char#define uint unsigned intuchar wei;//18b20接口sbit DS=P3^5; //define interface//sbit dula=P2;//定义数码管位选sbit wei1=P1^5;//定义数码管位选sbit wei2=P1^6;//定义数码管位选sbit wei3=P1^7;//定义按键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}; 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{ 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++; 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里 } 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; 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{ dsreset(); delay(1); tmpwritebyte(0xcc); // address all drivers on bus tmpwritebyte(0x44); // initiates a single temperature conversion}//18b20底层函数,获取当前温度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 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); 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); wei1=1; wei2=1; wei3=1; }//主函数void main(){ //定义变量存储当前温度 int tp=0; //定义变量存储设定温度 int set=300; //定义变量存储显示模式,显示当前温度还是显示设定温度 int mode; do { //开始转化温度 tmpchange(); //获取当前温度 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) { 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