立即注册 登录
返回首页

uid:176323的个人空间

日志

单片机课程设计:基于基于PIC16F877A单片机的八路温度巡回检测系统设计

已有 482 次阅读2017-3-21 12:58 | 单片机, 检测, 课程

单片机课程设计:基于基于PIC16F877A单片机的八路温度巡回检测系统设计

 

 

                       

  课 程 设 计

八路温度巡回检测系统设计

      院 (系):  XXXXXX学院  

          业:  XXXXXX      

          号:   XXXXXXX    

      学生姓名:     XXX        

      指导老师:     XXX          

 

本文介绍了一种基于PIC16F877A单片机,利用DS18B20对多路温度采集,并进行温度的控制与检测,并通过12864液晶显示出来。系统中通过控制按钮实现了实时各路的报警温度,并且实现多路与任一单路温度显示切换,从而既可以进行多路的检测又可以进行任一单路的监控,而且还有数字跟图形两种显示方式更为直观。在温度超过设定温度时温度跟时间通过24C02存储起来,以便查看,同时可以通过固定电话远程报警,还能将温度上传至PC机,进行后续处理。

关键词:温度检测;单片机;串行通讯;DS18B20;

 

1  系统设计   7

2  主芯片:PIC16F877A单片机简介   9

2.1  PIC单片机的优越之处: 9

2.2  PIC16F877A引脚图及主要性能   10

2.3  最小系统 11

2.3.1复位功能    11

2.3.2 系统时钟   12

2.4  设计心得总结    12

3  LCD12864液晶原理介绍及接口实现 12

3.1  液晶显示模块概述   12

3.2  液晶引脚说明    13

3.3 接口时序  14

3.4 具体指令介绍 15

3.5 显示坐标关系 19

3.5.1、图形显示坐标  19

3.5.2  汉字显示坐标  20

3.6 与单片机的接口实现  21

3.7    设计心得总结  22

4  DS18B20原理介绍及接口实现   22

4.1 DS18B20简介  22

4.2    DS18B20结构及其工作原理 23

4.3    DS18B20的接口实现    29

4.3.1 硬件设计   29

4.3.2 软件设计   30

4.4    设计心得总结  31

4.4.1 焊接问题: 31

4.4.2 软件设计: 31

4.4.3 不足:  31

5  存储芯片AT24C02简单介绍及接口实现 32

5.1    AT24C02功能描述管脚定义 32

5.2    管脚定义及接口实现   32

5.3    设计心得   34

6  实时时钟DS1302简单介绍及接口实现  34

6.1 DS1302简介   34

6.2 DS1302结构及工作原理   34

6.3    DS1302的接口实现 35

7  温度上限报警功能  37

7.1 设计原理  37

7.2 设计心得体会 37

8  PC串口通讯及VB上位机简单介绍   38

8.1 PC串口通信    38

8.2 上位机介绍   39

9  总结   43

附录   44

        部分原理图: 44

       参考文献:    45

基于PIC单片机的多路温度监控巡回系统

系统设计

在工业生产和日常生活中,经常要对温度进行测量与控制,并且有时是对多个点进行温度测量,比如冷库温度监控、环境温度监测、农业温室监控、粮库温度监控等。在这种情况下,多点温度检测系统应运而生。多点温度检测系统通常能够对多个工作点的温度进行检测,显示当前温度,并能够对温度进行存储和报警,还能将温度上传至PC机,进行后续处理。传统的测温元件有热电偶和热电阻,需很多硬件支持并且电路复杂。本文将设计一款由新型的数字温度传感器DS18B20配合单片机,具有温度检测、显示、存储、自动统计分析及跟电脑通讯连接还利用固定电话远程报警等功能的多点温度监控系统。

            1.1 多路温度监控系统模拟应用

温度监控主系统构架框图如图 1.2 所示:

                  1.2 多路温度监控系统构架框图

1.3 手工焊接实物图

主要技术参数

A温度检测范围 :  -55℃~+125

B测量精度 :      0.0625

C 显示方式:       LCD12864显示

D 报警方式:       固话报警

主芯片:PIC16F877A单片机简介

2.1  PIC单片机的优越之处:

 1 哈佛总线结构:

MCS-51单片机的总线结构是冯-诺依曼型,计算机 在同一个存储空间取指令和数据,两者不能同时进行;PIC单片机的总线结构是哈佛结构,指令和数据空间是完全分开的,一个用于指令,一个用于数据,由于 可以对程序和数据同时进行访问,所以提高了数据吞吐率。正因为在 PIC单片机中采用了哈佛双总线结构,所以与常见的微控制器不同的一点是:程序和数据总线可以采用不同的宽度。数据总线都是8位的,但指令总线位数分别位 121416位。
     2
流水线结构:

MCS-51单片机的取指和执行采用单指令流水线结构,即取一条指令,执行完后再取下一条指令;PIC的取指和执行采用双指令流水线结构,当一条指令被执行时,允许下一条指令同时被取出,这样就实现了单周期指令。
     3
寄存器组:

PIC单片机的所有寄存器,包括I/O,定时器和程序计数器等都采用RAM结构形式,而且都只需要一个指令周期就可以完成访问和操作;MCS-51单片机需要两个或两个以上的周期才能改变寄存器的内容。

   4)运行速度高:

