经典单片机毕业论文

PIC单片机的多路温度巡回检测系统

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

目录

1 系统设计 ................................................... 4 2 主芯片:PIC16F877A单片机简介 ............................... 5

2.1 PIC单片机的优越之处: .................................. 5 2.2 PIC16F877A引脚图及主要性能 ............................. 6 2.3 最小系统................................................ 8

2.3.1复位功能............................................ 8 2.3.2 系统时钟 ........................................... 8 2.4 设计心得总结............................................ 9 3 LCD12864液晶原理介绍及接口实现 ............................. 9

3.1 液晶显示模块概述........................................ 9 3.2 液晶引脚说明............................................ 9 3.3 接口时序................................................ 10 3.4 具体指令介绍............................................ 12 3.5 显示坐标关系............................................ 15

3.5.1、图形显示坐标 ..................................... 15 3.5.2 汉字显示坐标 ..................................... 17 3.6 与单片机的接口实现...................................... 18 3.7 设计心得总结 .......................................... 18 4 DS18B20原理介绍及接口实现 ................................. 19

4.1 DS18B20简介 ............................................ 19 4.2 DS18B20结构及其工作原理 ............................... 19 4.3 DS18B20的接口实现 ..................................... 26

4.3.1 硬件设计 .......................................... 26 4.3.2 软件设计 .......................................... 26 4.4 设计心得总结 .......................................... 27

4.4.1 焊接问题: ........................................ 27 4.4.2 软件设计: ........................................ 28 4.4.3 不足: ............................................ 28

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

5.1 AT24C02功能描述管脚定义 .............................. 28 5.2 管脚定义及接口实现 ................................... 29 5.3 设计心得 .............................................. 30 6 实时时钟DS1302简单介绍及接口实现 .......................... 30

6.1 DS1302简介 ............................................. 30

6.2 DS1302结构及工作原理 ................................... 31 6.3 DS1302的接口实现 ...................................... 32 7 温度上限报警功能 .......................................... 34

7.1 设计原理................................................ 34 7.2 设计心得体会............................................ 34 8 与PC串口通讯及VB上位机简单介绍 .......................... 35

8.1 与PC串口通信........................................... 35 8.2 上位机介绍.............................................. 36 9 总结 ...................................................... 40 附录 ......................................................... 40

部分原理图: .............................................. 40 参考文献 ..................................................... 41 致谢 ......................................... 错误!未定义书签。

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

1 系统设计

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

图 1.1 多路温度监控系统模拟应用 温度监控主系统构架框图如图 1.2 所示:

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

图1.3 手工焊接实物图

主要技术参数

A温度检测范围 : -55℃~+125℃ B测量精度 : 0.0625℃

C 显示方式: LCD12864显示 D 报警方式: 固话报警

2 主芯片: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总线,引脚复位功能多等。芯片自身功能的增加给设计带来了很多灵活性,同时也是学习的难点。

3 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 液晶引脚说明

逻辑工作电压(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

2、位址归位

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

DDRAM 3、位址归位

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

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

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

功能: D=1;整体显示ON C=1;游标ON B=1;游标位置ON 5、游标或显示移位控制

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

功能:设定游标的移动与显示的移位控制位:这个指令并不改变DDRAM的

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

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

内容 6、功能设定

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

集动作

7、设定CGRAM位址

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1

DB0

8、设定DDRAM位址

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1

DB0

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

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1

DB0

数器(AC)的值 10、写资料到RAM

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1

DB0

11、读出RAM的值

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1

DB0

12、 DB0

功能:从内部RAM读取资料(DDRAM/CGRAM/TRAM/GDRAM)

待命模式(12H)

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1

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

功能:进入待命模式,执行其他命令都可终止待命模式 13、卷动位址或IRAM位址选择(13H)

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

功能:SR=1;允许输入卷动位址 SR=0;允许输入IRAM位址 14、反白选择(14H)

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

功能:选择4行中的任一行作反白显示,并可决定反白的与否 15、睡眠模式(015H)

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

功能:SL=1;脱离睡眠模式 SL=0;进入睡眠模式 16、扩充功能设定(016H)

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1

DB0

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

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

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

功能:SR=1;AC5~AC0为垂直卷动位址 SR=0;AC3~AC0写ICONRAM位址

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

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

功能:设定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

send_i(i++); send_i(0x80);

for(k = 0;k

send_d(*ptr++); } }

