红外测距仪
智能仪表课程设计
课
名称 红外测距仪设计
学生姓名 许萌
所在班级 测控1101
指导教师 唐鸿儒 黄亚忠
扬州大学能源与动力工程学院
二〇一三年九月
智能仪表课程设计
总 目 录
第一部分:任务书
第二部分:课程设计报告
智能仪表课程设计
第 一 部 分
任
务
书
智能仪表课程设计
《智能仪表课程设计》课程设计任务书
一、课题名称
红外测距仪
二、设计
及设计要求
利用GP2Y0A21YK0F传感器作为测量组件,设计红外测距仪,具有下面的功能:
1.测量范围为10cm~80cm;
2.精度为1cm;
3.LCD12864显示模块;
4.可以实时测量距离;
5.可以实现面积的测量;
6.具有RS232通信接口。
三、时间安排
第一周:
星期一,星期二:布置任务,熟悉资料,确定仪表的功能要求、性能指标。熟悉实验板原理图和印刷板图。
星期三,星期五:进行仪表的
选择,确定主要芯片、工作方式、输入输出信号的接口方式、键盘和显示方式、以及通信方式。进行硬件设计和元器件选择,画出硬件原理图。
第二周:
星期一,星期五:根据硬件原理图,焊接硬件电路;测试硬件电路的功能;软件设计,包括软件需求说明、软件结构框图、主要软件功能模块的流程图;编写程序。
第三周:
星期一,星期三:调试程序,联调软件和硬件。
星期四,星期五:写课程设计报告。
智能仪表课程设计
四、应交成果
应交成果包括:
, 纸质课程设计报告和电子文档;
, 硬件原理图的Protel99se文件,程序;
, 可以演示的硬件和软件成果。
五、课程报告内容
课程设计报告应包括下列部分:
, 课程设计任务书
, 仪表的功能要求、性能指标要求。
, 方案选择:提出多种方案,进行方案比较,说明选定方案的理由,描述硬件和
软件的功能分工。
, 硬件设计:包括硬件结构框图、原理图及其各个主要环节的工作原理说明,元
器件选择的计算方法或者理由,利用提供的实验板焊接元器件。 , 软件设计:首先提出软件的功能需求,然后进行软件的结构设计,再画出主要
功能模块的软件框图。
, 程序编写和调试。
, 设计小结。
报告中硬件原理于用Protel99se画出,软件框图和程序流程图用Microsoft Visio画
出。
智能仪表课程设计
第 二 部 分
课
程
设
计
报
告
智能仪表课程设计
目 录
第一章 设计内容及要求 ............................................................................................................................... 1
1.1 课题名称.......................................................................................................................................... 1
1.2 仪表的功能要求及性能指标 .......................................................................................................... 1 第二章 方案选择........................................................................................................................................... 2
2.1 测距装置的选择 .............................................................................................................................. 2
2.2 显示方案的选择 .............................................................................................................................. 2
2.3 总体方案的设计 .............................................................................................................................. 2
第三章 硬件设计........................................................................................................................................... 3
3.1 硬件结构框图 .................................................................................................................................. 3
3.2 电路各主要环节工作原理 .............................................................................................................. 3
3.2.1 GP2Y0A21YK0F传感器 ........................................................................................................... 3
3.2.2 AD转换电路, ..................................................................................................................... 4
3.2.3 程序下载模块 ....................................................................................................................... 5
3.2.4 单片机控制系统 ................................................................................................................... 6
3.2.6 LCD12864显示电路 ............................................................................................................. 7
3.2.7红外测距仪总原理图,如图3-9 ......................................................................................... 8 第四章 软件设计........................................................................................................................................... 9
4.1 软件实现的功能 .............................................................................................................................. 9
4.2 主程序 ............................................................................................................................................. 9
4.2.1 主程序框图 ........................................................................................................................... 9
4.2.2 程序数据线性化处理部分 ................................................................................................. 10 第五章 程序编写......................................................................................................................................... 12
第六章 运行与调试..................................................................................................................................... 13
6.1 串口程序下载及显示电路调试 .................................................................................................... 13
6.2 AD转换电路调试 .......................................................................................................................... 13
6.3 控制按键调试 ................................................................................................................................ 13
第七章 设计小结......................................................................................................................................... 14
附录一 成果实物照片展示 ......................................................................................................................... 16
智能仪表课程设计
第一章 设计内容及要求 1.1 课题名称
红外测距仪设计
1.2 仪表的功能要求及性能指标
利用GP2Y0A21YK0F传感器作为测量组件,设计红外测距仪,具有下面的功能:
1.测量范围为10cm~80cm;
2.精度为1cm;
3.LCD12864显示模块;
4.可以实时测量距离;
5.可以实现面积的测量;
6.具有RS232通信接口。
第 1 页 共 23页
智能仪表课程设计
第二章 方案选择
2.1 测距装置的选择
市场上现在红外测距用的最多的地方是机器人的视觉控制部分,我们也选用最受欢迎的传感器GP2Y0A21YK0F,是由夏普公司生产的红外发射和接收一体的传感器,使用很方便,也很好用。 2.2 显示方案的选择
方案一:采用LCD1602显示屏,它有16个引脚,能够两行显示汉字和字符;
方案二:采用LCD12864显示屏,20个引脚,汉字图形点阵液晶显示模块,可显示汉字及图形,可以显示4行汉字和字符;
将二者比较发现,相比较,LCD12864功能更强一些,更符合我们设计的要求,显示3行汉字和字符,所以决定选用LCD12864.
2.3 总体方案的设计
由传感器测得的电压信号,用PCF8591进行AD转换得到数字量,到单片机中进行数据的处理,把数据进行线性化处理得到对应的距离,再把距离量送到LCD12864上显示,并且通过外部的按键进行控制,设置3个按键,分别进行测量长,宽和面积的控制,以及清屏的控制,让红外测距仪有一定的数据处理能力。
第 2 页 共 23页
智能仪表课程设计
第三章 硬件设计 3.1 硬件结构框图
红外测距仪主要由传感器,AD转换器,单片机,LCD12864显示以及开关控制等几个模块构成。
红外LCD显示测距A/D51单传感转换片机器模按键块
串行
通信
图3-1红外测距硬件框图 3.2 电路各主要环节工作原理
3.2.1 GP2Y0A21YK0F传感器
(1)GP2Y0A21YK0F传感器的内部模块图解,如图3-2
图3-2 直流电机驱动电路原理图
第 3 页 共 23页
智能仪表课程设计
它是由红外发射管和一个PSD(Position Sensing Device 位置敏感检测装置)以及相应的计算电路构成,Sharp公司的PSD很有特色,它可以检测到光点落在它上面的微小位移,分辨率达微米,正是利用这个特性实现了几何方式测距。 红外发射管发出的光束,遇到障碍无反射回来,落在PSD上,构成以等腰三角形,借助于PSD可以测得三角形的底,而两个底角是固定的,有发射管确定,此时可通过底边推算出高,也就是我们所要的距离。
3.2.2 AD转换电路,
(1)PCF8591管脚图,如图3-3
图3-3 PCF8591管脚图
(2)PCF8591的介绍
PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I?C总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。
PCF8591的功能包括多路模拟输入、内置跟踪保持、8-bit模数转换和8-bit数模转换。PCF8591的最大转化速率由I2C总线的最大速率决定。
第 4 页 共 23页
智能仪表课程设计
(3)PCF8591的原理图
图3-4 PCF8591原理图
3.2.3 程序下载模块
(1)MAX232芯片构成的程序下载电路原理图,如图3-7
图3-5 MAX232程序下载电路图
第 5 页 共 23页
智能仪表课程设计
(2)MAX232芯片管脚及说明,如图3-8
图3-6 MAX232芯片
3)程序下载电路工作原理 (
由于电脑串口RS232电平是-10V—10V,而一般的单片机应用系统的信号电压是TTL电平为0—+5V,MAX232芯片就是用来进行电平转换的,该器件包含两个驱动器、两个接收器和一个电压发生器电路,用来提供TIA/EIA-232-F电平。
MAX232符合TIA/EIA-232-F标准,每一个接收器将TIA/EIA-232-F电平转换成5-V TTL/CMOS电平,每一个发送器将TTL/CMOS电平转换成TIA/EIA-232-F电平。
MAX232的R1OUT、T1IN分别与单片机的RXD、TXD相连,然后MAX232的T1OUT、R1IN分别与上位机PC的TXD、RXD相连,这样单片机就可以通过MAX232实现与上位机PC机的数据传输。 3.2.4 单片机控制系统
(1)单片机控制系统原理图,如图3-9
图3-7 单片机控制系统原理图
(2)单片机控制系统组成及功能
红外测距仪的单片机系统由石英晶体和微调电容构成的时钟振荡电路、复位电路及单片机构成。实现与上位机的通信(程序下载)功能,对数字信号进行处理并进行控制。
第 6 页 共 23页
智能仪表课程设计
3.2.6 LCD12864显示电路
(1)显示电路原理图,如图3-11
图3-8 显示电路图
(2)LCD12864概述
带中文字库的128X64 是一种具有4 位/8 位并行、2 线或3 线串行多种接口方式,内部含有国标一级、二级简体 中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192 个16*16 点汉字,和128 个16*8 点ASCII 字符 集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4 行16×16 点 阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶 显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。
第 7 页 共 23页
智能仪表课程设计 3.2.7红外测距仪总原理图,如图3-9
图3-9 总原理图
第 8 页 共 23页
智能仪表课程设计
第四章 软件设计
4.1 软件实现的功能
软件主要实现读取转换好的数据进行线性化处理,得到所测得的距离量,实时在LCD上显示,并通过按键对数据进行控制,能够显示三组数据,分别是长.宽.面积,并且能够重新测量。 4.2 主程序
4.2.1 主程序框图
图4-1 主程序框图
说明:对于程序框图中的数据的线性化处理,对于传感器采集的模拟量并不是线性的,不能直接得到距离的数字量,要进行线性化处理。
第 9 页 共 23页
智能仪表课程设计
4.2.2 程序数据线性化处理部分
图4-2模拟量和距离的关系图
说明:通过图形可以看到图形从整体上看是非线性的,但是这个模拟量在传感器内部有处理电路,可以看到80cm~50cm对应电压近似可以看成线性的,50cm~40cm也是,以此类推,可以得到下面的线性化处理程序:
第 10 页 共 23页
智能仪表课程设计
if(i>=20&&i<=31)
{num=-2.5*i+130;}
else if(i>=31&&i<=39)
{num=-1.428*i+95.714;}
else if(i>=39&&i<=48)
{num=-1.111*i+83.333;}
else if(i>=48&&i<=54)
{num=-0.833*i+70;}
else if(i>=54&&i<=69)
{num=-0.357*i+44.286;}
else if(i>=69&&i<=90)
{num=-0.227*i+35.455;}
else if(i>=90&&i<=126)
{num=-0.147*i+28.235;}
return(num);
返回值就是要送显的距离了。
第 11 页 共 23页
智能仪表课程设计
第五章 程序编写
程序编写是一个逻辑思维展开的过程,也是将程序框图逐步细化的过程,要求编写者思维缜密。程序框图的绘制是程序编写的重要基础。如果在编写一个系统的程序之前,编写者能认真思考、绘制程序框图,而且程序框图几经修改完善没有逻辑错误,那接下来的程序编写便很轻松的多,这正是老师反复强调的“程序好编,框图难画,框图完成,程序的编写定会清清楚楚”,而且如果程序运行出错,单从程序中检查错误很难,而回头看程序框图便很容易查出逻辑错误,可见程序框图的重要性。
大体上的思路就很清晰了,对于程序中的一些小因此,对于已经写好的程序框图,
细节的地方才是最能锻炼我们编程能力的地方,程序总共有几块,AD转换程序模块,LCD12864显示程序模块,主程序数据处理和控制模块。分开编写能提高编写的正确率,并且好查找错误。
红外测距仪的程序参见附录二。
C语言具有一下一些优点:
?简洁紧凑、灵活方便
?运算符丰富
?数据结构丰富
?C是结构式语言
?C语法限制不太严格、程序设计自由度大
?C语言允许直接访问物理地址,可以直接对硬件进行操作
?C语言程序生成代码质量高,程序执行效率高
?C语言适用范围大,可移植性好
第 12 页 共 23页
智能仪表课程设计
第六章 运行与调试
6.1 串口程序下载及显示电路调试
(1)调试过程
由于单片机定时器通信限制,故没有实现单片机的实时通信功能,但依然将MAX232通信口焊接在电路板上以供下载程序使用。显示电路的调试很重要,由于之前在自己的开发板上以经进行过系统整体的测试,但是在焊接电路板上调试出现了问题,LCD12864不能正常显示。
(2) 调试的结果与遇到的问题
LCD12864显示不正常,就进行单独的显示模块的调试,还是显示不正常,就开始查电路的焊接口,发现在焊接LCD12864的引脚口全都焊接反了,这是在焊接电路时的失误,对应管脚没有查清楚就急忙开始动手了,后来将LCD12864反过来安装,显示正常了,但是最后还需要调整电路的焊接,给自己增加了工作量,这是不应该的。
6.2 AD转换电路调试
(1)调试过程
将整体电路进行调试时,显示还是有问题,不能正常显示,按键部分也没有反应。 (2)调试结果与遇到的问题
可以肯定不是显示部分的问题,接下来要对主要电路进行检查焊接问题,因为实验程序在开发板上进行过仿真实验,证明各个部分没有问题,能排除软件和硬件电路问题,主要就是焊接部分的问题了。进行排查,发现I2C总线接反了,对整个电路产生了问题,导致AD转换器不能正常工作。改正后,显示部分有动态数据的显示了。
6.3 控制按键调试
(1)调试过程
逐个按下按键,看显示部分的变化,变化正常。
(2)调试结果与遇到的问题
因为在开发板上仿真的缘故,控制按键部分没有出现什么问题,实现了红外测距的基本功能。
第 13 页 共 23页
智能仪表课程设计
第七章 设计小结
为期三周的智能仪器课程设计看似短暂,却让我们受益良多~
本次的课程设计从上学期末便开始了选题,我和王健2个人一组,经过我们不断的筛选,最终选定了红外测距仪这个题目。在当时的我们看来,这个题目显得“高大尚”,要是能够做出来一定会十分自豪和骄傲~在上个学期末确定了题目后,我们便开始准备资料,由于我们两人暑假里在学校复习考研,对于资料的准备也不是相当充分,以至于课程设计开始的时候还是觉得无从下手~
第一周是上网查找资料,设计产品性能指标,硬件电路图的阶段,对于红外测距仪,我们一致认为选择好传感器才是关键~于是在网上开始查找相关传感器,由于激光传感器过于昂贵而相对较为便宜的其测量距离却相当短,最终在我们深思熟虑之下,还是决定选择性价比比较高的红外传感器——夏普GP2Y0A21YK0F~这款红外测距传感器是被用于机器人使用的,其测量距离只在10CM-80CM之间,虽然与实际的红外测距仪相差较大,但已经足够我们使用和理解其中共组原理了。最关键的部分解决了,其他部分就相对简单~由于这款传感器输出的是非线性模拟信号,因此我们要对其进行线性化处理,然后进行AD转换,再通过单片机实现各种功能~这样我们的系统框图边设计好了~当然在此之前我们便确定了我们设计产品所应当实现的功能~而且听取老师的建议不仅能实时显示距离,还能测长,宽后自动计算出面积~最后便剩下硬件框图的设计~由于上学期我们已经学会了使用protel软件,而我们的题目所用硬件并不是很多,这部分工作很快便完成了。但其中任然有些许小错误,经过2位老师的指导也使我们成功改正了错误,使我们的硬件框图准确无误,为我们后面的程序设计和焊接埋下了深厚的基础~
第二周主要的是程序的设计与编写~由于我们的传感器输出值是非线性的,通过老师的指导,我们将其输出曲线分段处理,在每个小段里其输出为线性的,这样就成功解决了这个问题,然后我们实际测量其输出与距离的关系,自己计算函数,使我们的产品更加精确~程序的设计与编写是个难点,再此之前我们虽然编写过一些程序,但此次的程序十分长,而且是用C语言进行编写的,这耗费了我们大量的时间~由于上学期我们购买了开发板,其中有附带的实用程序,包括了此次我们需要用到的AD转换程序,LCD12864显示程序~于是我们开始分块看并理解运用这些程序,我们先看AD转换,并用开发板进行模拟,将传感器接入通过单片机先在较为简单的LCD1602上进行显示,通过不断的模拟,不断地改正,我们的AD转换部分已经基本完成了。其后,将其与12864的显示程序进行组合,12864显示程序较为复杂,但其能显示4行8列的汉字,功能更加强大也更加实用~即使到现在我也没能完全掌握他的功能~在完成上述程序后就剩下最后的主程序的编写,这涉及到我们所要实现的功能,也是全由我们自行编写的一部分~这部分的编写虽然最终完成了,但同样凸显出了很多问题,我们对于C语言的一些常用语法都不是很熟悉,总是出错,这也是我们今后要进行强化的地方~整个程序的设计耗费了我们整整一周的时间,但却让我们发现了很多自身存在的问题,这才是这周辛苦的意义所在~
第三周,便是焊接与调试的阶段了。由于前两周的认真努力,我们第三周的任务就显得轻了一些~焊接是个技术活儿,首先考虑的是元器件的排版,我们根据人们的习惯将显示放在左边,按键放在右边~排版好后就是焊接了,我的焊接水平十分差做模电设
第 14 页 共 23页
智能仪表课程设计
计时焊接的就不是很美观,而我的队友王健焊接十分在行,他焊接,我负责查看电路图,检查连线,分工明确,用了一天半不到的时间便完成了焊接,将程序读进去后,出来的结果却不是很理想,我们分块查找,发现I2C总线接反了,所以一直出不来结果,改正后发现现实的结果都是倒着的,原来我们的LCD完全接反了,这也使我们粗心所致,后来晚上连夜将其改正,但只能将显示屏放到右侧,这与我们当初的排版不太吻合,也十分遗憾,我们也
了教训,希望以后不会犯这种错误~在星期三上午我们的课程设计也就全部完成了,虽然有遗憾,但我们还是感到十分骄傲和自豪~
经过这么长时间的课程设计,我们对于单片机的使用,智能仪器的设计都有了全方位深入的了解,也体会到了产品从设计到完成的整个步骤,为我们将来的毕业设计甚至与工作都带来了巨大的好处~同样我们也发现了自己的很多不足,也让我们感受到了理论与实践的差异,这让我们受益匪浅~这3周的课程设计,在2位老师认真的指导下,也培养了我们敢于提出为题,用于解决问题的学习态度,使我们对于测控专业更加的自信~
最后,衷心感谢唐老师和黄老师的认真指导~
参考文献
【1】 张毅刚主编.《单片机原理及应用》(第一版).高教出版社.2003 【2】 程德福 林君主编.《智能仪器》(第二版).机械工业出版社.2009 【3】 杜宇人主编.《现代电子测量技术》(第一版).机械工业出版社.2009 【4】 侯殿有主编.《单片机C语言程序设计》.人民邮电出版社.2010
第 15 页 共 23页
智能仪表课程设计
附录一 成果实物照片展示
第 16 页 共 23页
智能仪表课程设计
第 17 页 共 23页
智能仪表课程设计 附录二 源程序
1、最后成果展示程序
#include
#include #include
#include
#include "delay.h"
#include "i2c.h"
sbit RS = P2^4;
sbit RW = P2^5;
sbit E = P2^6;
sbit RES = P2^3;
sbit PSB = P2^1;
sbit PAUSE = P3^0;
unsigned char temp[8]; float num,i;
float a,b;
double data3;
#define DataPort P0 //MCU P0<------> LCM
#define AddWr 0x90 //写数据地址
#define AddRd 0x91 //读数据地址
sbit key1=P1^2; sbit key2=P1^3;
sbit key3=P1^4;
extern bit ack;
unsigned char ReadADC(unsigned char Chl);
bit WriteDAC(unsigned char dat);
/*------------------------------------------------
检测忙位
------------------------------------------------*/
void Check_Busy()
{
RS=0;
RW=1;
E=1;
DataPort=0xff;
while((DataPort&0x80)==0x80);//忙则等待
第 18 页 共 23页
智能仪表课程设计
E=0;
}
/*------------------------------------------------
写命令
------------------------------------------------*/
void Write_Cmd(unsigned char Cmd) {
Check_Busy();
RS=0;
RW=0;
E=1;
DataPort=Cmd;
DelayUs2x(5);
E=0;
DelayUs2x(5);
}
/*------------------------------------------------
写数据
------------------------------------------------*/
void Write_Data(unsigned char Data) {
Check_Busy();
RS=1;
RW=0;
E=1;
DataPort=Data;
DelayUs2x(5);
E=0;
DelayUs2x(5);
}
/*------------------------------------------------
液晶屏初始化
------------------------------------------------*/
void Init_ST7920()
{
DelayMs(40); //大于40MS的延时程序
PSB=1; //设置为8BIT并口工作模式
DelayMs(1); //延时
RES=0; //复位
DelayMs(1); //延时
RES=1; //复位置高
DelayMs(10);
Write_Cmd(0x30); //选择基本指令集
DelayUs2x(50); //延时大于100us
Write_Cmd(0x30); //选择8bit数据流
DelayUs2x(20); //延时大于37us
第 19 页 共 23页
智能仪表课程设计
Write_Cmd(0x0c); //开显示(无游标、不反白)
DelayUs2x(50); //延时大于100us
Write_Cmd(0x01); //清除显示,并且设定地址指针为00H
DelayMs(15); //延时大于10ms
Write_Cmd(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,
光标从右向左加1位移动
DelayUs2x(50); //延时大于100us
}
/*------------------------------------------------
显示用户自定义字符
------------------------------------------------*/
void DisplayCGRAM(unsigned char x,unsigned char y)
{
switch(y)
{
case 1: Write_Cmd(0x80+x);break;
case 2: Write_Cmd(0x90+x);break;
case 3: Write_Cmd(0x88+x);break;
case 4: Write_Cmd(0x98+x);break;
default:break;
}
Write_Data(00);
Write_Data(00);
}
/*------------------------------------------------
显示字符串
x:横坐标值,范围0~8
y:纵坐标值,范围1~4
------------------------------------------------*/
void LCD_PutString(unsigned char x,unsigned char y,unsigned char a[8])
{ unsigned char k=0;
switch(y)
{
case 1: Write_Cmd(0x80+x);break;
case 2: Write_Cmd(0x90+x);break;
case 3: Write_Cmd(0x88+x);break;
case 4: Write_Cmd(0x98+x);break;
default:break;
}
while(k<9)
{
Write_Data(a[k]);
k++;
第 20 页 共 23页
智能仪表课程设计
DelayUs2x(50);
}
}
/*------------------------------------------------
清屏
------------------------------------------------*/
void ClrScreen()
{
Write_Cmd(0x01);
DelayMs(15);
}
/*------------------------------------------------
显示图片
------------------------------------------------*/
void LCD_PutGraphic(unsigned char code *img)
{
int i,j;
//显示上半屏内容设置
for(i=0;i<32;i++)
{
Write_Cmd(0x80 + i); //SET 垂直地址 VERTICAL ADD
Write_Cmd(0x80); //SET 水平地址 HORIZONTAL ADD
for(j=0;j<16;j++)
{
Write_Data(*img);
img++;
}
}
//显示下半屏内容设置
for(i=0;i<32;i++)
{
Write_Cmd(0x80 + i); //SET 垂直地址 VERTICAL ADD
Write_Cmd(0x88); //SET 水平地址 HORIZONTAL ADD
for(j=0;j<16;j++)
{
Write_Data(*img);
img++;
}
}
}
/*------------------------------------------------
设置到绘图模式
------------------------------------------------*/
void SetGraphicMode()
第 21 页 共 23页
智能仪表课程设计
{
Write_Cmd(0x36); //选择8bit数据流 图形模式
DelayUs2x(20);
}
/*------------------------------------------------
主程序
------------------------------------------------*/
main()
{
unsigned char i,j;
Init_ST7920();
while(1)
{ LCD_PutString(0,1,"长 ");
LCD_PutString(0,2,"宽 ");
LCD_PutString(0,3,"S ");
while(key1)
{ i=ReadADC(0);
if(i>=20&&i<=31)
{num=-2.5*i+130;}
else if(i>=31&&i<=39)
{num=-1.428*i+95.714;}
else if(i>=39&&i<=48)
{num=-1.111*i+83.333;}
else if(i>=48&&i<=54)
{num=-0.833*i+70;}
else if(i>=54&&i<=69)
{num=-0.357*i+44.286;}
else if(i>=69&&i<=90)
{num=-0.227*i+35.455;}
else if(i>=90&&i<=126)
{num=-0.147*i+28.235;}
a=num;
num=num*100;
temp[0]='0';
temp[1]=(int)num/1000+'0';
temp[2]=(int)num/100%10+'0';
temp[3]='.';
第 22 页 共 23页
智能仪表课程设计
temp[4]=(int)num/10%10+'0';
temp[5]=(int)num%10+'0';
temp[6]='c';
temp[7]='m';
temp[8]=' ';
LCD_PutString(2,1,temp);
DelayMs(50);
}
while(key2)
{ i=ReadADC(0);
if(i>=20&&i<=31)
{num=-2.5*i+130;}
else if(i>=31&&i<=39)
{num=-1.428*i+95.714;}
else if(i>=39&&i<=48)
{num=-1.111*i+83.333;}
else if(i>=48&&i<=54)
{num=-0.833*i+70;}
else if(i>=54&&i<=69)
{num=-0.357*i+44.286;}
else if(i>=69&&i<=90)
{num=-0.227*i+35.455;}
else if(i>=90&&i<=126)
{num=-0.147*i+28.235;}
b=num;
num=num*100;
temp[1]=(int)num/1000+'0';
temp[2]=(int)num/100%10+'0';
temp[3]='.';
temp[4]=(int)num/10%10+'0';
temp[5]=(int)num%10+'0';
temp[8]=' ';
LCD_PutString(2,2,temp);
DelayMs(50);
}
data3=a*b*10;
temp[0]=(int)data3/10000+'0';
temp[1]=(int)data3/1000%10+'0';
temp[2]=(int)data3/100%10+'0';
第 23 页 共 23页
智能仪表课程设计
temp[4]='.';
temp[3]=(int)data3/10%10+'0';
temp[5]=(int)data3%10+'0';
temp[6]='c';
temp[7]='m';
temp[8]='2';
while(key3)
{
LCD_PutString(2,3,temp);
DelayMs(50);
}
ClrScreen();
}
}
unsigned char ReadADC(unsigned char Chl)
{
unsigned char Val;
Start_I2c(); //启动总线
SendByte(AddWr); //发送器件地址
if(ack==0)return(0);
SendByte(0x40|Chl); //发送器件子地址
if(ack==0)return(0);
Start_I2c();
SendByte(AddWr+1);
if(ack==0)return(0);
Val=RcvByte();
NoAck_I2c(); //发送非应位
Stop_I2c(); //结束总线
return(Val);
}
第 24 页 共 23页