微型计算机控制技术课程设计报告多点温度检测系统设计_第1页
微型计算机控制技术课程设计报告多点温度检测系统设计_第2页
微型计算机控制技术课程设计报告多点温度检测系统设计_第3页
微型计算机控制技术课程设计报告多点温度检测系统设计_第4页
微型计算机控制技术课程设计报告多点温度检测系统设计_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、微型计算机控制技术课程设计报告课题名称 多点温度检测系统设计 专 业 自动化(交通信息与工程) 班 级 自动化一班 学生姓名 指导教师 李曙光 2015年 7月 3 日目录一、设计题目2二、任务要求2三、总体设计方案2 3.1控制模块.2 3.2温度显示模块.3 3.3温度采集模块.4 3.4键盘控制模块.6 3.5报警模块.6四、各硬件模块电路设计4 4.1单片机最小系统硬件仿真图.84.2温度显示模块硬件仿真图.84.3温度采集模块硬件仿真图.94.4按键控制模块硬件仿真图.94.5报警模块硬件仿真图.94.6硬件实现.10五、各个软件模块设计和流程图4 5.1软件设计总流程图125.2&

2、#160;ds18b20初始化.135.3读ds18b20测得的温度.145.4数码管显示数据处理15.5.5按键处理16六设计总结及参考资料46.1设计总结.166.2参考文献.17七附件4附件一:完整源程序.18附件二:完整的器件清单及硬件电路图.28一、设计题目多点温度检测系统设计二、任务要求(1) 使用ds18b20为温度传感器;(2)检测点数为2点以上,检测温度范围为-40到40度之间,测量相应时间小于1s;(3)完成温度数据的实时显示;(4)设计一报警电路,当采集的温度越限(超过键盘设置的上下限)时产 生声光报警。三、总体设计方案 控制模块键盘控制模块温度显示模块报警模块温度采集模

3、块3.1控制模块1) 主要功能采用atmel公司的at89s51单片机,它作为系统的核心部分,和温度采集单元之间,它直接对温度传感器进行指令操作,获取温度传感器的温度数据后进行各种处理,然后通过显示模块显示出温度值,工作过程中,接收来自键盘控制模块的信号,并对其作出相应的响应,同时,它不断检测ds18b20测取的温度值是否超过了设定的上限温度或下限温度,如果超过则对报警模块发出指令令其报警。2) 器件选择 at89s51是一种低功耗、高性能cmos 8位微控制器,具有8k 在系统可编程flash 存储器。使用atmel 公司高密度非易失性存储器技术制造。片上flash允许程序存储器在系统可编程

4、,亦适于常规编程器。在单芯片上,拥有灵巧的8 位cpu 和在系统可编程flash,使得at89s51在众多嵌入式控制应用系统中得到广泛应用。at89s51具有完整的输入输出、控制端口、以及内部程序存储空间。与我们通常意义上的微机原理类似,可以通过外接a/d,d/a转换电路及运放芯片实现对传感器传送信息的采集,且能够提供以点阵或lcd液晶及外接按键实现人机交互,能对内部众多i/o端口连接步进电机对外围设备进行精确操控,具有强大的工控能力。图一 at89s51管脚图3.2温度显示模块1) 主要功能实时显示两个ds18b20温度传感器采集到的温度,在按键的设置下显示设定的报警温度上、下限值。2) 器

5、件选择该模块采用两个四位的八段译码管和一块八位锁存器74hc573组成,采用扫描显示的方式显示八位数据。数码管分为共阳型和共阴型,共阳极型就是发光管的正极都连在一起 ,作为一条引线,负极分开。八段数码发光管就是8个发光二极管组成的,在空间排列成为8字型带个小数点,只要将电压加在阳极和阴极之间相应的笔画就会发光。8个发光二极管的阳极并接在一起,8个阴极分开,因此称为共阳八段数码管。相反则为共阴八段数码管。图二 数码管显示字段 (a)八段数码管结构 (b)共阴型数码管 (c)共阳型数码管 图三 八段led数码显示管原理和结构3.3温度采集模块1) 主要功能实时测量两个侧两点的温度2) 器件选择该模