i = 0x80;

for(j = 0;j

send_i(i++);

send_i(0x88); for(k = 0;k

send_i(0x36); //打开绘图显示 send_i(0x30); //回到基本指令集 }

3.5.2 汉字显示坐标

/**************************************************************** * 名 称: writelcd() * 功 能: 在LCD上显示字符串

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

**************************************************************/ void writelcd(const unsigned char *pt) {

while(*pt) }

// 应用如下

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); // 定位在第四行

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

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

writelcd(table4); // 写:2009年12月01日

3.6 与单片机的接口实现

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

图 3.6 -1 12864液晶电路连接图

图 3.6 -2 12864液晶模块实物图

3.7 设计心得总结

LCD12864与1602相比需要较大的电流驱动,如果出现图片模糊不清晰或者灰暗,除了检查背光灯外应考虑电源问题。最好采用大于5V的电源,经7805稳压管稳压驱动,以保证电流。基本驱动跟1602相似难度不大。中文及图像显示是12864最大的特点也是难点,主要是指令较多,还有就是图像驱动需要了

解液晶内部原理。整屏画图可以使用PCtoLCD2002把图片转换成16进制数,局部画曲线、直线、圆等需要一些算法,比较复杂

4 DS18B20原理介绍及接口实现

4.1 DS18B20简介

DS18B20是DALLAS半导体公司推出的第一片支持“一线总线”接口的温度传感器,他它具有微型化、低功耗、高性能、抗干扰能力强、易配微处理器等优点,可直接将温度转化成串行数字信号供处理器处理。DS18B20

具有以下优点:

(1) 适应电压范围宽,电压范围在3.0V~5.5V,在寄生电源方式下可由数

据线供电。

(2) 独特的单线接口方式,与微处理器连接时只需要一条口线即可实现

微处理器与DS18B20的双向通信。

(3) 支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组

网多点测温。

(4) 在使用中不需要任何外围元件,全部传感元件以及转换电路集成在

形如一直三极管的集成电路内。

(5) 测温范围-55℃~+125℃,在-10℃~+85℃时进度为±0.5℃

(6) 可编程分辨率为9~12位,对应的可分辨温度分别为0.5℃、

0.25℃、0.125℃和0.0625℃,可实现高精度测温。

(7) 负压特性。电源极性接反时,芯片不会因为过热而烧毁,但不能正

常工作。

4.2 DS18B20结构及其工作原理

图4.1DS18B20内部结构图

DS18B20的内部结构图如图4.1所示。由此我们可以看出DS18B20主要由4部分组成:64位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄

存器。DS18B20的管脚排列如图4.2所示,其中DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端,在寄生电源接线方式时接地。

图4.2 DS18B20引脚和封装

每颗DS18B20在出厂前都有一个64位光刻ROM,它可以看作该DS18B20的地址序列码。其各位排列顺序是:开始8位为产品类型标号,接下来48位是该DS18B20自身的序列号,最后8位是前面56位的CRC循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一条总线 挂接多个DS18B20的目的。

由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:复位时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。

(1) DS18B20的复位时序:

图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

}

(2) DS18B20的读时序:

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

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

}

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

st=1; st=0;

else //接收到应答信号 delayus(50,10); //延时430us

图4.4 DS18B20读时序图

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

* 名 称:read_byte() * 功 能:18b20读字节 * 出口参数:读出18B20的内容

