|
单片机课程设计:基于基于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位的,但指令总线位数分别位 12、14、16位。
2 流水线结构:
MCS-51单片机的取指和执行采用单指令流水线结构,即取一条指令,执行完后再取下一条指令;而PIC的取指和执行采用双指令流水线结构,当一条指令被执行时,允许下一条指令同时被取出,这样就实现了单周期指令。
3 寄存器组:
PIC单片机的所有寄存器,包括I/O口,定时器和程序计数器等都采用RAM结构形式,而且都只需要一个指令周期就可以完成访问和操作;而MCS-51单片机需要两个或两个以上的周期才能改变寄存器的内容。
(4)运行速度高:
由于采用了哈佛总线结构,以及指令的读取和执行才用了流水作业方式,使得运行速度大大提高。
(5)功耗低:
PIC单片机的功率消耗极低,是目前世界上最低的单片机品种之一。在4MHz时钟下工作时耗电不超过2mA,在睡眠模式下耗电可以低到1uA以下。
(6)驱动能力强:
I/O端口驱动负载的能力较强,每个I/O引脚吸入和输出电流的最大值可分别达到25mA和20mA,能够直接驱动发光二极管LED、光电耦合器或者轻微继电器等。
(7)外接电路简洁
PIC单片机片内集成了上电复位电路、I/O引脚上拉电路、看门狗定时器等,可以最大程度减少或免用外接器件,以便实现“纯单片机”应用。这样,不仅方便于开发,而且还可节省用户的电路空间和制作成本。
(8)程序保密性强
目前,尚无办法对其直接进行解密拷贝,可以最大限度的保护用户的程序版权。
2.2 PIC16F877A引脚图及主要性能
PIC16F877A的详细引脚如图2.2-1所示。
图 2.2-1 PIC16F877A引脚图 图 2.2 -2 PIC16F877A实物图
主要性能参数如下所示:
具有高性能RISC CPU
仅有35条单字指令
100000次擦写周期
除程序分支指令为两个周期外,其余均为单周期指令
运行速度: DC―20MHZ始终输入
DC―200ns 指令周期
8K * 14个 FLASH程序存储器
368 * 8 个数据存储器(RAM)字节
256 * 8 EEPRM 数据存储器字节
提供14个中断源
功耗低
在5V, 4MHZ 时钟运行时电流小于 2mA
在3V, 32KHZ 时钟运行时电流小于20Ua
支持在线串行编程(ICSP)
运行电压范围广,2.0V到5.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.3-1所示。
图 2.3―1 PIC最小系统电路图 图2.3―2 最小系统实物图
2.3.2 系统时钟
数字电路的工作离不开时钟信号,每一步细微动作都是在一个共同的时间基准信号协调下完成的。作为时基发生器的时钟震荡电路,为整个单片机芯片的工作提供系统时钟信号,也为单片机与其他外接芯片之间的通讯提供可靠的同步时钟信号。
PIC16F877A的时钟电路是由片内的一个反相器和一个反馈电阻,与外接的1个石英晶体和2个电容,共同构成的一个自激多谐振荡器。电路如图2.3-1 所示。
2.4 设计心得总结
PIC16F877A的最小系统跟51相似,较为简单。芯片自身增加了很多功能,如:自带8路AD转换、增加SPI总线,引脚复位功能多等。芯片自身功能的增加给设计带来了很多灵活性,同时也是学习的难点。
LCD12864液晶原理介绍及接口实现
3.1 液晶显示模块概述
12864A-1汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。
主要技术参数和显示特性:
电源:VDD 3.3V~+5V 内置升压电路,无需负压 ;
显示内容:128列× 64行
显示颜色:黄绿
显示角度:6:00钟直视
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.5~5.5V
电源地 GND :0V
工作温度 Ta :0~60℃ 常温 / -20~75℃(宽温)
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 功能:写入资料到内部的RAM(DDRAM/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 1;AC5~AC0为垂直卷动位址 SR 0;AC3~AC0写ICONRAM位址
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; //设置LCD为8位并口通信
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[ ] "2009年12月01日" ;
send_i 0x80 ; // 定位在第一行
writelcd table1 ; // 写:基PIC 单片机
send_i 0x90 ; // 定位在第二行
writelcd table2 ; // 写:多路温度
send_i 0x88 ; // 定位在第三行
writelcd table3 ; // 写:巡回检测系统
send_i 0x98 ; // 定位在第四行
writelcd table4 ; // 写:2009年12月01日
3.6 与单片机的接口实现
12864液晶的电路连线图如图3.6 -1所示,实物位置如图3.6 -2所示
图 3.6 -1 12864液晶电路连接图
图 3.6 -2 12864液晶模块实物图
设计心得总结
LCD12864与1602相比需要较大的电流驱动,如果出现图片模糊不清晰或者灰暗,除了检查背光灯外应考虑电源问题。最好采用大于5V的电源,经7805稳压管稳压驱动,以保证电流。基本驱动跟1602相似难度不大。中文及图像显示是12864最大的特点也是难点,主要是指令较多,还有就是图像驱动需要了解液晶内部原理。整屏画图可以使用PCtoLCD2002把图片转换成16进制数,局部画曲线、直线、圆等需要一些算法,比较复杂
DS18B20原理介绍及接口实现DS18B20是DALLAS公司的
图4.1DS18B20内部结构图
DS18B20的内部结构图如图4.1所示。由此我们可以看出DS18B20主要由4部分组成:64位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。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时序两个过程。
对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样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 发出命令后接着发出64位ROM编码,访问总线上与该编码对应的芯片 搜索ROM F0H 用于确定挂接在同一总线上DS18B20的个数 跳过ROM CCH 忽略64位ROM地址,直接向DS18B20发温度变换命令 告警搜索 ECH 执行后只有问多超过上限或下限的芯片才响应 RAM操作指令 指令 约定代码 功能 温度转换 44H 启动DS18B20温度转换。12位转换时长典型值750ms 读暂存器 BEH 读内部RAM中9字节的数据。 写暂存器 4EH 向RAM第2、3字节写上、下限温度数据,紧跟命令之后传送2字节数据 复制暂存器 48H 将RAM中第2、3字节的内容复制到内部EEPROM中 重调EEPROM B8H 将EEPROM中内容恢复到RAM中第3、4字节
温度数据在高速暂存器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, 内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。AT24C02有一个16字节页写缓冲器。该器件通过IC总线接口进行操作,有一个专门的写保护功能。AT24C02支持IC,总线数据传送协议IC,总线协议规定任何将数据传送到总线的器件作为发送器。任何从总线接收数据的器件为接收器。数据传送是由产生串行时钟和所有起始停止信号的主器件控制的。主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据(发送或接收)的模式,通过器件地址输入端A0、A1和A2可以实现将最多8个AT24C02器件连接到总线上。 SCL 串行时钟
AT24C02串行时钟输入管脚用于产生器件所有数据发送或接收的时钟,这是一个输入管脚。
SDA 串行数据/地址
AT24C02 双向串行数据/地址管脚用于器件所有数据的发送或接收,SDA 是一个开漏输出管脚,可与其它开漏输出或集电极开路输出进行线或(wire-OR)。
A0、A1、A2 器件地址输入端
这些输入脚用于多个器件级联时设置器件地址,当这些脚悬空时默认值为0。当使用AT24C02 时最大可级联8个器件。如果只有一个AT24C02被总线寻址,这三个地址输入脚(A0、A1、A2 )可悬空或连接到Vss,如果只有一个AT24C02被总线寻址这三个地址输入脚(A0、A1、A2 )必须连接到Vss。
WP 写保护
如果WP管脚连接到Vcc,所有的内容都被写保护只能读。当WP管脚连接到Vss 或悬空允许器件进行正常的读/写操作
设计心得
A0、A1、A2 器件地址输入端实时时钟DS1302简单介绍及接口实现DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与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相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH 写 、FFH 读 。
图6.4 DS1302初始化
此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为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开发串行通信程序有两种法,一种是利用Windows的API函数;另一种是采用VB6.0的通信控件MSComm。利用API函数编写串行通信程序较为复杂,需要掌握大量的通信知识,其优点是可实现的功能更丰富、应用面更广泛,适合于编写较为复杂的低层次通信程序。而VB6.0的MSComm通信控件提供了标准的事件处理函数、事件、方法,并通过控件属性对串口参数进行设置,比较容易地解决了串口通信问题。
MSComm是VB6.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-167、342-349、394-409
[7] 龙脉工作室.51单片机C语言应用开发技术大全[M].人民邮电出版社.2008-9
[8] 张越 嵌入式与SOC ,2008:54~56
[10] 廖琪梅,韩彬,杨文昭,屈景辉.基于单总线器件DSl8820的温度测量仪[J]《国外电子元器件》2008年第2期2008,2 国外电子元器件-CNKIDSl8B20与单片机的接口及编程技术[J]. 河北工业科技.第24卷第4期,2007,7
[12]张俊芳,张忠民,刘利民.智能单片机温度控制系统[J].辽宁工程技术大学学报,2004:69~71
[13]龚红军.单片机温度控制系统[J].电气时代,2002:66~67
[14]吴金戌,沈庆阳,郭庭吉.单片机时间与应用[J].清华大学出版社,2002:36~38
[15] 李江全,张丽,芩红蕾. Visual Basic串口通信与测控应用技术实战详解 人民邮电出版社