由于采用了哈佛总线结构,以及指令的读取和执行才用了流水作业方式,使得运行速度大大提高。

   5)功耗低:

PIC单片机的功率消耗极低,是目前世界上最低的单片机品种之一。在4MHz时钟下工作时耗电不超过2mA,在睡眠模式下耗电可以低到1uA以下。

   6)驱动能力强:

I/O端口驱动负载的能力较强,每个I/O引脚吸入和输出电流的最大值可分别达到25mA20mA,能够直接驱动发光二极管LED、光电耦合器或者轻微继电器等。

   7)外接电路简洁

PIC单片机片内集成了上电复位电路、I/O引脚上拉电路、看门狗定时器等,可以最大程度减少或免用外接器件,以便实现“纯单片机”应用。这样,不仅方便于开发,而且还可节省用户的电路空间和制作成本。

   8)程序保密性强

目前,尚无办法对其直接进行解密拷贝,可以最大限度的保护用户的程序版权。

2.2  PIC16F877A引脚图及主要性能

PIC16F877A的详细引脚如图2.21所示。

      2.2-1 PIC16F877A引脚图            2.2 -2 PIC16F877A实物图

主要性能参数如下所示:

具有高性能RISC   CPU

仅有35条单字指令

100000次擦写周期

除程序分支指令为两个周期外,其余均为单周期指令

运行速度: DC20MHZ始终输入

               DC200ns 指令周期

8K * 14 FLASH程序存储器

368 * 8 个数据存储器(RAM)字节

256 * 8 EEPRM 数据存储器字节

提供14个中断源

功耗低

5V 4MHZ 时钟运行时电流小于 2mA

3V 32KHZ 时钟运行时电流小于20Ua

支持在线串行编程(ICSP

运行电压范围广,2.0V5.5V

输入及输出电流可达到25mA

Timer0:带有预分频器的8位定时器/计数器

Timer1:带有预分频器的16位定时器/计数器,在使用外部晶振震荡时钟时,在睡眠期间仍能工作

Timer2:带有8位周期寄存器,预分频器和后分频器的8位定时器/计数器。

2个捕捉器,比较器,PWM模块

其中:

     捕捉器是16位,最大分辨率是12.5ns

     比较器是16位,最大分辨率是200ns

     PWM最大分辨率是10

10位多通道模数转换器

2.3  最小系统

 2.3.1复位功能

PIC16F877A的复位功能设计得比较完善,实现复位或引起复位的条件和原因可以归纳成4类:人工复位、上电复位、看门狗复位、欠压复位。

这里简单介绍一下人工复位

人工复位:无论是单片机在正常运行程序,还是处在睡眠状态或出现死机状态,只要在人工复位端MCLR加入低点平信号,就令其复位。

本次设计的电路图如图2.31所示。

           2.31 PIC最小系统电路图         2.32 最小系统实物图

 2.3.2 系统时钟

数字电路的工作离不开时钟信号,每一步细微动作都是在一个共同的时间基准信号协调下完成的。作为时基发生器的时钟震荡电路,为整个单片机芯片的工作提供系统时钟信号,也为单片机与其他外接芯片之间的通讯提供可靠的同步时钟信号。

PIC16F877A的时钟电路是由片内的一个反相器和一个反馈电阻,与外接的1个石英晶体和2个电容,共同构成的一个自激多谐振荡器。电路如图2.31 所示。

2.4  设计心得总结

     PIC16F877A的最小系统跟51相似,较为简单。芯片自身增加了很多功能,如:自带8AD转换、增加SPI总线,引脚复位功能多等。芯片自身功能的增加给设计带来了很多灵活性,同时也是学习的难点。

LCD12864液晶原理介绍及接口实现

3.1  液晶显示模块概述

12864A-1汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAMGDRAM)。

主要技术参数和显示特性:

电源:VDD 3.3V~+5V 内置升压电路,无需负压 ;

显示内容:128列× 64

显示颜色:黄绿

显示角度:600钟直视

LCD类型:STN

MCU接口:8位或4位并行/3位串行

配置LED背光

多种软件功能:光标显示、画面移位、自定义字符、睡眠模式等

3.2  液晶引脚说明