********************************************************************/ uch read_byte() { }

(3) DS18B20的写时序:

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

uch i;

uch value = 0; //读出温度 static bit j; for (i = 8;i > 0;i--) { }

return (value);

value >>= 1; DQ_LOW();

NOP();NOP();NOP();NOP();NOP();NOP(); //6us

DQ_HIGH(); //拉至高电平 NOP();NOP();NOP();NOP();NOP(); j = DQ;

if (j) value |= 0x80;

delay(2, 7); //63us

//4us

图4.5 DS18B20写时序图

/******************************************************************** * 名 称:write_byte() * 功 能:写18b20写字节 * 入口参数:uch val 待写的数据

*******************************************************************/ void write_byte(uch val) { }

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

表2 DS18B20高速暂存器结构

寄存器内容 温度值低位(LSB) 温度值高位(MSB)

字节地址

0 1

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; //右移一位

ROM操作指令

RAM操作指令

a1=temper/1000; //取温度十位 a2=temper%1000/100; //取个位 a3=temper%100/10; //小数点后个位 a4=temper%10; //小数点后十位 }

4.3

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.4 设计心得总结

4.4.1 焊接问题:

焊接DS18B20时,速度要快,如果高温的电烙铁持续接触传感器很容易烧

掉DS18B20,因为电烙铁一般温度为350 ~ 450度,而传感器承受温度为125度。我曾经因此烧坏了两个传感器,得此痛训!

4.4.2 软件设计:

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

4.4.3 不足:

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

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

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

5.1 AT24C02功能描述管脚定义

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

本次设计采用4个AT24C02用来储存4个温度传感器采集到的温度,用以回显。只要有温度较大变化都会被储存,随时可以通过功能按键切换功能查看,也可以将温度传回PC机统计分析。图5.1是硬件实现的效果图。

图 5.1 温度储存之后统计分析通过液晶显示出来

5.2 管脚定义及接口实现

AT24C02管脚图及硬件连接电路图如图5.2所示。个引脚功能如下: 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 或悬空允许器件进行正常的读/写操作

图5.2 AT24C02硬件连接图 设计思想如下:

5.3 设计心得

A0、A1、A2 器件地址输入端,应该设计不一样以区分各个存储器,一个24C02对应一个传感器。上拉电阻4.7K不可以省,不然会出现问题。

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

6.1 DS1302简介

DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。

6.2 DS1302结构及工作原理

DS1302的引脚排列如图2.1所示,其中Vcc1为后备电源,Vcc2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向), SCLK始终是输入端。

图6.1DS1302引脚图

DS1302 的控制字如图2.2所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位

开始输出。

图6.2 DS1302控制字

DS1302的数据输入输出方式(I/O) ,在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧

跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。

DS1302一共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见图2.3。

图6.3DS1302日历、时间寄存器

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

6.3 DS1302的接口实现

DS1302的初始化过程非常简单,在DS1302上电之后先关闭DS1302的写保护,接着依据不同的寄存器地址分别写入年份、月份、日期,以及需要设定的时间,然后启动DS1302的时钟振荡,打开写保护,这样DS1302就能正常走时了,并且不会因为误操作而干扰到DS1302。当DS1302上电后,为了防止系统掉电后重新上电,接着调用DS1302初始化程序造成时间丢失,我们在初始化

DS1302的时候先把DS1302当前的秒走时读出,放如临时变量,接着判断时间的正确性,如果时间正确,则把秒走时回送DS1302,重新启动时钟振荡后关闭

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

7 温度上限报警功能

7.1 设计原理

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

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

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

图 7.3 固话报警连接图

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

7.2 设计心得体会

没有做不到,只有想不到,一个非常简单的小小改装就可以实现一个远程

报警功能,其实生活就是缺少发现。

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

8.1 与PC串口通信

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

图8.1串口通信电路图

本系统串行通信采用异步通信方式。协议如下:

