1、单片机原理与应用实验报告温度测量显示及设定单片机原理与应用课程实验报告院 系: 班 级: 学 生: 学 号: 指导教师: 设计时间: 哈尔滨工业大学1 实验的目的、内容和设备1.1 实验的目的单片机综合实验的目的是训练单片机应用系统的编程及调试能力,通过对一个单片机应用系统进行系统的编程和调试,掌握单片机应用系统开发环境和仿真调试工具及仪器仪表的实用,掌握单片机应用程序代码的编写和编译,掌握利用单片机硬件仿真调试工具进行单片机程序的跟踪调试和排错方法,掌握示波器和万用表等杆塔工具在单片机系统调试中应用。1.2 实验内容实验的内容是利用APP001开发板实现一个温度测量显示和控制的单片机应用系统
2、,利用APP001开发板上的温度传感器测量温度,通过键盘输入一个稳定设定值,当测量温度高于设定温度时发出声音报警,开启散热风扇开关,并在LCD上显示实时温度值,设定温度值和散热风扇的开关状态,其中日期和时间利用单片机的定时器来产生,并能通过键盘来设定。通过该实验学习和掌握以下的内容:1) MPLAB开发环境的使用,程序编写和排错及软件仿真2) 利用MPLAB和ICD2对程序进行在线仿真和调试3) 使用万用表和示波器等仪器对硬件系统进行测量和调试4) PIC18F452单片机的I/O和PWM驱动及编程方法5) PIC18F452单片机LCD和键盘接口及编程方法6) PIC18F452单片机的US
3、ART编程及与PC机的通讯方法7) 利用Timer1外接32.768kHz的晶振产生RTC1.3 实验设备1) 运行MPLAB的PC机2) 示波器、万用表3) 直流电源4) ICD2仿真器5) APP001多功能实验板2 总体设计2.1 硬件总体设计系统组成方案图1 系统框图2.2 软件总体设计 图2主程序框图图3 中断程序框图3 硬件设计1) 散热风扇开发输出控制:实验中我们利用一个LED来模拟风扇状态,当散热风扇开关打开时,LED被点亮发光,当散热风扇关闭时,LED不发光。开发板上的指示灯D11由RB2,低电平亮,高电平灭。在代码中通过TRISBbits.TRISB2=0/1来设置输出/输
4、入,通过PORTBbits.RB2来控制RB2管脚输入高低电平。2) 字符LCD APP001:开发板配置了一个2X16的字符LCD,它和PIC18F452的接口图如下。端口D的RD0RD3连接到LCD模块的DB4DB7,用来向LCD模块写入命令和数据,其中DB7可以用来作为LCD模块控制器的忙标志位:RD5是读写控制位;RD4是命令和数据标志位,当RD40时,RD0RD3是读取和写入数据到LCD的命令寄存器,RD41时,RD0RD3读取和写入的是要显示的数据。端口A的RA2位用来控制LCD的使能,当RA2是高电平时LCD开始工作,RA2是低电平时,LCD禁止写工作。图中的电位器VR是用来调节
5、LCD的显示辉度。图4 LCD电路图3) TC74:APP001开发板上配置了一个I2C接口的温度传感器TC74.要使用TC74温度传感器时,断开J9的5、6、7、8管脚,同时连接J10的5、6、7、8管脚。 图5 TC74电路图4) 键盘:APP001开发板上配置了2组按键,SW2和SW3连接到端口RB0和RA4上。4 软件设计1) 温度更新函数:实现从TC47温度传感器中读取温度值,再将它显示到LCD上。void LCD_Temp_Update (void);2) 串口通讯函数:将当前时间和温度通过串口发送到PC机。void send_temperature(void);3) 按键处理函数
6、:判断按键是否按下,并根据相应的按键设定时间和报警值。void key_response(void);4) 报警函数:通过将当前温度值与报警值进行比较,判断是否需要报警。void alarm_response(void);5 系统操作说明通过STATUS按键切换设置日期、时间、设置温度报警值和完成状态,状态标志会依次在LCD上显示“Y(year)、M(month)、D(day)、h(hour)、m(minute)、s(second)、T(tempture)”,提示操作者。在相应的提示符号状态下,可以通过递增键来改变相应的值。每按以此,值加1,数值由09,逢9化0。.LCD上还会显示实时日期时钟
7、、传感器测得的当前温度值及报警值。温度设定值规定为1050度。同时单片机还会将实时时间和传感器测得的当前温度值发送到PC机。当温度超过报警值时,打开蜂鸣器和风扇(LED 代替)。打开串口调试小助手,当程序处在运行状态时,通过串口线,单片机每隔一秒会像PC机发送包含时间和当前温度的字符串。6调试过程和结束语通过本次单片机实验,了解了单片机应用系统的整个设计过程,培养了设计单片机应用初步能力。提高了综合运用单片机原理、C语言及电工电子技术等课程知识进行单片机应用系统设计的能力。(1)在调试过程中,在状态变量的指针方面遇到了较大的难题。因为年月日时分秒和温度报警值总共有7个设置量。其中日期和时间存储
8、在dt6数组中。刚开始设定displaycount指针的初始值来使状态显示位依次变化,但调试结果并不按设定的顺序变化,总是相差一定的数值。最后还是修改程序形式。记录调试过程中的显示顺序,然后由显示内容找出状态提示对应的字母,将对应字母改成我们要显示的字母。虽然表面上程序能够正常实现功能。但这次尝试说明我们对指针还不是很理解,以至于不能控制指针的精确指向。程序如下所示: if(displaycount=0&displaycount=3&displaycount9 ) cp=0; dt0+; /second + if(dt059) dt0=0; dt1+; if(dt159) dt1=0; dt2
9、+; if( dt223 ) dt2=0; dt3+; if(dt5%4=0|dt5%400=0) daylimit=days1k; else daylimit=daysk; if(dt3(daylimit-1) dt3=0; dt4+; if(dt411) dt4=0; dt5+; 附件1(电路原理图)附件2(部分源代码及注释)*主程序:时间产生和通信#include GROUPX_main.h unsigned char cp; / 100mS= T/(1/32768Hz) , T=3276.8 unsigned char dt6=0; /定义储存年月日时分秒的六元素数组unsigned
10、char days12=31,28,31,30,31,30,31,31,30,31,30,31;/定义平年的每月天数表unsigned char days112=31,29,31,30,31,30,31,31,30,31,30,31;/定义闰年的每月天数表unsigned char k=0;unsigned char daylimit=0; /定义每月天数上限值变量unsigned char timerflag_5s=1;unsigned char timer1H;unsigned char timer1L;unsigned char alarm_value;unsigned char nou
11、se=0; #pragma udata access My_RAM_1near unsigned char Str_Len;near unsigned char i;near unsigned int T2_Buffer ;near union int Word ; unsigned char Byte2 ;Byte2Word ;#pragma udatachar ASCII_StringT110;char ASCII_StringT210;#pragma romdata RomDataconst rom char LCD_ROM_MSG1 =T1=;/const rom char LCD_R
12、OM_MSG2 =T2=;#pragma interrupt MyHighInt #pragma code high_vector = 0x0008void high_direct(void) _asm /begin in-line assembly goto MyHighInt /go to isr_high function _endasm /end in-line assembly#pragma interruptlow MyLowInt #pragma code low_vector = 0x0018void low_direct(void) _asm /begin in-line a
13、ssembly goto MyLowInt /go to isr_high function _endasm /end in-line assembly#pragma code/start code herevoid MyHighInt(void) ;void MyLowInt(void) if(PIR1bits.TMR1IF=1) TMR1H=timer1H; TMR1L=timer1L; / Reload 0.1 Second value to Timer1 PIR1bits.TMR1IF=0; / Clear t flag of Timer 1 cp+; if( cp9 ) cp=0;
14、dt0+; /second + if(dt059) /满1分钟? dt0=0; dt1+; if(dt159)/ 满1小时? dt1=0; dt2+; if( dt223 ) / 满1天? dt2=0; dt3+; if(dt5%4=0|dt5%400=0)/判断是否是闰年 daylimit=days1k; / 满1月? else daylimit=daysk; if(dt3(daylimit-1) dt3=0; dt4+; if(dt411) /满一年? dt4=0; dt5+; LCD_Set_Cursor(1,7); WriteDataLCD(dt5/10+0x30) ; WriteDa
15、taLCD(dt5%10+0x30) ; /显示年 LCD_Set_Cursor(1,10); WriteDataLCD(dt4/10+0x30) ; WriteDataLCD(dt4%10+0x30) ; /显示月 LCD_Set_Cursor(1,13); WriteDataLCD(dt3/10+0x30) ; WriteDataLCD(dt3%10+0x30) ; /显示日 LCD_Set_Cursor(0,0); WriteDataLCD(dt2/10+0x30) ; WriteDataLCD(dt2%10+0x30) ; /显示时 LCD_Set_Cursor(0,3); Write
16、DataLCD(dt1/10+0x30) ; WriteDataLCD(dt1%10+0x30) ; /显示分 LCD_Set_Cursor(0,6); WriteDataLCD(dt0/10+0x30) ; WriteDataLCD(dt0%10+0x30) ; /显示秒 timerflag_5s=1; void main(void) /=initialize the MCU=/ unsigned char usartcount; InitializePORT( ); InitializeINTs( ); InitializeAD( ); InitializeTMR1( ); Initial
17、ize_I2C_Master( ); InitializeUSART(); /初始化 alarm_value=30;/温度告警值初始值设定 select_change=&alarm_value; /指针设定 /=initialize the LCD=/ OpenLCD( ); LCD_Set_Cursor(0,0); WriteDataLCD(dt2/10+0X30) ; /send hour to LCD WriteDataLCD(dt2%10+0X30) ; WriteDataLCD(:); WriteDataLCD(dt1/10+0X30) ; /send minute to LCD W
18、riteDataLCD(dt1%10+0X30) ; WriteDataLCD(:); WriteDataLCD(dt0/10+0X30) ; /send second to LCD WriteDataLCD(dt0%10+0x30) ; LCD_Set_Cursor(0,9); /send status to LCD WriteDataLCD(w) ; LCD_Set_Cursor(0,11); WriteDataLCD(!); /send alarm_value to LCD WriteDataLCD(alarm_value/10+0x30) ; WriteDataLCD(alarm_va
19、lue%10+0x30) ; putcLCD(0xDF); / Add degree symbol putcLCD(C); LCD_Set_Cursor(1,0); putrsLCD(LCD_ROM_MSG1); /send T1= to LCD LCD_Set_Cursor(1,8); dt3=1; dt4=2; dt5=11; while(1) if (timerflag_5s=1) timerflag_5s=0; LCD_Temp_Update() ; / 更新温度值 send_temperature(); /发送数据 key_response(); alarm_response();
20、void LCD_Temp_Update (void) /* Display TC74-A7 Temperature on LCD */ LCD_Set_Cursor(1,3); Byte2Word.Word = Read_TC74_Temperature( ); / Get Current Temperature form TC74-A7 T2_Buffer=Read_TC74_Temperature(); if ( Byte2Word.Byte1 = 0 ) btoa(Byte2Word.Byte0,ASCII_StringT1); / Convert Temp. Hax to ASCII
21、 string putsLCD(ASCII_StringT1); / Print to LCD putcLCD(0xDF); / Add degree symbol else if ( Byte2Word.Byte1 = -1 ) / Read fail from TC74-A7, Display - on LCD putcLCD(-) ; putcLCD(-) ; void alarm_response(void) if (T2_Buffer)=alarm_value) /TC74温度值超过告警值时报警 PORTCbits.RC2=1; /开蜂鸣器 PORTDbits.RD7=1; /点LE
22、D D8 else PORTCbits.RC2=0; /观蜂鸣器 PORTDbits.RD7=0; /关 LED D8 void send_temperature(void) unsigned char usartcount;/=send the time to PC=/ WriteUSART(dt2/10+0x30) ; Delay1KTCYx(4) ; WriteUSART(dt2%10+0x30) ;/ send hour Delay1KTCYx(4) ; WriteUSART(:); Delay1KTCYx(4) ; WriteUSART(dt1/10+0x30) ; Delay1KT
23、CYx(4) ; WriteUSART(dt1%10+0x30) ;/ send minute Delay1KTCYx(4) ; WriteUSART(:); Delay1KTCYx(4) ; WriteUSART(dt0/10+0x30) ; Delay1KTCYx(4) ; WriteUSART(dt0%10+0x30) ;/ send second Delay1KTCYx(4) ;/=send double space to PC=/ WriteUSART( ); Delay1KTCYx(4) ; WriteUSART( ); Delay1KTCYx(4) ;/=send TC74-A7
24、 Temperature to PC=/ usartcount=0; while(LCD_ROM_MSG1usartcount) WriteUSART(LCD_ROM_MSG1usartcount+); Delay1KTCYx(4) ; usartcount=0; while(ASCII_StringT1usartcount) WriteUSART(ASCII_StringT1usartcount+); Delay1KTCYx(4) ; /=send double space to PC=/ WriteUSART( ); Delay1KTCYx(4) ; WriteUSART( ); Delay1KTCYx(4) ;*键盘程序#inclu
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1