PIC18f452_LM35温度报警_MCP4725正弦波发生器

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

单片机课程设计报告组长:组员:2016年9月12日目录一.设计任务与要求………………………………………………………………………二.220V转5V的三种方案对比……………………….…………………………………三.温度检测………………………………………………………………………1、设计方案……………………………..……………………………………………2、模块设计……………………………..……………………………………………3、代码设计……………………………..……………………………………………四.正弦波发生器…………………………………………………..………………………1、设计方案……………………………..……………………………………………2、模块设计……………………………..……………………………………………3、代码设计……………………………..……………………………………………五.实验心得………………………………………………..………………………………一.设计任务与要求1、PIC18F452的单片机最小系统:调试器下载、晶体振荡器、复位电路、LCD1602显示、4*4键盘;2、220V转5V的三种方案对比,列举在一张表中;3、以LM336、LM35组成传感器电路,测量外部温度,键盘可以设定高温报警、低温报警(扩展要求:设定值可以存储到外部24C02中);设定值与实际测量值,均可以在LCD中显示;4、以MCP4725设计一个正弦波发生器,频率10-50HZ可调节,步进1HZ;(实际测试指标尽量接近要求,允许有误差)二.220V转5V的三种方案对比开关电源稳压电源阻容电源原理开关电源是利用现代电力电子技术,控制开关管开通和关断的时间比率,维持稳定输出电压的一种电源,(1)电源变压器:降压(2)整流电路:交流变直流(3)滤波电路:得到平滑的直流电压(4)稳压电路:使输出的直流电压稳定工作原理是利用电容在一定的交流信号频率下产生的容抗来限制最大工作电流分类线性稳压器、开关稳压器、充电泵按整流电路分:半波整流、桥式整流按整流电路分:半波整流、全波整流组成开关电源一般由脉冲宽度调制(PWM)控制IC和MOSFET构成电源变压器整流电路滤波电路稳压电路降压电容器、半波整流二极管、稳压二极管、电阻优点高效率,宽电压输入范围低功率耗散,提供隔离(利用变压器)低噪声,低纹波,良好的负载调整率,高稳定度,高准确度。低成本取得非隔离的小电流电源。它的输出电压通常可在几伏到三几十伏缺点瞬态响应慢,加大设计难度,较高的输出纹波和噪声效率低电容降压式电源是一种非隔离电源,在应用上要特别注意隔离,防止触电。三、温度检测1、设计方案用LM35温度传感器检测温度,输入单片机,经过AD转换,显示到LCD显示屏。通过4*4矩阵键盘设定最高温度、最低温度,将检测到的温度值与设定温度比较,超过范围则蜂鸣器响起报警。2、模块设计1)4*4矩阵键盘的设计键盘需用到k1~k10作为0~9数字输入,k15作为复位,k16作为开始。键开关状态的可靠输入:如果检测到有按键按下时,延时5到10ms进行消除按键抖动,再确认该键电平是否仍保持闭合状态电平,如保持闭合状态电平则确认为真正键按下状态,从而消除了抖动影响。在这种行列式矩阵键盘非编码键盘的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。当确认有按键按下后,下一步就要识别哪一个按键按下。我们使用的是逐行扫描查询法。按键部分由两种按键组成,一种是等待按键(除非有按键按下,否则等待按键);另一种是无需等待按键;前者用于输入温度和时间,后者用于判断完后的重新循环按键。2)、LCD1602液晶显示的设计温度显示工作原理:LCD1602可以采用两种方式与单片机连接,一种是采用8位数据总线D0—D7,和RS、R/W、EN三个控制端口;另一种是只用D4-D7作为四位数据分两次传送。本实验将使用并采用八位数据方式来控制1602显示。进行LCD设计主要是LCD的控制/驱动和外界的接口设计。控制主要是通过接口与外界通信、管理内/外显示RAM,控制驱动器,分配显示数据;驱动主要是根据控制器要求,驱动LCD进行显示。控制器还常含有内部ASCII字符库,或可外扩的大容量汉字库。内部引线已经连接好,不用外接杜邦线。3)LM35温度传感器的设计PIC18F452内置的是10位A/D转换器,但是一次只能读入8位,故要用到两个存储空间,根据采用A/D转换后结果的对齐方式不同而有不同的读取方法,一般是采用右对齐的。在程序运行时,LM35温度传感器从零摄氏度输出零伏起每升高一摄氏度输出增加10mV。由LM35温度传感器输入的电压经过A/D转换成10位的数字量转换成实际的电压值,并将实际的电压值的各个位分开装入显示缓冲区。转换后的数字量为0--1023,而我们所需要的温度为0--100,这里有一个换算的过程,将AD转换而来的结果整除10,这样得到的结果刚好在0--100内。然后将转换的结果显示在LCD上。测量电压与编码值的关系式:1023XVxVref4)24C02的应用利用I2C进行对EEPROM进行写操作和读操作,将每次我们设定好的最高温度、最低温度,检测周期写入EEPROM,然后在每次上电复位时,将上一次存入的值显示为初始值,这样可以对上一次的操作保留记忆。写操作必须要写入器件地址、存储区地址、存储的内容。5)、蜂鸣器报警如果当前温度超过最高设定或者低于最低设定,LED灯会闪烁进行报警。程序设计中用的是RB0接蜂鸣器,当达到条件时,蜂鸣器开始鸣叫。3、代码设计#includep18f452.h#includedelays.h#includeadc.h/*RB0接CN11-2蜂鸣器RB1接CN11-3SCLRB2接CN11-4SDARC0~RC7接CN18-0~7键盘RB3~RB5LCDRA0AD*///宏定义#defineRB0PORTBbits.RB0#defineRSPINPORTBbits.RB5//DataorInstrumentSelect#defineRWPINPORTBbits.RB4//WriteorRead#defineEPINPORTBbits.RB3//6800modeEnablesingle#defineSCLPORTBbits.RB1//SDA#defineSDAPORTBbits.RB2//SCL#defineRC0PORTCbits.RC0#defineRC1PORTCbits.RC1#defineRC2PORTCbits.RC2//全局变量unsignedcharL=0,H=0,T=0,N=0;//定义高H低L温度T及实时温度的编写符号unsignedinta;//a为AD读出值unsignedintt=10;unsignedintTimeout;intflag;intresult;intxh;//函数声明voidInterruptHandlerHigh(void);////按键的识别码和编入码romunsignedcharASC[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};romunsignedcharKEYCODE[]={0XEE,//00XDE,//10XBE,//20X7E,//30XED,//40XDD,//50XBD,//60X7D,//70XEB,//80XDB,//90XBB,0X7B,0XE7,0XD7,0XB7,//14重置按键0X77,//15输入完成后开始信号};Delay(){unsignedcharp;for(p=0;p100;p++);}Delayus(){unsignedcharq;for(q=0;q10;q++);}//IIC部分voidIICstart(void){SDA=1;//先将SDA=1,以准备在SCL=1时,将SDA=0SCL=1;//时钟总线拉高Delay();//调用延时函数,略作延时SDA=0;//SCL=1时,将SDA拉低即产生启动信号Delay();//调用延时函数,略作延时SCL=0;//将SCL=0,完成启动信号操作Delay();//调用延时函数,略作延时}//---------------------------------------//名称:IIC停止信号函数//---------------------------------------voidIICstop(void){SDA=0;//先将SDA=0,以准备在SCL=1时,将SDA=1SCL=1;//时钟总线拉高Delay();//调用延时函数,略作延时SDA=1;//SCL=1时,将SDA拉高即产生停止信号Delay();//调用延时函数,略作延时SCL=0;//将SCL=0,完成启动信号操作Delay();//调用延时函数,略作延时}//---------------------------------------//名称:向IIC总线写入1个字节函数//---------------------------------------voidWrite1Byte(unsignedcharBuf1){unsignedchark;//1个字节要分8次写入,需要定义一个寄存器用来计数for(k=0;k8;k++)//做一个8次的循环,每次写入1位,需要写8次{if(Buf1&0x80)//从最高位开始写{SDA=1;//如果欲写入数据为1,就将数据线置1}else{SDA=0;//如果欲写入数据为0,就将数据线写0}Delayus();SCL=1;//时钟线做一个上升沿,将一位数据写入Buf1=Buf11;//数据左移一位,将下次要写入的位数据移到最高位Delayus();SCL=0;//将SCL=0,以准备通过上升沿将数据写入Delayus();}TRISBbits.TRISB2=1;//将RC4(SDA)设置为输入状态//Delayus();////从时序图中读出来感觉这一步爱是真正ACK给低电平的时候,好像这个延迟又不用给了SCL=1;//将SCL=1,做个上升沿准备读应答信号Delayus();SCL=0;//将SCL=0,结束应答信号读操作TRISBbits.TRISB2=0;//将RC4(SDA)恢复为输出状态}//名称:从IIC总线读入1个字节函数//---------------------------------------unsignedcharRead1Byte(void){unsignedchark;//1个字节要分8次读出,需要定义一个寄存器用来计数unsignedcharg=0;//定义一个寄存器用保存读出数据TRISBbits.TRISB2=1;//将RC4(SDA)设置为输入状态for(k=0;k8;k++)//做一个8次的循环,每次读入1位,需要读8次{g=g1;//数据左移一位,空出最低位以准备保存读入的一位数据SCL=1;//将SCL=1,做个上升沿准备读一位数据Delayus();Delayus();if(SDA==1)//读一位数据,并判断{g=g|0x01;//如果读入数据为1,就将接收缓冲区最低一位置1}else{g=g&0xfe;//如果读入数据为0,就将接收缓冲区最低一位写0}SCL=0;//SCL恢复为0,结束一位数据读操作Delayus();Delayus();}TRISBbits.TRISB2=0;//将RC4(SDA)恢复为输出状态returng;//将读入的一个字节返回}//---------------------------------------//名称:软件模拟IIC向AT24C02指定地址写一个字节函数//---------------------------------------voidWriteAT24C02(unsignedcharAddress,unsignedcharDatabuf){//直接调用本函数即可对AT

1 / 29
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功