1. 一帧数据由1位起始位、8位数据位、无奇偶校验位、1位停止位共10位组成。

2. 波特率设为119200bps。单片机串行口按方式1工作,波特率由定时器T1控制,

PC机串口波特率通过VB通讯控件的Settings属性设置,为保证数据传送的准确性,两者的波特率必须一致。

单片机串口初始化:

TRISC=0XFF; //设置C口方向全为输出

SPBRG=0XC; //设置波特率为119200BPS

TXSTA=0X24; //使能串口发送,选择高速波特率

RCSTA=0X90; //使能串口工作,连续接收

RCIE=0X1; //使能接收中断

GIE=0X1; //开放全局中断

PEIE=0X1; //使能外部中断

8.2 上位机介绍

上位机利用Visual Basic 6.0编程。用VB6.0开发串行通信程序有两种法,一种是利用Windows的API函数;另一种是采用VB6.0的通信控件MSComm。利用API函数编写串行通信程序较为复杂,需要掌握大量的通信知识,其优点是可实现的功能更丰富、应用面更广泛,适合于编写较为复杂的低层次通信程序。而VB6.0的MSComm通信控件提供了标准的事件处理函数、事件、方法,并通过控件属性对串口参数进行设置,比较容易地解决了串口通信问题。

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

图 8.2 上位机监控界面

下面VB上位机完整程序:

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 MaxPlotNo As Long '最长的X轴范围

Dim PreValue As Single '前一个测量值

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

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

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

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

Private Sub cmbCOM_Click()

'若通信端口号码和现在的选择一样时就不必理会,直接跳出此子程序 If cmbCOM.ListIndex + 1 = MSComm1.CommPort 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

MSComm1.CommPort = 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%

MaxPlotNo = 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,YMax)-(XMax,YMin)

