PIC课程设计报告-LM35温度报警器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

PIC课程设计报告
LM35温度报警器
专 业:电子信息工程
组 长:
组员:
学号:
指导教师:
一、设计要求:
1、 4*4键盘设定,最高温度,最低温度限制
功能键));
数字++功能键键盘设定,最高温度,最低温度限制(0-9
(0-9数字
2、 LCD1602液晶显示当前温度,最高温度,最低温度限制值,报
警检测周期;
警检测周期;
℃);
0-1.0V对应0-100
0-100℃)
温度传感器输出(0-1.0V
3、 LM35温度传感器输出(
4、 24C02存储设定的最高温度,最低温度限制值;
存储设定的最高温度,最低温度限制值;
5、 低于设置的最低温度或高于最高温度LED 会闪烁报警。

例如: 键盘输入最低温度2020℃,最高温度℃,最高温度3030℃。

当传感器温度小于℃。

当传感器温度小于℃。

当传感器温度小于 20或大于3030℃,℃,℃,LED LED 会闪烁报警;会闪烁报警; 二、系统组成及工作原理 1、系统框图
2、工作原理 (1)总体设计思想)总体设计思想
本设计是以PIC18F452单片机作为控制核心,以LM35的温度传感器作为单片机的输入。

首先通过4*4矩阵键盘设定一个最高温度和最低温度作为报警器报警的条件,然后单片机通过实时监控温度的变化,通过LCD1602字符型液晶显示各节点温度的数值,字符型液晶显示各节点温度的数值,当温度值超出当温度值超出所设定的值时,所设定的值时,LED LED 开始闪烁报警,从而实现对整个温度系统的管理和控制。

和控制。

MCU LCD1602液晶液晶
4*4键盘键盘
AT24C02
LM35输出
(2)各模块设计)各模块设计 1)、4*4矩阵键盘的设计矩阵键盘的设计
根据设计任务书中要求实现的功能,我选择了一个4*4矩阵键盘来设置最高温度、最低温度和检测周期,4*4键盘能够符合设计要求,其中10个键来设置具体的数值,另外六个键为功能键,具体设计后面详述。

面详述。

①矩阵键盘结构:①矩阵键盘结构:
键盘实际上是一组按键开关的集合,平时按键开关总是处于断开状态,当按下键时它才闭合。

键盘结构能够有效的提高单片机系统中I/O 口的利用率。

它的结构和产生的波形如图2-4所示。

所示。

图2-4 键盘结构及产生的波形图键盘结构及产生的波形图
键盘结构及产生的波形图 单片机应用系统中除了复位按键有专门的复位电路单片机应用系统中除了复位按键有专门的复位电路,,以及专一的复位功能外复位功能外,,其它的按键或键盘都是以开关状态来设置控制功能或输入数据。

入数据。

键开关状态的可靠输入:如果检测到有按键按下时,延时5到10ms 进行消除按键抖动,再确认该键电平是否仍保持闭合状态电平,如保持闭合状态电平则确认为真正键按下状态,从而消除了抖动影响。

在这种行列式矩阵键盘非编码键盘的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。

当确认有按键按下后,下一步就要识别哪一个按键按下。

下一步就要识别哪一个按键按下。

我们使用的是逐行扫描查询我们使用的是逐行扫描查询
法。

法。

由于考虑到后面I2C 的写入要用到RC 端口的3、4引脚,故我们这里用的是RB 端口的RB0-2和RB6四个个引脚接行,四个个引脚接行,RB7RB7和RC5-7接列。

接列。

键盘共有16个按键,用于方便设定温度。

个按键,用于方便设定温度。

表5-1键盘的按键分布
2)、LCD1602液晶显示的设计液晶显示的设计
温度显示工作原理:温度显示工作原理: LCD1602可以采用两种方式与单片机连接,一种是采用8位数据总线D0D0——D7D7,和,和RS RS、、R/W R/W、、EN 三个控制端口;另一种是只用D4-D7作为四位数据分两次传送。

