资源描述
电子装置课程设计报告
19
2020年4月19日
文档仅供参考,不当之处,请联系改正。
浙江理工大学
班级:08电子信息实验班
学号:Q08610110
姓名:周慧
指导老师:陈科
~ 第二学期
设计题目:温度检测系统设计
一、实验内容
1、 利用板载模拟温度传感器TC1047A实现一温度采集系统;
2、 间隔1--5s采集一次(步进1 s,能够预设),在液晶屏第一行显示连续的3个采集温度值;
3、 当最新采集的温度大于这三个温度的平均值温度1℃时,蜂鸣器报警,当温度降低后,解除报警;
4、 记录报警次数,在LCD上显示,,并将结果存入24LC024。
二、 电路原理图以及各功能模块的工作原理
1、驱动蜂鸣器
APP001开发板上的BUZZER是由RC2控制一个三极管来驱动的,当JP4的跳线开关短路时,RC2管脚输出高电平便会使蜂鸣器发出声音,RC2管脚输出低电平便禁止蜂鸣器发声。
2.字符LCD
APP001开发板配置了一个2*16的字符LCD,它和PIC18F452的接口是RD0-RD3连接到LCD模块的DB4-DB7,用来向LCD模块写入命令和数据,其中DB7能够用来作为LCD模块控制器的忙标志位;RD5是读写控制位;RD4是命令和数据标志位。RD=0时,RD0-RD3是读取和写入数据到LCD的命令寄存器;RD=1时,RD0-RD3读取和写入的是要显示的数据。
3.温度测量
使用模拟温度传感器TC1047A,利用模数转换,将模拟电压转换为数字电压。对应于相应的温度。
4.键盘
使用开发板上的2组按键SW2和SW3
5. RTC
采用Timer 1外接32.768kHz的晶振能够产生精确的1秒计时,从而实现RTC。
6.24LC024
7.LCD、LED&ADC按键读取
三、主要函数程序流程图
1.Main函数流程图
2.LCD__EEPROM 更新
3.温度比较和蜂鸣器
四、实验主要源码
(1)Main函数:
void main(void)
{
int AlarmNum;
/*首先初始化*/
InitializePORT( );
InitializeINTs( );
InitializeAD( );
InitializeTMR1( );
Initialize_I2C_Master( );
/*lcd初始化*/
OpenLCD( );
while(1)
{
Key_Press_Check();
if (Flagbits.Timer1_Flag) // update Temperature on LCD every 1 Sec
{
Flagbits.Timer1_Flag=0;
get_key_flag++;
if(get_key_flag>=Time_count)
{
get_key_flag=0;
LCD_Temp_Update() ; // update Temperature
Temp_Compare();
}
}
}
}
(2)读取温度:
int Read_TC1047_Temperature(void)
{ int AD_Temp;
ADCON0bits.CHS0=1;
for (AD_Temp=0;AD_Temp<5;AD_Temp++);
ADCON0bits.GO=1; // Start to convert the A/D
while(ADCON0bits.GO); // Waiting A/D until done
AD_Temp = ReadADC( ); // Get 10 bits A/D result
return AD_Temp;
}
(3)LCD__EEPROM 更新
void LCD_Temp_Update (void)
{
int i;
LCD_Set_Cursor(0,0); // 清理lcd
for (i=0;i<16;i++)putcLCD(' ');
/****显示第一个温度值******/
LCD_Set_Cursor(0,0);//定位光标
T2_buffer[0]=T2_buffer[1];//从后面向前传递温度参数
if(T2_buffer[0]!=0)//如果是零,不要显示
{
Buffer_LCD(T2_buffer[0]);
LCD_Set_Cursor(0,4);//定位光标
putcLCD(0xDF);//显示 ”度 “ 这个标志
}
/****显示第二个温度值******/
LCD_Set_Cursor(0,5);
if(T2_buffer[1]!=0)
{
Buffer_LCD(T2_buffer[1]);
LCD_Set_Cursor(0,9);
putcLCD(0xDF);
}
/****显示第三个温度值******/
LCD_Set_Cursor(0,10);
T2_buffer[2]=T2_buffer[3];
if(T2_buffer[2]!=0)
{
Buffer_LCD(T2_buffer[2]);
LCD_Set_Cursor(0,14);
putcLCD(0xDF);
}
T2_Buffer=Read_TC1047_Temperature( );// Get Current Temperature from TC1047A
T2_buffer[3]=T2_Buffer;
EEPROM.Word=EERandomRead(0xA0,0x30);
//显示累积温度报警次数
LCD_Set_Cursor(1,13);
NUM=EEPROM.Byte[0];
itoa(EEPROM.Byte[0],ASCII_String);
putsLCD(ASCII_String);
//显示当次温度报警次数
LCD_Set_Cursor(1,11);
itoa(alarm_count,ASCII_String);
putsLCD(ASCII_String);
EEByteWrite(0xA0, 0x30, (NUM+NUMN));
EEAckPolling(0xA0);
NUMN=0;
}
(4) 温度比较和蜂鸣器
void Temp_Compare(void)
{
int i,range;
unsigned int alarm_value=0;
//当所有的温度采集完毕之后 才能正常比较
if(T2_buffer[0]!=0)
{
for(i=0;i<=2;i++)
{
alarm_value+=T2_buffer[i];
}
range=alarm_value/3.0;
LCD_Set_Cursor(1,0);
Buffer_LCD(range);
LCD_Set_Cursor(1,4);
putcLCD(0xDF);
if ((T2_Buffer)>(range+0x000A)) //温度值超过告警值时报警
{
PORTCbits.RC2=1; //开蜂鸣器
PORTDbits.RD7=1; //点LED D8
alarm_count++;
NUMN++;
}
else
{
PORTCbits.RC2=0; //观蜂鸣器
PORTDbits.RD7=0; //关 LED D8
//T2_Buffer_Flag=1;
}
}
}
(5) 按键查询
void Key_Press_Check(void)
{
if(!SW2)
{
PIE1bits.TMR1IE=0;
Delay10KTCYx(100);
if(Time_count>4)
{
Time_count=1;
}
else
Time_count++;
PIE1bits.TMR1IE=1;
}
if(!SW3)
{
EEByteWrite(0xA0, 0x30, 0);
EEAckPolling(0xA0);
LCD_Set_Cursor(1,13);
putcLCD(' ') ;
LCD_Set_Cursor(1,14);
putcLCD(' ') ;
LCD_Set_Cursor(1,15);
putcLCD(' ') ;
}
LCD_Set_Cursor(1,6);
WriteDataLCD('T');
LCD_Set_Cursor(1,7);
WriteDataLCD('=');
LCD_Set_Cursor(1,8);
itoa(Time_count,ASCII_String);
putsLCD(ASCII_String);
LCD_Set_Cursor(1,9);
WriteDataLCD('s');
}
五、心得体会
经过本次实验,我学会了温度检测系统,整个过程如下:首先利用传感器去采集温度,接着将采集过来的温度经过一定的公式转化成电压,然后又经过一定的公式将其转化成电路板上合适的电压值,用AD将其进行编码,最后将其转化成温度显示出来。
接着讲讲主程序的编写主要包括以下部分:首先是程序的初始化,接着跳入循环while(1)中,接着调用Key_Press_Check()对按键进行判断,如果有按键按下则处理按键,然后判断中断,若达到所规定的时间,则更新温度,并将中断次数写入EPROM中,最后在采集完三次温度之后,能够用Temp_Compare()函数进行温度比较,如果温度高于三次温度的平均值,则进行报警。整个过程是采用模块编程、分块调试、之后系统联调的原则。
经过本次实验,我觉得.自己学到了很多东西,以后应该会进一步去学习。
展开阅读全文