6、块采用dallas公司的ds18b20温度传感器,该温度传感器将温度检测与数字数据输出全集成于一个芯片上,它的一个工作周期分为温度检测和数据处理两个部分,它采用单数据总线进行数据传输,由于本设计采用两点测量温度,两个温度传感器的输出数据脚共连在单片机的数据引脚上,因此在进行温度检测和数据处理中需要首先利用ds18b20的rom操作指令对温度传感器的romid进行识别,以针对特定的温度传感器进行操作。(对ds18b20的操作指令见附录文件)ds18b20的主要特征:1) 全数字温度转换及输出2) 先进的单总线技术3) 最高12位的分辨率时的最大工作周期为750毫秒4) 可选择寄生工作方式5) 检

7、测温度范围为-55°c+125°c6) 内置eeprom,限温度报警7) 64位光刻rom,内置产品序列号,方便多机挂接8) 多种封装形式,适应不同硬件图四 ds18b20的不同封装形式3.4键盘控制模块1) 主要功能通过按键进行工作模式的切换,并且用按键进行上限温度和下限温度的更改2) 器件选择该模块采用几个按钮开关和相应的几个10k电阻组成,当按下按钮是,得到一个低电平信号送入单片机,松开开关后变回高电平信号,单片机识别此信号并对此做出响应。图五 按键3.5报警模块1) 功能实现当两个ds18b0中任意一个测取的温度超过设定的温度上、下限时,蜂鸣器响,以此报警。2) 器

8、件选择该模块采用蜂鸣器来实现,蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为有源蜂鸣器和无源蜂鸣器两种类型。有源蜂鸣器与无源蜂鸣器的区别(注意:这里的“源”不是指电源,而是指震荡源):有源蜂鸣器内部带震荡源,所以只要一通电就会叫;而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。必须用2k-5k的方波去驱动它。有源蜂鸣器往往比无源的贵,就是因为里面多个震荡电路。无源蜂鸣器的优点是:1. 便宜2. 声音频率可控,可以做出“多来米发索拉西”的效果3. 在一些特例中,可以

9、和led复用一个控制口有源蜂鸣器的优点是:程序控制方便。综上所述,本实验采用无缘蜂鸣器。图六:有源和无源蜂鸣器的外观 a)有源 b)无源四、各硬件模块电路设计 图七 单片机端口分配图总的硬件仿真图附于附录中。下面是各模块硬件仿真连线图:4.1单片机最小系统硬件仿真图4.2温度显示模块硬件仿真图4.3温度采集模块硬件仿真图4.4按键控制模块硬件仿真图4.5报警模块硬件仿真图4.6硬件实现初始显示界面(显示两点测量温度)设定温度上限显示界面(显示温度上限值30°和第二点测量温度)设定温度下限显示界面(显示温度下限值0°和第二点测量温度)五、各个软件模块设计和流程图5.1软件设计

10、总流程图首先,读取第一个ds18b20测得的温度存入数组temp_buff中,然后读取第二个ds18b20测得的温度存入数组temp1_buff中,随后进行按键扫描和按键处理,对接下来要显示的模式进行选择,然后对数码要管显示的数据进行处理,根据选择的不同的模式读取相应的缓存,经过数码管扫描读出相应的温度,最后,依次判断两个点的测量温度是否超过设定的温度报警值,若超过,蜂鸣器报警,若未超过,继续从开始处循环。5.2 ds18b20初始化ds18b20的通信方式属于单总线通信方式,需按一定的通信协议。单总线的所有处理过程均从初始化开始。其中初始化序列包括一个由主机发出的复位脉冲和其后由从机发出的存

