交通与汽车工程学院 课程设计说明书
课 程 名 称: 微机检测课程设计 课 程 代 码: 8416671 题 目: 年级/专业/班: 学 生 姓 名: 学 号: 开 始 时 间: 年 月 日 完 成 时 间: 年 月 日 课程设计成绩:
学习态度及平时成绩(30) 技术水平与实际能力(20) 创新(5) 说明书(计算书、图纸、分析报告)撰写质量(45) 总 分(100)
指导教师签名: 年 月 日
微机检测课程设计说明书
目 录
摘要…………………………………………………………………………………………2 1 引言………………………………………………………………………………………3 1.1 问题的提出 ………………………………………………………………………… 3 1.2 任务与分析……………………………………………………………………………3 2 方案设计…………………………………………………………………………………4 2.1 系统设计方案…………………………………………………………………………4 2.2 系统总体框图…………………………………………………………………………4 3 系统硬件设计……………………………………………………………………………5 3.1 89C51单片机………………………………………………………………………… 5 3.2 LCD12864人机交互设备………………………………………………………………7 3.3 ADC0804 AD转换芯片……………………………………………………………… 8 4系统软件设计……………………………………………………………………………10 4.1 proteus软件环境介绍………………………………………………………………10 4.2 protel软件环境介绍……………………………………………………………… 11 4.3系统软件分析 ………………………………………………………………………11 4.4 程序流程图……………………………………………………………………………12 5 系统调试过程……………………………………………………………………………14 结论…………………………………………………………………………………………21 致谢…………………………………………………………………………………………22 参考文献……………………………………………………………………………………23 附录…………………………………………………………………………………………24
- 1 -
微机检测课程设计说明书
摘 要
此次蓄电池电压检测系统设计以89C51单片机为控制核心。随着现代工业蓬勃发展,蓄电池在各行各业的应用越来越广泛,它为各种系统提供必不可少的电源。蓄电池在现代汽车上更是必不可少。此次课程设计电压检测系统原理图以51单片机、AD0804芯片、液晶屏lcd12864和一些常用元器件完成制作。通过滑动变阻器的滑头端输出电压来模拟蓄电池的电压,经AD采样,在液晶屏上显示蓄电池电压,并且当电压低于规定值2V时, 会提醒驾驶员“电压过低,请充电”的显示条目。经测试,该系统的硬件电路设计任务要求。
关键词: 汽车蓄电池;LCD12864;51单片机;proteus仿真
- 2 -
微机检测课程设计说明书
1 引 言
1.1 问题的提出
伴随着汽车工业全球化的发展,汽车上用于蓄电池检测显示的设备往往很复杂。当下,我们考虑利用现在所学的微机检测知识及相关元器件搭建出能够检测并显示的蓄电池系统,以满足市场的相关需要。此次课程设计题目基于微机检测原理,以单片机芯片AT89C51作为核心控制器,通过硬件电路的制作以及软件程序的编制,设计制作汽车蓄电池电压检测系统。
1.2任务与分析
此次设计的系统的控制单元是89C51单片机。硬件电路图的设计在Protel软件环境中进行,而软件编程则在keil环境中进行,通过编译、调试,生成HEX文件。最后将作源代码的HEX文件是导入到仿真环境Proteus的硬件电路中,进行仿真测试。通过滑动变阻器的滑头端输出电压来模拟蓄电池的电压,经AD采样,在液晶屏上显示蓄电池电压,并且当电压低于规定值2V时, 会提醒驾驶员“电压过低,请充电”的显示条目。
本次课程设计是应用51单片机原理和微机控制与接口技术设计蓄电池检测系统控制器的硬件电路,并采用C语言进行程序设计。通过控制外部AD0804芯片来检测滑动变阻器模拟输出的蓄电池电压,当电压低于2V时,系统能够及时的给出提示信息。本系统的难点在于AD芯片的应用以及如何在LCD12864上显示提示信息。由于课程设计需要Proteus软件进行仿真,而软件自带的LCD12864是无字符液晶显示器,所以程序中还要编写显示字符的程序。
- 3 -
微机检测课程设计说明书
2 系统方案设计
2.1 系统设计方案
通过查阅相关资料,设计初期共有二个方案供我选择,分别是:
方案一:
系统采用AT89C51单片机作为主控芯片,AD0804芯片作为电压检测的AD转换模块。在LCD1602上显示。
方案二:
系统采用AT89C51单片机作为主控芯片,AD0804芯片作为电压检测的AD转换模块。采用LCD12864显示。
进行方案比较,由于要求显示汉字提示信息,方案二可以精确的显示提示信息,最后确定设计采用第2方案,即系统是由89C51单片机,AD0804芯片,LCD12864液晶显示器组成。
2.2 系统总体框图
图1 系统总体框图
AD0804 主控芯片 AT89C51 LCD12864 滑动变阻器 在设计里面,利用单片机设计电路,以滑动变阻器模拟蓄电池电压,用AD芯片进行采样,最后通过LCD12864液晶显示器进行显示,由于使用软硬件结合的方式代替了数字电路的复杂性,所以电路结构简单、调试也相对方便,经济实惠。
- 4 -
微机检测课程设计说明书
3 系统硬件电路设计
3.1 89C51单片机
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS 8位微处理器,俗称单片机。0C51是INTEL公司MCS-51系列单片机中最基本的产品,它采用INTEL公司可靠的CHMOS工艺技术制造的高性能8位单片机,属于标准的MCS-51的HCMOS产品。它结合了HMOS的高速和高密度技术及CHMOS的低功耗特征,它继承和扩展了MCS-48单片机的体系结构和指令系统。
80C51内置中央处理单元、128字节内部数据存储器RAM、32个双向输入/输出(I/O)口、2个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。此外,80C51还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。在空闲模式下冻结CPU而RAM定时器、串行口和中断系统维持其功能。掉电模式下,保存RAM数据,时钟振荡停止,同时停止芯片内其它功能。80C51有PDIP(40pin)和PLCC(44pin)两种封装形式。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。其引脚图如图2所示:
图2 89C51单片机引脚图
- 5 -
微机检测课程设计说明书
89C51单片机与早期Intel的8051/8751/8031芯片的外部引脚和指令系统完全兼容,只不过用Flash ROM 替代了ROM/EPROM而已
[3]
。89C51单片机内部结构如图3所示。
图3 89C51单片机内部结构示意图
各引脚的功能如下: VCC:供电电压。 GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高
[3]
。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用
- 6 -
微机检测课程设计说明书
于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。 ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR 8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA:当/EA保持低电平时,则在此期间CPU只访问外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,则执行内部程序存储器中的程序。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。
3.2 LCD12864人机交互设备
为了进行实时的显示,本次设计选用LCD12864作为显示设备,12864可分为无字符型和有字符型。由于Proteus中自带的LCD12864为无字符型,所以还要在程序中加入字符编码。lcd12864液晶显示模块是128×64点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置国标GB2312码简体中文字库(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。可与CPU直接接口,提供两种界面来连接微处理机:8-位并行及串行两种连接方式。具有多种功能:光标显示、画面移位、睡眠模式等。
- 7 -
微机检测课程设计说明书
图4 LCD12864实物图
3.3 ADC0804 AD转换芯片
ADC0804是用CMOS集成工艺制成的逐次比较型摸数转换芯片。分辨率8位,转换时间100μs,输入电压范围为0~5V,增加某些外部电路后,输入模拟电压可为 5V。该芯片内有输出数据锁存器,当与计算机连接时,转换电路的输出可以直接连接在CPU数据总线上,无须附加逻辑接口电路。ADC0804芯片外引脚图如7.25所示
图5 ADC0804
引脚名称及意义如下:VIN+ VIN- :ADC0804的两模拟信号输入端,用以接受单极性、双极性和差摸输入信号。DB8~DB0 :A/D转换器数据输出端,该输出端具有三态特性,能与微机总线相接。AGND:模拟信号地。DGND:数字信号地。CLKIN:外电路提供时钟脉冲输入端。CLKR:内部时钟发生器外接电阻端,与CLKIN端配合可由芯片自身产生时钟脉冲,其频率为1/1.1RC。图5 ADC0804引脚图CS:片选信号输入端,低电平有效,一旦CS有效,表明A/D转换器被选中,可启动工作。WR:写信号输入,接受微机系统或其它数字系统控制芯片的启动输入端,低电平有效,当CS、WR同时为低电平时,启动转换。。RD:读信号输入,低电平有效,当CS、RD同时为低电平时,可读取转换输出数据。INTR:
- 8 -
微机检测课程设计说明书
转换结束输出信号,低电平有效。输出低电平表示本次转换已完成。该信号常作为向微机系统发出的中断请求信号。在使用时应注意以下几点:(1)转换时序:ADC0804控制信号的时序图各控制信号时序关系为:当CS ADC0804控制信号的时序图与WR同时为低电平A/D转换器被启动切在WR上升沿后模数完成转换,转换结果存入数据锁存器,同时,INTR自动变为低电平,表示本次转换已结束。如CS、RD同时来低电平,则数据锁存器三态门打开,数字信号送出,而在RD高电平到来后三态门处于高阻状态。(2)零点和满刻度调节:ADC0804的零点无须调整。满刻度调整时,先给输入端加入电压 ,使满刻度所对应的电压值是,其中是输入电压的最大值,是输入电压的最小值。当输入电压与值相当时,调整端电压值使输出码为FEH或FFH。(3)参考电压的调节:在使用A/D转换器时,为保证其转换精度,要求输入电压满量程使用。如输入电压动态范围较小,则可调节参考电压 ,以保证小信号输入时ADC0804芯片8位的转换精度。(4)接地:模数、数模转换电路中要特别注意到地线的正确连接,否则干扰很严重,以至影响转换结果的准确性。A/D、D/A及取样保持芯片上都提供了独立的模拟地(AGND)和数字地(DGND)的引脚。在线路设计中,必须将所有的器件的模拟地和数字地分别连接,然后将模拟地与数字地仅在一点上相连。地线的正确连接方法
本次课程设计系统采用ADC0804AD转换芯片采样滑动变阻器上的电压,其他外部电路采用芯片资料上的典型应用电路。系统采用AD采样电路如图6所示
C11nFAC VoltsP26P27+15V+88.8R1RV1U356%10kP251kOP1P+88.8AC Volts+7.5V 图6 AD采样电路
- 9 -
微机检测课程设计说明书
4 系统软件设计
4.1 proteus软件环境介绍
本系统的硬件设计首先是在Proteus软件环境中仿真实现的。Proteus软件是来自英国Labcenter electronics公司的EDA工具软件,Proteus软件有十多年的历史,在全球广泛使用,除了具有和其它EDA工具一样的原理布图、PCB自动或人工布线及电路仿真的功能外,其革命性的功能是,它的电路仿真是互动的。针对微处理器的应用,还可以直接在基于原理图的虚拟原型上编程,并实现软件源码级的实时调试。如果有显示及输出,配合系统配置的虚拟仪器如示波器、逻辑分析仪等,还能看到运行后输入输出的效果。Proteus建立了完备的电子设计开发环境,尤其重要的是Proteus Lite可以完全免费,也可以花微不足道的费用注册达到更好的效果。
Proteus是目前最好的模拟单片机外围器件的工具。可以仿真51系列、AVR、PIC等常用的MCU及其外围电路(如LCD,RAM,ROM,键盘,马达,LED,AD/DA,部分SPI器件,部分IIC器件...)。其实Proteus 与 multisim比较类似,只不过它可以仿真MCU,当然,软件仿真精度有限,而且不可能所有的器件都找得到相应的仿真模型,用开发板和仿真器当然是最好选择,可是初学者拥有它们的可能性比较小。当然,硬件实践还是必不可少的。在没有硬件的情况下,Proteus能像pspice 仿真模拟/数字电路那样仿真MCU及外围电路。另外,即使有硬件,在程序编写早期用软件仿真一下也是很有必要的。Proteus软件主要具有以下几个方面的特点:
1、设计和仿真软件Proteus 是一个很有用的工具,它可以帮助学生和专业人士提高他们的模拟和数字电路的设计能力。
2、它允许对电路设计采用图形环境,在这种环境中,可以使用一个特定符号来代替元器件,并完成不会对真实电路造成任何损害的电路仿真操作。 3、它可以仿真仪表以及可描述在仿真过程中所获得的信号的图表。
4、它可以仿真目前流行的单片机,如PICS, ATMEL-AVR, MOTOROLA, 8051 等。 5、在设计综合性方案中,还可以利用ARES开发印制电路板。
4.2 Protel软件环境介绍
Protel印制板设计软件包是澳大利亚protel technology公司与1990年推出的电子CAD产品,具有方便、易学、实用、快速以及高速度、高步通率的特点。它采用了分层次下拉窗口菜单结构形式,用户基本上不需要记背太多的键盘命令,用鼠标点击菜单命令
- 10 -
微机检测课程设计说明书
就能操作,protel有着很高的自动布线布通率。布通率是电子产CAD产品的一项重要指标,它反映电子元件在电路图中连接关系有多少能在印刷版图中实现。在设计常用的单、双面印制板时只要选择适当的元件布局和布线策略方法,protel就可以轻易的达到98%-100%的布通率。对于极少数不能布通的定方,protel可以用飞线指示出来,引导用户用手工方法连通。另外,protel有强大的宏命令设置功能,利用宏命令功能多定义的热键可以大大提高操作速度
[1]
。
Protel对微机的软硬件配置要求很低:cpu在8088以上,dos2.0以上版本,内存640kb
以上,双软件(或一个软件一个硬盘),单色显示器(多层板设计时最好用彩色),各种兼容打印机。也能在Windows9X平台的模拟DOS下运行。
Protel已成为印制板设计加工方面的工业标准。据初步统计protel在CAD的市场占有
率达 95%,成为电子产品制造业界的首选CAD软件。
4.3系统软件分析
任何一个应用系统,它们都有着自己的硬件系统和软件系统,少了任何一个部分都不可能称之为一个完整的应用系统,它们之间是相互依存的一个整体,硬件系统是软件系统的一个基础和前提,为软件系统提供了一个操作平台;而软件系统是硬件系统的灵魂,它对硬件系统起到扩充和完善的作用。可想而知软件系统与硬件系统同等重要,系统软件设计过程为:系统采用AT89C51单片机进行设计,程序首先对AD进行初始化,滑动变阻器滑片的不同位置将对应不同的电压值,AD采集到的数值也不相同。通过调用转换程序对其进行标度变换,最终显示在LCD12864上。如果标度变换的数值小于所设定的值时,LCD12864上面将会显示提示信息。
- 11 -
微机检测课程设计说明书
4.4 程序流程图
主程序框图: 开始 AD模块初始化 液晶初始化 读AD采样数据 将数据转化为电压值 电压是否小于2 N Y 显示电压值 显示电压值 显示提供信息 图7 主程序框图
- 12 -
微机检测课程设计说明书
数据转换子程序:
开始 i=(X*15*1000)/255 乘以1000 提取每一位数 字用于显示
结束 图8 按键检测子程序框图
滤波子程序流程: 电压取本次采样值 将Get赋给getI进行数据更新 用本次采样值减去上次采样值得变化量X 将AD采样值赋给Get 开始 N X是否大于最大允许差值 Y 电压取上次采样值 结束 图9 滤波子程序流程图
- 13 -
微机检测课程设计说明书
延时子程序框图: 将实参赋给x X自减1 给Y赋初值100
X>0? N 结束 Y Y自减1
开始
Y N Y>0? 图10 延时子程序框图
说明:
该程序主要是实现软件可变延时的功能,该延时子程序主要实现1ms延时 (程序由双重循环嵌套实现,外循环执行减1操作1次,内循环执行加1操作100次。调用延时函数的实参值不同,其延时的时间不同,延时时间=实参*1ms。
- 14 -
微机检测课程设计说明书
5 系统调试过程
通过上面的硬件设计和软件设计过程,设计的工作已经基本完成,接下来的工作就是对所设计好的应用系统进行调试。通过调试可以检查出系统出现的一些错误,从而进行下一步的修改。
(1)在Protel 99 SE中,对硬件电路图进行ERC电气规则检查。
图 11 protel原理图
图12 ERC电气规则检查结果
封装好原理图元件生成网络表加载生成PCB:如图13
- 15 -
微机检测课程设计说明书
图13 PCB布局图
(2)程序调试
程序经过调试显示“0错误,0警告”。表示程序调试通过。如 图14
- 16 -
微机检测课程设计说明书
图14 程序调试结果
(3)protues调试
仿真图建立 :系统采用Proteus软件进行仿真,利用软件自带的仿真模块建立系统的仿真图。图15为蓄电池电压检测系统的最小系统图。
- 17 -
微机检测课程设计说明书
图15 主控芯片仿真
系统采用滑动变阻器作为蓄电池的输入电压,通过改变滑片的位置将输出不同的电压。为了显示器件的对比,在此选用了软件自带的电压表进行检测。
图16 系统检测系统
- 18 -
微机检测课程设计说明书
系统采用LCD12864液晶屏作为显示器件,其具体的仿真连接图如下
图17 系统的显示器件图
当系统检测完后得到输入电压小于我所设定的电压值时,显示提示信息。当电压正常时,不显示。
Proteus仿真调试结果:在不同的电压输入值中对应的显示情况为,当调节滑动变阻器改变AD输入值,此时可以通过电压表观察此时滑动变阻器的电压为+1.8V,单片机通过采集进行程序处理,在显示器上面对应的显示当前值。由于此时的电压低于设定值2V所以,此时显示器有提示信息“电压过低,请充电”如Proteus仿真图(1)所示
Proteus仿真图(1)
当逐渐调节滑动变阻器使其电压值大于2V时,此时显示器显示当前的电压值但提示信息
- 19 -
微机检测课程设计说明书
将消失。如Proteus仿真图(2)所示
Proteus仿真图(2)
- 20 -
微机检测课程设计说明书
结 论
本此次设计过程中,我查阅了一些相关资料,使得我更深入的了解51系列单片机芯片的应用以及相关软件、硬件的使用方法。在这段时间里,我不仅完成设计所要求的内容,也掌握了一些AT89C51芯片的具体功能。此外,设计中所涉及到的元器件还有:电容、电阻、液晶显示器、AD0804等,我通过查阅相关元器件的作用及工作原理。
在整个设计过程中,我们不仅能将书本上学到的关于单片机相关的知识与实践相结合,而且还培养了查找相关资料和自学能力。这将对我们今后的实践提供很大的帮助。设计中还让我意识到:理论和实践相结合的重要性。虽然电路看上去比较简单,但实际行动起来将会遇到许多困难。因此,设计过程中要保持一种持之以恒、严谨的学习态度,这样才会在设计过程中及时的发现问题、解决问题。
- 21 -
微机检测课程设计说明书
致 谢
在陈飞老师的指导下,我完成了本次课程设计。陈老师是一个拥有专业知识,严谨治学态度,精益求精作风的老师,他的严以律己、宽以待人的崇高风范,朴实无华、平易近人的人格魅力对我影响深远。在课程设计里面,他让我重新认识到了专业知识学习的重要性,还使我明白了许多为人处世的道理。本课程设计从选题到完成,都是老师指导下完成。另外,本次设计的完成也离不开各位同学给我的建议和帮助。在此,我谨向陈飞老师和帮助过我的老师和同学们,表示崇高的敬意和衷心的感谢!
- 22 -
微机检测课程设计说明书
参考文献
1]《Protel99SE EDA 技术及应用》徐峥颖编著,北京:机械工业出版社,2005 [2]《单片机系统的protues设计与仿真》张靖武编著,北京:电子工业出版社,2007 [3]《单片机原理及接口技术》李朝青编著,北京:北京航空航天大学出版社,2005 [4]《MCS-51单片机应用开发实用子程序》边春远编著,北京:人民邮电出版社,2005 [5] 刘守义编著.单片机应用技术[M].西安:西安电子科技大学出版社,2002. [6] 韩志军编著.单片机应用系统设计[M].北京:机械工业出版社,2005.
[7] 张毅刚,刘喜元编著.新编MCS-51单片机应用设计[M].哈尔滨:哈尔滨工业大学出版
社,2003.
[8] 唐岚编著.汽车测试技术[M].北京:机械工业出版社,2006.
- 23 -
微机检测课程设计说明书
附录
PCB图
- 24 -
微机检测课程设计说明书
protel原理图
C程序代码:#include uint shi,ge,xiao1,xiao2,xiao3,get,get_l; uint dianya;//电压实际是浮点数,这个电压实际是指AD转化完成后得到的二进制数据,电压的范围定位0到15V//那么得到的真实电压应该是dianya*15整除255得到整数部分,对255取余再乘100对255取余,得到小数部分 /*****函数声明********/ - 25 - 微机检测课程设计说明书 void delay(uint k); void wcode(uchar c,uchar csl,uchar csr); void wdata(uchar c,uchar csl,uchar csr); void set_statrline(uchar i); void set_xy(uchar x,uchar y); void dison_off(uchar o); void reset(); void lcd_init(void); void lw(uchar x,uchar y,uchar dd);//写数据函数 void disp_Hz(uchar xx,uchar yy,uchar n,uchar fb);//显示汉字 void disp_Ez(uchar xx,uchar yy,uchar n,uchar fb); void data_change(uint x);//数据转化将AD得到的数据按位转化为数字方便显示 void Tdelay(unsigned int i); void get0804(); //延时 void Tdelay(unsigned int i) { while(i--); } void get0804() { ad_WR=0; Tdelay(5) ; ad_INTR=0; Tdelay(5) ; ad_INTR=1; Tdelay(5) ; ad_WR=1; Tdelay(5); P1=0xff ; ad_WR=0; Tdelay(5); - 26 - 微机检测课程设计说明书 ad_RD=0; Tdelay(30); get=P3; Tdelay(5); ad_RD=1; Tdelay(5); ad_WR=1; } void delay(uint k) { uint i; for(;k>0;k--) } // //LCM忙判断 void lcd_busy(void) { p_di=0; p_rw=1; /*lcm=0xff; while(1) { p_e=1; if(lcm<0x80) break; p_e=0; } p_e=0;*/ } //写指令到LCM void wcode(uchar c,uchar csl,uchar csr) { p_csl=csl; - 27 - { for(i=0;i<124;i++) {;} } 微机检测课程设计说明书 p_csr=csr; lcd_busy(); p_di=0; p_rw=0; lcm=c;//将变量C赋予LCM p_e=1; p_e=0; } //写数据到LCM子函数 void wdata(uchar c,uchar csl,uchar csr) { p_csl=csl; p_csr=csr; lcd_busy(); p_di=1; p_rw=0; lcm=c;//将变量C赋予LCM p_e=1; p_e=0; } //设定起始行 void set_startline(uchar i) { i=0xc0+i; wcode(i,1,1); } //定位X方向,Y方向 void set_xy(uchar x,uchar y) { x=x+0x40; y=y+0xb8; wcode(x,1,1); wcode(y,1,1); } //屏幕开启、关闭 - 28 - //c表示的是要写的数据8个二进制位 微机检测课程设计说明书 void dison_off(uchar o) { o=o+0x3e; //o为1为开,为0是关 wcode(o,1,1); } //复位子函数 void reset() {//delay(1000); p_rst=0; delay(20); p_rst=1; delay(20); } //LCM初始化 void lcd_init(void) { uchar x,y; reset(); dison_off(0); for(y=0;y<8;y++) { for(x=0;x<128;x++) lw(x,y,0); } dison_off(1); set_startline(0); } //写数据到LCM void lw(uchar x,uchar y,uchar dd) //先定位,再写入数据 { if(x>=64) { set_xy(x-64,y); wdata(dd,0,1);//写右半屏 } else - 29 - 微机检测课程设计说明书 } { set_xy(x,y); wdata(dd,1,0); } //显示汉字子函数 void disp_Hz(uchar xx,uchar yy,uchar n,uchar fb)//xx为该行第xx个字,共8字,yy为第几行,共8行,n为字库中第N个字。 { uchar i,dx; for(i=0;i<16;i++) { dx=HZ[2*i+n*32]; //2*i为选择偶数行,因其为列扫描 一个字在X方向应该是 16个像素,因为用的是整列16个从上到下编码每一列占两个字符 } void disp_Ez(uchar xx,uchar yy,uchar n,uchar fb)//显示数字或英语 { uchar i,dx; for(i=0;i<8;i++) { dx=Ez[2*i+n*16]; if(fb) dx=255-dx; lw(xx*8+i,yy,dx);// if(fb) dx=255-dx;//反白显示 lw(xx*16+i,yy,dx); dx=HZ[(2*i+1)+n*32]; if(fb) dx=255-dx; lw(xx*16+i,yy+1,dx); } dx=Ez[(2*i+1)+n*16]; if(fb) dx=255-dx; lw(xx*8+i,yy+1,dx); - 30 - 微机检测课程设计说明书 } } void filter()//限幅滤波 { int x; x=get-get_l; if(x>10 & x<-10) dianya=get_l; else dianya=get; get_l=get; } void data_change(uint x) { uint i,j; i=(x*15)/255; j=((x*15)%255)*200/51;//本来应该是 ((x*15)%255)*1000/255 shi=i/10; ge=i%10; xiao1=j/100; xiao2=j%100/10; xiao3=j%100%10; } /*****主函数****/ void main() { uchar loop,j;// uchar fb=0; lcd_init(); delay(300); for(loop=0;loop<8;loop++)//行1 { disp_Hz(loop,0,loop,fb); } //dianya=111; while(1) - 31 - 会出现溢出 微机检测课程设计说明书 { get0804(); filter(); data_change(dianya); fb=0; if(shi) disp_Ez(4,4,shi,fb); else disp_Ez(4,4,12,fb); disp_Ez(5,4,ge,fb); disp_Ez(6,4,10,fb); disp_Ez(7,4,xiao1,fb); disp_Ez(8,4,xiao2,fb); disp_Ez(9,4,xiao3,fb); disp_Ez(10,4,11,fb); if(dianya<=34) { j++; if(j<5) { } if(j>=5) { } for(loop=0;loop<8;loop++)//行1 { disp_Hz(loop,6,loop+8,fb); fb=1; if(j==10) j=0; fb=0; } } else - 32 - 微机检测课程设计说明书 { fb=0; for(loop=0;loop<16;loop++)//行1 { disp_Ez(loop,6,12,fb); } } } } uchar code HZ[]= { 0x00,0x00,0x40,0x40,0x42,0x44,0x44,0x44, 0x58,0x44,0x40,0x44,0x40,0x44,0x7F,0x44, 0x40,0x44,0x40,0x44,0x50,0x44,0x48,0x44, 0xC6,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,/*\"当\0x08,0x00,0x08,0x00,0xE8,0xFF,0x29,0x09, 0x2E,0x49,0x28,0x89,0xE8,0x7F,0x08,0x00, 0x08,0x00,0xC8,0x0F,0x0C,0x40,0x0B,0x80, 0xE8,0x7F,0x08,0x00,0x08,0x00,0x00,0x00,/*\"前\0x12,0x00,0x12,0x00,0x12,0xFA,0x52,0xAA, 0x77,0xAB,0x52,0xAB,0xD2,0xAA,0xDA,0xFA, 0x52,0xAA,0x52,0xAA,0x37,0xAA,0x92,0xAA, 0x12,0xFB,0x12,0x06,0x12,0x00,0x00,0x00,/*\"蓄\0x00,0x00,0x00,0x00,0xF8,0x1F,0x88,0x08, 0x88,0x08,0x88,0x08,0x88,0x08,0xFF,0x7F, 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, 0xF8,0x9F,0x00,0x80,0x00,0xF0,0x00,0x00,/*\"电\0x10,0x04,0x60,0x04,0x02,0x7E,0xCC,0x01, 0x80,0x00,0x80,0x00,0xFC,0x3F,0x40,0x40, 0x20,0x40,0xFF,0x4F,0x10,0x40,0x08,0x44, 0xF8,0x47,0x00,0x40,0x00,0x78,0x00,0x00,/*\"池\0x00,0x00,0x00,0x00,0xF8,0x1F,0x88,0x08, 0x88,0x08,0x88,0x08,0x88,0x08,0xFF,0x7F, - 33 - 微机检测课程设计说明书 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, 0xF8,0x9F,0x00,0x80,0x00,0xF0,0x00,0x00,/*\"电\0x00,0x80,0x00,0x60,0xFE,0x1F,0x02,0x40, 0x82,0x40,0x82,0x40,0x82,0x40,0x82,0x40, 0xFA,0x7F,0x82,0x40,0x82,0x40,0x82,0x44, 0x82,0x58,0x82,0x40,0x02,0x40,0x00,0x00,/*\"压\0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x36, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*\":\0x00,0x00,0x00,0x00,0xF8,0x1F,0x88,0x08, 0x88,0x08,0x88,0x08,0x88,0x08,0xFF,0x7F, 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, 0xF8,0x9F,0x00,0x80,0x00,0xF0,0x00,0x00,/*\"电\0x00,0x80,0x00,0x60,0xFE,0x1F,0x02,0x40, 0x82,0x40,0x82,0x40,0x82,0x40,0x82,0x40, 0xFA,0x7F,0x82,0x40,0x82,0x40,0x82,0x44, 0x82,0x58,0x82,0x40,0x02,0x40,0x00,0x00,/*\"压\0x40,0x00,0x40,0x40,0x42,0x20,0xCC,0x1F, 0x00,0x20,0x08,0x40,0x48,0x40,0x88,0x41, 0x08,0x40,0x08,0x48,0x08,0x50,0xFF,0x4F, 0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,/*\"过\0x00,0x01,0x80,0x00,0x60,0x00,0xF8,0xFF, 0x07,0x00,0x00,0x00,0xFC,0xFF,0x84,0x40, 0x84,0x20,0x84,0x00,0xFE,0x41,0x82,0x8E, 0x83,0x30,0x82,0x40,0x80,0xF8,0x00,0x00,/*\"低\0x00,0x00,0x00,0x00,0x00,0x58,0x00,0x38, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*\",\0x40,0x00,0x42,0x00,0xCC,0x7F,0x00,0x20, 0x00,0x10,0x44,0x00,0x54,0xFF,0x54,0x15, - 34 - 微机检测课程设计说明书 0x54,0x15,0x7F,0x15,0x54,0x55,0x54,0x95, 0x54,0x7F,0x44,0x00,0x40,0x00,0x00,0x00,/*\"请\0x04,0x00,0x04,0x80,0x84,0x80,0xC4,0x40, 0xA4,0x30,0x9C,0x0F,0x85,0x00,0x86,0x00, 0x84,0x00,0x84,0x7F,0xA4,0x80,0xC4,0x80, 0x84,0x81,0x04,0xF0,0x04,0x00,0x00,0x00,/*\"充\0x00,0x00,0x00,0x00,0xF8,0x1F,0x88,0x08, 0x88,0x08,0x88,0x08,0x88,0x08,0xFF,0x7F, 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88, 0xF8,0x9F,0x00,0x80,0x00,0xF0,0x00,0x00,/*\"电\}; //数字 uchar code Ez[]={ 0x00,0x00,0xE0,0x0F,0x10,0x10,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00,/*\"0\0x00,0x00,0x00,/*\"1\8,0x21,0x70,0x30,0x00,0x00,/*\"2\88,0x20,0x48,0x11,0x30,0x0E,0x00,0x00,/*\"3\0x20,0x24,0x10,0x24,0xF8,0x3F,0x00,0x24,0x00,0x00,/*\"4\9,0x08,0x21,0x88,0x20,0x88,0x20,0x08,0x11,0x08,0x0E,0x00,0x00,/*\"5\x00,0xE0,0x0F,0x10,0x11,0x88,0x20,0x88,0x20,0x18,0x11,0x00,0x0E,0x00,0x00,/*\"6\x00,0x00,/*\"7\,0x70,0x1C,0x00,0x00,/*\"8\22,0x10,0x11,0xE0,0x0F,0x00,0x00,/*\"9\0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*\".\88,0x07,0x00,0x38,0x00,0x0E,0xC8,0x01,0x38,0x00,0x08,0x00,/*\"V\,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*\" \}; - 35 - 因篇幅问题不能全部显示,请点此查看更多更全内容