为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

智能电热水壶控制系统设计

2017-12-10 50页 doc 473KB 59阅读

用户头像

is_496339

暂无简介

举报
智能电热水壶控制系统设计智能电热水壶控制系统设计 2012年华中科技大学-ADI电子设计大赛文档 智能电热水壶控制系统设计 团队成员: 队长:薛浩洲 U200914397 队员:熊 博 U200914418 严 乐 U200914410 指导老师: 张林 曾喻江 2012年5月25日 1 2012年华中科技大学-ADI电子设计大赛文档 摘要:本论文设计介绍了ADuC7026为控制芯片,对电热水壶工作进行控制的 方法。通过电加热电路对水进行加热,并对水的温度进行采样,采样信号通过 DS18B20将数字量送入ARM,经微机处理后...
智能电热水壶控制系统设计
智能电热水壶控制系统设计 2012年华中科技大学-ADI电子设计大赛文档 智能电热水壶控制系统设计 团队成员: 队长:薛浩洲 U200914397 队员:熊 博 U200914418 严 乐 U200914410 指导老师: 张林 曾喻江 2012年5月25日 1 2012年华中科技大学-ADI电子设计大赛文档 摘要:本论文设计介绍了ADuC7026为控制芯片,对电热水壶工作进行控制的 。通过电加热电路对水进行加热,并对水的温度进行采样,采样信号通过 DS18B20将数字量送入ARM,经微机处理后,结合按键控制实现LCD显示,并可 实现对水的温度的控制和超过水温的报警系统。 关键词:ARM;温度控制;控制器 Abstract: The thesis introducts the method of use the ADuC7026 which is the control chip to control the work of kettle heat with electric energy. Through electric heated circle, the water will be heated, then sample the temperature of the water. The sampling signal will set the mimic to the system of ARM through DS18B20, after processed by the computer and controlled by the switch, it will be showed by LCD.At the same time, the system can control the temperature beyond the setting, the system of alarm will run. Keywords:ARM;Temperature control;Controller 2 2012年华中科技大学-ADI电子设计大赛文档 目 录 4 一、系统设计目标 ................................................................................................................................. 1. 基本设计目标 ............................................................................................................................ 4 2. 发挥与拓展 ................................................................................................................................ 4 二、系统设计与论证 ..................................................................................................................... 5 1. 系统方案选择与比较 ................................................................................................................ 5 2. 系统框图和方案描述 ................................................................................................................ 6 三、理论计算 ................................................................................................................................. 7 四、单元电路设计与功能实现说明 ................................................................................................... 12 1. 模块电路设计 .......................................................................................................................... 12 2. 流程图...................................................................................................................................... 17 3. 模块实现.................................................................................................................................. 18 4. 整体电路设计 .......................................................................................................................... 20 4.1 电路原理 ...................................................................................................................... 20 4.2 Pcb版图 ....................................................................................................................... 20 4.3 电路元器件清单 .......................................................................................................... 21 五、测试方案与测试结果 ................................................................................................................... 22 1. 测试方案.................................................................................................................................. 22 2. 测试仪器.................................................................................................................................. 22 3. 测试结果.................................................................................................................................. 22 六、收获和体会 ................................................................................................................................... 23 七、致谢............................................................................................................................................... 27 附录一:参考文献 ............................................................................................................................... 28 附录二:系统框图 ............................................................................................................................... 28 附录三:系统流程图 ........................................................................................................................... 28 附录四:系统源码清单 ....................................................................................................................... 30 1. 头文件:.................................................................................................................................. 30 2. 程序主体: .............................................................................................................................. 35 3 2012年华中科技大学-ADI电子设计大赛文档 一、系统设计目标 对于常规的电热水壶,只要接通电源,就开始加热,直到水沸腾后通过蒸汽来产生声音报警。这种设计有下面几个方面的不足:1(如水壶中没水,电源误接通时也会一直加热,容易引起事故。2(当只需要加热到沸点以下某一温度时,不能及时给出声音报警信号。3(当水加热沸腾后不能自动停止工作。而电热水壶是家家户户都用的,因此本设计具有广泛的应用价值。本课程设计要求完成一个电热水壶控制器的电路设计。用ADuC7026作为控制芯片,管理整个电热水壶的工作情况,构成了一个闭环控制系统。 具体来说,我们的智能电热水壶控制系统设计的目标是:产品化、人性化、智能化。首先,我们此次完成的作品是一个普通用户可以使用的产品,配套有产品使用。然后,我们努力做到使我们的产品能够想用户之所想,知用户之所需,这包括人机交互环节的友好性以及使用过程中的流畅性。最后,在实现以上目标以后精益求精,依赖算法的不断完善,提高测量精度,增强算法的功能,实现产品的智能化。详细设计目标见下: 1. 基本设计目标 1) 控制加热 2) 温度实时显示 3) 烧沸断电 4) 任意温度保温 5) 蜂鸣提示 2. 发挥与拓展 1) 红外远距离控制 2) 傻瓜烧水模式和智能烧水模式之间的切换 3) 按键近距离控制 4) 开始工作时间预设定 5) 期望温度预设定 4 2012年华中科技大学-ADI电子设计大赛文档 6) 倒计时显示 7) 工作时间实时显示 8) 烧水过程中任意时刻重新设定 9) 工作状态指示灯 10) 产品化外包装 11) 其他功能与性能。 二、系统方案设计与论证 1. 系统方案选择与比较 拿到题目后我们团队首先很快提出了两套方案: 方案一:采用功率电子器件控制电热水壶主电路。具体采用IGBT或其他类似功能的电力电子器件串联在热水壶供电线路中,并将电力电子器件的控制端连接芯片的输出管脚。通过程序给输出管脚置高低不同电平,实现电热水壶供电线路的导通与断开,从而控制电热水壶的工作状态。 优点:环境适应能力强,可以承受大功率电器,产品寿命长等; 缺点:强直流供电需要对220V交流进行整流,电路复杂等。 方案二:采用电磁继电器作为电热水壶主电路的开关。同样,将电磁继电器串接入电热水壶供电线路的火线上,并且弱电控制部分接入芯片的输出管脚。通过程序的判断来输出高低电平,配合采用上拉电压及三极管控制电磁继电器的吸合与断开,控制电热水壶供电线路的导通与否,从而控制电热水壶的工作状态。 优点:强弱电分离,直接用220V交流供电,电路简单等; 通过对以上两套方案进行比较,考虑具体实现时的难度,结合我们设计的目标,我们团队则更倾向于第二套方案。第二套方案中,采用电磁继电器实现电路控制和强弱电的分离。此方案中电路简单易行,器件体积较小,方便我们产品化的设计。同时不需要对220V高压进行整流处理,减少了很多不必要的麻烦。 5 2012年华中科技大学-ADI电子设计大赛文档 2. 系统框图和方案描述 220V交流电源分出两路,一路通过电磁继电器和电热水壶相连接,电磁继电器处于交流电路的火线上,相当于开关;另一路通过220V交流转5V直流进行变压,提供5V直流电源,用来给最小系统板以及PCB外设板供电。与最小系统板相连接的还有温度传感器、输入输出外设、电磁继电器。温度传感器放置在电热水壶中,用来传回水壶中水的温度。通过输入的设定值与传感器返回温度值的比较、判断来控制输出端口状态,从而控制外设与电磁继电器,实现整体的智能控制。 其中,温度传感器使用DS18B20,输入设备有按键和红外,输出设备为液晶显示屏、指示灯、蜂鸣器等。 整体系统组成框图如下: 220V交流电磁继电器 电热水壶 电源 220V交流 温度传感器 ADuC7026 转5V直流 变压器 输入设备 输出设备 图2.1 系统组成框图 6 2012年华中科技大学-ADI电子设计大赛文档 三、理论分析计算 单元电路的设计多采用先在面包板上调试,实验通过以后再在PCB板上设定具体器件的参数,故外设电路中的电阻、电容等多采用经验值。设计的软件部分用到了PID算法,以精确控制温度,下面对此算法进行展开计算。 PID(Proportional Integral Derivative)控制是控制工程中技术成熟、应用广泛的一种控制策略,经过长期的工程实践,已形成了一套完整的控制方法和典型的结构。它不仅适用于数学模型已知的控制系统中,而且对于大多数数学模型难以确定的工业过程也可应用,在众多工业过程控制中取得了满意的应用效果。 PID 工作基理:由于来自外界的各种扰动不断产生,要想达到现场控制对象值保持恒定的目的,控制作用就必须不断的进行。若扰动出现使得现场控制对象值(以下简称被控参数)发生变化,现场检测元件就会将这种变化采集后经变送器送至PID 控制器的输入端,并与其给定值(以下简称SP 值)进行比较得到偏差值(以下简称e 值),调节器按此偏差并以我们预先设定的整定参数控制规律发出控制信号,去改变调节器的开度,使调节器的开度增加或减少,从而使现场控制对象值发生改变,并趋向于给定值(SP 值),以达到控制目的 ,如图 1 所示,其实PID 的实质就是对偏差(e 值)进行比例、积分、微分运算,根据运算结果控制执行部件的过程。 图3.1 模拟PID 控制系统原理图 PID 控制器的控制规律可以描述为: (1) 比例(P)控制能迅速反应误差,从而减小稳态误差。但是,比例控制不能消除稳态误差。比例放大系数的加大,会引起系统的不稳定。积分(I)控制的作用是:7 2012年华中科技大学-ADI电子设计大赛文档 只要系统有误差存在,积分控制器就不断地积累,输出控制量,以消除误差。因而,只要有足够的时间,积分控制将能完全消除误差,使系统误差为零,从而消除稳态误差。积分作用太强会使系统超调加大,甚至使系统出现振荡。微分(D)控制可以减小超调量,克服振荡,使系统的稳定性提高,同时加快系统的动态响应速度,减小调整时间,从而改善系统的动态性能。根据不同的被控对象的控制特性,又可以分为P、PI、PD、PID 等不同的控制模型。 数字PID 的实现 在连续-时间控制系统(模拟PID 控制系统)中,PID 控制器应用得非常广泛。其设计技术成熟,长期以来形成了典型的结构,参数整定方便,结构更改灵活,能满足一般的控制要求。随着计算机的快速发展,人们将计算机引入到PID 控制领域,也就出现了数字式PID 控制。 由于计算机基于采样控制理论,计算方法也不能沿袭传统的模拟PID 控制算法(如公式1 所示),所以必须将控制模型离散化,离散化的方法:以T 为采样周期,k 为采样序号,用求和的形式代替积分,用增量的形式(求差)代替微分,这样可以将连续的PID 计算公式离散: (2) 式1 就可以离散为: (3) 或者: (4) 这样就可以让计算机或者单片机通过采样的方式实现PID 控制,具体的PID 控8 2012年华中科技大学-ADI电子设计大赛文档 制又分为位置式PID 控制和增量式PID 控制,公式4 给出了控制量的全部大小,所以称之为全量式或者位置式控制;如果计算机只对相邻的两次作计算,只考虑在前一次基础上,计算机输出量的大小变化,而不是全部输出信息的计算,这种控制叫做增量式PID 控制算法,其实质就是求Δμ的大小,而 Δμk =μk -μk-1 ;所以将式4 做自减变换有: (5) 其中 温度控制PID 算法设计 本设计利用了上面所介绍的位置式PID 算法,将温度传感器采样输入作为当前输入,然后与设定值进行相减得偏差ek,然后再对之进行PID 运算产生输出结果fOut,然后让fOut 控制定时器的时间进而控制加热器。为了方便PID 运算,首先建立一个PID 的结构体数据类型,该数据类型用于保存PID 运算所需要的P、I、D 系数,以及设定值,历史误差的累加和等信息: typedef struct PID { float SetPoint; // 设定目标 Desired Value float Proportion; // 比例系数 Proportional Const float Integral; // 积分系数 Integral Const float Derivative; // 微分系数 Derivative Const int LastError; // 上次偏差 9 2012年华中科技大学-ADI电子设计大赛文档 int SumError; // 历史误差累计值 } PID; PID stPID; // 定义一个stPID 变量 下面是PID 运算的算法程序,通过PID 运算返回fOut,fOut 的值决定是否加热,加热时间是多少。 PID 运算的C 实现代码: float PIDCalc( PID *pp, int NextPoint ) { int dError,Error; Error = pp->SetPoint*10 - NextPoint; // 偏差,设定值减去当前采样值 pp->SumError += Error; // 积分,历史偏差累加 dError = Error-pp->LastError; // 当前微分,偏差相减 pp->PrevError = pp->LastError; // 保存 pp->LastError = Error; + pp->Integral * pp->SumError // 积分项 - pp->Derivative * dError // 微分项 ); } 在实际运算时,由于水具有很大的热惯性,而且PID 运算中的I(积分项)具有非常明显的延迟效应所以不能保留,我们必须把积分项去掉,相反D(微分项)则有很强的预见性,能够加快反应速度,抑制超调量,所以积分作用应该适当加强才能达到较佳的控制效果,系统最终选择PD 控制方案,下面C 代码所示为PD 控制的实现过程: float PIDCalc( PID *pp, int NextPoint ) { int dError,Error; 10 2012年华中科技大学-ADI电子设计大赛文档 Error = pp->SetPoint*10 - NextPoint; // 偏差,设定值减去当前采样值 dError = Error-pp->LastError; // 当前微分,偏差相减 pp->PrevError = pp->LastError; // 保存 pp->LastError = Error; return (pp->Proportion * Error // 比例项 - pp->Derivative * dError // 微分项 ); } 温度控制实现 通过温度的PID 运算,产生结果fOut,该参数决定是否加热,加热时间是多长。该程序如下: stPID.Proportion = 2; //设置PID 比例值 stPID.Integral = 0; //设置PID 积分值 stPID.Derivative = 5; //设置PID 微分值 fOut = PIDCalc ( &stPID,(int)(fT*10) ); //PID 计算 if(fOut<=0) *P_IOA_Buffer &= 0xff7f; //温度高于设定值,关闭加热器 else *P_IOA_Buffer |= 0x0080; //温度低于设定值,打开加热器 加热时间由主函数计算,由TimerB 中断控制。主程序中通过PIDCalc 函数得到fOut 参数,如果该参数大于“0”,则开启加热器。IRQ2_TMB 中断一直处于允许状态,每进入一次IRQ2_TMB 中断,fOut 参数减1,直到fOut = 0,停止加热。如果PIDCalc 计算结果比较大说明离目标温度相差较大,则加热时间比较长,如果计算结果比较小,说明离目标温度相差较小,加热时间相对较短。 11 2012年华中科技大学-ADI电子设计大赛文档 四、单元电路设计与功能实现说明 1. 模块电路设计 蜂鸣器模块: 图4.1 蜂鸣器模块控制电路图 蜂鸣器模块采用外接上拉电压以提供较大的驱动电流。通过芯片P0_1输出端口的高低控制三极管NPN1的导通或截止以驱动蜂鸣器。R1电阻限流使用。 当程序判断达到预设温度以后,输出端口置高,蜂鸣器工作,发出提示信号。当温度低于设定温度是,蜂鸣器则不工作。 12 2012年华中科技大学-ADI电子设计大赛文档 继电器模块: 图4.2 电磁继电器模块控制电路图 电磁继电器模块的控制电路图如图4.2所示,同样通过上拉5V高电平来提供较大的驱动电流。通过对输出端口P0_2的置高或置低,控制三极管NPN2的导通或者截止,进而使线圈的工作状态发生转换。继电器连接强电的两个触电为1和2(或3),通过线圈导通吸合可动触电1,控制火线的导通获断开,从而进行烧水的控制。 开关SW00控制P0_2输出端口是否控制三极管NPN2,从而实现傻瓜烧水模式和智能烧水模式之间的切换。 当开关拨到1、3相连时,继电器处于常闭状态,实现傻瓜烧水模式。当开关拨到1、2相连时,继电器的工作状态受P0_2端口的控制。通过程序判断,当温度达到设定值时,输出端口置高,三极管导通,线圈吸合触电,断开强电。 13 2012年华中科技大学-ADI电子设计大赛文档 温度传感器、红外接收头、电源模块: 图4.3 传感器、红外、电源模块电路图 其中,GET为红外接收头,TT为温度传感器,Battery为电源模块。 电源则是连接变压器整流后提供的5V直流电。温度传感器三个端口分别接VDDIO、GND和P2_7输入端口。红外接收头有两个端口连接VCC和GND,另一个输入端口连接P1_4 。 按键模块: 图4.4 按键模块电路图 通过四个按键可以对温度时间进行设定。按下按钮后,相应输入端口置高,四个输入端口通过或门组合进入中断,执行相应的中断程序。我们设计依次实现切换、加、减、确认功能。 14 2012年华中科技大学-ADI电子设计大赛文档 排针模块: 图4.5 排针模块电路图 我们一共设计了两处排针模块,分别是24*2和20*4 。两排的排针连接最小系统板上的对应的24*2的排针,目的是把芯片的对应端口引到PCB板上,方便连线的同时可以将我们自己设计的PCB板固定在最小系统板的上方,减小产品的体积。一排的排针连接液晶显示屏,用来控制液晶显示器的显示及固定液晶显示器之用。 15 2012年华中科技大学-ADI电子设计大赛文档 4输入或门模块: 图4.6 4输入或门模块电路图 或门模块用来组合四个按键的输入值,实现只要有一个按键按下,P1_5端口则输入高电平,让程序进入中断,再通过判断是哪一个按键被按下来实现相应的设定功能。 变压器模块: 图4.7 变压器模块电路图 变压器模块实现对220V交流的整流以输出5V直流,实现对最小系统板和PCB外设板供电的自给自足。 16 2012年华中科技大学-ADI电子设计大赛文档 开始 2. 流程图 是否设置 是 进入设置 否 倒计时 否 是否结束 是 烧开水 是 是否设置 否 设置 继续烧开水 否 是否达 到温度 是 蜂鸣器响 继电器断开 是 保温 是否结束 否 是 图4.8 整体流程图 结束 17 2012年华中科技大学-ADI电子设计大赛文档 3. 模块实现 蜂鸣器控制模块代码: /*************************************************************** * 功能:P0.1置位 ***************************************************************/ void BeepOn() { GP0SET |= (1<<17); } /*************************************************************** * 功能:P0.1清零 ***************************************************************/ void BeepOff() { GP0CLR |= (1<<17); } 继电器控制模块代码: /*************************************************************** * 功能:P0.2置位 ***************************************************************/ void RelayOn() { GP0CLR |= (1<<18); } /*************************************************************** * 功能:P0.2清零 ***************************************************************/ void RelayOff() { GP0SET |= (1<<18); } 中断处理模块代码: void IRQ_Handler(void) __irq { if((IRQSTA & (1<<3) ) != 0) //判断是否为Timer1 IRQ { CountTime(); T1CLRI = 0; T1LD = 0x350000; } if((IRQSTA & (1<<22)) != 0) //判断是否为按键中断 18 2012年华中科技大学-ADI电子设计大赛文档 { PauseTime(); CheckKey(); StartTime(); } if((IRQSTA & (1<<21)) != 0) //判断是否为红外中断 { PauseTime(); CheckIR(); HandleIR(); DelayMs(10); StartTime(); } return; } 按键处理模块代码: /*************************************************************** * 功能:检测按下哪个键 ***************************************************************/ void CheckKey() { //S1 按下 if( (GP0DAT & (1<<5) ) == (1<<5) ) { SwitchKey(); } //S2 按下 if( (GP0DAT & (1<<6) ) == (1<<6) ) { AddKey(); } //S3 按下 if( (GP1DAT & (1<<2) ) == (1<<2) ) { DecKey(); } //S4 按下 if( (GP1DAT & (1<<3) ) == (1<<3) ) { AckKey(); } DelayMs(100); } PID温度控制模块代码: float PIDCalc() { static int LastError = 70; // 上次偏差 19 2012年华中科技大学-ADI电子设计大赛文档 float Proportion = 2; // 比例系数 Proportional Const float Derivative = 5; // 微分系数 Derivative Const int dError,Error; Error = set_tmp - tmp; // 偏差,设定值减去当前采样值 dError = Error - LastError; // 当前微分,偏差相减 LastError = Error; return (Proportion * Error // 比例项 + Derivative * dError // 微分项 ); } 4. 整体电路设计 4.1 电路原理 图4.9 电路原理图 4.2 Pcb版图 根据原理电路图手工绘制PCB电路图,最终的印刷电路板如下图所示: 20 2012年华中科技大学-ADI电子设计大赛文档 图4.10 PCB电路图 4.3 电路元器件清单 表4.1 电路元器件清单 型号 数量 说明 S9013 2 NPN三极管 7 1KΩ 电阻 1 0.1uF 电容 4 轻触按键 长柄按钮 注11 24*2 排针1 注21 20*1 排针2 1 芯片74ls25 4输入或非门 1 开关 单刀双掷 1 蜂鸣器 响声 1 继电器 强电开关 1 DS18B20 温度传感器 HS0038A2 1 红外接收头 21 2012年华中科技大学-ADI电子设计大赛文档 注: 1、用于连接PCB扩展板与系统板;为满足相应封装的48脚连接线。 2、用于连接PCB扩展板与液晶显示器;为满足相应封装的20脚连接线。 五、测试方案与测试结果 1. 测试方案 通过温度计和我们的产品显示温度的同步对比,测量产品测定温度的准确性。对比使用PID算法前后对温度控制的精确度,不断完善温度测定的准确度。 2. 测试仪器 满足量程的温度计、产品的温度传感器 3. 测试结果 图5.1 烧水温度过程曲线 22 2012年华中科技大学-ADI电子设计大赛文档 六、收获和体会 说是为期十五周的ADI电子竞赛终于要在这周结束了。看着自己的成果,我们团队的队员们可以很骄傲地说:我们终于做成了~的确,经过了这难忘的十五周,我们终于完成了智能电热水壶控制系统的设计,并有了我们成型的产品。 回想这十五周里,我们从不懂到朦胧有些懂,直到最后彻底懂,全部的一个过程便是我们在相关方面学习成长的一个历程。作为队长,我想说:我们的团队是十分优秀的~我们有着编写了好几千行C程序的熊博,我们有着心灵手巧、善于创新设计的严乐,当然,作为团队的一员,通过不断的学习,我也完成了相应的任务,配合软件、外观的要求设计出了功能齐全,可塑性高的PCB板。最后的成果是对我们团队的肯定和鼓励。 看着队员们各自认真地研究自己分配的任务时,脑中便模糊已经有了我们最后能做成功的这样一个成品。熊博的软件功底过硬,严乐作为一个女生更是少不了细心周到,而对于什么都不懂的我来说,负责整块硬件方面的设计,着实是一项艰巨的任务~自己知道肩负的重任,自己从一开始便做好了努力去弥补自身知识储备不足的弱势。对于电路的学习,对于最小系统板的学习,对于设计软件的学习,一步步按部就班地去规划,去完善,并配合着试着去一步步做出点东西。就这样,我从一开始的一窍不通到后来的有点明白知道,直到最后的成功投板~感觉真的很神奇,只要你花时间了,只要你用功去做了,我发现任何事情都是可以做好的,尽管你以前有没有做过类似的事~当然,过程中也会遇到打击。有时想完成一个小小的点,很有可能思考一天都没有去解决好;有时由于设计的更新,可能一周要跑去两趟广埠屯咨询、学习;更有时一个BUG没有解决,从晚上调到第二天早上还没搞好,然后一整天睡不了觉„„太多的令人失望的回忆,现在想想有些真是太不应该,但毋庸置疑的是这一切对自己的成长、对自己的不断丰富都是有很大帮助的。而在设计PCB板子的过程中,我也掌握了一项本领,那便是对Altium designer的学习使用。从一开始的基本电路图,到后来的的整个电路的设计,直到最后的自己手动布线成功的PCB板的成功出台,期间的成就感真是与日俱增。而且,在设计基本电路的同时,自己也在不断去思索能不能多加些元器件,多实现一些小巧的功能。等全23 2012年华中科技大学-ADI电子设计大赛文档 部设计完了后才发现,我们的确有了很多附加的功能。很开心,自己画出了人生的第一块PCB板,可能布局不是最完美的,但自己真是十分喜欢。另外的一些工作就是与两位队员一起,设计外观和界面。这也花了我们不少的时间,方案也是被改了又改,直到最后一刻,我们才算统一了我们的设计思路,才有了一系列的赶工、熬夜。 这段过程无疑是开心的~我们在一起学习,在一起讨论,在一起吃饭,在一起聊天~当我们在一天天丰富自己的同时,我们的团队也在日益茁壮,我们之间的友谊更是与日俱增。当我们的工作室里笑声最爽朗的时刻,那一定使我们学有所成后放松一下的时段。有那么一阵子,我们每天很早就背着电脑,拿着水壶和各种混杂的器件来到启明学院,开始一天的工作。有时忘了吃饭,有时懒得吃饭,有时熬夜到很晚,有时累到趴下。也许并不是这门课程有多么困难,多么重要,我们只是想展示我们自己的智慧,我们只想完成我们的目标,我们想去多学习~相信这段成长的时光定会给我们留下些许美好的回忆,相信我们的所有付出都是十分值得的~ 最后,感谢我的团队每名队员的付出,也感谢在此过程中帮助过我们的老师和同学。青春岁月里有你们相伴,那边是最美好的展示~ 薛浩洲 电子课设心得(熊博): 为期15周的ADI电子竞赛,终于在我们组员的共同努力下,顺利的完成了结题,个人在其中从老师,学长,和队友的身上都学到了不少的东西。 本次课程设计任务中,我主要担任ARM开发的代码编写部分。大一自学单片机控制的时候,我零零散散的学过一些C语言硬件编程的知识。刚开始接到课设题目的时候,我开始了ARM控制的正式学习,所用的资料是《Aduc7026原理及应用》这本书。这本教程是自己在网上买的,书中的很多例程对自己都有很大的启发。通过这次系统的学习,才发现以前自己学习到的只是皮毛。在这次电子竞赛的压力之下,自己的硬件编程水平才有了质的提高。 下面就个人编程过程中遇到的一些问题和收获做一个简单的总结。首先说一下24 2012年华中科技大学-ADI电子设计大赛文档 ARM与单片机IO口操作上的差别,单片机中,我们可以直接给某一管脚赋值高电平,例如P0.2=1。而在ARM中,IO口的操作都是通过寄存器完成的,例如通过对GP0DAT赋值,但是这其中很容易存在重复赋值导致的问题,因为在将某一管脚置高时很可能就将其他的管脚置低。为此,要寻找一种方法,只对GP0DAT中的某一位改变的运算操作,我最后采用的运算方式如下:置1操作:GP0CLR |= (1<<18);置0操作:GP0DAT &= ~(1<<18);这样一来,就会保证在对某一位操作时,不会影响其他位的值。其次介绍一下中断控制方面的收获,由于自己是在Keil环境下编写整个工程,ARM中断刚开始一直有问题,程序始终不能进入中断中,后来在网上查资料才知道并不是程序的问题,而是Keil软件的设置不正确,通过这次的找错过程,我对中断的实现有了更深的认识。最后总结一下红外检测模块的调试过程,之前在上“计算机网络”课程的时候,我曾用单片机写过红外检测的程序,于是这次就直接想把它搬到ARM上用,但是程序读到的键码始终不对。然后想了想,觉得可能是延时不太对,由于是软件延时,不好直接计算准确的延时时间。于是,在延时程序后加入使管脚反向的代码,通过示波器测量电平变化之间的时间,就可以准确的得出延时的准确时间,通过反复的实验测量,最终顺利的读出正确的键码。通过这次,我明白了硬件测量在软件测试中的重要作用。 在代码编写的过程中,有一点是我自己比较自豪的,那就是代码的规范性,在开始编写之前,我上网查找了有关Keil软件编程的一些规范。也在自己的代码里得到了实现,这其中包括函数命名的规范,函数内变量命名的规范,函数间全局变量命名的规范,甚至是注释的规范。 通过这次课程设计,我对硬件编程有了更深的认识。非常感谢基地学长和老师对我的指导,谢谢~ 电子课设心得(严乐): 从竞赛题目布置下来到最终结题完稿,也历经了三个多月的时间。这么长的时间里,虽说有时候挺辛苦的,但最终回想起来,收获还是挺多的。下面就个人部分做点小小的总结。 因为之前没有在基地做项目的经验,所以,在拿到比赛题目后有点不知道如何25 2012年华中科技大学-ADI电子设计大赛文档 着手。好在团队里熊博同学在这方面比较有经验,我们组就组织了一次小型的交流会,讨论了各自对“智能电热水壶”的理解,及今后如何准备。之后,我们又约曾喻江老师,和他进行了更细致的交谈,交谈过程中,他和我们着重谈论了国外大学生在做比赛时的“产品化思想”,而我国学生在这方面的不足:只实现了功能,像一个模型,而没有产品化、生化话。此次交谈后,我们对自己的作品也有了一个初步的定位:产品化、智能化、人性化。这也是指导我们比赛准备的核心思想。 在确定了核心思想后,我们就开始准备自己的比赛题目了。根据个人的兴趣,我们小组对工作任务进行了合理的分工:熊博负责软件实现部分,薛浩洲负责电路部分,我主要负责机械设计部分(实现产品化)。分工明确后,我们各自便开始准备自己部分的工作。 因为机械设计部分主要在后期实现,所以前期我也协助薛浩洲同学完成了部分电路方面的工作——最小电路板的连线,继电器、蜂鸣器及红外接收头的电路设计。 我的重点部分是机械设计。刚开始,我并不知道我们应该怎样完成作品的封装。于是想到了利用以前金工实习时所学的铣床,利用编程实现。但询问后,他们说这个是不可能实现的,首先就是设备问题,学生基地这边没有,只能找外面做,这样经费太多。放弃这个想法后,薛浩洲提议用有机玻璃做,但是我觉得这样做出来的效果肯定是不好的,首先,它不美观;那样的话,就达不到最初产品化、人性化的要求了。在不知如何是好后,我向电工基地的老师求助,他在分析了我们现有材料后,建议我们去广埠屯买专门的封装盒,然后再根据自己板子的特点,进行人性化的界面设计。 经过挑选后,最终买来的封装盒是一个封闭的塑料盒,而且比我们的板子要高些、宽些、长些。将它进行加工,以完美的承载我们的电路板的工作就落在我身上啦~首先,我们的智能电热水壶是一个包含输入、输出的智能系统。那我就必须在封装盒适当的地方打孔、切割以使得我们的LCD显示屏能看得见,还有按键、开关、指示灯、温度传感器的线、插槽等等这些,且必须保证他们在确定的、恰当的、刚好的位置和大小。这个要求确实够难。于是我选用了最为精确的数字游标卡尺进行测量。为了防止出错,我先用空白的有机玻璃作为实验,这样实验了一块又一块的有机玻璃板后,我打算在封装盒上动工了。不过,谨慎的我还是去找机械的学长们26 2012年华中科技大学-ADI电子设计大赛文档 交流了一下,因为我觉得我在画直线时,我的线不够水平。于是他们向我推荐了一个更精确、更好用的测量工具——高度尺。高度尺确实是个好用的工具。简单方便,更重要的是精确、水平度好~画好线后,就要进行打孔、切割、打磨等工艺了。虽是第一次,但我很感兴趣,学得也很快。此外,对于封装盒过高、过长、过宽的问题,我是在下面量身定做了一个恰好的泡沫底板,将我们的电路板完美的固定住了。经过这么复杂的准备后结果怎样呢,可以看看我们最终的产品~ 大家看到的也许只是一个普普通通的封装盒,看起来也很简单,但要把它做好、做精确、做美观确实不易。我们现在展示的这个,实际上它是我第五次实践的结果。 有过困难,有过付出,留下更多的是收获。一路走来,我很感谢我当初选择了这次比赛,因为它真的让我学到了很多~ 在此,也非常感谢张林老师、曾喻江老师和赵鑫师兄对我的指导和帮助,谢谢~ 七、致谢 在本次课程设计的过程中,有很多同学、老师帮助过自己。无论是从硬件上的支持,还是精神上的鼓励,都让我们有了继续坚持的决心和勇气~在此,特别感谢我们的指导老师张林老师和我们班的任课老师曾喻江老师,离开了老师们的指导,我们很难完成这样的一次课程设计。同时,感谢那些在一起共同探讨、帮助,共同完成这样的一次课程设计的同学们~ 27 2012年华中科技大学-ADI电子设计大赛文档 附录一:参考文献 [1] 孙来军等(《ADuC7026原理与应用》(电子工业出版社,2009( [2] 谢晋雄等(《环境温度条件对电热水壶温升试验结果影响的试验研究》(检验检疫学刊,2010 ( [3] 许雪梅,何善亮(《水沸腾前水层的温度分布》(《现代物理知识》2004年第2期,2004( [4] 林祝亮等(《基于PID算法的家用电热水器恒温控制系统设计》(《仪器仪表学报》,2006 ( 其他一些网上搜索的零碎的资料和图片。 附录二:系统框图 系统整体组成框图 220V交流电磁继电器 电热水壶 电源 220V交流 温度传感器 ADuC7026 转5V直流 变压器 输入设备 输出设备 附录三:系统流程图 28 2012年华中科技大学-ADI电子设计大赛文档 开始 是否设置 是 进入设置 否 倒计时 否 是否结束 是 烧开水 是 是否设置 否 设置 继续烧开水 否 是否达 到温度 是 蜂鸣器响 继电器断开 是 保温 是否结束 否 是 结束 29 2012年华中科技大学-ADI电子设计大赛文档 附录四:系统源码清单 1. 头文件: 1) common.h #ifndef _COMMON_H_ #define _COMMON_H_ #include #include #include #endif 2) int.h #ifndef _INT_H_ #define _INT_H void IRQ_Handler(void) __irq; #endif 3) interface.h #ifndef _INTERFACE_H_ #define _INTERFACE_H_ extern int flash_time; void Display(void); void UpdateDisplay(void); #endif 4) io_ctrl.h #ifndef _IO_CTRL_H_ 30 2012年华中科技大学-ADI电子设计大赛文档 #define _IO_CTRL_H_ // IO口初始化函数 void IOInit(void); // 蜂鸣器使用P0.1控制 void BeepOn(void); void BeepOff(void); // 继电器使用P0.2和P0.3控制 void RelayOn(void); void RelayOff(void); #endif 5) ir.h #ifndef _IR_H_ #define _IR_H_ #define uchar unsigned char #define uint unsigned int extern int key_id; void IRInit(void); void beep(void); void CheckIR(void); void HandleIR(void); void SetNum(void); void CheckIR2(void); #endif 6) key.h #ifndef _KEY_H_ #define _KEY_H extern char flash; 31 2012年华中科技大学-ADI电子设计大赛文档 void KeyInit(void); void CheckKey(void); void SwitchKey(void); void AddKey(void); void DecKey(void); void AckKey(void); #endif 7) ocm12864.h #ifndef __OCM12864_H_ #define __OCM12864_H_ #include"..\\head\\ocm12864.h" typedef unsigned char uchar; typedef unsigned int uint; #define lcddata_out GP3DAT //P3 #define lcddata_in (char)(GP3DAT & 0x000000FF) #define LCD_DOUT_EN GP3DAT=(GP3DAT|0xFF000000) #define LCD_DIN_EN GP3DAT=(GP3DAT&0x00FFFFFF) #define set_rs() GP4DAT=(GP4DAT|0x01010000) //P4.0 A0 #define clear_rs() GP4DAT=(GP4DAT|0x01000000)&(~0x00010000) #define set_rw() GP4DAT=(GP4DAT|0x02020000) //P4.1 #define clear_rw() GP4DAT=(GP4DAT|0x02000000)&(~0x00020000) #define set_en() GP4DAT=(GP4DAT|0x04040000) //P4.2 #define clear_en() GP4DAT=(GP4DAT|0x04000000)&(~0x00040000) #define set_cs() GP4DAT=(GP4DAT|0x08080000) //P4.3 #define clear_cs() GP4DAT=(GP4DAT|0x08000000)&(~0x00080000) #define set_reset() GP4DAT=(GP4DAT|0x10100000) //P4.4 #define clear_reset() GP4DAT=(GP4DAT|0x10000000)&(~0x00100000) ////*****************//// ////*****函数声明****//// ////*****************//// void LCD_Delay(unsigned long v); void check_busy(void); void write_data(unsigned long dat); void write_command(unsigned long command); 32 2012年华中科技大学-ADI电子设计大赛文档 void reset(void); void clear_screen(uchar m); void lcd_initial(void); void set_page_address(uchar page); void set_colume_address(uchar colume); void disp_word(uchar col,uchar pag,uchar ascii); void disp_chn(uchar col,uchar pag,uchar ascii); void disp_str(uchar col,uchar page,uchar *cn); void setpoint(uchar x,uchar y); void point(uchar x,uchar y); void disp_bmp( uchar const *puts ); void shuxian(uchar n,uchar e,uchar f); void hengxian(uchar k); void delaynum(unsigned char num); void write_floatNum(uchar col,uchar pag,double x,char y); void disp_big_word(uchar col,uchar pag,uchar ascii); void write_BigNum(uchar col,uchar pag,float x,char y); void write_Num(uchar col,uchar pag,int x,char y); void disp_huge_word(uchar col,uchar pag,uchar ascii); void disp_huge_dot(uchar col,uchar pag); #endif 8) pid_ctrl.h #ifndef _PID_CTRL_H_ #define _PID_CTRL_H_ void ControlTmp(void); float PIDCalc(void); #endif 9) serial.h #ifndef _SERIAL_H_ #define _SERIAL_H_ void SerialInit(void); int PutChar(int); int GetChar (void); 33 2012年华中科技大学-ADI电子设计大赛文档 int Write (char *); #endif 10) tempetature.h #ifndef _TEMPERATURE_H_ #define _TEMPERATURE_H_ // 设置P2.7为输入,由于总线存在上拉电阻,所以此时是高电平1 #define PIN GP2DAT = 0x00 // 设置P2.7为输出,同时输出低电平0 #define POUT_0 GP2DAT = 0x80000000 // 设置P2.7为输出,同时输出高电平1 #define POUT_1 GP2DAT = 0x80800000 // 全局变量,温度的数值 extern float tmp; // 全局变量,温度的字符串 extern char tmp_str[7]; void DelayUs(int); void DelayMs(int); void SysClkInit(void); void TmpBusInit(void); unsigned char ReadTmpBus(void); void WriteTmpBus(unsigned char); void ReadTmp(void); void ConvertTmp(unsigned char, unsigned char); #endif 11) time.h #ifndef _TIME_H_ #define _TIME_H_ // 全局变量 设置的温度 extern int set_tmp; // 全局变量 设置的分钟 extern int set_min; 34 2012年华中科技大学-ADI电子设计大赛文档 // 全局变量 剩余秒 extern int remain_sec; // 全局变量 标志第几个阶段 extern char stage; void StartTime(void); void PauseTime(void); void CountTime(void); #endif 2. 程序主体: 1) main.c #include "head\\common.h" #include "head\\temperature.h" #include "head\\serial.h" #include "head\\ocm12864.h" io_ctrl.h" #include "head\\ #include "head\\interface.h" #include "head\\time.h" #include "head\\int.h" #include "head\\key.h" #include "head\\IR.h" #include "head\\pid_ctrl.h" #include "irq_arm.c" int main (void) { SysClkInit(); SerialInit(); IOInit(); GP3CON=0x00000000; GP4CON=0x00000000; lcd_initial(); StartTime(); KeyInit(); IRInit(); 35 2012年华中科技大学-ADI电子设计大赛文档 Display(); RelayOff(); while(1) { ReadTmp(); tmp += 5; UpdateDisplay(); switch (stage) { case 1: RelayOff(); break; case 2: RelayOff(); break; case 3: ControlTmp(); break; default: break; } } } 2) int.c /*********************************************************************** / /* */ /* int.c: 按键处理模块 */ /* */ /*********************************************************************** / #include "..\\head\\common.h" #include "..\\head\\int.h" #include "..\\head\\time.h" #include "..\\head\\io_ctrl.h" #include "..\\head\\key.h" #include "..\\head\\IR.h" 36 2012年华中科技大学-ADI电子设计大赛文档 #include "..\\head\\serial.h" #include "..\\head\\temperature.h" void IRQ_Handler(void) __irq { if((IRQSTA & (1<<3) ) != 0) //判断是否为Timer1 IRQ { CountTime(); T1CLRI = 0; T1LD = 0x350000; } if((IRQSTA & (1<<22)) != 0) { PauseTime(); CheckKey(); StartTime(); } if((IRQSTA & (1<<21)) != 0) { PauseTime(); CheckIR(); HandleIR(); DelayMs(10); StartTime(); } return; } 3) interface.c /*********************************************************************** / /* */ /* interface.c: 界面显示模块 */ /* */ /*********************************************************************** 37 2012年华中科技大学-ADI电子设计大赛文档 / #include "..\\head\\common.h" #include "..\\head\\interface.h" #include "..\\head\\temperature.h" #include "..\\head\\ocm12864.h" #include "..\\head\\time.h" #include "..\\head\\key.h" int flash_time = 1; /*************************************************************** * 功能:整体界面显示 ***************************************************************/ void Display() { // 显示“设定温度:” disp_chn(0,4,0); disp_chn(16,4,1); disp_chn(16*2,4,2); disp_chn(16*3,4,3); disp_word(4*16, 4, ':'); // 显示?(16*16) disp_chn(16*6, 4, 7); // 显示“设定时间:” disp_chn(0,6,0); disp_chn(16,6,1); disp_chn(16*2,6,4); disp_chn(16*3,6,5); disp_word(4*16, 6, ':'); // 显示 m 和 s disp_word(16*5+8, 6, 'm'); disp_word(16*7+8, 6, 's'); } /*************************************************************** * 功能:更新界面数据 ***************************************************************/ void UpdateDisplay() { 38 2012年华中科技大学-ADI电子设计大赛文档 disp_chn(16*6, 4, 7); // 更新当前温度 if(tmp < 100) { write_BigNum(16*1.25,0,tmp,3); disp_huge_word(16*4.75,0,58); } else { write_BigNum(16*0.75,0,tmp,4); disp_huge_word(16*5.25,0,58); } /***************更新设置的温度********************/ if(set_tmp < 100) { //* 闪烁显示*// if(flash == 1) { switch (flash_time) { case 1: disp_str(16*4+8 , 4, " "); disp_str(16*5 , 4, " "); flash_time = 0; break; case 0: disp_str(16*4+8 , 4, " "); write_Num(16*5 , 4, set_tmp, 2); flash_time = 1; break; } } else { disp_str(16*4+8 , 4, " "); write_Num(16*5 , 4, set_tmp, 2); } } else 39 2012年华中科技大学-ADI电子设计大赛文档 { //* 闪烁显示*// if(flash == 1) { switch (flash_time) { case 1: disp_str(16*4+8 , 4, " "); flash_time = 0; break; case 0: write_Num(16*4+8, 4, set_tmp, 3); flash_time = 1; break; } } else { write_Num(16*4+8, 4, set_tmp, 3); } } /***************更新倒计时分********************/ if (set_min >=10) { //*闪烁显示*// if(flash == 2) { switch (flash_time) { case 1: disp_str(4*16+8 , 6, " "); flash_time = 0; break; case 0: write_Num(4*16+8, 6, set_min, 2); flash_time = 1; break; } } else 40 2012年华中科技大学-ADI电子设计大赛文档 { write_Num(4*16+8, 6, set_min, 2); } } else { //*闪烁显示*// if(flash == 2) { switch (flash_time) { case 1: disp_str(4*16+8 , 6, " "); flash_time = 0; break; case 0: disp_word(4*16+8, 6, ' '); write_Num(5*16, 6, set_min, 1); flash_time = 1; break; } } else { disp_word(4*16+8, 6, ' '); write_Num(5*16, 6, set_min, 1); } } /***************更新倒计时秒********************/ if (remain_sec >=10) { write_Num(6*16+8, 6, remain_sec, 2); } else { disp_word(6*16+8, 6, ' '); write_Num(7*16, 6, remain_sec, 1); } 41 2012年华中科技大学-ADI电子设计大赛文档 } 4) io_ctrl.c /***********************************************************************/ /* */ /* io_ctrl.c: 蜂鸣器、继电器控制模块 */ /* */ /***********************************************************************/ #include "..\\head\\common.h" #include "..\\head\\io_ctrl.h" /*************************************************************** * 功能:初始化相应端口输出P0.1,P0.2设置为输出 ***************************************************************/ void IOInit() { GP0DAT |= (1<<25); GP0DAT |= (1<<26); } /*************************************************************** * 功能:P0.1置位 ***************************************************************/ void BeepOn() { GP0SET |= (1<<17); } /*************************************************************** * 功能:P0.1清零 ***************************************************************/ void BeepOff() { GP0CLR |= (1<<17); 42 2012年华中科技大学-ADI电子设计大赛文档 } /*************************************************************** * 功能:P0.2置位 ***************************************************************/ void RelayOn() { GP0CLR |= (1<<18); } /*************************************************************** * 功能:P0.2清零 ***************************************************************/ void RelayOff() { GP0SET |= (1<<18); } 5) ir.c /***********************************************************************/ /* */ /* IR.c: 红外按键处理模块 */ /* */ /***********************************************************************/ #include "..\\head\\common.h" #include "..\\head\\IR.h" #include "..\\head\\io_ctrl.h" #include "..\\head\\serial.h" #include "..\\head\\key.h" #include "..\\head\\time.h" #include "..\\head\\temperature.h" #include "..\\head\\interface.h" #define PHIGH (GP1DAT & 0x10 ) == 0x10 43 2012年华中科技大学-ADI电子设计大赛文档 #define PLOW (GP1DAT & 0x10 ) == 0x00 int key_id = 0; #define BOILTMP 100 /*************************************** 说明: IR初始化,使能红外外部中断 *****************************************/ void IRInit() { IRQEN |= (1<<21); GP1CLR |= (1<<4); GP0DAT |= (1<<27); } /*************************************** 说明: 蜂鸣器驱动 *****************************************/ void beep() { unsigned char i; for (i=0;i<100;i++) { DelayUs(100); GP0DAT ^= (1<<17); } BeepOff(); //关闭蜂鸣器 } /*************************************** 说明: 中断检测函数 *****************************************/ void CheckIR() { unsigned char j,k,N=0; char IRCOM[4] = {0}; // char key_code[2] = {0}; IRQCLR |= (1<<21); //关闭中断 // DelayUs(200); if (PLOW) //IR为0,则跳出 { // Write("IR = 0"); 44 2012年华中科技大学-ADI电子设计大赛文档 IRQEN |= (1<<21); return; } while (PHIGH) //等IR变为0,跳过9ms { // Write("9ms\n"); // DelayMs(1); } // Write("4.5ms\n"); while (PLOW) //等待IR { // DelayUs(1); } for (j=0;j<4;j++) //收集四组数据 { for (k=0;k<8;k++) //每组数据有8位 { while (PHIGH) //等IR变为0 { // DelayUs(1); } while (PLOW) //计算IR=0时长 { DelayUs(40); //100us GP0DAT ^= (1<<19); N++; if (N > 30){ IRQEN |= (1<<21); return; } //Write("Low TIME\n"); } //高电平计数完毕 //IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0” //if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1” if (N < 10){ IRCOM[j] |= (1<> 4; // for(j=0;j<2;j++) // { // if(key_code[j] > 9) // key_code[j] += 55; // else // key_code[j] += 48; // } // Write(key_code); // Write("\n"); if(IRCOM[2] == 0xB8) { key_id = 11; } if(IRCOM[2] == 0xBA) { key_id = 10; } if(IRCOM[2] == 0xBF) { key_id = 12; } if(IRCOM[2] == 0xBC) { key_id = 13; } if(IRCOM[2] == 0xF8) { 46 2012年华中科技大学-ADI电子设计大赛文档 key_id = 14; } if(IRCOM[2] == 0xEA) { key_id = 15; } if(IRCOM[2] == 0xF6) { key_id = 16; } if(IRCOM[2] == 0xE6) { key_id = 17; } if(IRCOM[2] == 0xF2) { key_id = 18; } if(IRCOM[2] == 0xE9) { key_id = 0; } if(IRCOM[2] == 0xF3) { key_id = 1; } if(IRCOM[2] == 0xE7) { key_id = 2; } if(IRCOM[2] == 0xA1) { key_id = 3; } if(IRCOM[2] == 0xF7) { key_id = 4; } if(IRCOM[2] == 0xE3) { key_id = 5; 47 2012年华中科技大学-ADI电子设计大赛文档 } if(IRCOM[2] == 0xA5) { key_id = 6; } if(IRCOM[2] == 0xBD) { key_id = 7; } if(IRCOM[2] == 0xAD) { key_id = 8; } if(IRCOM[2] == 0xB5) { key_id = 9; } beep(); IRQEN |= (1<<21); } /*************************************** 说明: 处理遥控器按键 *****************************************/ void HandleIR() { //即烧按键 if(key_id == 10) { Display(); stage = 3; set_min = 0; remain_sec = 0; set_tmp = BOILTMP; } //100?按键 if(key_id == 11) { set_tmp = BOILTMP; } //设置温度按键 48 2012年华中科技大学-ADI电子设计大赛文档 if(key_id == 14) { flash = 1; } //设置时间按键 if(key_id == 16) { flash = 2; } //加数字按键 if(key_id == 12) { AddKey(); } //减数字按键 if(key_id == 17) { DecKey(); } //确认按键 if(key_id == 15) { AckKey(); } //重新设置按键 if(key_id == 13) { stage =1; set_tmp = 100; Display(); } //清零按键 if(key_id == 18) { if(flash == 1) { set_tmp = 0; } if(flash == 2) { set_min = 0; 49 2012年华中科技大学-ADI电子设计大赛文档 } } //数字按键 if(key_id >= 0 && key_id <=9) { SetNum(); } } /*************************************** 说明: 快速设置数字 *****************************************/ void SetNum() { static int i=0; int temp[2]={0}; if(flash == 1) { temp[0]=set_tmp/10; //取十位 temp[1]=set_tmp%10; //取百位 //第一次按数字设定十位 if(i == 0) { temp[0] = key_id; } //第二次按数字设定个位 if(i == 1) { temp[1] = key_id; } set_tmp = 10*temp[0] + temp[1]; i++; if(i == 2) i=0; } if(flash == 2) { temp[0]=set_min/10; //取十位 temp[1]=set_min%10; //取百位 //第一次按数字设定十位 if(i == 0) { 50 2012年华中科技大学-ADI电子设计大赛文档 temp[0] = key_id; } //第二次按数字设定个位 if(i == 1) { temp[1] = key_id; } set_min = 10*temp[0] + temp[1]; i++; if(i == 2) i=0; } } 6) irq_arm.c /* Function Pointers for Interrupts */ typedef void (* tyVctHndlr) (void); tyVctHndlr IRQ = (tyVctHndlr)0x0; tyVctHndlr SWI = (tyVctHndlr)0x0; tyVctHndlr FIQ = (tyVctHndlr)0x0; tyVctHndlr UNDEF = (tyVctHndlr)0x0; tyVctHndlr PABORT = (tyVctHndlr)0x0; tyVctHndlr DABORT = (tyVctHndlr)0x0; //void IRQ_Handler (void) __irq; void SWI_Handler (void) __irq; void FIQ_Handler (void) __irq; void Undef_Handler (void) __irq; void PAbt_Handler (void) __irq; void DAbt_Handler (void) __irq; //void IRQ_Handler(void) __irq //{ // if ( *IRQ !=0x00) // { // IRQ(); // } // return; //} 51 2012年华中科技大学-ADI电子设计大赛文档 void FIQ_Handler(void) __irq { if ( *FIQ !=0x00) { FIQ(); } } void SWI_Handler(void) __irq { if ( *SWI !=0x00) { SWI(); } } void Undef_Handler(void)__irq { if ( *UNDEF !=0x00) { UNDEF(); } } void PAbt_Handler(void) __irq { if ( *PABORT !=0x00) { PABORT(); } } void DAbt_Handler(void) __irq { if ( *DABORT !=0x00) { DABORT(); } } 7) key.c 52 2012年华中科技大学-ADI电子设计大赛文档 /***********************************************************************/ /* */ /* key.c: 按键处理模块 */ /* */ /***********************************************************************/ #include "..\\head\\common.h" #include "..\\head\\key.h" #include "..\\head\\serial.h" #include "..\\head\\temperature.h" #include "..\\head\\time.h" char flash = 0; /*************************************************************** * 功能:使能按键中断 ***************************************************************/ void KeyInit() { // S1配置为输入 P0.5 GP0DAT &= ~(1<<29); // S2配置为输入 P0.6 GP0DAT &= ~(1<<30); // S3配置为输入 P1.2 GP1DAT &= ~(1<<26); // S4配置为输入 P1.3 GP1DAT &= ~(1<<27); IRQEN |= (1<<22); } 53 2012年华中科技大学-ADI电子设计大赛文档 /*************************************************************** * 功能:检测按下哪个键 ***************************************************************/ void CheckKey() { //S1 按下 if( (GP0DAT & (1<<5) ) == (1<<5) ) { SwitchKey(); } //S2 按下 if( (GP0DAT & (1<<6) ) == (1<<6) ) { AddKey(); } //S3 按下 if( (GP1DAT & (1<<2) ) == (1<<2) ) { DecKey(); } //S4 按下 if( (GP1DAT & (1<<3) ) == (1<<3) ) { AckKey(); } DelayMs(100); } /*************************************************************** * 功能:按下切换键 ***************************************************************/ void SwitchKey() { stage = 1; flash ++; if(flash == 3) { flash = 0; } } 54 2012年华中科技大学-ADI电子设计大赛文档 /*************************************************************** * 功能:增加键 ***************************************************************/ void AddKey() { if(flash == 1) { set_tmp += 5; if(set_tmp >= 100) { set_tmp = 10; } } if(flash == 2) { set_min += 5; if(set_min >= 100) { set_min = 0; } } } /*************************************************************** * 功能:减少键 ***************************************************************/ void DecKey() { if(flash == 1) { set_tmp --; if(set_tmp == 0) { set_tmp = 100; } } if(flash == 2) { set_min --; if(set_min == 0) 55 2012年华中科技大学-ADI电子设计大赛文档 { set_min = 99; } } } /*************************************************************** * 功能:确认键 ***************************************************************/ void AckKey() { remain_sec = 59; stage = 2; flash = 0; } ocm12864.c #include"..\\head\\ocm12864.h" #include "..\\head\\common.h" /*****将字符生产软件得到的每个汉字的32个字符依次存于tab表中*****/ /*****用PCtoLCD2002软件设置列行式和顺向输出得到对于汉字字符串*****/ /*-- 宋体16*16; 此字体下对应的点阵为:宽x高=16x16 --*/ const uchar tab[12*32]={ 0x02,0x02,0x42,0x33,0x00,0x02,0x05,0x79,0x41,0x41,0x41,0x79,0x05,0x04,0x04,0x00, 0x00,0x00,0x00,0xFC,0x09,0x11,0x02,0xC2,0x34,0x08,0x14,0x62,0x82,0x01,0x01,0x00,/*"设",0*/ 0x08,0x30,0x22,0x22,0x22,0x22,0xA2,0x63,0x22,0x22,0x22,0x22,0x22,0x28,0x30,0x00, 0x01,0x02,0x04,0x78,0x04,0x02,0x02,0xFE,0x22,0x22,0x22,0x22,0x22,0x02,0x02,0x00,/*"定",1*/ 0x08,0x06,0x40,0x31,0x00,0x00,0x7F,0x49,0x49,0x49,0x49,0x49,0x7F,0x00,0x00,0x00, 0x20,0x20,0x7E,0x80,0x02,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x02,0x00,/*"温",2*/ 56 2012年华中科技大学-ADI电子设计大赛文档 0x00,0x00,0x3F,0x24,0x24,0x24,0x3F,0xA4,0x64,0x24,0x3F,0x24,0x24,0x24,0x20,0x00, 0x02,0x0C,0xF1,0x01,0x21,0x32,0xAA,0xA4,0xA4,0xA4,0xAA,0x32,0x01,0x01,0x01,0x00,/*"度",3*/ 0x00,0x3F,0x21,0x21,0x21,0x3F,0x00,0x08,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x00, 0x00,0xFC,0x08,0x08,0x08,0xFC,0x00,0x00,0x80,0x60,0x02,0x01,0xFE,0x00,0x00,0x00,/*"时",4*/ 0x00,0x1F,0x80,0x60,0x00,0x0F,0x48,0x48,0x48,0x4F,0x40,0x40,0x40,0x7F,0x00,0x00, 0x00,0xFF,0x00,0x00,0x00,0xF8,0x88,0x88,0x88,0xF8,0x00,0x02,0x01,0xFE,0x00,0x00,/*"间",5*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*":",6*/ 0x00,0x00,0x18,0x15,0x1B,0x04,0x08,0x08,0x08,0x08,0x08,0x0C,0x1E,0x00,0x00,0x00, 0x00,0x00,0x00,0xE0,0xF8,0x0C,0x04,0x04,0x04,0x04,0x04,0x08,0x18,0x00,0x00,0x00,/*"?",7*/ 0x01,0x06,0x1F,0xE0,0x20,0x26,0x3A,0x23,0x26,0x22,0x00,0x1F,0x00,0xFF,0x00,0x00, 0x00,0x00,0xFF,0x00,0x04,0x46,0x44,0xF8,0x48,0x48,0x00,0xF2,0x01,0xFE,0x00,0x00,/*"倒",8*/ 0x02,0x02,0x42,0x33,0x00,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x02,0x00, 0x00,0x00,0x00,0xFE,0x04,0x08,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,/*"计",9*/ 0x00,0x00,0x47,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x7F,0x00,0x00,0x00,0x00, 0x00,0x00,0xFC,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x1E,0x00,0x00,/*"已",10*/ 57 2012年华中科技大学-ADI电子设计大赛文档 0x00,0x00,0x7F,0x44,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0x7F,0x00,0x00,0x00, 0x01,0x06,0xF8,0x40,0x40,0x40,0x40,0xFE,0x40,0x40,0x42,0x41,0xFE,0x00,0x00,0x00,/*"用",11*/ }; const uchar dian[32] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,/*".",0*/ } ; const uchar adj_page[]={7,6,5,4,3,2,1,0}; // 16*32大数字 const uchar BigNum[12*64] = { 0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x02,0x02,0x02,0x03,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x0F,0x7F,0xF0,0x80,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0x7F,0x0F,0x00, 0x00,0x00,0xF8,0xFF,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFF,0xF8,0x00, 0x00,0x00,0x00,0x00,0x80,0xC0,0x60,0x20,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0x00,/*"0",0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x20,0x20,0x20,0x60,0xE0,0xE0,0x60,0x20,0x20,0x20,0x00,0x00,0x00,/*"1",1*/ 0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x02,0x02,0x02,0x03,0x01,0x01,0x00,0x00,0x00, 58 2012年华中科技大学-ADI电子设计大赛文档 0x00,0x00,0x78,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0xFE,0x7C,0x00,0x00, 0x00,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x07,0x00,0x00, 0x00,0x00,0xE0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0xE0,0x80,0x00,0x00,/*"2",2*/ 0x00,0x00,0x00,0x01,0x01,0x02,0x02,0x02,0x02,0x03,0x01,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0xF0,0xF0,0x00,0x00,0x01,0x01,0x01,0x03,0x86,0xFC,0x78,0x00,0x00,0x00, 0x00,0x00,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xC0,0x7F,0x1E,0x00,0x00, 0x00,0x00,0x80,0xC0,0x40,0x20,0x20,0x20,0x20,0x20,0x40,0xC0,0x80,0x00,0x00,0x00,/*"3",3*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x01,0x06,0x0C,0x30,0x40,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, 0x00,0x08,0x38,0x48,0x88,0x08,0x08,0x08,0x08,0xFF,0xFF,0xFF,0x08,0x08,0x08,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0xF0,0xF0,0xF0,0x10,0x10,0x10,0x00,/*"4",4*/ 0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x00, 0x00,0x00,0x00,0x1F,0xE1,0x02,0x04,0x04,0x04,0x04,0x06,0x03,0x01,0x00,0x00,0x00, 0x00,0x00,0x07,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xFF,0x7E,0x00,0x00, 0x00,0x00,0x80,0x40,0x20,0x20,0x20,0x20,0x20,0x20,0x40,0xC0,0x80,0x00,0x00,0x00,/*"5",5*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x02,0x02,0x02,0x02,0x01,0x00,0x00,0x00, 0x00,0x00,0x07,0x3F,0x70,0x81,0x01,0x02,0x02,0x02,0x02,0x03,0xC1,0xC0,0x00,0x00, 0x00,0x00,0xFC,0xFF,0xC3,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x7E,0x00, 0x00,0x00,0x00,0x00,0x80,0xC0,0x60,0x20,0x20,0x20,0x20,0x40,0xC0,0x80,0x59 2012年华中科技大学-ADI电子设计大赛文档 00,0x00,/*"6",6*/ 0x00,0x00,0x00,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x00, 0x00,0x00,0xF0,0xC0,0x80,0x00,0x00,0x00,0x01,0x06,0x18,0x60,0x80,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"7",7*/ 0x00,0x00,0x00,0x00,0x01,0x03,0x02,0x02,0x02,0x02,0x03,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x78,0xFC,0x8E,0x07,0x03,0x01,0x01,0x01,0x01,0x86,0xFC,0x78,0x00,0x00, 0x00,0x1F,0x3F,0x60,0xC0,0x80,0x00,0x80,0x80,0xC0,0xE0,0x70,0x3F,0x1F,0x00,0x00, 0x00,0x00,0x80,0xC0,0x40,0x20,0x20,0x20,0x20,0x20,0x40,0xC0,0x80,0x00,0x00,0x00,/*"8",8*/ 0x00,0x00,0x00,0x01,0x01,0x02,0x02,0x02,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x3F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC1,0x7F,0x1F,0x00,0x00, 0x00,0x00,0x81,0xC1,0x60,0x20,0x20,0x20,0x20,0x40,0xC1,0x8F,0xFE,0xF0,0x00,0x00, 0x00,0x00,0xC0,0xC0,0x20,0x20,0x20,0x20,0x60,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,/*"9",9*/ 0x00,0x00,0x00,0x00,0x07,0x04,0x08,0x04,0x07,0x00,0x00,0x00,0x00,0x01,0x03,0x02, 0x06,0x06,0x04,0x04,0x04,0x04,0x02,0x02,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0x40,0x40,0x40,0x80,0x00,0x1F,0x7F,0xE0,0x80,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFC,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0xFF,0x07,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x60 2012年华中科技大学-ADI电子设计大赛文档 00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0x60, 0x30,0x30,0x30,0x30,0x30,0x20,0x20,0x60,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,/*"?",0*/ } ; // 8*16字符 const uchar ASCIIchardot[16*96]= { /* */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*! */ 0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCC,0x0C,0x00,0x00,0x00, /*" */ 0x00,0x08,0x30,0x60,0x08,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*# */ 0x02,0x03,0x1E,0x02,0x03,0x1E,0x02,0x00,0x20,0xFC,0x20,0x20,0xFC,0x20,0x20,0x00, /*$ */ 0x00,0x0E,0x11,0x3F,0x10,0x0C,0x00,0x00,0x00,0x18,0x04,0xFF,0x84,0x78,0x00,0x00, /*% */ 0x0F,0x10,0x0F,0x00,0x07,0x18,0x00,0x00,0x00,0x84,0x38,0xC0,0x78,0x84,0x78,0x00, /*& */ 0x00,0x0F,0x10,0x11,0x0E,0x00,0x00,0x00,0x78,0x84,0xC4,0x24,0x98,0xE4,0x84,0x08, /*' */ 0x08,0x68,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*( */ 0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00, /*) */ 0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00, /** */ 0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,0x40,0x40,0x80,0xF0,0x80,0x40,0x61 2012年华中科技大学-ADI电子设计大赛文档 40,0x00, /*+ */ 0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0xF8,0x80,0x80,0x80,0x00, /*, */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0D,0x0E,0x00,0x00,0x00,0x00,0x00, /*- */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80, /*. */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,0x00,0x00, /*/ */ 0x00,0x00,0x00,0x00,0x01,0x06,0x18,0x20,0x00,0x06,0x18,0x60,0x80,0x00,0x00,0x00, /*0 */ 0x00,0x07,0x08,0x10,0x10,0x08,0x07,0x00,0x00,0xF0,0x08,0x04,0x04,0x08,0xF0,0x00, /*1 */ 0x00,0x08,0x08,0x1F,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0xFC,0x04,0x04,0x00,0x00, /*2 */ 0x00,0x0E,0x10,0x10,0x10,0x11,0x0E,0x00,0x00,0x0C,0x14,0x24,0x44,0x84,0x0C,0x00, /*3 */ 0x00,0x0C,0x10,0x11,0x11,0x12,0x0C,0x00,0x00,0x18,0x04,0x04,0x04,0x88,0x70,0x00, /*4 */ 0x00,0x00,0x03,0x04,0x08,0x1F,0x00,0x00,0x00,0xE0,0x20,0x24,0x24,0xFC,0x24,0x00, /*5 */ 0x00,0x1F,0x10,0x11,0x11,0x10,0x10,0x00,0x00,0x98,0x84,0x04,0x04,0x88,0x70,0x00, /*6 */ 0x00,0x07,0x08,0x11,0x11,0x18,0x00,0x00,0x00,0xF0,0x88,0x04,0x04,0x88,0x70,0x00, /*7 */ 0x00,0x1C,0x10,0x10,0x13,0x1C,0x10,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00, /*8 */ 62 2012年华中科技大学-ADI电子设计大赛文档 0x00,0x0E,0x11,0x10,0x10,0x11,0x0E,0x00,0x00,0x38,0x44,0x84,0x84,0x44,0x38,0x00, /*9 */ 0x00,0x07,0x08,0x10,0x10,0x08,0x07,0x00,0x00,0x00,0x8C,0x44,0x44,0x88,0xF0,0x00, /*: */ 0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00, /*; */ 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x00,0x00,0x00,0x00, /*< */ 0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x00, /*= */ 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00, /*> */ 0x00,0x10,0x08,0x04,0x02,0x01,0x00,0x00,0x00,0x04,0x08,0x10,0x20,0x40,0x80,0x00, /*? */ 0x00,0x0E,0x12,0x10,0x10,0x10,0x0F,0x00,0x00,0x00,0x00,0x0C,0x6C,0x80,0x00,0x00, /*@ */ 0x03,0x0C,0x13,0x14,0x17,0x08,0x07,0x00,0xE0,0x18,0xE4,0x24,0xC4,0x28,0xD0,0x00, /*A */ 0x00,0x00,0x03,0x1C,0x07,0x00,0x00,0x00,0x04,0x3C,0xC4,0x40,0x40,0xE4,0x1C,0x04, /*B */ 0x10,0x1F,0x11,0x11,0x11,0x0E,0x00,0x00,0x04,0xFC,0x04,0x04,0x04,0x88,0x70,0x00, /*C */ 0x03,0x0C,0x10,0x10,0x10,0x10,0x1C,0x00,0xE0,0x18,0x04,0x04,0x04,0x08,0x10,0x00, /*D */ 0x10,0x1F,0x10,0x10,0x10,0x08,0x07,0x00,0x04,0xFC,0x04,0x04,0x04,0x08,0xF0,0x00, /*E */ 0x10,0x1F,0x11,0x11,0x17,0x10,0x08,0x00,0x04,0xFC,0x04,0x04,0xC4,0x04,0x18,0x00, 63 2012年华中科技大学-ADI电子设计大赛文档 /*F */ 0x10,0x1F,0x11,0x11,0x17,0x10,0x08,0x00,0x04,0xFC,0x04,0x00,0xC0,0x00,0x00,0x00, /*G */ 0x03,0x0C,0x10,0x10,0x10,0x1C,0x00,0x00,0xE0,0x18,0x04,0x04,0x44,0x78,0x40,0x00, /*H */ 0x10,0x1F,0x10,0x00,0x00,0x10,0x1F,0x10,0x04,0xFC,0x84,0x80,0x80,0x84,0xFC,0x04, /*I */ 0x00,0x10,0x10,0x1F,0x10,0x10,0x00,0x00,0x00,0x04,0x04,0xFC,0x04,0x04,0x00,0x00, /*J */ 0x00,0x00,0x10,0x10,0x1F,0x10,0x10,0x00,0x03,0x01,0x01,0x01,0xFE,0x00,0x00,0x00, /*K */ 0x10,0x1F,0x11,0x03,0x14,0x18,0x10,0x00,0x04,0xFC,0x04,0x80,0x64,0x1C,0x04,0x00, /*L */ 0x10,0x1F,0x10,0x00,0x00,0x00,0x00,0x00,0x04,0xFC,0x04,0x04,0x04,0x04,0x0C,0x00, /*M */ 0x10,0x1F,0x1F,0x00,0x1F,0x1F,0x10,0x00,0x04,0xFC,0x00,0xFC,0x00,0xFC,0x04,0x00, /*N */ 0x10,0x1F,0x0C,0x03,0x00,0x10,0x1F,0x10,0x04,0xFC,0x04,0x00,0xE0,0x18,0xFC,0x00, /*O */ 0x07,0x08,0x10,0x10,0x10,0x08,0x07,0x00,0xF0,0x08,0x04,0x04,0x04,0x08,0xF0,0x00, /*P */ 0x10,0x1F,0x10,0x10,0x10,0x10,0x0F,0x00,0x04,0xFC,0x84,0x80,0x80,0x80,0x00,0x00, /*Q */ 0x07,0x08,0x10,0x10,0x10,0x08,0x07,0x00,0xF0,0x18,0x24,0x24,0x1C,0x0A,0xF2,0x00, /*R */ 0x10,0x1F,0x11,0x11,0x11,0x11,0x0E,0x00,0x04,0xFC,0x04,0x00,0xC0,0x30,0x0C,0x04, /*S */ 0x00,0x0E,0x11,0x10,0x10,0x10,0x1C,0x00,0x00,0x1C,0x04,0x84,0x84,0x44,0x64 2012年华中科技大学-ADI电子设计大赛文档 38,0x00, /*T */ 0x18,0x10,0x10,0x1F,0x10,0x10,0x18,0x00,0x00,0x00,0x04,0xFC,0x04,0x00,0x00,0x00, /*U */ 0x10,0x1F,0x10,0x00,0x00,0x10,0x1F,0x10,0x00,0xF8,0x04,0x04,0x04,0x04,0xF8,0x00, /*V */ 0x10,0x1E,0x11,0x00,0x00,0x13,0x1C,0x10,0x00,0x00,0xE0,0x1C,0x70,0x80,0x00,0x00, /*W */ 0x1F,0x10,0x00,0x1F,0x00,0x10,0x1F,0x00,0xC0,0x3C,0xE0,0x00,0xE0,0x3C,0xC0,0x00, /*X */ 0x10,0x18,0x16,0x01,0x01,0x16,0x18,0x10,0x04,0x0C,0x34,0xC0,0xC0,0x34,0x0C,0x04, /*Y */ 0x10,0x1C,0x13,0x00,0x13,0x1C,0x10,0x00,0x00,0x00,0x04,0xFC,0x04,0x00,0x00,0x00, /*Z */ 0x08,0x10,0x10,0x10,0x13,0x1C,0x10,0x00,0x04,0x1C,0x64,0x84,0x04,0x04,0x18,0x00, /*[ */ 0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00, /*\ */ 0x00,0x30,0x0C,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x1C,0x03,0x00, /*] */ 0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00, /*^ */ 0x00,0x00,0x20,0x40,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*_ */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, /*` */ 0x00,0x40,0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /*a */ 65 2012年华中科技大学-ADI电子设计大赛文档 0x00,0x00,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x98,0x24,0x44,0x44,0x44,0xFC,0x04, /*b */ 0x10,0x1F,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0xFC,0x88,0x04,0x04,0x88,0x70,0x00, /*c */ 0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x00,0x00,0x70,0x88,0x04,0x04,0x04,0x88,0x00, /*d */ 0x00,0x00,0x00,0x01,0x01,0x11,0x1F,0x00,0x00,0x70,0x88,0x04,0x04,0x08,0xFC,0x04, /*e */ 0x00,0x00,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0xF8,0x44,0x44,0x44,0x44,0xC8,0x00, /*f */ 0x00,0x01,0x01,0x0F,0x11,0x11,0x11,0x18,0x00,0x04,0x04,0xFC,0x04,0x04,0x00,0x00, /*g */ 0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0xD6,0x29,0x29,0x29,0xC9,0x06,0x00, /*h */ 0x10,0x1F,0x00,0x01,0x01,0x01,0x00,0x00,0x04,0xFC,0x84,0x00,0x00,0x04,0xFC,0x04, /*i */ 0x00,0x01,0x19,0x19,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0xFC,0x04,0x04,0x00,0x00, /*j */ 0x00,0x00,0x00,0x01,0x19,0x19,0x00,0x00,0x00,0x03,0x01,0x01,0x01,0xFE,0x00,0x00, /*k */ 0x10,0x1F,0x00,0x00,0x01,0x01,0x01,0x00,0x04,0xFC,0x24,0x40,0xB4,0x0C,0x04,0x00, /*l */ 0x00,0x10,0x10,0x1F,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0xFC,0x04,0x04,0x00,0x00, /*m */ 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x04,0xFC,0x04,0x00,0xFC,0x04,0x00,0xFC, /*n */ 0x01,0x01,0x00,0x01,0x01,0x01,0x00,0x00,0x04,0xFC,0x84,0x00,0x00,0x04,0xFC,0x04, 66 2012年华中科技大学-ADI电子设计大赛文档 /*o */ 0x00,0x00,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0xF8,0x04,0x04,0x04,0x04,0xF8,0x00, /*p */ 0x01,0x01,0x00,0x01,0x01,0x00,0x00,0x00,0x01,0xFF,0x85,0x04,0x04,0x88,0x70,0x00, /*q */ 0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x00,0x00,0x70,0x88,0x04,0x04,0x05,0xFF,0x01, /*r */ 0x01,0x01,0x01,0x00,0x01,0x01,0x01,0x00,0x04,0x04,0xFC,0x84,0x04,0x00,0x80,0x00, /*s */ 0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0xCC,0x24,0x24,0x24,0x24,0x98,0x00, /*t */ 0x00,0x01,0x01,0x07,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0xF8,0x04,0x04,0x00,0x00, /*u */ 0x01,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0xF8,0x04,0x04,0x04,0x08,0xFC,0x04, /*v */ 0x01,0x01,0x01,0x00,0x00,0x01,0x01,0x01,0x00,0x80,0x70,0x0C,0x10,0x60,0x80,0x00, /*w */ 0x01,0x01,0x00,0x01,0x00,0x01,0x01,0x01,0xF0,0x0C,0x30,0xC0,0x30,0x0C,0xF0,0x00, /*x */ 0x00,0x01,0x01,0x00,0x01,0x01,0x01,0x00,0x00,0x04,0x8C,0x74,0x70,0x8C,0x04,0x00, /*y */ 0x01,0x01,0x01,0x00,0x00,0x01,0x01,0x01,0x01,0x81,0x71,0x0E,0x18,0x60,0x80,0x00, /*z */ 0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x84,0x0C,0x34,0x44,0x84,0x0C,0x00, /*{ */ 0x00,0x00,0x00,0x00,0x01,0x3E,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0xFC,0x02,0x02, /*| */ 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x67 2012年华中科技大学-ADI电子设计大赛文档 00,0x00, /*} */ 0x00,0x40,0x40,0x3E,0x01,0x00,0x00,0x00,0x00,0x02,0x02,0xFC,0x00,0x00,0x 00,0x00, /*~ */ 0x00,0x60,0x80,0x80,0x40,0x40,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00, /* */ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00 }; /*************************************************************** * 功能:判忙函数 ***************************************************************/ void check_busy() { uchar read_data=0xff; clear_rs(); set_rw(); clear_cs(); LCD_DIN_EN ; do { set_en(); delaynum(1); delaynum(1); read_data=lcddata_in; clear_en(); }while(read_data&0x80); set_cs(); LCD_DOUT_EN; } /*************************************************************** 68 2012年华中科技大学-ADI电子设计大赛文档 * 功能:写数据函数 ***************************************************************/ void write_data(unsigned long dat) { check_busy(); set_rs(); clear_rw(); clear_cs(); lcddata_out=(dat<<16)|0XFF000000; set_en(); delaynum(1); delaynum(1); clear_en(); set_cs(); } /*************************************************************** * 功能:写命令函数 ***************************************************************/ void write_command(unsigned long command) { check_busy(); clear_rs(); clear_rw(); clear_cs(); lcddata_out = (command<<16)|0xff000000; set_en(); delaynum(1); delaynum(1); clear_cs(); set_cs(); } /*************************************************************** * 功能:复位函数 ***************************************************************/ void reset(void) { clear_reset(); 69 2012年华中科技大学-ADI电子设计大赛文档 LCD_Delay(200); set_reset(); } /*************************************************************** * 功能:清屏函数 ***************************************************************/ void clear_screen(uchar m) { uchar i,j; write_command(0x40); //设置起始行 for(i=0;i<8;i++) { write_command(i|0xb0); //设置起始页 write_command(0x10); //设置列的高八位 write_command(0x00); //设置列的低八位 for(j=0;j<128;j++) { write_data(m); //设置清屏方式 } } } /*************************************************************** * 功能:初始化函数 ***************************************************************/ void lcd_initial() { LCD_DOUT_EN; clear_en(); clear_rw(); clear_cs(); reset(); write_command(0xe2); //复位函数 write_command(0xa2); //液晶背光电压选择 write_command(0xa0); //液晶驱动输出和内部RAM列选择 write_command(0xc0); //控制输出模式选择 write_command(0x24); //液晶背光灯电压设置为总电压的50% write_command(0x81); //液晶背光灯电压设置控制使能 write_command(0x28); //对比度控制,液晶所有控制电压全关 70 2012年华中科技大学-ADI电子设计大赛文档 write_command(0x2f); //对比度控制,液晶所有控制电压全开 write_command(0xa6); //现实模式设置(正常) write_command(0xaf); //开显示 write_command(0xa5); //液晶上所有显示点开 LCD_Delay(1000); write_command(0xa4); //液晶正常显示 clear_screen(0); //以清屏 write_command(0x40); //显示起始行设置 write_command(0xb0); //设置起始页 write_command(0x10); //设定列高八位 write_command(0x00); //设定列低八位 LCD_Delay(10); clear_screen(0); } /*************************************************************** * 功能:设行起始页位置 ***************************************************************/ void set_page_address(uchar page) { write_command(0xb0|page); } /*************************************************************** * 功能:设定起始列位置 ***************************************************************/ void set_colume_address(uchar colume) { uchar temp; temp=colume>>4; write_command(temp|0x10); //先送列的高三位 temp=colume&0x0f; write_command(temp|0x00); //再送列的低四位 } /*************************************************************** * 功能:在指定位置显示一个字符(8*16) ***************************************************************/ void disp_word(uchar col,uchar pag,uchar ascii) //列col 0,127 小行pag 0,7 字符ascii 71 2012年华中科技大学-ADI电子设计大赛文档 { //4行16列时(8*i,2*j,ascii); uchar i,tmp; uint x; x=(ascii-0x20)*0x10; //字符从0x20开始起,每个16位 write_command((adj_page[pag]&0x07)|0xb0); //设置页地址 tmp=col>>4; write_command(tmp|0x10); //显示列的高四位 tmp=col&0x0f; write_command(tmp); //显示列的低四位 for(i=0;i<8;i++) { write_data(ASCIIchardot[x]); //通过查找ASCIIchardot表得到相应字符串 x++; } pag++;//写下半页 write_command((adj_page[pag]&0x07)|0xb0); //设置页地址 tmp=col>>4; write_command(tmp|0x10); //显示列的高四位 tmp=col&0x0f; write_command(tmp); //显示列的低四位 for(i=0;i<8;i++) { write_data(ASCIIchardot[x]); x++; } pag--; //写完一个字符页还原 } /*************************************************************** * 功能:在指定位置显示一个超大数字(32*32) ***************************************************************/ void disp_huge_word(uchar col,uchar pag,uchar ascii) //列col 0,127 小行pag 0,7 字符ascii { //4行16列时(8*i,2*j,ascii); uchar i,tmp; uint x; x=(ascii- 48)*64; //字符从0x20开始起,每个6472 2012年华中科技大学-ADI电子设计大赛文档 位 write_command((adj_page[pag]&0x07)|0xb0); //设置页地址 tmp=col>>4; write_command(tmp|0x10); //显示列的高四位 tmp=col&0x0f; write_command(tmp); //显示列的低四位 for(i=0;i<32;i++) { write_data(BigNum[x]); //通过查找ASCIIchardot表得到相应字符串 x++; } pag++; //写第二页 write_command((adj_page[pag]&0x07)|0xb0); //设置页地址 tmp=col>>4; write_command(tmp|0x10); //显示列的高四位 tmp=col&0x0f; write_command(tmp); //显示列的低四位 for(i=0;i<32;i++) { write_data(BigNum[x]); x++; } pag++; //写第三页 write_command((adj_page[pag]&0x07)|0xb0); //设置页地址 tmp=col>>4; write_command(tmp|0x10); //显示列的高四位 tmp=col&0x0f; write_command(tmp); //显示列的低四位 for(i=0;i<32;i++) { write_data(BigNum[x]); x++; } pag++; //写第四页 write_command((adj_page[pag]&0x07)|0xb0); //设置页地址 tmp=col>>4; 73 2012年华中科技大学-ADI电子设计大赛文档 write_command(tmp|0x10); //显示列的高四位 tmp=col&0x0f; write_command(tmp); //显示列的低四位 for(i=0;i<32;i++) { write_data(BigNum[x]); x++; } } /*************************************************************** * 功能:在指定位置显示一个超大点(8*32) ***************************************************************/ void disp_huge_dot(uchar col,uchar pag) //列col 0,127 小行pag 0,7 字符ascii { //4行16列时(8*i,2*j,ascii); uchar i,tmp; uint x = 0; write_command((adj_page[pag]&0x07)|0xb0); //设置页地址 tmp=col>>4; write_command(tmp|0x10); //显示列的高四位 tmp=col&0x0f; write_command(tmp); //显示列的低四位 for(i=0;i<8;i++) { write_data(dian[x]); //通过查找ASCIIchardot表得到相应字符串 x++; } pag++; //写第二页 write_command((adj_page[pag]&0x07)|0xb0); //设置页地址 tmp=col>>4; write_command(tmp|0x10); //显示列的高四位 tmp=col&0x0f; write_command(tmp); //显示列的低四位 for(i=0;i<8;i++) { write_data(dian[x]); 74 2012年华中科技大学-ADI电子设计大赛文档 x++; } pag++; //写第三页 write_command((adj_page[pag]&0x07)|0xb0); //设置页地址 tmp=col>>4; write_command(tmp|0x10); //显示列的高四位 tmp=col&0x0f; write_command(tmp); //显示列的低四位 for(i=0;i<8;i++) { write_data(dian[x]); x++; } pag++; //写第四页 write_command((adj_page[pag]&0x07)|0xb0); //设置页地址 tmp=col>>4; write_command(tmp|0x10); //显示列的高四位 tmp=col&0x0f; write_command(tmp); //显示列的低四位 for(i=0;i<8;i++) { write_data(dian[x]); x++; } } /*************************************************************** * 功能:在指定位置显示一个大数字(16*32) ***************************************************************/ void disp_big_word(uchar col,uchar pag,uchar ascii) //列col 0,127 小行pag 0,7 字符ascii { //4行16列时(8*i,2*j,ascii); uchar i,tmp; uint x; x=(ascii- 48)*64; //字符从0x20开始起,每个64位 write_command((adj_page[pag]&0x07)|0xb0); //设置页地址 tmp=col>>4; 75 2012年华中科技大学-ADI电子设计大赛文档 write_command(tmp|0x10); //显示列的高四位 tmp=col&0x0f; write_command(tmp); //显示列的低四位 for(i=0;i<16;i++) { write_data(BigNum[x]); //通过查找ASCIIchardot表得到相应字符串 x++; } pag++; //写第二页 write_command((adj_page[pag]&0x07)|0xb0); //设置页地址 tmp=col>>4; write_command(tmp|0x10); //显示列的高四位 tmp=col&0x0f; write_command(tmp); //显示列的低四位 for(i=0;i<16;i++) { write_data(BigNum[x]); x++; } pag++; //写第三页 write_command((adj_page[pag]&0x07)|0xb0); //设置页地址 tmp=col>>4; write_command(tmp|0x10); //显示列的高四位 tmp=col&0x0f; write_command(tmp); //显示列的低四位 for(i=0;i<16;i++) { write_data(BigNum[x]); x++; } pag++; //写第四页 write_command((adj_page[pag]&0x07)|0xb0); //设置页地址 tmp=col>>4; write_command(tmp|0x10); //显示列的高四位 tmp=col&0x0f; write_command(tmp); //显示列的低四位 for(i=0;i<16;i++) 76 2012年华中科技大学-ADI电子设计大赛文档 { write_data(BigNum[x]); x++; } } /*************************************************************** * 功能:在指定位置显示一个汉字(16*16) ***************************************************************/ void disp_chn(uchar col,uchar pag,uchar cn) //列col 0,127 小行pag 0,7 汉字cn tab表中的序号0,x { //4行8列时(16*i,2*j,cn); uchar i,tmp; uint x; x=cn<<5; write_command((adj_page[pag]&0x07)|0xb0); //设置页地址 tmp=col>>4; write_command(tmp|0x10); //显示列的高四位 tmp=col&0x0f; write_command(tmp); //显示列的低四位 for(i=0;i<16;i++) { write_data(tab[x]); //通过查找tab表得到相应字符串 x++; } pag++; //写下半页 write_command((adj_page[pag]&0x07)|0xb0); //设置页地址 tmp=col>>4; write_command(tmp|0x10); //显示列的高四位 tmp=col&0x0f; write_command(tmp); //显示列的低四位 for(i=0;i<16;i++) { write_data(tab[x]); x++; } pag--; //写完一个字符页还原 } /*************************************************************** 77 2012年华中科技大学-ADI电子设计大赛文档 * 功能:在指定位置显示一个字符串 ***************************************************************/ void disp_str(uchar col,uchar pag,uchar *cn) { while(*cn!=0) { if(col==128) { pag+=2; col=0; } if(pag==8) { pag=0; } disp_word(col,pag,*cn++); col+=8; } } /*************************************************************** * 功能:在指定的位置显示一个点 ***************************************************************/ void setpoint(uchar x,uchar y) //x横坐标 0-127 往右 y纵坐标 0-63 往下 { set_page_address(y/8); //y用以确定某一页,0-7页 set_colume_address(x); //x用于确定某一列,0-127列 write_data(0x01<<(y%8)); //再y确定某一页的具体点 } /*************************************************************** * 功能:在指定行pag低端的位置显示一个点 ***************************************************************/ void point(uchar x,uchar y) { set_page_address(x); //x用以确定某一页,0-7页 set_colume_address(y); //Y用于确定某一列,0-127列 write_data(0x80); } 78 2012年华中科技大学-ADI电子设计大赛文档 /*************************************************************** * 功能:显示图片 ***************************************************************/ void disp_bmp( uchar const *puts ) { uchar i,j; write_command(0x40); for(i=8;i>0;i--) { write_command((i-1)|0xB0); write_command(0x10); write_command(0x00); for(j=0;j<128;j++) { write_data( *puts++ ); } } } /*************************************************************** * 功能:显示竖线 ***************************************************************/ void shuxian(uchar n,uchar e,uchar f) //列 n 0-127 e,f行 0-7 从e行到f 行画竖线 { uint i; for(i=e;i<(f+1);i++) { set_page_address(i); set_colume_address(n); write_data(0xff); } } /*************************************************************** * 功能:显示横线 ***************************************************************/ void hengxian(uchar k) //行 k 0-7 底端画横线 { 79 2012年华中科技大学-ADI电子设计大赛文档 uint i; for(i=0;i<128;i++) { point(k,i); //write_data(0xff); } } /*************************************************************** * 功能:显示大整数 ***************************************************************/ void write_BigNum(uchar col,uchar pag,float x,char y) //x为要显示的浮点数,y为要显示的有效位数.最多显示8位有效数字 //列col 0,127 小行pag 0,7 { unsigned char dian = 0,k; unsigned char N[4]={0}; int num0; long dis_num; num0=x; //取出欲显示的数的整数部分,以便判断小数点的位置 if(num0>0&&num0<10) dian=1; //表示小数点在第1位数后面 if(num0>=10&&num0<100) dian=2; if(num0>=100&&num0<1000) dian=3; if(dian==1) dis_num=x*1000; //对x进行放大 if(dian==2) dis_num=x*100; if(dian==3) dis_num=x*10; N[0]=dis_num%10000/1000; //取出数字的高位 N[1]=dis_num%1000/100; //取出数字的次高位 N[2]=dis_num%100/10; N[3]=dis_num%10; for(k = 0; k0&&num0<10) dian=1; //表示小数点在第1位数后面 if(num0>=10&&num0<100) dian=2; if(num0>=100&&num0<1000) dian=3; if(dian==1) dis_num=x*100; //对x进行放大 if(dian==2) dis_num=x*10; if(dian==3) dis_num=x*1; //以保证x中的小数都能显示 N[1]=dis_num/100; //取出数字的高位 N[2]=dis_num%100/10; //取出数字的次高位 N[3]=dis_num%10; k=0; if(k0&&num0<10) dian=1; //表示小数点在第1位数后面 if(num0>=10&&num0<100) dian=2; if(num0>=100&&num0<1000) dian=3; if(num0>=1000&&num0<10000) dian=4; //表示小数点在第4位数后面 if(num0>=10000&&num0<100000) dian=5; if(num0>=100000&&num0<1000000) dian=6; if(num0>=1000000&&num0<10000000) dian=7; if(dian==0) dis_num=x*100000000; //放大 if(dian==1) dis_num=x*10000000; //对x进行放大 if(dian==2) dis_num=x*1000000; if(dian==3) dis_num=x*100000; //以保证x中的小数都能显示 if(dian==4) dis_num=x*10000; 82 2012年华中科技大学-ADI电子设计大赛文档 if(dian==5) dis_num=x*1000; if(dian==6) dis_num=x*100; if(dian==7) dis_num=x*10; N[1]=dis_num/10000000; //取出数字的高位 N[2]=dis_num%10000000/1000000; //取出数字的次高位 N[3]=dis_num%1000000/100000; N[4]=dis_num%100000/10000; N[5]=dis_num%10000/1000; N[6]=dis_num%1000/100; N[7]=dis_num%100/10; N[8]=dis_num%10; k=0; if(dian==0) { disp_word(col,pag,0+0x30); col+=8; //列col 0,127 小行pag 0,7 disp_word(col,pag,'.'); col+=8; } if(k0) i--; } 88 2012年华中科技大学-ADI电子设计大赛文档 /*************************************************************** * 功能:毫妙延时子程序 ***************************************************************/ void DelayMs(int a) { int i; for(i=0;i<1000*a;i++) DelayUs(1); } /*************************************************************** * 功能:系统时钟配置子程序 41.78MHz ***************************************************************/ void SysClkInit(void) { PLLKEY1 = 0xAA; PLLCON = 0x01; PLLKEY2 = 0x55; POWKEY1 = 0x01; POWCON = 0x00; POWKEY2 = 0xF4; } /*************************************************************** * 功能:总线初始化子程序 ***************************************************************/ void TmpBusInit(void) { POUT_1; // 复位脉冲(下降沿) POUT_0; DelayUs(600); // 延时480-960us PIN; // 拉高总线 DelayUs(45); // 延时15-60us if((GP2DAT&0x80)==0x80) // 判断DS18B20是否存在,如果存在会产生一个低电平60-240us while(1); PIN; // 拉高总线 DelayUs(300); } 89 2012年华中科技大学-ADI电子设计大赛文档 /*************************************************************** * 功能:读数据子程序(先传输低位后传输高位) ***************************************************************/ unsigned char ReadTmpBus(void) { unsigned char data_18b20=0; unsigned char n= 1; while(n) { POUT_1; POUT_0; DelayUs(1); // 拉低总线1-3us,通知从机准备收发数据 PIN; // 释放总线 DelayUs(2); // 从机在1-15us内会向总线输出数据的某一位(1或者0) if((GP2DAT&0x80)==0x80) data_18b20+=n; // 读取总线数据 DelayUs(45); // 等待从机释放总线 n<<=1; } return data_18b20; } /*************************************************************** * 功能:写数据子程序(先写低位再写高位) ***************************************************************/ void WriteTmpBus(unsigned char data) { unsigned char n= 1; while(n) { POUT_1; POUT_0; DelayUs(1); if(data&n) { POUT_1;} else POUT_0; // 向总线写数据的某一位(1或者0) DelayUs(60); // 等待60us保证从机有足够的时间进行采样 PIN; // 释放总线 DelayUs(2); // 释放总线时间要大于1us 90 2012年华中科技大学-ADI电子设计大赛文档 n<<=1; } } /*************************************************************** * 功能:读取温度函数 ***************************************************************/ void ReadTmp(void) { unsigned char data_H, data_L; TmpBusInit(); // 调用初始化子程序 WriteTmpBus(0xCC); // 跳过ID码匹配,适用于一个DS18B20 //可以使用8条语句代替上面的那条语句依次写入8个ID码,这样就是ID码匹配了 //如果不知道18B20的ID码,可以在总线上接入单个18B20 //然后参考下面的读取语句,依次读取18B20的8个ID码 //记得使用CRC8校验一下是否正确 WriteTmpBus(0x44); // 启动温度转换 DelayMs(100); // 等待转换结束 TmpBusInit(); // 调用初始化子程序 WriteTmpBus(0xCC); // 跳过ID码匹配 WriteTmpBus(0xBE); // 通知DS18B20,准备读数据 data_L = ReadTmpBus(); // 读取第一个数据(温度低字节) data_H = ReadTmpBus(); // 读取第二个数据(温度高字节) if(data_H>0x7f) //最高位为1时温度是负 { data_L = ~data_L; //补码转换,取反加一 data_H = ~data_H + 1; } ConvertTmp(data_H, data_L); } /*************************************************************** * 功能:转换温度函数 91 2012年华中科技大学-ADI电子设计大赛文档 ***************************************************************/ void ConvertTmp(unsigned char data_H, unsigned char data_L) { unsigned char zhengshu; unsigned char xiaoshu1; unsigned char xiaoshu2; zhengshu = data_L/16 + data_H*16; //整数部分 xiaoshu1 = (data_L & 0x0f)*10/16; //小数第一位 xiaoshu2 = (data_L & 0x0f)*100/16%10; //小数第二位 // 更新温度 tmp = zhengshu + xiaoshu1 * 0.1 + xiaoshu2 * 0.01; // 将温度转换为字符串 if(zhengshu < 100) { tmp_str[0] = zhengshu / 10 + 0x30; tmp_str[1] = zhengshu % 10 + 0x30; tmp_str[2] = '.'; tmp_str[3] = xiaoshu1 + 0x30; tmp_str[4] = xiaoshu2 + 0x30; tmp_str[5] = 0x0A; tmp_str[6] = 0x00; } if(zhengshu >= 100) { tmp_str[0] = zhengshu / 100 + 0x30; tmp_str[1] = (zhengshu/10)%10 + 0x30; tmp_str[2] = zhengshu % 10 + 0x30; tmp_str[3] = '.'; tmp_str[4] = xiaoshu1 + 0x30; tmp_str[5] = xiaoshu2 + 0x30; tmp_str[6] = 0x0A; } } 11) time.c /*********************************************************************** / /* */ 92 2012年华中科技大学-ADI电子设计大赛文档 /* interface.c: 倒计时模块 */ /* */ /***********************************************************************/ #include "..\\head\\common.h" #include "..\\head\\time.h" #include "..\\head\\serial.h" #include "..\\head\\io_ctrl.h" #include "..\\head\\int.h" #include "..\\head\\ocm12864.h" int set_tmp = 40; int set_min = 20; int remain_min = 0; int remain_sec = 0; char stage = 1; /*************************************************************** * 功能:计时使能 ***************************************************************/ void StartTime() { T1LD = 0x350000; //1s进入一次中断 T1CON = 0xC4; IRQEN |= (1<<3); } /*************************************************************** * 功能:计时暂停 ***************************************************************/ void PauseTime() { IRQCLR |= (1<<3); } /*************************************************************** * 功能:开始计时 ***************************************************************/ void CountTime() { 93 2012年华中科技大学-ADI电子设计大赛文档 switch (stage) { //第一阶段 case 1: // 显示”设定“时间 disp_chn(0,6,0); disp_chn(16,6,1); break; //第二阶段减计时 case 2: //显示“倒计”时间 // IRQCLR |= (1<<21); //关闭中断 disp_chn(0,6,8); disp_chn(16,6,9); disp_chn(16*2,6,4); disp_chn(16*3,6,5); disp_chn(16*3,6,5); disp_word(3*16, 6, ':'); remain_sec--; if(remain_sec < 0) { set_min--; remain_sec = 59; } //倒计时结束,进入第三阶段 if(set_min == 0) { stage = 3; remain_sec = 0; } break; //第三阶段加计时 case 3: //显示“已用”时间 if(remain_sec == 0 && set_min == 0) { disp_chn(0,6,10); disp_chn(16,6,11); disp_chn(16*2,6,4); disp_chn(16*3,6,5); 94 2012年华中科技大学-ADI电子设计大赛文档 disp_chn(16*3,6,5); disp_word(3*16, 6, ':'); disp_word(16*5+8, 6, 'm'); disp_word(16*7+8, 6, 's'); IRQCLR |= (1<<21); //关闭中断 } remain_sec++; if(remain_sec == 60) { set_min++; remain_sec = 0; } break; } } 95
/
本文档为【智能电热水壶控制系统设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索