11、在脉冲,存在脉冲让主机知道ds18b20在总线上并且已准备就绪。5.3读ds18b20测得的温度首先对ds18b20进行初始化,然后通过跳过rom匹配指令、温度转换指令,将ds18b20采集到的数据转化为温度,再通过初始化、跳过rom匹配指令、读温度暂存器指令,将得到的温度读取出来,最后对得到的温度数据进行处理,令tn=温度整数部分,td=温度小数部分,以便后续进行使用。5.4数码管显示数据处理1)前四位数码管显示数据处理由于数码管数量有限,所以用前四位显示第一个ds18b20测得的温度和设定的报警温度(包括上限温度和下限温度),通过k1键进行三种模式的切换。若无按键按下或者按下三次k1键(m

12、ode=0),将第一个ds18b20测出的温度存入temp 前四位,后续对其进行译码,经过译码后,前四位数码管显示第一个ds18b20测得的温度:若按下一次k1键(mode=1),将设定的报警温度上限存入temp 前四位,后续对其进行译码,经过译码后,前四位数码管显示设定的报警温度上限:若按下两次k1键(mode=2),将设定的报警温度下限存入temp 前四位,后续对其进行译码,经过译码后,前四位数码管显示设定的报警温度下限。2)后四位数码管显示数据处理将第二个ds18b20测得的温度存入temp ,后续对其进行译码,译码后实时显示第二点的测量温度5.5按键处理 检测键盘扫描是否有返回值,判断

13、是否有按键按下。若无按键按下,则进行数码管显示数据处理;若有按键按下且为k1键,mode自加1 ,并判断mode是否大于2,若大于2,mode清零后输出,若不大于2,直接输出mode;若有按键按下且为k2键,判断mode 是否为1,若为1,上限报警温度自加1(不超过125°),若不为1,进行下限报警温度自加1(不超过125°);若有按键按下且为k3键,判断mode 是否为1,若为1,上限报警温度自减1(不低于-50°),若不为1,进行下限报警温度自减1(不超过-50°)。六设计总结及参考资料6.1设计总结本次课程设计我们将两个ds18b20和at89c5

14、1单片机相结合实现了多点温度测量。对单片机的独立控制外设而言难度不大,但由于不会用同一个i/o口控制多个ds18b20,因此用两个独立的i/o口分别对其控制,故编写的程序有些繁琐。本次设计的不足是,第二个ds18b20测得温度的小数部分一直无法显示,经过多次调试仍然没有结果,但基本功能都已实现。虽然课程设计结束了,但我们仍会努力将这一问题解决。经过本次设计实验,充分认识到自己实际操作方面的不足以及程序编写不够熟练等问题,因此需要多加练习。同时也更加明确了我们在接下来的学习中的侧重方向,作为工科专业应该更加注重理论与实际的结合,并且持之以恒地坚持,只有这样不断提高自己的专业素养。6.2参考文献1

15、李群芳. 单片机微型计算机与接口技术第三版.电子工业出版社,2010.12 谢自美电子线路设计实验测试(第二版)m武汉:华中科技大学出版社,20003 丘玉娟 用串行rom和at89c51实现电子密码锁j电脑知识与技术2005,11(3):34364李金平电子系统设计电子工业出版社2009七附件附件一:完整源程序#include<reg51.h>#include<intrins.h>/-定义使用的io-/sbit lsa=p22;sbit lsb=p23;sbit lsc=p24;/译码器sbit dq=p37;/定义第一个18b20单总线端口sbit dq1=p36;

16、/定义第二个18b20单总线端口sbit key1=p10;/模式切换(上限,下限,当前)sbit key2=p11;/温度上/下限+sbit key3=p12;/温度上/下限-sbit beep=p15;/定义蜂鸣器接口/-定义全局变量-/unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80,0x40,0x00;/数码管表,其中display10"."display11"-"display12"不显示"unsigned char

17、 mode=0,key; /mode是模式切换变量,key=key_back(按键返回值)unsigned char n=0; /数码管位数unsigned int temp_buff9,temp1_buff9,*p,*q,id_buff8,id1_buff8; /利用指针和数组进行数据传输unsigned char symbol,symbol1; /正负标志位unsigned char sflag,tltemp; /负温度标志和临时暂存变量unsigned char tl; /存储暂存器的温度低位unsigned char th; /存储暂存器的温度高位unsigned char tn,tn

18、1; /tn:第一个ds18b20测得温度的整数部分,tn1:第二个ds18b20测得温度的整数部分unsigned char td,td1; /td:第一个ds18b20测得温度的小数部分,td1:第二个ds18b20测得温度的小数部分char temp8; /温度数据显示的缓存char h_temp=30; /上限报警温度char l_temp=0; /下限报警温度bit flag;/-函数声明-/ char cabs(char val); /取绝对值函数void delay(unsigned char); /短延时函数void delay1ms(unsigned int); /长延时函数