本实验将使用并采用八位数据方式来控制1602显示。

显示。

进行LCD 设计主要是LCD 的控制的控制//驱动和外界的接口设计。

控制主要是通过接口与外界通信、管理内主要是通过接口与外界通信、管理内//外显示RAM RAM,控制驱动器,分,控制驱动器,分配显示数据;驱动主要是根据控制器要求,驱动LCD 进行显示。

控制器还常含有内部ASCII 字符库,或可外扩的大容量汉字库。

或可外扩的大容量汉字库。

内部引线内部引线已经连接好,不用外接杜邦线。

已经连接好,不用外接杜邦线。

0 1 2 3 4 5 6 7 8 9 复位复位 复位复位 无



3)、LM35温度传感器的设计温度传感器的设计
PIC18F452内置的是10位A/D 转换器,但是一次只能读入8位,故要用到两个存储空间,根据采用A/D 转换后结果的对齐方式不同而有不同的读取方法,一般是采用右对齐的。

在程序运行时,LM35温度传感器从零摄氏度输出零伏起每升高一摄氏度输出增加10mV 10mV。

由。

由LM35温度传感器输入的电压经过A/D 转换成10位的数字量转换成实际的电压值,并将实际的电压值的各个位分开装入显示缓冲区。

际的电压值,并将实际的电压值的各个位分开装入显示缓冲区。

转换后的数字量为0--10230--1023,,而我们所需要的温度为0--1000--100,,这里有一个换算的过程,将AD 转换而来的结果整除1010,这样得到的结,这样得到的结果刚好在0--100内。

然后将转换的结果显示在LCD 上。

上。

测量电压与编码值的关系式:测量电压与编码值的关系式:
1023
X V xVref
=
4)4)、、24C02的应用的应用
利用I2C 进行对EEPROM 进行写操作和读操作,将每次我们设定好的最高温度、最低温度,检测周期写入EEPROM EEPROM,然后在每次上电复位,然后在每次上电复位时,将上一次存入的值显示为初始值,将上一次存入的值显示为初始值,这样可以对上一次的操作保留这样可以对上一次的操作保留记忆。

记忆。

写操作必须要写入器件地址、存储区地址、存储的内容,以下是写操作的时序图:作的时序图:
5)、)、LED LED 灯报警灯报警
如果当前温度超过最高设定或者低于最低设定,如果当前温度超过最高设定或者低于最低设定,LED LED 灯会闪烁进行报警。

程序设计中用的是RB0接蜂鸣器,当达到条件时,蜂鸣器开始鸣叫。

鸣叫。

