电子装置课程设计报告.docx
《电子装置课程设计报告.docx》由会员分享,可在线阅读,更多相关《电子装置课程设计报告.docx(14页珍藏版)》请在冰豆网上搜索。
电子装置课程设计报告
电子装置课程设计报告
浙江理工大学
电子装置课程设计
班级:
08电子信息实验班
学号:
Q08610110
姓名:
周慧
指导老师:
陈科
2010~2011第二学期
设计题目:
温度检测系统设计
一、实验内容
1、利用板载模拟温度传感器TC1047A实现一温度采集系统;
2、间隔1--5s采集一次(步进1s,可以预设),在液晶屏第一行显示连续的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
采用Timer1外接32.768kHz的晶振可以产生精确的1秒计时,从而实现RTC。
6.24LC024
7.LCD、LED&ADC按键读取
三、主要函数程序流程图
1.Main函数流程图
2.LCD__EEPROM更新
3.温度比较和蜂鸣器
四、实验主要源码
(1)Main函数:
voidmain(void)
{
intAlarmNum;
/*首先初始化*/
InitializePORT();
InitializeINTs();
InitializeAD();
InitializeTMR1();
Initialize_I2C_Master();
/*lcd初始化*/
OpenLCD();
while
(1)
{
Key_Press_Check();
if(Flagbits.Timer1_Flag)//updateTemperatureonLCDevery1Sec
{
Flagbits.Timer1_Flag=0;
get_key_flag++;
if(get_key_flag>=Time_count)
{
get_key_flag=0;
LCD_Temp_Update();//updateTemperature
Temp_Compare();
}
}
}
}
(2)读取温度:
intRead_TC1047_Temperature(void)
{intAD_Temp;
ADCON0bits.CHS0=1;
for(AD_Temp=0;AD_Temp<5;AD_Temp++);
ADCON0bits.GO=1;//StarttoconverttheA/D
while(ADCON0bits.GO);//WaitingA/Duntildone
AD_Temp=ReadADC();//Get10bitsA/Dresult
returnAD_Temp;
}
(3)LCD__EEPROM更新
voidLCD_Temp_Update(void)
{
inti;
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();//GetCurrentTemperaturefromTC1047A
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)温度比较和蜂鸣器
voidTemp_Compare(void)
{
inti,range;
unsignedintalarm_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;//点LEDD8
alarm_count++;
NUMN++;
}
else
{
PORTCbits.RC2=0;//观蜂鸣器
PORTDbits.RD7=0;//关LEDD8
//T2_Buffer_Flag=1;
}
}
}
(5)按键查询
voidKey_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()函数进行温度比较,如果温度高于三次温度的平均值,则进行报警。
整个过程是采用模块编程、分块调试、之后系统联调的原则。
通过本次实验,我觉得.自己学到了很多东西,以后应该会进一步去学习。