19、bit init18b20(void); /第一个ds18b20初始化函数bit init118b20(void); /第二个ds18b20初始化函数void write0nechar(unsigned char); /向第一个ds18b20写一个字节void write0nechar1(unsigned char); /向第二个ds18b20写一个字节unsigned char read0nechar(void); /从第一个ds18b20读一个字节unsigned char read0nechar1(void); /从第二个ds18b20读一个字节void read_18b20(unsig

20、ned char); /读第一个ds18b20void read1_18b20(unsigned char); /读第二个ds18b20readtemperature(void); /读第一个ds18b20的温度readtemperature1(void); /读第二个ds18b20的温度void beep(void); /蜂鸣器函数void check_alarm(void); /检测第一个ds18b20是否超过限值并报警void check1_alarm(void); /检测第二个ds18b20是否超过限值并报警unsigned char key_scan(); /按键扫描void key

21、_action(key); /按键处理void display_transaction(); /第一个ds18b20显示数据处理void display_transaction1(); /第二个ds18b20显示数据处理/-短延时-/void delay(unsigned char us)while(us-);/-长延时-/void delay1ms(unsigned int x)unsigned char i,j;for(i=0;i<x;i+)for(j=1;j<120;j+);/-蜂鸣器-/void beep(void)beep=0;delay1ms(1);beep=beep;

22、delay1ms(1);/-按键扫描-/unsigned char key_scan(void)unsigned char key_back;key_back=0;if(!key1|!key2|!key3)delay1ms(10);if(!key1|!key2|!key3)delay1ms(10);if(!key1)key_back=1;else if(!key2)key_back=2; /检测哪个按键按下else if(!key3)key_back=3;while(!key1|!key2|!key3);/等待按键释放return(key_back);/-按键处理-/void key_acti

23、on(key_back)if(key_back=1)mode+;if(mode>2)mode=0;else if(key_back=2)if(mode=1)h_temp+;if(h_temp>125)h_temp=125;elsel_temp+;if(l_temp>125)l_temp=125;else if(key_back=3)if(mode=1)h_temp-;if(h_temp<-50)h_temp=-50;else l_temp-;if(l_temp<-50)l_temp=-50;/-前四位数码管显示数据处理-/void display_transact

24、ion()if(!mode)temp0=td;/显示小数点temp1=tn%10;temp2=tn/10;if(symbol=0) /如果温度为正值temp3=12;/不显符号else/if(symbol=1)温度为负值temp3=11;/显示负号else if(mode=1)temp0=12;temp1=cabs(h_temp)%10;/此处调用求绝对值处理,是显示负温度的关键,下同temp2=cabs(h_temp)/10;if(h_temp>0|h_temp=0)temp3=12;elsetemp3=11;else if(mode=2)temp0=12;temp1=cabs(l_t

25、emp)%10;temp2=cabs(l_temp)/10;if(l_temp>0|l_temp=0)temp3=12;else/如果温度小于0temp3=11;/-后四位数码管显示数据处理-/void display_transaction1()temp7=td1;/显示小数点temp6=tn1%10;/显示个位temp5=tn1/10; /显示十位if(symbol1=0)/如果温度为正值temp4=12;/不显符号else/if(symbol=1)温度为负值temp4=11;/显示负号/-检测第一个ds18b20是否超过限值并报警-/void check_alarm(void)if

26、(tn>h_temp)|(tn<l_temp)|(tn=h_temp)|(tn=l_temp)beep();/-检测第一个ds18b20是否超过限值并报警-/void check1_alarm(void)if(tn1>h_temp)|(tn1<l_temp)|(tn1=h_temp)|(tn1=l_temp)beep();/以下是对18b20的操作/-第一个ds18b20初始化-/bit init18b20(void)dq=1;_nop_();dq=0;delay(80);_nop_();dq=1;delay(14);_nop_();_nop_();flag=dq;de

