单片机课程设计-基于PIC单片机的室内温度检测.doc_第1页
单片机课程设计-基于PIC单片机的室内温度检测.doc_第2页
单片机课程设计-基于PIC单片机的室内温度检测.doc_第3页
单片机课程设计-基于PIC单片机的室内温度检测.doc_第4页
单片机课程设计-基于PIC单片机的室内温度检测.doc_第5页
免费预览已结束,剩余11页可下载查看

下载本文档

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

文档简介

引言在工业控制中,pic单片机应用广泛,它最大的特点是不搞单纯的功能堆积,而是从实际出发,重视产品的性能与价格比,靠发展多种型号来满足不同层次的应用要求。就实际而言,不同的应用对单片机功能和资源的需求也是不同的。比如,一个摩托车的点火器需要一个i/o较少、ram及程序存储空间不大、可靠性较高的小型单片机,若采用40脚且功能强大的单片机,投资大不说,使用起来也不方便。 室温检测在实际生活中有相当重要的意义。比如说:通过温度来控制供暖阀门的开关,控制空调的降温和升温等等。在本课程设计我们采用基于pic单片机型号16f628a,通过温度传感器18b20来检测温度,并通过max485芯片进行传输,在读取温度方面可以用过一个rs485和rs232电平转换器,传输到pc机上来查看。1.问题分析及解决方案1.1 题目要求本课程设计为一个实际应用系统的温度检测控制部分,在温度检测系统中,对功能的要求如下:1.需要通过温度传感器18b20把实时的温度采集出来。2.当pic单片机程序跑飞,或受到干扰是有软件自动复位的功能。3.给pic单片机一个地址,通过上位机来寻找此地址来查询温度,且可以修改地址。4.当pic单片机断电和复位后,修改后的地址保持不变。5.需要通过458总线进行传输。1.2 解决方案针对题目所提供的要求,逐步提出以下解决方案:1.温度传感器18b20的温度采集主要的采集原理中的问题就是时序的问题,它之中的读,写,复位时序弄清楚,再对相应的寄存器进行设置。18b20就可以开始采集温度。2.对第二个要求,在pic16f628a单片机刚好存在有看门狗功能,即当看门狗使能时,一段时间没有喂狗,单片机就会自动复位,刚好解决了第二个问题。3.在第三个和第四个要求中,可以利用pic16f628a中的eeprom来解决,eeprom的主要功能就是的那个单片机断电后里面存在的数据不会丢失,在改变此检测系统的地址时,只需要把地址写到单片机的eeprom中即可。4.要通过485传输,我们选择了集成芯片max485,它满足了485传输协议,利用差分传输,抗干扰能力强,通过对max485芯片的控制就达到了485传输的功能。2. 单片机选型及硬件配置2.1 单片机及扩展模块选择在此室内温度检测上,我们在单片机的选择上进行了综合的考虑,最终选择了工业级单片机pic16f628a。它的主要特点:性价比高,体积小。它内部的结构完全可以满足室内温度检测所需要的要求,例如它内部有看门狗功能,有128字节的eeprom,还有内部晶振,低功耗功能,16个io口,欠压复位功能。基于此,我们选择它作为此系统的核心控制单元。在扩展模块中,我们需要温度传感和485传输。现在市场上用于温度检测主要就是18b20,它的优点也是性价比高,单线传输数据,可以节约单片机的io口,所以我们也选择了18b20.max485是基于485协议的485传输接口芯片,采用半双工传输方式。性价比高,优质,也是我们采用它的主要原因。2.2 i/o地址分配在此系统中我们用到的io口不多,引脚主要有指示灯一个,温度传感器一个,控制max485一个和外接晶振两个引脚,串行发送和接受两个引脚。具体引脚图如图1所示,io地址分配如表1所示:图1 pic16f628a引脚图表1 io地址分配表io地址功能ra3指示灯rb418b20温度传输线rb1数据接收rb2数据发送rb5max485控制线2.3 系统硬件原理图利用protel绘制的系统控制电路原理图如图2所示。图2 电路原理图3.软件实现3.1 控制流程图 为了清楚地表明动作的顺序和条件,绘制室pic单片机检测温度主程序流程图如图3所示。 图3 主程序流程图 温度传感器18b20的工作流程图如图4所示。图4 温度传感器18b20工作流程图中断服务工作和eeprom读写流程图如图5所示。图5 中断服务程序及eeprom写流程图3.2 软件代码利用c语言在mplab编译器里编写的程序如下所示:/pic单片机配置位0xde45#include#include#define uchar unsigned char#define uint unsigned int#define dq rb4#define dq_high() trisb4=1;dq=1 /为输入#define dq_low() trisb4=0;dq=0 uint temper;uchar a1,a2,a3,a4,addr,flag=0,flag1=0;void delay(uint x);void delayus(uint x);void init();void reset(); void write_byte(uchar date);uchar read_byte();void get_tem();void delay1();char rsbuf50; /定义串口接收数据缓冲区char rspoint=0;char *mystrstr(char *s, char *t);/比较是否为okunsigned char eeprom_rd(unsigned char addr) ;void eeprom_wr(unsigned char addr, unsigned char value) ; void config18b20()/初始化传感器,有些精度是0.5就不可以啦 reset(); write_byte(0xcc); /skip rom write_byte(0x4e); /write scratchpad write_byte(0x55); /上限 th 85度write_byte(0x00); /下限 tlwrite_byte(0x7f); /设置精度为 () ,特别说明:pdf说明文档说默认精度是0.0625,实际上不手动设置使用的是精度0.5reset(); write_byte(0xcc); /skip rom write_byte(0x48); /保存设定值 reset(); write_byte(0xcc); /skip rom write_byte(0xb8); /回调设定值 void clc()/清空函数char i;for(i=0;i50;i+)rsbuf0=0; /清除串口接收数据缓冲区 rspoint=0; void send_byte1( ) txreg=eeprom_rd(0x00); while(!trmt); void send_byte(uchar data ) txreg= data; while(!trmt); void send_string(char * str) int k = 0; do send_byte(*(str + k); k+; while(k 0;i-)dq_low();nop();nop();nop(); nop();nop();nop();nop();nop();nop(); dq=date&0x01;/01010101 delayus(1);/45us trisb4=0;rb4=0;nop();nop();date=0;/00101010 右移 nop();nop();uchar read_byte()uchar i,date=0; for(i=8;i0;i-) dq_low(); date=date1;/保证最低位存在nop();nop(); nop();nop();/5ustrisb4=0;rb4=1; trisb4=1; if(dq)date=date|0x80;/1000 0000 右移高位自动填0 delayus(1);/40us trisb4=1rb4=1;nop();nop();/1us return (date);void get_tem()uchar tem1,tem2,num;float aaa;reset(); /复位write_byte(0xcc);/跳过rom 因为只有一个ds18b20 不用读write_byte(0x44);/温度转换 delay(800);/延时 _此处本来需要750ms reset();write_byte(0xcc);write_byte(0xbe); /读暂存器tem1=read_byte();tem2=read_byte();aaa=(tem2*256+tem1)*6.25;/相当于 25.25转换为2525temper=(int)aaa;a1=temper/1000%10;a2=temper%1000/100;a3=temper%100/10;a4=temper%10;void delayus(uint x )uint i; for(i=x;i0;i-)nop(); void delay(uint x)/x msuint a,b;for(a=x;a0;a-)for(b=110;b0;b-);void init()trisb1=1; trisb2=1;trisb3=0; trisb5=0; trisa3=0; rb5=0;/2max485ra3=1; /指示灯灭 option=0x12;/看门的狗, 你要听话哟 config18b20();/配置18b20txsta=0x24;/高速rcsta=0x90;spbrg=25;/波特率设置9600/发送不中断 接受中断gie=1;/总中断使能peie=1;/定义外设中断使能rcie=1;/接受中断使能void eeprom_wr(unsigned char addr, unsigned char value) if(wr=0) gie=0; eeadrl=(addr); eedata=(value); wren=1; /写使能wr=1; nop(); nop(); /两次空操作,等待eeprom写完成gie=1; wren=0; /写使能 unsigned char eeprom_rd(unsigned char addr) eeadrl=addr; rd=1; return eedata; void main()delay(200);init();ra3=0; /指示灯亮delay(200);ra3=1; /指示灯灭addr=eeprom_rd(0x00); while(1) if(flag1=1)/vip查询地址flag1=0;rcie=0;/关接受中断使能rb5=1;/2max485/发送send_byte1( );rb5=0;/2max485 准备接受 rcie=1;/开 接受中断使能 if(flag=1)/用户查询数据 rcie=0;/关接受中断使能 flag=0;ra3=0; /指示灯亮rb3=1;/ 蜂鸣器响 rb5=1;/2max485/发送 get_tem();/获得温度send_byte(a1+48); /通过串口发送 send_byte(a2+48); /通过串口发送 send_byte(a3+48); /通过串口发送send_byte(a4+48); /通过串口发送send_string(c. ); ra3=1;/指示灯灭rcie=1;/开 接受中断使能clrwdt();/喂狗void interrupt com() char *p;if(rcif)/判断接受标志 rsbufrspoint+=rcreg; if(rcreg=1)/vip查询地址 flag1=1;clc(); if(rsbuf0=addr&rspoint=4) if(rsbuf2=0x72)/改 地址eeprom_wr(0x00,rsbuf3); if(rsbuf2=0x73)/输出温度 flag=1; if(rspoint=4) clc(); 3.3 设计结果通过反复的调试,功能已经全部实现,具体调试结果如下:硬件结构如截图6所示.上位机显示如截图7所示。图6 硬件结构图图7 上位机显示温度值图3.5 结果分析我们在设计过程中对硬件的电路设计和焊接,以及软件的调试,最后运行的结果已经达到预想的期望。在此检测系统中证明了pic单片机在这一系统中的优势,充分的利用了它的资源,若采用40脚且功能强大的单片机比如stc89c52,投资大不说,体积也大,且造成众多资源的浪费。 在设计此系统中,由于我们考虑有软件自动复位的功能,所以我们没有加入手动复位功能,这可能对现场操作人员操作造成不变。4.结论与体会 在本次课程设计中,我主要做的工作是对pic单片机控制程序的编写。在编写过程中经历了枯燥乏味的调试。记得有一次在调eeprom的时候,在上电的情况下,进行读和写都能够成功,但是一断电数据就丢失,这令我十分懊恼,就继续去查资料,一遍一遍的看pic16f628a技术手册,甚至和怀疑eeprom

温馨提示

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

评论

0/150

提交评论