picVoltage.Scale (0, 50)-(MaxPlotNo, 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 > MaxPlotNo Then NowX = 0 '超过范围则数值归零

End Sub

9 总结

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

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

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

附录

部分原理图:

参考文献

[1] 陈洪财. 单片机C语言和汇编语言实用开发技术[M].哈尔滨工业出版社 .2008.5

[2] 刘和平等. PIC16F877X单片机实用软件与接口技术-C语言及其应用[M]. 北京航空航天大学出版社, 2003-1-1

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

PIC单片机的多路温度巡回检测系统

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

目录

1 系统设计 ................................................... 4 2 主芯片:PIC16F877A单片机简介 ............................... 5

2.1 PIC单片机的优越之处: .................................. 5 2.2 PIC16F877A引脚图及主要性能 ............................. 6 2.3 最小系统................................................ 8

2.3.1复位功能............................................ 8 2.3.2 系统时钟 ........................................... 8 2.4 设计心得总结............................................ 9 3 LCD12864液晶原理介绍及接口实现 ............................. 9

3.1 液晶显示模块概述........................................ 9 3.2 液晶引脚说明............................................ 9 3.3 接口时序................................................ 10 3.4 具体指令介绍............................................ 12 3.5 显示坐标关系............................................ 15

3.5.1、图形显示坐标 ..................................... 15 3.5.2 汉字显示坐标 ..................................... 17 3.6 与单片机的接口实现...................................... 18 3.7 设计心得总结 .......................................... 18 4 DS18B20原理介绍及接口实现 ................................. 19

4.1 DS18B20简介 ............................................ 19 4.2 DS18B20结构及其工作原理 ............................... 19 4.3 DS18B20的接口实现 ..................................... 26

4.3.1 硬件设计 .......................................... 26 4.3.2 软件设计 .......................................... 26 4.4 设计心得总结 .......................................... 27

4.4.1 焊接问题: ........................................ 27 4.4.2 软件设计: ........................................ 28 4.4.3 不足: ............................................ 28

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

5.1 AT24C02功能描述管脚定义 .............................. 28 5.2 管脚定义及接口实现 ................................... 29 5.3 设计心得 .............................................. 30 6 实时时钟DS1302简单介绍及接口实现 .......................... 30

6.1 DS1302简介 ............................................. 30

6.2 DS1302结构及工作原理 ................................... 31 6.3 DS1302的接口实现 ...................................... 32 7 温度上限报警功能 .......................................... 34

7.1 设计原理................................................ 34 7.2 设计心得体会............................................ 34 8 与PC串口通讯及VB上位机简单介绍 .......................... 35

8.1 与PC串口通信........................................... 35 8.2 上位机介绍.............................................. 36 9 总结 ...................................................... 40 附录 ......................................................... 40

部分原理图: .............................................. 40 参考文献 ..................................................... 41 致谢 ......................................... 错误!未定义书签。

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

1 系统设计

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

图 1.1 多路温度监控系统模拟应用 温度监控主系统构架框图如图 1.2 所示:

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

图1.3 手工焊接实物图

主要技术参数

A温度检测范围 : -55℃~+125℃ B测量精度 : 0.0625℃

C 显示方式: LCD12864显示 D 报警方式: 固话报警

2 主芯片: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总线,引脚复位功能多等。芯片自身功能的增加给设计带来了很多灵活性,同时也是学习的难点。

3 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 液晶引脚说明

逻辑工作电压(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

2、位址归位

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

DDRAM 3、位址归位

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

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

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

功能: D=1;整体显示ON C=1;游标ON B=1;游标位置ON 5、游标或显示移位控制

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

功能:设定游标的移动与显示的移位控制位:这个指令并不改变DDRAM的

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

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

内容 6、功能设定

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

集动作

7、设定CGRAM位址

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1

DB0

8、设定DDRAM位址

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1

DB0

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

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1

DB0

数器(AC)的值 10、写资料到RAM

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1

DB0

11、读出RAM的值

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1

DB0

12、 DB0

功能:从内部RAM读取资料(DDRAM/CGRAM/TRAM/GDRAM)

待命模式(12H)

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1

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

功能:进入待命模式,执行其他命令都可终止待命模式 13、卷动位址或IRAM位址选择(13H)

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

功能:SR=1;允许输入卷动位址 SR=0;允许输入IRAM位址 14、反白选择(14H)

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

功能:选择4行中的任一行作反白显示,并可决定反白的与否 15、睡眠模式(015H)

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

功能:SL=1;脱离睡眠模式 SL=0;进入睡眠模式 16、扩充功能设定(016H)

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1

DB0

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

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

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

功能:SR=1;AC5~AC0为垂直卷动位址 SR=0;AC3~AC0写ICONRAM位址

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

CODE: RW RS DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

功能:设定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

send_i(i++); send_i(0x80);

for(k = 0;k

send_d(*ptr++); } }

i = 0x80;

for(j = 0;j

send_i(i++);

send_i(0x88); for(k = 0;k

send_i(0x36); //打开绘图显示 send_i(0x30); //回到基本指令集 }

3.5.2 汉字显示坐标

/**************************************************************** * 名 称: writelcd() * 功 能: 在LCD上显示字符串

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

**************************************************************/ void writelcd(const unsigned char *pt) {

while(*pt) }

// 应用如下

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); // 定位在第四行

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

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

writelcd(table4); // 写:2009年12月01日

3.6 与单片机的接口实现

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

图 3.6 -1 12864液晶电路连接图

图 3.6 -2 12864液晶模块实物图

3.7 设计心得总结

LCD12864与1602相比需要较大的电流驱动,如果出现图片模糊不清晰或者灰暗,除了检查背光灯外应考虑电源问题。最好采用大于5V的电源,经7805稳压管稳压驱动,以保证电流。基本驱动跟1602相似难度不大。中文及图像显示是12864最大的特点也是难点,主要是指令较多,还有就是图像驱动需要了

解液晶内部原理。整屏画图可以使用PCtoLCD2002把图片转换成16进制数,局部画曲线、直线、圆等需要一些算法,比较复杂

4 DS18B20原理介绍及接口实现

4.1 DS18B20简介

DS18B20是DALLAS半导体公司推出的第一片支持“一线总线”接口的温度传感器,他它具有微型化、低功耗、高性能、抗干扰能力强、易配微处理器等优点,可直接将温度转化成串行数字信号供处理器处理。DS18B20

具有以下优点:

(1) 适应电压范围宽,电压范围在3.0V~5.5V,在寄生电源方式下可由数

据线供电。

(2) 独特的单线接口方式,与微处理器连接时只需要一条口线即可实现

微处理器与DS18B20的双向通信。

(3) 支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组

网多点测温。

(4) 在使用中不需要任何外围元件,全部传感元件以及转换电路集成在

形如一直三极管的集成电路内。

(5) 测温范围-55℃~+125℃,在-10℃~+85℃时进度为±0.5℃

(6) 可编程分辨率为9~12位,对应的可分辨温度分别为0.5℃、

0.25℃、0.125℃和0.0625℃,可实现高精度测温。

(7) 负压特性。电源极性接反时,芯片不会因为过热而烧毁,但不能正

常工作。

4.2 DS18B20结构及其工作原理

图4.1DS18B20内部结构图

DS18B20的内部结构图如图4.1所示。由此我们可以看出DS18B20主要由4部分组成:64位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄

存器。DS18B20的管脚排列如图4.2所示,其中DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端,在寄生电源接线方式时接地。

图4.2 DS18B20引脚和封装

每颗DS18B20在出厂前都有一个64位光刻ROM,它可以看作该DS18B20的地址序列码。其各位排列顺序是:开始8位为产品类型标号,接下来48位是该DS18B20自身的序列号,最后8位是前面56位的CRC循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一条总线 挂接多个DS18B20的目的。

由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:复位时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。

(1) DS18B20的复位时序:

图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

}

(2) DS18B20的读时序:

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

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

}

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