引脚号 引脚名称   方向   功能说明      1   VSS -   模块的电源地      2   VDD -   模块的电源正端     3   V0  -   LCD驱动电压输入端       4   RS CS H/L 并行的指令/数据选择信号;串行的片选信号     5   R/W SID    H/L 并行的读写选择信号;串行的数据口       6   E CLK H/L 并行的使能信号;串行的同步时钟       7   DB0 H/L 数据0     8   DB1 H/L 数据1     9   DB2 H/L 数据2     10  DB3    H/L 数据3     11  DB4 H/L 数据4     12  DB5 H/L 数据5     13  DB6 H/L 数据6     14  DB7 H/L 数据7       15  PSB H/L /串行接口选择:H-并行;L-串行    16  NC     空脚       17  /RET   H/L 复位 低电平有效     18  NC     空脚       19  LED_A  -   背光源正极(LED+5V     20  LED_K  -   背光源负极(LED-OV      

逻辑工作电压 VDD 4.55.5V

电源地 GND 0V

工作温度 Ta 060℃ 常温  / -2075℃(宽温)

3.3 接口时序

模块有并行和串行两种连接方法,本文采用并行接法(时序如下):

8位并行连接时序图

MPU写资料到模块

程序实现如下:

/********************************************************************

*     称:send_i  

*     能:写一个字节命令到LCD

* 入口参数:unsigned char x 字符

*******************************************************************/

void send_i unsigned char x

 

   chk_busy  ;                     //检测LCD是否工作繁忙

   rs   0;                        //设置该字节数据为控制命令

   rw   0;                        //设置此次操作为写

   PORTD   x;                     //送数据口PORTD

   e   1;                         //使能

   nop  ;

   nop  ;

   nop  ;

   e   0;                         //禁止

 

MPU从模块读出资料

程序实现如下:

/*************************************************

                 读数据

**************************************************/

unsigned char u8_Lcd12864ReadByte_f  void 

 

    unsigned char byReturnValue ;

    chk_busy   ;                      //检测LCD是否工作繁忙

   TRISD 0XFF;                   //设置PD口为输入状态

    PORTD   0xff ;                  //PD初始化为高电平

    rs 1;                           // 读置高

    rw 1;                          //  写置高

    e 0;                            // 使能置低

    e 1;                           //  使能置高

    byReturnValue   PORTD ;         //  读数据

    e 0;                            // 关使能

   TRISD 0X00;                    // 恢复PD口为输出

    return byReturnValue ;             // 返回读到的数据

 

3.4 具体指令介绍

1、清除显示

CODE    RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

L  L   L   L   L   L   L   L   L   H      功能:清除显示屏幕,把DDRAM位址计数器调整为“00H

2、位址归位

CODE    RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

L  L   L   L   L   L   L   L   H   X      功能:把DDRAM位址计数器调整为“00H”,游标回原点,该功能不影响显示DDRAM

3、位址归位

CODE    RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

L  L   L   L   L   L   L   H   I/D S      功能:把DDRAM位址计数器调整为“00H”,游标回原点,该功能不影响显示DDRAM功能:执行该命令后,所设置的行将显示在屏幕的第一行。显示起始行是由Z地址计数器控制的,该命令自动将A0-A5位地址送入Z地址计数器,起始地址可以是0-63范围内任意一行。Z地址计数器具有循环计数功能,用于显示行扫描同步,当扫描完一行后自动加一。

4、显示状态 开/

CODE    RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

L  L   L   L   L   L   H   D   C     B      功能: D 1;整体显示ON     C 1;游标ON     B 1;游标位置ON

5、游标或显示移位控制

CODE    RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

L  L   L   L   L   H   S/C R/L X     X      功能:设定游标的移动与显示的移位控制位:这个指令并不改变DDRAM的内容

6、功能设定

CODE    RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

L  L   L   L   H   DL  X   0 RE   X     X      功能:DL 1(必须设为1   RE 1;扩充指令集动作    RE 0:基本指令集动作

7、设定CGRAM位址

CODE    RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

L  L   L   H   AC5 AC4 AC3 AC2 AC1 AC0       功能:设定CGRAM位址到位址计数器(AC

8、设定DDRAM位址

CODE    RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

L  L   H   AC6 AC5 AC4 AC3 AC2 AC1 AC0         功能:设定DDRAM位址到位址计数器(AC

9、读取忙碌状态(BF)和位址

CODE    RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

L  H   BF  AC6 AC5 AC4 AC3 AC2 AC1 AC0       功能:读取忙碌状态(BF)可以确认内部动作是否完成,同时可以读出位址计数器(AC)的值

10、写资料到RAM

CODE    RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

H  L   D7  D6  D5  D4  D3  D2  D1  D0      功能:写入资料到内部的RAMDDRAM/CGRAM/TRAM/GDRAM

11、读出RAM的值

CODE    RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

H  H   D7  D6  D5  D4  D3  D2  D1  D0      功能:从内部RAM读取资料(DDRAM/CGRAM/TRAM/GDRAM

12   待命模式(12H

CODE    RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

L  L   L   L   L   L   L   L   L     H      功能:进入待命模式,执行其他命令都可终止待命模式

13、卷动位址或IRAM位址选择(13H

CODE    RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

L  L   L   L   L   L   L   L   H     SR       功能:SR 1;允许输入卷动位址      SR 0;允许输入IRAM位址

14、反白选择(14H

CODE    RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

L  L   L   L   L   L   L   H   R1    R0       功能:选择4行中的任一行作反白显示,并可决定反白的与否

15、睡眠模式(015H

CODE    RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

L  L   L   L   L   L   H   SL  X     X    功能:SL 1;脱离睡眠模式   SL 0;进入睡眠模式

16、扩充功能设定(016H

CODE    RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

L  L   L   L   H   H   X   1 RE   G   L      功能:RE 1;扩充指令集动作    RE 0;基本指令集动作  G 1;绘图显示ON  G 0;绘图显示OFF

17、设定IRAM位址或卷动位址(017H

CODE    RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

L  L   L   H   AC5 AC4 AC3 AC2 AC1 AC0         功能:SR 1AC5~AC0为垂直卷动位址   SR 0AC3~AC0ICONRAM位址

18、设定绘图RAM位址(018H

CODE    RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

L  L   H   AC6 AC5 AC4 AC3 AC2 AC1 AC0         功能:设定GDRAM位址到位址计数器(AC

备注、

1、当模块在接受指令前,微处理顺必须先确认模块内部处于非忙碌状态,即读取BF标志时BF需为0,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延迟一段较长的时间,即是等待前一个指令确实执行完成,指令执行的时间请参考指令表中的个别指令说明。

2、“RE”为基本指令集与扩充指令集的选择控制位元,当变更“RE”位元后,往后的指令集将维持在最后的状态,除非再次变更“RE”位元,否则使用相同指令集时,不需每次重设“RE”位元。

本次设计液晶初始化如下:

void lcd_init 

 

   rst   0;                     //复位LCD

   delay 1 ;                    //保证复位所需要的时间(1ms

   rst   1;                    //恢复LCD正常工作

// nop  ;

// psb   1;                 //设置LCD8位并口通信

   send_i 0x30 ;               //基本指令操作

   send_i 0x01 ;               //清除显示

   send_i 0x06 ;              //指定在写入或读取时,光标的移动方向

   send_i 0x0c ;               //开显示,关光标,不闪烁

 

3.5 显示坐标关系

3.5.1、图形显示坐标

水平方向X―以字节单位

垂直方向Y―以位为单位

/*******************************************

函数名称:Draw_PM

    :在整个液晶屏幕上画图

    :

返回值  :

********************************************/

void Draw_PM const uchar *ptr

 

    uchar i,j,k;

   send_i 0x34 ;        //打开扩展指令集

   i   0x80;            

   for j   0;j   32;j++

    

        send_i i++ ;

        send_i 0x80 ;

       for k   0;k   16;k++

        

           send_d *ptr++ ;

        

    

   i   0x80;

   for j   0;j   32;j++

    

       send_i i++ ;

        send_i 0x88 ;     

       for k   0;k   16;k++

        

              send_d *ptr++ ;

            

     

    send_i 0x36 ;        //打开绘图显示

   send_i 0x30 ;        //回到基本指令集

 

3.5.2  汉字显示坐标

                           X坐标      Line1  80H 81H 82H 83H 84H 85H 86H 87H    Line2  90H    91H 92H 93H 94H 95H 96H 97H    Line3  88H 89H 8AH 8BH 8CH 8DH 8EH 8FH    Line4  98H 99H 9AH 9BH    9CH 9DH 9EH 9FH    /****************************************************************

*     称: writelcd()

*     能: 在LCD上显示字符串

* 入口参数:const unsigned char *pt 字符串的首地址

**************************************************************/

void writelcd const unsigned char *pt

 

    while *pt           //检测是否达到了字符串最后

        send_d *pt++ ;  //发送数据给lcd

 

// 应用如下

const uchar table1[ ]  "  PIC 单片机" ;

const uchar table2[ ]  "    多路温度" ;  

const uchar table3[ ]  "  巡回检测系统" ; 

const uchar table4[ ]  "20091201" ;

   send_i 0x80 ;              // 定位在第一行

   writelcd table1 ;          // 写:基PIC 单片机

   send_i 0x90 ;              // 定位在第二行

   writelcd table2 ;          // 写:多路温度

   send_i 0x88 ;              // 定位在第三行

   writelcd table3 ;          // 写:巡回检测系统

   send_i 0x98 ;              // 定位在第四行

   writelcd table4 ;          // 写:20091201

3.6 与单片机的接口实现

12864液晶的电路连线图如图3.6 -1所示,实物位置如图3.6 -2所示

            3.6 -1 12864液晶电路连接图

            3.6 -2   12864液晶模块实物图

设计心得总结

LCD128641602相比需要较大的电流驱动,如果出现图片模糊不清晰或者灰暗,除了检查背光灯外应考虑电源问题。最好采用大于5V的电源,经7805稳压管稳压驱动,以保证电流。基本驱动跟1602相似难度不大。中文及图像显示是12864最大的特点也是难点,主要是指令较多,还有就是图像驱动需要了解液晶内部原理。整屏画图可以使用PCtoLCD2002把图片转换成16进制数,局部画曲线、直线、圆等需要一些算法,比较复杂

DS18B20原理介绍及接口实现DS18B20DALLAS公司的

4.1DS18B20内部结构图

DS18B20的内部结构图如图4.1所示。由此我们可以看出DS18B20主要由4部分组成:64ROM、温度传感器、非挥发的温度报警触发器THTL、配置寄存器。DS18B20的管脚排列如图所示,DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端在寄生电源接线方式时接地

4.3 DS18B20复位时序图

程序实现如下:

/********************************************************************

*     称:reset  

*     能:18b20复位

********************************************************************/

#define DQ RB7

#define DQ_HIGH   TRISB7 1

#define DQ_LOW   TRISB7 0;DQ 0

void reset 

 

   uchar st 1;

   DQ_HIGH  ;                    // 先拉至高电平

   NOP  ;NOP  ;

   while st

    

       DQ_LOW  ;                 // 低电平

       delayus 70,30 ;           // 延时503us

DQ_HIGH  ;                //释放总线等电阻拉高总线

delayus 4,4 ;             //延时60us

       if DQ  1                  //没有接收到应答信号,继续复位

          st 1;

       else                      //接收到应答信号

          st 0;

       delayus 50,10 ;            //延时430us

    

 

DS18B20的读时序:

对于DS18B20的读时序分为读0时序和读1时序两个过程。

对于DS18B20的读时隙是从主机把单总线拉低之后,在15uS之内释放单总线,以让DS18B20把数据传输到单总线上。DS18B20在完成一个读时序过程,至少需要60us才能完成。

4.4 DS18B20读时序图

/********************************************************************

*     称:read_byte  

*     能:18b20读字节

* 出口参数:读出18B20的内容

********************************************************************/

uch read_byte 

 

   uch i;

   uch value   0;                              //读出温度

   static bit j;

   for  i   8;i   0;i--

    

       value     1;

       DQ_LOW  ;

       NOP  ;NOP  ;NOP  ;NOP  ;NOP  ;NOP  ;   //6us

       DQ_HIGH  ;                              //拉至高电平

       NOP  ;NOP  ;NOP  ;NOP  ;NOP  ;         //4us

       j   DQ;

       if  j  value |  0x80;

       delay 2, 7 ;                            //63us

    

   return  value ;

 

DS18B20的写时序:

对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。

对于DS18B200时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。

4.5 DS18B20写时序图

/********************************************************************

*     称:write_byte  

*     能:写18b20写字节

* 入口参数:uch val 待写的数据

*******************************************************************/

void write_byte uch val

 

   uch i;

   uch temp;

   for  i   8;i   0;i--

    

       temp   val & 0x01;              //最低位移出

       DQ_LOW  ;

       NOP  ;NOP  ;NOP  ;NOP  ;NOP  ;  //从高拉至低电平,产生写时间隙

       if  temp    1  DQ_HIGH  ;       //如果写1,拉高电平

       delay 2, 7 ;                    //延时63us

       DQ_HIGH  ;

       NOP  ;NOP  ;

       val   val    1;                 //右移一位

    

 

DS18B20内部带有共9个字节的高速暂存器RAM和电可擦除EEPROM,起结构如表2所示。

2 DS18B20高速暂存器结构

寄存器内容    字节地址      温度值低位(LSB 0      温度值高位(MSB 1      高温限值(TH    2      低温限值(TL    3      配置寄存器 4      保留   5      保留   6      保留   7       CRC校验值 8     

DS18B20所包含的操作指令如表3所示。

3 DS18B20操作指令

ROM操作指令      指令   约定代码   功能       ROM  33H DS18B20温度传感器ROM中的编码(即64位地址)       匹配ROM   55H 发出命令后接着发出64ROM编码,访问总线上与该编码对应的芯片     搜索ROM   F0H 用于确定挂接在同一总线上DS18B20的个数    跳过ROM   CCH 忽略64ROM地址,直接向DS18B20发温度变换命令      告警搜索   ECH 执行后只有问多超过上限或下限的芯片才响应      RAM操作指令      指令   约定代码   功能       温度转换   44H 启动DS18B20温度转换。12位转换时长典型值750ms      读暂存器   BEH 读内部RAM9字节的数据。      写暂存器   4EH RAM23字节写上、下限温度数据,紧跟命令之后传送2字节数据      复制暂存器 48H RAM中第23字节的内容复制到内部EEPROM       重调EEPROM    B8H EEPROM中内容恢复到RAM中第34字节   

温度数据在高速暂存器RAM的第0和第1个字节中的存储格式如下表4所示。

4 DS18B20温度数据存储格式

7   6    5    4    3    2    1    0       23  22  21  20  2-1 2-2 2-3 2-4     15   14   13   12   11   10   9    8       S   S   S   S   S   26  25  24     

DS18B20在出厂是默认配置为12位,其中最高位为符号位,即温度值共11位,单片机在读取数据时,一次会读2字节共16位,读完后将低11位的二进制数转化为十进制数后再乘以0.0625便为所测的实际温度值。另外,还需要判断温度的正负。前5个数字为符号位,这5位同时变化,我们只需要判断11位就可以了。前5位为1时,读取的温度为负值,且测到的数值需要取反加1再乘以0.0625才可得到实际温度值。前5位为0时,读取的温度为正值,且温度为正值时,只要将测得的数值乘以0.0625即可得到实际温度值。考虑到实际使用的需要,在这里我们只使用一个DS18B20,故每次操作前只需复位后发出Skip ROM指令(即跳过ROM指令)再读出温度的正值、并精确到小数点后一位,即可满足设计需求。

/*****************************************************************

*     称:get_temp  

*     能:启动温度转换

*****************************************************************/

void get_tem 

 

   uchar tem1,tem2,num;

   float aaa;

   reset  ;                 //复位

   write_byte 0xCC ;        //跳过ROM

   write_byte 0x44 ;        //温度转换

   for num 100;num 0;num--  //确保温度转换完成所需要的时间

   reset  ;                 //再次复位,等待从机应答

   write_byte 0xCC ;        //忽略ROM匹配

   write_byte 0xBE ;        //发送读温度命令

   tem1 read_byte  ;        //读出温度低8

   tem2 read_byte  ;        //读出温度高8

   shu  tem2  4|tem1  4 ;   //温度整数部分

   aaa  tem2*256+tem1 *6.25; //温度小数部分

   temper  int aaa;          //强制转换成整型

   a1 temper/1000;           //取温度十位

   a2 temper%1000/100;       //取个位

   a3 temper%100/10;         //小数点后个位

   a4 temper%10;             //小数点后十位

 

DS18B20的接口实现

4.3.1 硬件设计

DS18B20在本次设计中接线图如图4.6 所示,实验板硬件图如图4.7所示

这次实验只焊了两个温度传感器而已,其他两个用法一样,留作外接口,可以方便外用。

      4.6 DS18B20原理图               4.7 DSB18B20硬件连接实物图

4.3.2 软件设计

根据DS18B20约定的通讯协议,每次使用DS18B20之前都必须经过三个步骤,即先复位DS18B20,接着发出ROM操作指令,然后才可以发出RAM操作指令以进行温度转换等命令。本系统将实现读出DS18B20的温度并实时显示到LCD12864上,分辨率为0.0625℃。由于DS18B20对时序要求很严格,所以在程序设计时,时序要多加注意一点,不过数字不是死的,只要控制合理控制也不是扫描大问题。 DS18B20首次初始化时开启温度转换,之后每1s进行一次DS18B20的温度读取和转换,具体实现效果图如图4.8 流程图如图4.9所示

                  4.8温度采集效果实物图

4.9 DS18B20读取温度流程图

设计心得总结

4.4.1 焊接问题:

焊接DS18B20时,速度要快,如果高温的电烙铁持续接触传感器很容易烧掉DS18B20,因为电烙铁一般温度为350 ~ 450度,而传感器承受温度为125度。我曾经因此烧坏了两个传感器,得此痛训!

4.4.2 软件设计:

DS18B20时序要求较为严格,这里的严格不是说一定要按手册的时间一摸一样而是说相对其他芯片来说严格了一点。如果读取不到温度应该检查一下时序时间设计问题。再有一个难点就是温度转换问题。温度能显示到小数点后4位,如果要将温度全部读出,应该将整数部分乘以10000再加上小数部分,化浮点数为整数,当然也可以直接采用浮点数相乘。开机会出现85C那是18B20复位值

4.4.3 不足:

此次设计没有处理温度负数情况,如果要处理应该判断最高位符号位,然后取反加一。

18B20可单总线挂多个,这里IO口有剩再加上为了程序设计简单采用了并口方式。

存储芯片AT24C02简单介绍及接口实现AT24C02功能描述AT24C02是一个2K位串行CMOS E2PROM, 内部含有2568位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。AT24C02有一个16字节页写缓冲器。该器件通过IC总线接口进行操作,有一个专门的写保护功能。AT24C02支持IC,总线数据传送协议IC,总线协议规定任何将数据传送到总线的器件作为发送器。任何从总线接收数据的器件为接收器。数据传送是由产生串行时钟和所有起始停止信号的主器件控制的。主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据(发送或接收)的模式,通过器件地址输入端A0A1A2可以实现将最多8AT24C02器件连接到总线上。   SCL 串行时钟

  AT24C02串行时钟输入管脚用于产生器件所有数据发送或接收的时钟,这是一个输入管脚。

  SDA 串行数据/地址

  AT24C02 双向串行数据/地址管脚用于器件所有数据的发送或接收,SDA 是一个开漏输出管脚,可与其它开漏输出或集电极开路输出进行线或(wire-OR)。

  A0A1A2 器件地址输入端

  这些输入脚用于多个器件级联时设置器件地址,当这些脚悬空时默认值为0。当使用AT24C02 时最大可级联8个器件。如果只有一个AT24C02被总线寻址,这三个地址输入脚(A0A1A2 )可悬空或连接到Vss,如果只有一个AT24C02被总线寻址这三个地址输入脚(A0A1A2 )必须连接到Vss

  WP 写保护

如果WP管脚连接到Vcc,所有的内容都被写保护只能读。当WP管脚连接到Vss 或悬空允许器件进行正常的读/写操作

设计心得

    A0A1A2 器件地址输入端实时时钟DS1302简单介绍及接口实现DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。DS1302 的控制字如图2所示。控制字节的最高有效位 位7 必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;5至位1指示操作单元的地址;最低有效位 位0 如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。 数据输入输出 I/O  ,在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7 DS1302一共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见

6.3DS1302日历、时间寄存器

此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0HFDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM31个字节,命令控制字为FEH 写 、FFH 读 。

6.4 DS1302初始化

此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0HFDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM31个字节,命令控制字为FEH 写 、FFH 读 。DS1302与单片机的连接电路图如图6.5所示:

               6.5 DS1302硬件连接图

备用电池可用来断电保护,当主电源断开之后,备用电池开始工作,起到备用作用,继续保持时钟的准确性

 温度上限报警功能

7.1 设计原理

   固话报警的设计原理非常简单,把电话外壳拆出来之后,里面的按键其实就是一个矩阵键盘,为了简化设计,这里只说明重拨按键,因为只需要重拨按键就可以工作完全满足我们功能了。拆出来后下一步就是找出重拨键对应的引脚,先找到重拨键位置然后通过万用表就可以测出重拨键对应的两个引脚线,这个过程相当简单,通过肉眼也能很快找出来。其他按键找出方法相同,不过本次设计无需用到不再阐述。

      7.1 固话内部电路                   7.2改装后的固话

    找出重拨键引脚之后通过外线引出来,中间通过一个继电器连接单片机既可工作。如图7.3所示。

                       7.3 固话报警连接图

上限温度通过软件设计设定也可以通过功能按键设定,当满足条件达到上限温度,单片机引脚触发高电平引发继电器工作既可实现自动重拨。固话的重拨号码要事先先设定好。

7.2 设计心得体会

     没有做不到,只有想不到,一个非常简单的小小改装就可以实现一个远程报警功能,其实生活就是缺少发现。

PC串口通讯及VB上位机简单介绍

 8.1 PC串口通信

目前较为常用的串口有9针串口(DB9)和25针串口(DB25)。最为简单且常用的是三线制接地法,即地、接收数据和发送数据三脚相连,本文只涉及到最为基本的接法,且直接用RS232相连,电路图如图8.1所示

                  8.1串口通信电路图

本系统串行通信采用异步通信方式。协议如下:1. 一帧数据由1位起始位、8位数据位、无奇偶校验位、1位停止位共10位组成。
 2
. 波特率设为00bps。单片机串行口按方式1工作,波特率由定时器T1控制,
 PC
机串口波特率通过VB通讯控件的Settings属性设置,为保证数据传送的准确性,两者的波特率必须一致。  上位机利用Visual Basic 6.0编程。用VB6.0开发串行通信程序有两种法,一种是利用WindowsAPI函数;另一种是采用VB6.0的通信控件MSComm。利用API函数编写串行通信程序较为复杂,需要掌握大量的通信知识,其优点是可实现的功能更丰富、应用面更广泛,适合于编写较为复杂的低层次通信程序。而VB6.0MSComm通信控件提供了标准的事件处理函数、事件、方法,并通过控件属性对串口参数进行设置,比较容易地解决了串口通信问题。

MSCommVB6.0提供的ActiveX控件,使用前需将该控件添加到VB工具栏。MSComm控件具有功能完善的串口数据发送和接受功能,有两种处理通信的方式,即事件驱动方式和查询方式,事件驱动方式是利用MSComm控件的OnComm事件捕获并处理通信错误事件,是处理串行端口交互作用的一种非常有效的方法;查询方式是通过检查CommEvent属性的值来判断事件和错误。 下面Declare Function GetTickCount Lib "kernel32"    As Long

Sub TimeDelay t As Long

  '时间延迟子程序,单位是毫秒 ms

  Dim TT&

  TT   GetTickCount 

  Do

   DoEvents

  Loop Until GetTickCount   - TT    t

End Sub

'等待RS字符串返回,或是时间到达

'Comm是通信控件名称

'RS是欲等待的字符

'DT是最长的等待时间

'正常时返回值是所得的完整字符串,不正常时返回值是空字符串

Function WaitRS Comm As MSComm, RS As String, DT As Long  As String

  Dim Buf$, TT As Long

  Buf   ""

  TT   GetTickCount

  Do

    Buf   Buf & Comm.Input

  Loop Until InStr 1, Buf, RS    0 Or GetTickCount - TT    DT

  If InStr 1, Buf, RS    0 Then

    WaitRS   Buf

  Else

    WaitRS   ""

  End If

End Function

Option Explicit

Dim NowX As Integer  '现在的X轴位置

Dim PlotNo As Long  '最长的X轴范围

Dim PreValue As Single  '前一个测量值

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'当选择通信端口的Combo控件被选中后激活此事件

'若用户改变通信端口时,关闭通信端口

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Private Sub cmbCOM_Click 

  '若通信端口号码和现在的选择一样时就不必理会,直接跳出此子程序

  If cmbCOM.ListIndex + 1   MSComm1mPort Then Exit Sub

  Timer1.Enabled   False                      '关闭定时器

  TimeDelay 100

  If MSComm1.PortOpen Then

    MSComm1.PortOpen   False                    '关闭通信端口

  End If

  lblMsg.Caption   "已停止检测并关闭通讯端口"

  cmdOpenCOM.Enabled   True     '允许使用【打开通信端口】按钮

End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'单击【结束】按钮后激活此事件

'使用End命令将系统结束

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Private Sub cmdEnd_Click 

  MSComm1.PortOpen   False          '关闭通信端口

  End

End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'单击【打开通信端口】按钮后激活此事件

'MSComm控件的参数设置好,并打开

'激活【开始检测】按钮

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Private Sub cmdOpenCOM_Click 

  '判断端口号码是否落在1--16之间

  If cmbCOM.ListIndex    0 And cmbCOM.ListIndex    16 Then

    MSComm1mPort   cmbCOM.ListIndex + 1

  Else

    MsgBox "指定通信端口时发生错误!", vbCritical + vbOKOnly, "系统信息"

    Exit Sub

  End If

  '激活错误检测机制

  On Error GoTo comErr

  MSComm1.Settings   "119200,n,8,1"  '设定通信参数

  MSComm1.PortOpen   True          '打开通信端口

  cmdOpenCOM.Enabled   False       '将此按钮设为禁用状态

  cmdStart.Enabled   True          '激活【开始检测】按钮

  lblMsg.Caption   "可单击【开始检测】按钮,执行检测的工作。"

  Exit Sub

comErr:

  MsgBox "打开通信端口时发生错误!请确定通信端口存在且正常。", vbCritical + vbOKOnly, "系统信息"

End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'单击【开始检测】按钮后激活此事件

'将定时器激活或关闭,并显示对应的文字在按钮上,以指示用户操作

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Private Sub cmdStart_Click 

  Timer1.Enabled   Not Timer1.Enabled

  If Timer1.Enabled Then

    cmdStart.Caption   "停止检测"

  Else

    cmdStart.Caption   "开始检测"

    lblMsg.Caption   "已停止检测"

  End If

End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'窗体的Load事件

'输入图形暂时设为灰色,表示无状态信息进入

'将通讯端口号码及站号填入Combo控件;并默认二者的选项是第一个

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Private Sub Form_Load 

  Dim i%

  PlotNo   100

  cmbCOM.Clear

  cmbCOM.AddItem "COM1"

  cmbCOM.AddItem "COM2"

   cmbCOM.AddItem "COM3 USB "

  cmbCOM.AddItem "COM4 USB "

   cmbCOM.AddItem "COM5"

  cmbCOM.AddItem "COM6"

   cmbCOM.AddItem "COM7"

  cmbCOM.AddItem "COM8"

   cmbCOM.AddItem "COM9"

  cmbCOM.AddItem "COM10"

   cmbCOM.AddItem "COM11"

  cmbCOM.AddItem "COM12"

   cmbCOM.AddItem "COM12"

  cmbCOM.AddItem "COM14"

   cmbCOM.AddItem "COM15"

  cmbCOM.AddItem "COM16"

  cmbCOM.ListIndex   0

  cmdStart.Enabled   False

  '以下设定绘图范围, Xmin,Y - X,YMin

  picVoltage.Scale  0, 50 - PlotNo, 0

  picVoltage.DrawWidth   2 '使用两个像素宽度的画笔

End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'定时器的Timer事件引发后,就不断地执行其中的程序。

'将模拟读值命令送出,再取得返回字符串并判断。

'

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Private Sub Timer1_Timer 

  Dim Buf$, ValueStr As Single, Pos1%

 Buf$   Buf$ + MSComm1.Input '读取变量

 TimeDelay 2150

  ValueStr   Val Mid Buf, Pos1 + 1, 7   '分离出正号以后的数值

  lblValue.Caption   ""                    '清空上一次数据

  lblValue.Caption   Format ValueStr, "00.0"  & ""  '显示在画面上

  If NowX   0 Then

    picVoltage.Cls '清除图形

    picVoltage.PSet  0, ValueStr   '设定起点

  Else

    '以下判断现在的读值是否大于前一次的读值,若是,则以红色绘线

    '若否,则以蓝色绘线

    'If ValueStr   PreValue + 0.01 Then

      picVoltage.Line - NowX, ValueStr , RGB 255, 0, 0  '由上一次的位置画至此点

    'Else

     ' picVoltage.Line - NowX, ValueStr , RGB 0, 0, 255  '由上一次的位置画至此点

    'End If

  End If

  PreValue   ValueStr

  NowX   NowX + 1 '位置加1

  If NowX   PlotNo Then NowX   0  '超过范围则数值归零

End Sub

9  总结

     本系统的设计更加人性化,可以对4路设定不同的上限报警温度,这样在需要不同温度的测量中更具有优势,当然更多路温度的设计方法也一样。并且报警方面只稍微改动了一下固话就达到了远程报警的功能,温度较大变化时还会自动存储同时时间也会储存起来,可以给操作人员提供更多的信息。

本系统所需的元器件价格低廉,单片机资源利用率比较高。4个开关实现的功能比较多,使操作人员操作更加方便。

在温度数据的处理上精度可达到0.0625℃,可以满足一定场合的用途。

可改进之处:本系统虽然已经实现了大部分功能但仍可继续改造。如果远程测温等,通过无线模块可实现采集到的温度传送到控制台,进行远程监控,无需到现场。图9.1是通过NRF24L01在开发板上实现的功能。由于精力问题没有实现到这个系统上。

                     9.1 远程测温测试

附录

部分原理图:

参考文献

[1] 陈洪财. 单片机C语言和汇编语言实用开发技术[M][2] 刘和平等[M]. 北京航空航天大学出版社 2003-1-1

[3] 李学海. PIC单片机实用教程―基础篇[M]. 北京航空航海大学出版社, 2007-02

[4] 李学海.PIC单片机实用教程―提高篇[M]. 北京航空航海大学出版社,2007-02

[5] 能昌会.时钟芯片DS1302在单片机系统中的应用[J].电子制作,2007,11

[6] 郭天祥.新概念51单片机C语言教程:入门、提高、开发、拓展[M].电子工业出版社,2009-02 147-167342-349394-409

[7] 龙脉工作室.51单片机C语言应用开发技术大全[M].人民邮电出版社.2008-9

[8] 张越 嵌入式与SOC ,2008:5456

[10] 廖琪梅,韩彬,杨文昭,屈景辉.基于单总线器件DSl8820的温度测量仪[J]《国外电子元器件》2008年第220082 国外电子元器件-CNKIDSl8B20与单片机的接口及编程技术[J]. 河北工业科技.24卷第4期,20077

[12]张俊芳,张忠民,刘利民.智能单片机温度控制系统[J].辽宁工程技术大学学报,2004:6971

[13]龚红军.单片机温度控制系统[J].电气时代,2002:6667

[14]吴金戌,沈庆阳,郭庭吉.单片机时间与应用[J].清华大学出版社,2002:3638

[15] 李江全,张丽,芩红蕾. Visual Basic串口通信与测控应用技术实战详解 人民邮电出版社



路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

返回顶部