PIC课程设计专业:电子信息工程班级:12电子(3)姓名:王伟_______学号:2012329600173指导教师:陈科__________2014年7月5日1、设计要求以PIC18F452为核心,实现以下程序功能:(1)、4*4键盘设定,最高温度,最低温度限制;(2)、1602液晶显示当前温度,最高温度,最低温度限制值;(3)、LM20模拟温度传感器输入;(4)、24C02存储最高温度,最低温度限制值;(5)、温度检测周期在1-60秒可调,步进1秒;默认5秒;2、系统的组成及工作原理2.1系统框图2.2工作原理(1)、总体设计思想本设计是以PIC18F452单片机作为控制核心,以LM20模拟温度输入。首先通过4*4矩阵键盘设定一个最高温度和最低温度作为报警器报警的条件,然后单片机通过实时监控温度的变化,通过LCD1602字符型液晶显示各节点温度的数值,当温度值超出所设定的值时,报警器开始报警,从而实现对整个温度系统的管理和控制。这种温度测量系统具有成本低廉、传感精度高、系统稳定、易于管理等优点。(2)、各模块设计控制器1602液晶4*4键盘24C02LM201)、4*4矩阵键盘的设计根据设计任务书中要求实现的功能,我选择了一个4*4矩阵键盘来设置温度的上、下限值,此键盘设计符合系统设置要求,所以我选择此键盘完成本设计。①矩阵键盘结构:键盘实际上是一组按键开关的集合,平时按键开关总是处于断开状态,当按下键时它才闭合。键盘结构能够有效的提高单片机系统中I/O口的利用率。它的结构和产生的波形如图2-4所示。图2-4键盘结构及产生的波形图单片机应用系统中除了复位按键有专门的复位电路,以及专一的复位功能外,其它的按键或键盘都是以开关状态来设置控制功能或输入数据。键开关状态的可靠输入:为了去抖动我采用软件方法,它是在检测到有键按下时,执行一个20ms的延时程序后,在按键放开时,再执行一个20ms的延时程序。再确认该键电平是否仍保持闭合状态电平,如保持闭合状态电平则确认为真正键按下状态,从而消除了抖动影响在这种行列式矩阵键盘非编码键盘的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。当确认有按键按下后,下一步就要识别哪一个按键按下。对键的识别通常有两种方法:一种是常用的逐行扫描查询法;另一种是速度较快的线反转法。本次课程设计运用扫描法来进行按键设定。键盘共有16个按键,用于方便设定温度。表5-1键盘的按键分布2)、LCD1602液晶显示的设计温度显示工作原理:LCD1602可以采用两种方式与单片机连接,一种是采用8位数据总线D0—D7,和RS、R/W、EN三个控制端口;另一种是只用D4-D7作为四位数据分两次传送。本实验将使用并采用八位数据方式来控制1602显示。进行LCD设计主要是LCD的控制/驱动和外界的接口设计。控制主要是通过接口与外界通信、管理内/外显示RAM,控制驱动器,分配显示数据;驱动主要是根据控制器要求,驱动LCD进行显示。控制器还常含有内部ASCII字符库,或可外扩的大容量汉字库。3)、LM20温度传感器的设计LM20模拟温度输入,存在一个模拟量从数字量转变的过程,转换公式可上网查阅资料获得。4)、24C02的应用由于整个设计过程都在以仿真方式进行,最终没有实现用24C02读取和存P2.0789设定最高P2.1456设定最低P2.2123设定时间P2.3DOT0OKRSTP2.4P2.5P2.6P2.7储的功能,有些遗憾。5)、LED灯报警如果当前温度超过最高设定或者低于最低设定,LED灯会闪烁进行报警。这方面功能实现较为简单。3、程序清单#includep18f452.h#includeadc.h#includedelays.h#includemath.h#includeI2C.h#pragmaconfigOSC=HS#pragmaconfigWDT=OFF#pragmaconfigLVP=OFF#defineP1PORTBbits.RB4#defineP2PORTBbits.RB5#defineP3PORTBbits.RB6#defineP4PORTBbits.RB7#defineRSPINPORTCbits.RC7//DataorInstrumentSelect#defineRWPINPORTCbits.RC6//WriteorRead#defineEPINPORTCbits.RC5//6800modeEnablesingle#defineRST11#defineDOT10#defineHIGH12#defineLOW13#defineSET_TIME14#defineNOP-1#defineOK15#defineNOW16#defineFIRST_WRITE0x17;#defineSLAVE_ADDRESS0xa0doublehigh=0,low=0,now=0,time_sec=0;inttemp=0;intnum[4][4]={7,8,9,HIGH,4,5,6,LOW,1,2,3,SET_TIME,DOT,0,OK,RST};intP1_();intP2_();intP3_();intP4_();intgetinput();intcommand(intcom);doublesetparam();voidad_init();doubleget_temp();voidLED_yellow(inttemp);voidprint_LCD();voidinit_LCD();intstring(intx,inty,char*str);voiddelayms(intms);voidlcd_write_com(unsignedcharcombuf);voidlcd_wait_busy(void);voidlcd_write_com_busy(unsignedcharcombuf);voidlcd_write_data(unsignedchardatabuf);voidlcd_write_address(unsignedcharx,unsignedchary);voidlcdreset(void);voidlcd_write_char(unsignedcharx,unsignedchary,unsignedcharbuf);voidinit_timer0();voidInterruptHandlerHigh(void);voidnum_print(intposition,doubletemp);voidselect(intposition);voidselect_clear(intposition);voidIIC_init();voidsave();voidload();voidmain(){inti=1,ax=0,ay=0,com;intdis;TRISB=0xf0;PORTB=0xff;command(RST);ad_init();init_LCD();//IIC_init();init_timer0();now=get_temp();////load();while(1){com=getinput();command(com);if((nowhigh)||(nowlow))LED_yellow(1);elseLED_yellow(0);}}voidinit_timer0(){INTCON=0x20;//disableglobalandenableTMR0interruptINTCON2=0x84;//TMR0highpriorityRCONbits.IPEN=1;//enableprioritylevelsTMR0H=0;//cleartimerTMR0L=0;//cleartimerT0CON=0x82;//setuptimer0-prescaler1:8INTCONbits.GIEH=1;//enableinterruptsTRISA&=~0x02;}intstring(intx,inty,char*str){while(*str!='\0'){lcd_write_char(x,y,*str);str++;}}voidinit_LCD(){TRISC=0B00011111;//RC5-7设置为输出TRISD=0B00000000;//RD设置为输出lcdreset();//复位1602}voidprint_LCD(){lcd_write_char(0,0,'H');lcd_write_char(1,0,':');num_print(HIGH,high);lcd_write_char(8,0,'L');lcd_write_char(9,0,':');num_print(LOW,low);lcd_write_char(0,1,'N');lcd_write_char(1,1,'O');lcd_write_char(2,1,'W');lcd_write_char(3,1,':');num_print(NOW,now);num_print(SET_TIME,2*time_sec);}voidad_init(){TRISA=0x01;}doubleget_temp(){intresult;doublead_result;OpenADC(ADC_FOSC_32&ADC_RIGHT_JUST&ADC_8ANA_0REF,ADC_CH0&ADC_INT_OFF);Delay10TCYx(5);//Delayfor50TCYConvertADC();//Startconversionwhile(BusyADC());//Waitforcompletionresult=ReadADC();//ReadresultCloseADC();//DisableA/DconverterNop();ad_result=result;ad_result=ad_result/1023*5;ad_result=sqrt(2.1962+(1.8639-ad_result)/3.88)*1000-1481.96;returnad_result;}voidLED_yellow(inttemp){if(temp==1){PORTA|=0x02;}else{PORTA&=~0x02;}}intP1_(){if(P1==0){delayms(20);if(P1==0){delayms(20);return0;}}delayms(20);return1;}intP2_(){if(P2==0){delayms(20);if(P2==0){delayms(20);return0;}}delayms(20);return1;}intP3_(){if(P3==0){delayms(20);if(P3==0){delayms(20);return0;}}delayms(20);return1;}intP4_(){if(P4==0){delayms(20);if(P4==0){delayms(20);return0;}}delayms(20);return1;}intgetinput(){inti=1,n=0,ax=0,ay=0;for(n=0;n4;n++){PORTB=~i;PORTB&=0x0f;i=i*2;if(i35){i=1;}elseif(P1_()==0){ay=0;returnnum[ax][ay];}elseif(P2_()==0){ay=1;returnnum[ax][ay];}elseif(P3_()==0){ay=2;returnnum[ax][ay];}elseif(P4_()==0){ay=3;returnnum[ax][ay];}ax++;}returnNOP;}intcommand(intcom){if((com10)&&(com16)){delayms(100);switch(com){caseHIGH:select(HIGH);high=setparam();selec