st=1; st=0;

else //接收到应答信号 delayus(50,10); //延时430us

图4.4 DS18B20读时序图

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

* 名 称:read_byte() * 功 能:18b20读字节 * 出口参数:读出18B20的内容

********************************************************************/ uch read_byte() { }

(3) DS18B20的写时序:

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

uch i;

uch value = 0; //读出温度 static bit j; for (i = 8;i > 0;i--) { }

return (value);

value >>= 1; DQ_LOW();

NOP();NOP();NOP();NOP();NOP();NOP(); //6us

DQ_HIGH(); //拉至高电平 NOP();NOP();NOP();NOP();NOP(); j = DQ;

if (j) value |= 0x80;

delay(2, 7); //63us

//4us

图4.5 DS18B20写时序图

/******************************************************************** * 名 称:write_byte() * 功 能:写18b20写字节 * 入口参数:uch val 待写的数据

*******************************************************************/ void write_byte(uch val) { }

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

表2 DS18B20高速暂存器结构

寄存器内容 温度值低位(LSB) 温度值高位(MSB)

字节地址

0 1

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; //右移一位

ROM操作指令

RAM操作指令

a1=temper/1000; //取温度十位 a2=temper%1000/100; //取个位 a3=temper%100/10; //小数点后个位 a4=temper%10; //小数点后十位 }

4.3

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.4 设计心得总结

4.4.1 焊接问题:

焊接DS18B20时,速度要快,如果高温的电烙铁持续接触传感器很容易烧

掉DS18B20,因为电烙铁一般温度为350 ~ 450度,而传感器承受温度为125度。我曾经因此烧坏了两个传感器,得此痛训!

4.4.2 软件设计:

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

4.4.3 不足:

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

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

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

5.1 AT24C02功能描述管脚定义

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