三、单片机程序 #include <p18F452.h> #include <adc.h> #include <delays.h> #include <I2C.h>
#define RB0 PORTBbits.RB0 #define RB1 PORTBbits.RB1 #define RB2 PORTBbits.RB2 #define RB6 PORTBbits.RB6 #define RB7 PORTBbits.RB7 #define RC5 PORTCbits.RC5 #define RC6 PORTCbits.RC6 #define RC7 PORTCbits.RC7 #define scl PORTCbits.RC3 #define sda PORTCbits.RC4 #define LED PORTCbits.RC0
#define RSPIN PORTBbits.RB5 //Data or Instrument Select
#define RWPIN PORTBbits.RB4 //Write or Read
#define EPIN PORTBbits.RB3 //6800 mode Enable single
void key(void);
void choose(void);
voidread_T(void);
void display(void);
voidlcdreset(void);
voidlcd_wait_busy(void);
voidlcd_write_com(unsigned char combuf);
voidlcd_write_com_busy(unsigned char combuf);
voidlcd_write_data(unsigned char databuf);
voidlcd_write_address(unsigned char x,unsigned char y); voidwrite_t(unsigned char x,unsignedinty,unsignedint data); voidlcd_write_char(unsigned char x,unsigned char y,unsigned char buf);
voidlcd_write_string(unsigned char x,unsigned char
y,unsigned char *s);
unsignedinti,j;
unsignedint result=0,T=0;
unsignedintlowt=100,hight=400;
unsignedint number=0,times=0;
//---------------------------------------
//名称: 主函数
//-----------------------------------------
void main( void )
{
OpenI2C(MASTER,SLEW_ON); // configure A/D convertor
TRISC=0B11111110;
TRISB=0B10000000; // RB3-5设置为输出
// RD设置为输出
TRISD=0B00000000;
lcdreset(); // 复位1602
while(1)
{
read_T();
if(EERandomRead(0xa0,0x0f0)==255)
{
lowt=EERandomRead(0xa0,0x0f1)*255+EERandomRead(0xa0,0x0 f2);
hight=EERandomRead(0xa0,0x0f3)*255+EERandomRead(0xa0,0x 0f4);
}
else
write_t(0xa0,0x0f0,255);
key();
if(times==1)lowt=lowt%100+number*100;
else
if(times==2)lowt=100*(int)(lowt/100)+lowt%10+number*10;
else if(times==3)lowt=10*(int)(lowt/10)+number;
else if(times==4)hight=hight%100+number*100;
else
if(times==5)hight=100*(int)(hight/100)+hight%10+number*10; else
if(times==6)hight=10*(int)(hight/10)+number,times=0;
display();
if(T<lowt||T>hight)
{
LED=1;
Delay10KTCYx(10);
}
LED=0;
write_t(0xa0,0x0f1,lowt/255);
write_t(0xa0,0x0f2,lowt%255);
write_t(0xa0,0x0f3,hight/255);
write_t(0xa0,0x0f4,hight%255);
}
}
//---------------------------------------
//名称: 设置最低温度和最高温度的函数
//-----------------------------------------
voidwrite_t(unsigned char x,unsignedinty,unsignedint data) {
StartI2C();
Nop();
WriteI2C(x);
Nop();
WriteI2C(y);
Nop();
WriteI2C(data);
Nop();
StopI2C();
Delay10KTCYx(1);
}
//---------------------------------------
//名称: 读取温度数的函数
//-----------------------------------------
voidread_T()
{
OpenADC( ADC_FOSC_32 &ADC_RIGHT_JUST &ADC_7ANA_1REF, ADC_CH0 &ADC_INT_OFF );
时钟源,晶振32分频率, A/D 转换结果右对齐,A/D // A/D
参考电压源,电源工作电压
// 通道选择中断关闭,查询模式
// Delay for 50TCY
Delay10TCYx( 5 );
ConvertADC(); // Start conversion
// Wait for completion
while(BusyADC() );
// Read result
result = ReadADC();
CloseADC(); // Disable A/D converter Nop();
T=result*2908.0/1023;
}
//---------------------------------------
//名称: 显示函数
//-----------------------------------------
void display()
{
lcd_write_char(2,1,lowt/100+0x30);
lcd_write_char(3,1,lowt/10%10+0x30);
lcd_write_char(4,1,'.');
lcd_write_char(5,1,lowt%10+0x30);
lcd_write_char(10,1,hight/100+0x30); lcd_write_char(11,1,hight/10%10+0x30);
lcd_write_char(12,1,'.');
lcd_write_char(13,1,hight%10+0x30);
lcd_write_char(10,0,T/100+0x30);
lcd_write_char(11,0,T/10%10+0x30);
lcd_write_char(12,0,'.');
lcd_write_char(13,0,T%10+0x30);
}
//---------------------------------------
//名称: 检测按键的状态函数
//----------------------------------------- void choose()
{
if(RB7==0)
number=i, Delay10KTCYx(50),times++; else if(RC5==0)
number=i+1,Delay10KTCYx(50),times++;
else if(RC6==0)
number=i+2,Delay10KTCYx(50),times++; else if(RC7==0)
number=i+3,Delay10KTCYx(50),times++;
Nop();
}
//--------------------------------------- //名称: 按键低电平输入
//----------------------------------------- void key()
{
RB0=0,RB1=1,RB2=1,RB6=1;
i=0;
choose();
RB0=1,RB1=0,RB2=1,RB6=1;
i=4;
choose();
RB0=1,RB1=1,RB2=0,RB6=1;
i=8;
choose();
RB0=1,RB1=1,RB2=1,RB6=0;
i=12;
choose();
if(number>=10)
times=0;
Nop();
}
//---------------------------------------
//名称: 1602忙检测函数
//----------------------------------------- voidlcd_wait_busy(void)
{
TRISDbits.TRISD7=1; //为读状态做准备
RSPIN=0; //选择指令寄存器
RWPIN=1; //选择读
EPIN=1; //使能线电平变化
读忙状态,不忙时退出 while(PORTDbits.RD7==1); //
EPIN=0; //恢复使能线电平
TRISDbits.TRISD7=0;
}
//---------------------------------------
//名称: 1602写命令函数
//-----------------------------------------
voidlcd_write_com(unsigned char combuf)
{
//选择指令寄存器
RSPIN=0;
//选择写
RWPIN=0;
PORTD=combuf;
//把命令字送入RD
EPIN=1; //使能线电平变化,命令送入1602的8位数据口
Delay1TCY();
EPIN=0; //恢复使能线电平
}
//---------------------------------------
//名称: 1602写命令函数(带忙检测)
//-----------------------------------------
voidlcd_write_com_busy(unsigned char combuf)
{
lcd_wait_busy(); //调用忙检测函数
lcd_write_com(combuf); //调用写命令函数
}
//---------------------------------------
//名称: 1602写数据函数(带忙检测)
//-----------------------------------------
voidlcd_write_data(unsigned char databuf)
{
lcd_wait_busy(); //调用忙检测函数
RSPIN=1;
//选择数据寄存器
//选择写
RWPIN=0;
PORTD=databuf; //
把数据字送入P2
使能线电平变化,命令送入1602 EPIN=1; //
的8位数据口
Delay1TCY();
恢复使能线电平
EPIN=0; //
}
//---------------------------------------
//名称: 1602显示地址写函数
//-----------------------------------------
voidlcd_write_address(unsigned char x,unsigned char y) {
x&=0x0f; //列地址限制在0-15
y&=0x01; //行地址限制在0-1
if(y==0x00)
lcd_write_com_busy(x|0x80); //第一行的列地址写入
else
lcd_write_com_busy((x+0x40)|0x80); //第二行的列地址写入
}
//---------------------------------------
//名称: 1602初始化函数
//-----------------------------------------
voidlcdreset(void)
{
Delay100TCYx(15);
位数据,双列,5*7字形 lcd_write_com_busy(0x38); //8
lcd_write_com_busy(0x08); //显示功能关,无光标
lcd_write_com_busy(0x01); //写入新的数据后,光标右移,
显示屏不移动
Delay10KTCYx(1);
lcd_write_com_busy(0x0c); //显示功能开,无光标,
lcd_write_char(14,0,'C');
lcd_write_char(8,0,'T');
lcd_write_char(9,0,'=');
lcd_write_char(0,1,'L');
lcd_write_char(1,1,'=');
lcd_write_char(6,1,'C');
lcd_write_char(8,1,'H');
lcd_write_char(9,1,'=');
lcd_write_char(14,1,'C');
}
//--------------------------------------
//名称: 指定地址写入函数
//-----------------------------------------
voidlcd_write_char(unsigned char x,unsigned char y,unsigned char buf)
{
lcd_write_address(x,y); //写入地址
lcd_write_data(buf); //写入显示数据
}
四、单片机仿真
五、心得与总结。

相关文档
最新文档