田苗法
(安徽机电职业技术学院,安徽 芜湖 241000)
基于PIC单片机数字式温度计电路设计与仿真
田苗法
(安徽机电职业技术学院,安徽 芜湖 241000)
文章采用PIC单片机和数字温度传感器TC74设计数字式温度计,硬件电路设计简单,工作可靠,易于实现,程序设计采用C语言编程实现,最后利用电路仿真软件proteus对电路进行仿真。
PIC单片机;数字式温度计;电路设计
本设计主控制芯片采用 16F877A单片机,该单片机内置I2C总线模块,利用该模块可以更方便地跟 I2C芯片进行通信,简化了C程序代码设计。利用I2C器件TC-74将温度转变为电信号,然后发给单片机,单片机对数据进行分析和计算等处理,最后通过1602液晶显示屏显示温度值。
1.PIC16F877A单片机
PIC16F877A单片机是美国Microchip公司生产的8位单片机,具有独特的RISC结构,即数据总线和指令总线分离的哈佛结构,该结构具有执行效率高和速度快等优点。另外,片内带有EEPROM、A/D转换器、USART通信模块、MSSP通信模块等,功能强大,可以简化外围硬件电路设计和程序设计。本次电路设计应用了其内部的 I2C通信功能模块,作为 I2C通信硬件电路中的主控制器件使用,按照I2C通信协议与I2C从控制器件TC-74进行数据通信,实现温度信号的传输。
图1 PIC16F877A引脚示意图
2.温度传感器TC-74
TC-74是适用于低成本和小尺寸应用场合的可串行读取的数字温度传感器,内部温度检测元件将周围环境温度转变为模拟信号,再通过内部电路转换成数字信号对外输出。该芯片为I2C芯片,内部置有I2C通信协议,作为I2C通信硬件电路中的从控制器件使用,数据按照该通信协议与主控制器件进行数据交换。图2为TC-74各引脚的功能说明,其中VDD和GND分别接电源正极和电源负极,SDA和SCLK为I2C数据传输接口。
图2 TC-74引脚示意图
3.字符型1602液晶
图3 1602液晶引脚示意图
字符型1602液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用的有16×1、16×2、20×2和40×2等模块,该电路设计采用的是16×1型号,该模块采用标准的16引脚接口,如图3所示。其中,DB0—DB7八个引脚为并行数据传输接口,各引脚功能见表1。
表1 1602液晶引脚接口说明表
1.硬件电路设计
应用 proteus电路仿真软件对硬件电路进行了设计与仿真,图4所示,1602液晶芯片的并行数据接口DB0—DB7与单片机B端口的8个引脚连接,TC74的数据接口SCLK和SDA分别与单片机SCL、SDA引脚连接。R1和R2为I2C总线上的上拉电阻。打开仿真按钮,液晶屏能够正确显示温度传感器上显示的模拟温度值。
图4 proteus电路设计图与仿真
2.程序设计
采用 C语言编程,按照结构化程序设计和模块化思想,
分别对1602液晶和TC74进行编程,C程序代码如下:
#include〈pic.h〉
#define uchar unsigned char
#define uint unsigned int
#define RS RD0
#define E RD1
const uchar a[]="temp:";
void port_init() //单片机端口初始化
{
TRISB=0; TRISD0=0;
TRISD1=0; PORTB=0;
RD0=0; RD1=0;
TRISC=0xff;
}
void delay(uchar x) //延时函数
{
uchar i;
while(x--) for(i=0;i〈110;i++);
}
void lcd_com(uchar dat) //向LCD写入命令函数
{
RS=0; PORTB=dat;
E=0; delay(2);
E=1; delay(2);
E=0; delay(2);
}
void lcd_date(uchar dat) //向LCD写入数据函数
{
RS=1; PORTB=dat;
E=0; delay(2);
E=1; delay(2);
E=0; delay(2);
}
void lcd_init() //LCD初始化
{
lcd_com(0x30); delay(2);
lcd_com(0x0c); delay(2);
lcd_com(0x01); delay(2);
}
void i2c_init() //单片机I2C控制寄存器初始化
{
SSPSTAT=0x80; SSPCON=0X38;
SSPCON2=0X00; SSPADD=0X09;
}
uchar i2c_read() //读取TC74中数据的函数
{
uchar dat; SSPIF=0;
SEN=1;
while(!SSPIF); SSPIF=0;
SSPBUF=0X9A;
while(!SSPIF); SSPIF=0;
SSPBUF=0X00;
while(!SSPIF); SSPIF=0;
RSEN=1;
while(!SSPIF); SSPIF=0;
SSPBUF=0X9B;
while(!SSPIF); SSPIF=0;
RCEN=1;
while(!(SSPSTAT & 0x01));
dat=SSPBUF; SSPIF=0;
ACKDT=1; SSPIF=0;
PEN=1;
while(!SSPIF); SSPIF=0;
return(dat);
}
void lcd_display(uchar dat) //液晶显示温度值函数
{
uchar shi,ge;
ge=dat % 10; shi=dat/10;
lcd_com(0x80+7); lcd_date(0x30+shi);
lcd_com(0x80+8); lcd_date(0x30+ge);
}
void main() //主函数
{
uchar i;
port_init(); i2c_init();
lcd_init(); lcd_com(0x80);
for(i=0;i〈8;i++)
{
lcd_date(a[i]);
}
while(1)
{
delay(500);
lcd_display((int)i2c_read());
}
}
通过对电路进行仿真,证明该电路设计是正确的,具有较强的实用性,并且电路硬件接线简单,测量精度高,温度测量范围广泛,抗干扰能力强,误差较小。可广泛应用于对温度的检测和控制等领域。
[1] 徐玮,沈建良,庄建清.PIC单片机快速入门[M].北京:北京航空航天大学出版社,2010.
[2] 李学海.PIC 单片机实用教程—提高篇[M].北京:北京航空航天大学出版社,2002.
[3] 张明峰.PIC 单片机入门与实战[M].北京:北京航空航天大学出版社,2004.
[4] 李广弟,朱月秀,冷祖祈.单片机基础(第三版)[M].北京:北京航空航天大学出版社,2007.
[5] 谭浩强.C 程序设计(第二版)[M].北京:清华大学出版社,2004.
TP311
A
1008-1151(2011)05-0027-02
2011-02-12
田苗法(1984-),男,山东定陶人,安徽机电职业技术学院汽车工程系助教,研究方向为汽车电子与电控技术。