本次设计采用4个AT24C02用来储存4个温度传感器采集到的温度,用以回显。只要有温度较大变化都会被储存,随时可以通过功能按键切换功能查看,也可以将温度传回PC机统计分析。图5.1是硬件实现的效果图。

图 5.1 温度储存之后统计分析通过液晶显示出来

5.2 管脚定义及接口实现

AT24C02管脚图及硬件连接电路图如图5.2所示。个引脚功能如下: 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 或悬空允许器件进行正常的读/写操作

图5.2 AT24C02硬件连接图 设计思想如下:

5.3 设计心得

A0、A1、A2 器件地址输入端,应该设计不一样以区分各个存储器,一个24C02对应一个传感器。上拉电阻4.7K不可以省,不然会出现问题。

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

6.1 DS1302简介

DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。

6.2 DS1302结构及工作原理

DS1302的引脚排列如图2.1所示,其中Vcc1为后备电源,Vcc2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向), SCLK始终是输入端。

图6.1DS1302引脚图

DS1302 的控制字如图2.2所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位

开始输出。

图6.2 DS1302控制字

DS1302的数据输入输出方式(I/O) ,在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧

跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。

DS1302一共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见图2.3。

图6.3DS1302日历、时间寄存器

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

6.3 DS1302的接口实现

DS1302的初始化过程非常简单,在DS1302上电之后先关闭DS1302的写保护,接着依据不同的寄存器地址分别写入年份、月份、日期,以及需要设定的时间,然后启动DS1302的时钟振荡,打开写保护,这样DS1302就能正常走时了,并且不会因为误操作而干扰到DS1302。当DS1302上电后,为了防止系统掉电后重新上电,接着调用DS1302初始化程序造成时间丢失,我们在初始化

DS1302的时候先把DS1302当前的秒走时读出,放如临时变量,接着判断时间的正确性,如果时间正确,则把秒走时回送DS1302,重新启动时钟振荡后关闭

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

7 温度上限报警功能

7.1 设计原理

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

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

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

图 7.3 固话报警连接图

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

7.2 设计心得体会

没有做不到,只有想不到,一个非常简单的小小改装就可以实现一个远程

报警功能,其实生活就是缺少发现。

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

8.1 与PC串口通信

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

图8.1串口通信电路图

本系统串行通信采用异步通信方式。协议如下:

1. 一帧数据由1位起始位、8位数据位、无奇偶校验位、1位停止位共10位组成。

2. 波特率设为119200bps。单片机串行口按方式1工作,波特率由定时器T1控制,

PC机串口波特率通过VB通讯控件的Settings属性设置,为保证数据传送的准确性,两者的波特率必须一致。

单片机串口初始化:

TRISC=0XFF; //设置C口方向全为输出

SPBRG=0XC; //设置波特率为119200BPS

TXSTA=0X24; //使能串口发送,选择高速波特率

RCSTA=0X90; //使能串口工作,连续接收

RCIE=0X1; //使能接收中断

GIE=0X1; //开放全局中断

PEIE=0X1; //使能外部中断

8.2 上位机介绍

上位机利用Visual Basic 6.0编程。用VB6.0开发串行通信程序有两种法,一种是利用Windows的API函数;另一种是采用VB6.0的通信控件MSComm。利用API函数编写串行通信程序较为复杂,需要掌握大量的通信知识,其优点是可实现的功能更丰富、应用面更广泛,适合于编写较为复杂的低层次通信程序。而VB6.0的MSComm通信控件提供了标准的事件处理函数、事件、方法,并通过控件属性对串口参数进行设置,比较容易地解决了串口通信问题。

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

图 8.2 上位机监控界面

下面VB上位机完整程序:

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 MaxPlotNo As Long '最长的X轴范围

Dim PreValue As Single '前一个测量值

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

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

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

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

Private Sub cmbCOM_Click()