27、lay(20);_nop_();_nop_();return(flag); /-第二个ds18b20初始化-/bit init118b20(void)dq1=1;_nop_();dq1=0;delay(80);_nop_();dq1=1;delay(14);_nop_();_nop_();flag=dq1;delay(20);_nop_();_nop_();return(flag);/-向第一个ds18b20写一个字节-/void write0nechar(unsigned char m)unsigned char i;for(i=0;i<8;i+)dq=0;_nop_();dq=m&a

28、mp;0x01;delay(3);_nop_();_nop_();dq=1;m>>=1;/-向第二个ds18b20写一个字节-/void write0nechar1(unsigned char m)unsigned char i;for(i=0;i<8;i+)dq1=0;_nop_();dq1=m&0x01;delay(3);_nop_();_nop_();dq1=1;m>>=1;/-从第一个ds18b20读一个字节-/unsigned char read0nechar(void)unsigned char i=0,dat=0;for(i=0;i<8

29、;i+) /拉低总线dq=0;dat>>=1;dq=1; /释放总线if(dq=1)dat|=0x80;delay(2);_nop_();return(dat);/-从第二个ds18b20读一个字节-/unsigned char read0nechar1(void)unsigned char i=0,dat=0;for(i=0;i<8;i+)dq1=0;/拉低总线dat>>=1;dq1=1;/释放总线if(dq1=1)dat|=0x80;delay(2);/延时等待数据稳定_nop_();return(dat);/-读第一个ds18b20-/void read_1

30、8b20(unsigned char j)unsigned char i;for(i=0;i<j;i+)*p=read0nechar();p+;/-读第二个ds18b20-/void read1_18b20(unsigned char j)unsigned char i;for(i=0;i<j;i+)*q=read0nechar1();q+;/-从第一个18b20读温度-/readtemperature(void)p=id_buff;init18b20();write0nechar(0xcc);/跳过rom操作命令write0nechar(0x44);/温度转换命令init18b2

31、0();write0nechar(0xcc);write0nechar(0xbe);/读暂存器指令p=temp_buff;read_18b20(9);if(temp_buff1&0xf8)!=0x00)/判断高五位,得到温度正负标志,前五位为0 正值,1 负值symbol=1;flag=1;temp_buff0=temp_buff0;/取反temp_buff1=temp_buff1;/取反tltemp=temp_buff0+1;/低位加1temp_buff0=tltemp;if(tltemp>225)temp_buff1+;/如果低8位大于225,向高8位进1tn=temp_bu

32、ff1*16+temp_buff0/16;/温度的整数部分td=(temp_buff0%16)*10/16;/温度的小数部分,一位小数tn=temp_buff1*16+temp_buff0/16;td=(temp_buff0%16)*10/16;/-从第二个18b20读温度-/readtemperature1(void)q=id1_buff;init118b20();write0nechar1(0xcc); /跳过rom操作命令write0nechar1(0x44);/温度转换指令init118b20();write0nechar1(0xcc);write0nechar1(0xbe); /读暂

33、存器指令q=temp1_buff;read1_18b20(9);if(temp1_buff1&0xf8)!=0x00)/判断高五位,得到温度正负标志,前五位为1 负值,0 正值symbol1=1;flag=1;temp1_buff0=temp1_buff0;/取反temp1_buff1=temp1_buff1;/取反tltemp=temp1_buff0+1;/低位加1temp1_buff0=tltemp;if(tltemp>225)temp1_buff1+;/如果低8位大于225,向高8位进1tn1=temp1_buff1*16+temp1_buff0/16;/温度的整数部分td

34、1=(temp1_buff0%16)*10/16;/温度的小数部分,一位小数tn1=temp1_buff1*16+temp1_buff0/16;td1=(temp1_buff0%16)*10/16;/以上对18b20操作完毕/-数码管扫描-/void display()for(n=0;n<7;n+) /八位数码管动态扫描if(n=1|n=6)/此处if判断是否显示个位小数点 p0=tabletempn|0x80;else p0=tabletempn;/显示对应的数字switch(n)case 0: lsc=0; lsb=1; lsa=1;break;case 1: lsc=0; lsb=1; lsa=0;break;case 2: lsc=0; lsb=0; lsa=1;break;case 3: lsc=0; lsb=0; lsa=0;break;case 4: lsc=1; lsb=0; lsa=0;break;case 5: lsc=1; lsb=0; lsa=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论