'若通信端口号码和现在的选择一样时就不必理会,直接跳出此子程序 If cmbCOM.ListIndex + 1 = MSComm1.CommPort 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

MSComm1.CommPort = 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%

MaxPlotNo = 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,YMax)-(XMax,YMin)

picVoltage.Scale (0, 50)-(MaxPlotNo, 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 > MaxPlotNo Then NowX = 0 '超过范围则数值归零

End Sub

9 总结

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

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

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

附录

部分原理图:

参考文献

[1] 陈洪财. 单片机C语言和汇编语言实用开发技术[M].哈尔滨工业出版社 .2008.5

[2] 刘和平等. PIC16F877X单片机实用软件与接口技术-C语言及其应用[M]. 北京航空航天大学出版社, 2003-1-1

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


相关文章

  • 设计单片机通讯协议论文(非常经典)
  • 如何设计单片机常用通信 协议论文 目录 1.自定义数据通信协议 .................................... 3 2.上位机和下位机中的数据发送 ............................. 3 3 ...查看


  • 公路收费站车流量统计系统的研制任务书
  • 一.毕业设计(论文)的内容(400字以上) 车流量统计是智能交通领域的重要研究课题之一,是实现交通智能化管理的重要环节.本课题任务是设计.制作一套车流量统计系统,具体研究内容如下: 1.通过图书馆.网络等途径搜集相关资料,掌握车流量统计的原 ...查看


  • 2014经典个人简历制作模板
  • 个人简历 基 姓名: 出生年月: 本 性别: 毕业学校: 照片 资 民族: 专业: 料 E-mail: 专 业 背 景 校 园 经 历 获得奖励: 2011.9至今:自己填 2014TI杯江苏省大学生电子设计竞赛二等奖: 2012.9~20 ...查看


  • 基于单片机的简易逻辑分析仪论文(经典)
  • 目 录 第1节 引 言„„„„„„„„„„„„„„„„„„„„„„„„„„„„„3 1.1 系统概述„„„„„„„„„„„„„„„„„„„„„„„„„„„3 1.1.1系统的特点„„„„„„„„„„„„„„„„„„„„„„„„4 1.1.2 ...查看


  • 毕业论文答辩自述大全
  • 毕业论文答辩自述 尊敬的各位评委老师: 大家好!我是来自里仁学院旅游管理专业2003级(5)班的学生**.我的毕业论文题目是<河北省红色旅游资源开发对策>. 我当时之所以选择研究河北省红色旅游是因为发展红色旅游,对河北有着非常重 ...查看


  • 电子秤的设计与制作毕业论文
  • 分类号 单位代码 密 级 公 开 学 号[1**********]3 学士学位论文 论文题目:电子秤的设计与制作 论 文 作 者:甘清华 指 导 教 师:谭菊(讲师) 专 业:电子信息科学与技术 (微电子制造工程) 提交论文日期:2015年 ...查看


  • 知网论文检测查重报告样板2015
  • 打印 文本复制检测报告单(全文标明引文) №:ADBD2015R_[***********]0527152407xxxxx 检测时2015-05-27 15:24:07 间: 检测文献: 红外防盗报警系统 作者: XX(xxxxxxxx) ...查看


  • 经典单片机毕业论文 1
  • 本文由421239245贡献 doc文档可能在WAP端浏览体验不佳.建议您优先选择TXT,或下载源文件到本机查看. PIC 单片机的多路温度巡回检测系统 摘要: 摘要:本文介绍了一种基于 PIC16F877A 单片机,利用 DS18B20 ...查看


  • Arduino单片机毕业设计
  • 石家庄邮电职业技术学院 毕业设计 基于Arduino的急救车音效设计 届 电信工程 系 专业移动通信技术( ) 班级 学号 姓名 指导教师 完成日期 2012年12月14日 毕业设计任务书 毕业设计评定书 摘 要 急救车,专指接载病员由伤病 ...查看


热门内容