资源描述
目录
摘 要 II
1 设计目标 1
2 设计要求 2
3 设计内容 3
3.1 系统需求分析 3
3.1.1 硬件选择 3
3.1.2 软件选择 4
3.2 硬件电路设计 4
3.2.1 输入电路模块设计 4
3.2.2 LM7805稳压电源电路介绍 5
3.2.3 显示模块电路设计 6
3.2.4 A/D转换设计 7
3.2.5 单片机模块介绍 10
3.3系统软件设计 13
3.3.1主程序设计 14
3.3.2 各子程序设计 15
总结和致谢 17
参考文件 18
附录一 系统整体电路图 19
附录二 A/D转换电旅程序 20
附录三 1602LCD显示模块程序 22
摘 要
本设计在查阅了大量前人设计数字电压表基础上,利用单片机技术结合A/D转换芯片ADC0832构建了一个直流数字电压表。本文首先简明介绍了单片机系统优势,然后具体介绍了直流数字电压表设计步骤,和硬件系统和软件系统设计。
本文介绍了基于89S51单片机电压测量系统设计,介绍1602LCD液晶功效和ADC0832转换原理。该电路设计简单,方便。该设计能够测量0~5V电压值,并在1602LCD液晶上显示出来。
本系统关键包含三大模块:主程序模块、显示模块、A/D转换模块,绘制点哭原理图和工作步骤图,并进行调试,最终设计完成了该系统硬件电路,在软件编程上,采取了c语言进行编程,开发了显示模块程序,A/D转换程序。
关键词:电压测量;A/D转换;89S51单片机
1 设计目标
电压是属于电子测量中一个关键组成部分。了解,测出多种电压值,有利于让我们愈加安全、方便使用电压。因为研究电压测量值含相关键价值。
传统指针式电压表功效单一、精度低,已经满足不了现在时代需求,而采取单片机数字电压表,精度高、抗干扰能力强,可扩张性强、集成方便,还可和PC实施实时通信,现在,由多种单片机和A/D转换器组成数字电压表,已被广泛用于电子及电工测量、工业自动化仪表、自动测试系统等智能化测量领域。
基于单片机电压检测系统设计,控制系统采取89S51单片机,A/D转换器采取ADC0832为关键硬件,实现数字电压表硬件电路和软件设计。数字电压表能够测量0~5V输入电压值,并在1602LCD液晶模块上显示。
2 设计要求
1.依据已知参数对输入信号特征进行分析、需求分析,选择确定单片机型号、多种外围芯片型号,完成系统硬件设计。
2.基础教学要求:每人一台计算机,计算机安装Keil、Protel等软件。
3. (利用单片机设计并制作简易直流数字电压表,能够测出0~5V直流电压,电路组成框图图所表示。
(1)测量精度0.02V。
(2)利用数码管或液晶显示器显示电压值。
(3)测量范围0~5V。
3 设计内容
3.1 系统需求分析
本设计从各个角度分析了由单片机组成数字电压表设计过程及各部分电路组成及其原理。框图以下:
本设计关键分为两部分:硬件电路及软件程序。而硬件电路又大致可分为单片机小系统电路、A/D转换电路、液晶显示电路,各部分电路设计及原理将会在硬件电路设计部分具体介绍;程序设计使用C语言编程。
电压是检测中最基础测量值,关键过程是模拟信号经过输入电路调理,在经过放大电路,变换成适宜范围信号幅度,接着该信号,经过A/D转换电路转化成数字信号,数字信号既能够直接经过单片机处理、保留,再由液晶显示器显示出来。
总体设计内容:被测电压经过运算放大电路,能够被AD接收电压范围,然后该信号经过ADC0832芯片A/D转换电路转化成数字信号,再经过89S51单片机处理、保留,由1602LCD液晶模块显示出来。
该电压表可达成以下程度:
(1) 电压表量程范围0V~5V;
(2) 能用液晶显示电压值;
(3) 测量精度可达成0.02mV。
3.1.1 硬件选择
选择89S51作为单片机芯片,选择1602LCD液晶屏来实现电压显示,因为ADC0832基准电压由它内部本身提供,所以为了方便,我就利用ADC0832作为数模转换芯片,利用P0至P4各个串口来进行不一样设备间连接,计算机进行汇编,H51/L仿真器,单片机多功效试验箱。
3.1.2 软件选择
本设计是硬件电路和软件编程相结合设计方案,选择适宜编程语言是一个关键步骤。在单片机应用系统程序设计时,常见是汇编语言和C语言。汇编语言特点是占用内存单元少,实施效率高。实施速度快。但它依靠于计算机硬件,程序可读性和可移植性比较差。而C语言即使实施效率没有汇编语言高,但语言简练,使用方便,灵活,运算丰富,表示化类型多样化,数据结构类型丰富,含有结构化控制语句,程序设计自由度大,有很好可重用性,可移植性等特点。
因为现在单片机发展已经达成了很高水平,内部多种资源相当丰富,CPU处理速度很快。用C语言来控制单片机无疑是一个理想选择。所以在本设计中采取C语言编写软件程序。
3.2 硬件电路设计
3.2.1 输入电路模块设计
电压测量原理图所表示,电压输入到LM358正相端。最高输入电压可到5V ,使输入电压处于AD量程范围。LM358 组成一个电压跟随器,起到隔离前后通道作用,其较低输出电阻还能够提升带负载能力,输出端 接入ADC。
因为该设计精度要达成0.01mV左右,所以我们加入了LM358放大器,来放大较小被测电压,输入到AD转换器中,再经过单片机处理从液晶上显示出来。
图所表示,是由LM358放大器组成,LM358 内部包含有两个独立、高增益、内部频率赔偿双运算放大器,适合于电源电压范围很宽单电源使用,也适适用于双电源工作模式,在推荐工作条件下,电源电流和电源电压无关。它使用范围包含传感放大器、直流增益模块和其它全部可用单电源供电使用运算放大器场所。
电容C5是阻容滤波,为了使得信号更稳定。
3.2.2 LM7805稳压电源电路介绍
用lm78/lm79系列三端稳压IC来组成稳压电源所需外围元件极少,电路内部有过流、过热和调整管保护电路,使用方便、可靠,而且价格低廉。该系列集成稳压IC型号中lm78或lm79后面数字代表此三端集成稳压电路输出电压。因为三端固定集成稳压电路使用方便,电子制作中常常采取。
这是一个输出正5V直流电压稳压电源电路。IC采集成稳压器lm7805,C4为输出端滤波电容,D1为输入反向保护。
3.2.3 显示模块电路设计
显示模块选择关系到整个系统设计功效多少,我们只需要显示最终电压数字值和电压单位,依据多种显示器件特点:数码管只能显示数字,不能显示单位字符,不符合本设计要求。而点阵显示器件驱动显示软件程序编写麻烦,占用引脚相对也较多。也不是理想显示器件。所以在本设计中,我们考虑用液晶显示器件,即使12864液晶比1602液晶功效强,不过在价格方面却贵了好多。而1602液晶也足够满足本设计需要。所以,在本设计试验我们选择1602液晶显示器件。
1602LCD分为带背光和不带背光两种,带背光比不带背光厚,是否带背光在应用中并无差异,此次设计采取带背光。1602液晶模块内部字符发生存放器有存放了160个不一样点阵字符图形,这些字符有:阿拉伯数字、英文字母大小写、常见符号等,每一个字符全部有一个固定代码,比如大写阿拉伯数字“8”代码是00111000B(38H),显示时模块把地址38H中点阵字符图形显示出来,我们就能看到数字“8”。LCD1602和单片机接口图所表示。
第0脚:GCD为地电源。
第1脚:VCC接5V正电源。
第2脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时能够经过一个10K电位器调整对比度。
第3脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第4脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时能够写入指令或显示地址,当RS为低电平R/W为高电平时能够读忙信号,当RS为高电平R/W为低电平时能够写入数据。
第5脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块实施命令。
第6~13脚:D0~D7为8位双向数据线。
第14脚:背光源正极。
第15脚:背光源负极。
3.2.4 A/D转换设计
3.2.4.1 A/D电路介绍和选择
在该设计中,模数(A/D)转换模块是一个很关键模块,它关系到最终数字电压表电压值正确度。所以,A/D芯片选择是设计过程中一个很关键步骤。
模数转换器即A/D转换器,或简称ADC,通常是指一个将模拟信号转变为数字信号电子元件。通常模数转换器是将一个输入模拟电压信号转换为一个输出数字信号。模数转换器最关键参数是转换精度,通常见输出数字信号位数多少表示。转换器能够正确输出数字信号位数越多,表示转换器能够分辨输入信号能力越强,转换器性能也就越好。A/D转换通常要经过采样,保持,量化及编码4个过程。在实际电路中,有些过程是合并进行,如采样和保持,量化和编码在转换过程中是同时实现。
ADC0832是8脚双列直插式双通道A/D转换器,能分别对两路模拟信号实现模—数转换,能够用在单端输入方法和差分方法下工作。ADC0832采取串行通信方法,经过DI 数据输入端进行通道选择、数据采集及数据传送。8位分辨率(最高分辨可达256级),能够适应通常模拟量转换要求。其内部电源输入和参考电压复用,使得芯片模拟电压输入在0~5V之间。含有双数据输出可作为数据校验,以降低数据误差,转换速度快且稳定性能强。独立芯片使能输入,使多器件挂接和处理器控制变愈加方便。ADC0832是8位精度,在本设计中,为了降低数字电压表误差率,在同类比AD转换器中,ADC0832性价比较高,于是我就选择了ADC0832作为这次设计AD转换器。
3.2.4.2 ADC0832和单片机接口电路
CH0、CH1。是ADC0832两个通道,在ADC0832工作时,被测电压进行通道选择进入CH0或CH1通道,ADC0832采取串行通信方法,经过DI 数据输入端进行通道选择、数据采集及数据传送。CS,CLK,DI,DO四个是和单片机P3接口相连,只有在使能端CS为低电平时,ADC0832才开始工作,此时处理器向AD传送时钟信号,而依据DI和DO来选择需要通道信号,传入单片机处理和保留。
在第一个时钟脉冲下降之前DI端必需是高电平,表示开始信号。在第二、三个脉冲下将之前DI端应输入两个数据用于选择通道功效。
通道地址
通道
工作方法说明
SGL/DIF
ODD/SIGN
0
1
0
0
+
-
差分方法
0
1
-
+
1
0
+
单端输入方法
1
1
+
当此两个数据为“1”、“0”时,只对CH0 进行单通道转换。当两个数据为“1”、“1”时,只对CH1进行单通道转换。当两个数据为“0”、“0”时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。当两位数据为“0”、“1”时,将CH0作为负输入端IN-,CH1 作为正输入端IN+进行输入。到第三个脉冲下降以后DI端输入电平就失去输入作用,以后DO/DI端则开始利用数据输出DO进行转换数据读取。从第4个脉冲下降沿开始由DO端输出转换数据最高位Data7,随即每一个脉冲下降沿DO端输出下一个数据。直到第11个脉冲时发出最低位数据Data0,一个字节数据输出就完成了。也正是以后位开始输出下一个相反字节数据,即从第11个字节下降沿输出Data0。随即输出8位数据,到第19 个脉冲时数据输出完成,也标志着一次A/D转换结束。最终将CS置高电平停用芯片,直接将转换后数据进行处理就能够了。
作为单通道模拟信号输入时ADC0832输入电压是0—5V且8位分辨率时电压精度为19.53125mV,即量化间隔为(5/256)V。假如作为由IN+和IN-输入输入时,可是将电压值设定在某一个较大范围之内,从而提升转换宽度。但值得注意是,在进行IN+和IN-输入时,假如IN-电压大于IN+电压则转换后数据结果一直为00H。
3.2.5 单片机模块介绍
单片机是指一个集成在一块芯片上完整计算机系统,含有一个完整计算机所需要大部分部件:CPU,内存,总线系统等。而现在常见单片机8位有51系列单片机,AVR单片机,PIC单片机。
应用最广8位单片机还是intel51系列单片机。51系列单片机特点是:硬件结构合理,指令系统规范,加之生产历史悠久,世界有很多芯片企业全部买了51芯片关键专利技术,并在其基础上扩充其性能,使得芯片运行速度变得愈加快,性价比更高。
我们在此次设计中选择了89S51芯片,正因为含有功效强、体积小、成本低、功耗小等特点,所以它可单独地完成现代工业控制所要求智能化控制功效,能在软件控制下正确、快速、高效地完成程序设计者事先要求任务。
89S51是一个带4K字节闪烁可编程可擦除只读存放器低电压,高性能CMOS8位微处理器,俗称单片机。该器件采取ATMEL高密度非易失存放器制造技术制造,和工业标准MCS-51 指令集和输出管脚相兼容。因为将多功效8位CPU和闪烁存放器组合在单个芯片中,ATMEL89S51是一个高效微控制器,为很多嵌入式控制系统提供了一个灵活性高且价廉方案。
3.2.5.1 单片机小系统
单片机最小系统包含晶振电路,电源。在此模块中,单片机晶振是12MHZ。P1端口和AD转换器连接,RS、RW、EN和P0端口和1602LCD连接。
被测电压被AD转换后从P1端口输入,由单片机进行数据采集然后保留在RAM中。再经过单片机系统软件程序编写,适合1602LCD输入,则经过P1端口输出,在1602LCD上显示出来被测电压。
3.2.5.2 89S51单片机基础组成
(1)一个8位微处理器(CPU)。
(2)片内256字节数据存放器RAM/SFR,用以存放能够读/写数据,如运算中间结果、最终止果和欲显示数据等。
(3)片内4KB程序存放器Flash ROM,用以存放程序、部分原始数据和表格。
(4)4个8位并行I/O端口P0-P3,每个端口既能够用作输入,也能够用作输出。
(5)两个16位定时器/计数器,每个定时器/计数器全部能够设置成计数方法。
(6)含有5个中止源、两个中止优先级中止控制系统。
(7)一个全双工UART串行I/O口,用于实现单片机之间或单片机和PC机之间串行通信。
(8)片内振荡器和时钟产生电路,但石英晶体和微调电容需要外接。
(9)含有节电工作方法,即休闲方法和掉电方法。
以上各个部分经过片内八位数据总线相连接。
3.2.5.3 89S51引脚及其功效
(1)XTAL1(19脚):振荡器反相放大器及内部时钟发生器输入端。
(2)XTAL2(18脚):振荡器反相放大器输出端。
(3)RST(9脚):复位输入,当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。
(4)P0口(39~32脚):P0口是一个漏极开路8位准双向I/O端口。作为漏极开路输出端口,每位能驱动8个LS型TTL负载。当P0口作为输入口使用时,应先向口锁存器写入全1,此时P0口全部引脚浮空,可作为高阻抗输入。
(5)P3口(10~17脚):P3口是一组带有内部上拉电阻8位双向I/O多功效口。P3口输出缓冲器可驱动4个TTL逻辑门电路。对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口,此时,被外部拉低P3口将用上拉电阻输出电流。当CPU不对P3口进行SFR寻址访问时,即用作第二功效输出/输入线时,由内部硬件使锁存器Q置1。
整个PEROM阵列和三个锁定位电擦除可经过正确控制信号组合,并保持ALE管脚处低电平10ms来完成。在芯片擦除操作中,代码陈列全被写“1”且在任何非空存放字节被反复编程以前,该操作必需被实施。另外,89S51设有稳态逻辑,支持两种软件可选掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,计数器,串口和中止系统仍在工作。在掉电模式下,保留RAM内容而且冻结振荡器,严禁所用其它芯片功效,直到下一个硬件复位为止。
3.3系统软件设计
本设计是硬件电路和软件编程相结合设计方案,选择适宜编程语言是一个关键步骤。在单片机应用系统程序设计时,常见是汇编语言和C语言。汇编语言特点是占用内存单元少,实施效率高。实施速度快。但它依靠于计算机硬件,程序可读性和可移植性比较差。而C语言即使实施效率没有汇编语言高,但语言简练,使用方便,灵活,运算丰富,表示化类型多样化,数据结构类型丰富,含有结构化控制语句,程序设计自由度大,有很好可重用性,可移植性等特点。
因为现在单片机发展已经达成了很高水平,内部多种资源相当丰富,CPU处理速度很快。用C语言来控制单片机无疑是一个理想选择。所以在本设计中采取C语言编写软件程序。
3.3.1主程序设计
初始化中,关键针对89S51、ADC0832管脚和1602LCD液晶位选进行初始化设置。
利用公式VOT=(unsigned int)((unsigned long)val*5000/255);得出数据显示在液晶显示器上第一行;利用VAL= GetVal0832(1);得出数据显示在液晶显示器上第二行。
主程序:
void main()
{
uchar val;
init();
while(1)
{
val = GetVal0832(1);
Vot = (unsigned int)((unsigned long)val*5000/255);
//显示电压
WriteChar(0,0,'V');
WriteChar(1,0,'O');
WriteChar(2,0,'T');
WriteChar(3,0,':');
WriteChar(4,0,(Vot%10000)/1000+0x30);
WriteChar(5,0,'.');
WriteChar(6,0,(Vot%1000)/100+0x30);
WriteChar(7,0,(Vot%100)/10+0x30);
WriteChar(8,0,(Vot%10)+0x30);
WriteChar(0,1,'V');
WriteChar(1,1,'A');
WriteChar(2,1,'L');
WriteChar(3,1,':');
WriteChar(4,1,val/1000+0x30);
WriteChar(5,1,(val%1000)/100+0x30);
WriteChar(6,1,(val%100)/10+0x30);
WriteChar(7,1,(val%10)+0x30);
delay(10);
}
3.3.2 各子程序设计
3.3.2.1 A/D程序步骤图
为了高速有效实现通信,我们采取汇编语言编写接口程序。因为ADC0832数据转换时间仅为32μS,所以A/D转换数据采样频率能够很快,从而也确保一些场所对A/D转换数据实时性要求。数据读取程序以子程序调用形式出现,方便了程序移植。
程序占用资源有累加器A,工作寄存器R7,通用寄存器B和特殊寄存器CY。通道功效寄存器和转换值共用寄存器B。在使用转换子程序之前必需确定通道功效寄存器B值,其赋值语句为“MOV B,#data”(00H~03H)。运行转换子程序后转换数据值被放入B中。子程序退出后即能够对B中数据处理。
3.3.2.2显示程序步骤图
LCD进行初始化,从通电开始延时,先经过判忙后再进行功效设置,过一段时间后能够设置显示状态再经过延时清屏后才能够设置输入方法,具体实现过程以下图所表示:
LCD显示程序设计通常先要确定LCD初始化、光标定位、确定显示字符后,显示程序步骤图以下:
总结和致谢
在高焕兵老师和胡秀蒙老师悉心指导下,我顺利完成了此次课程设计。在试验中我认识到单片机应用现在已经是在工业,电子等方面展示出了它优越性,利用单片机在设计电路逐步成了趋势,它和外围电路再加上软件程序就能够构建任意产品,使得本设计成为现实。伴随单片机日益发展,它必将在未来显示出更大活力,为电子设计更多出色。对于数字电压表而言,功效将会越来越强大,以后一定要加强单片机知识学习。
经过此次课程设计,使我对单片机及数模电等知识掌握和了解有了深入加深,巩固了我在《单片机原理及应用》课程中所学基础理论知识和试验技能,使我对《单片机原理及应用》课程有了更深入了解深入激发了我对所学专业学习爱好;提升了我认识和了解和实践能力。
在设计过程和设计说明书撰写过程中,高老师和胡老师给了我热心帮助和大力支持,给我提了很多宝贵意见,拓宽了我思绪。在此我向老师致以高尚敬意和衷心感谢!
参考文件
[1] 马潮. AVR单片机嵌入式系统原理和应用实践 [M].北京: 北京航空航天大学出版社,.
[2] 杨欣,王玉凤,刘湘黔. 51单片机应用从零开始 [M].北京: 清华大学出版社,.
[3] 沈建华,杨艳琴. MSP430系列16位超低功耗单片机原理和实践[M]. 北北京航空航天大学出版社,.
[4] 马忠梅.单片机C语言应用程序设计[M].北京:北京航空航天大学出版社,.
[5] 胡汉才.单片机原理及其接口技术[M].北京:清华大学出版社,.
[6] 王珊,萨师煊.数据库系统概论[M].北京:高等教育出版社..
[7] 蒋焕文,孙续编著.电子测量.第二版[M].北京:中国计量出版社,1988.
[8] 杨吉祥,詹宏英编著.电子测量技术基础[M].南京:东南大学出版社,1999.
[9] 陈杰美,古天祥编.电子仪器[M].北京:国防工业出版社,1986.
[10] 张乃国编,电子测量技术[M].北京:人民邮电出版社,1985.
[11] 刘君华编著.现代检测技术和测试系统设计[M].西安:西安交通大学出版,1999.
[12] 李广第. 单片机基础[M].北京:北京航空航天大学出版社,1999.
[13]徐惠民、安德宁. 单片微型计算机原理接口和应用.[M]. 北京:北京邮电大学出版社,1996
[14]何立民.中一片机高级教程[M].北京:北京航空航天大学出版社..
[15]徐江海.中一片机实用教程[M]北京:机械工业出版社,.
[16]康华光,陈大钦.电子技术基础(模拟部分) [M]北京:i}}等教育出版社,1999.
[17]孟庆浩,翟振铎,孙冰A/ D转换器MC 14433实际应用中若干问题探讨[J].天津理工学院学报,1996.
附录一 系统整体电路图
附录二 A/D转换电旅程序
#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//定义液晶接口
sbit rs=P2^0;
sbit lcden=P2^2;
sbit rw = P2^1;
// ADC0832连接端口
sbit ADC0832_CLK = P1^3;
sbit ADC0832_DO = P1^5;
sbit ADC0832_DI = P1^4;
sbit ADC0832_CS = P1^2;
uint Vot = 0;
// 读ADC0832指定通道AD转换数值
uchar GetVal0832(uchar channel)
{
uchar i,dat=0; // 读到数据,MSB FIRST DATA
bit SGL_DIF,ODD_SIGN; // 通道选择信号
switch(channel)
{ case 1:SGL_DIF=1;ODD_SIGN=0;break; // 选单通道
case 2:SGL_DIF=1;ODD_SIGN=1;break; // 选单通道
case 3:SGL_DIF=0;ODD_SIGN=0;break; // CH0为+,CH1为-
case 4:SGL_DIF=0;ODD_SIGN=1;break; // CH0为-,CH1为+
default:break; // 通道选择错误
}
ADC0832_CS=1; // 片选无效
// 一个无效时钟周期
ADC0832_CLK=1;
_nop_();
ADC0832_CLK=0;
_nop_();
ADC0832_CS=0; // 片选有效,开始AD转换
// 传START BIT 信号
ADC0832_CLK=0;
_nop_();
ADC0832_DI=1; // START BIT
ADC0832_CLK=1; //上升沿锁住START BIT信号
_nop_();
// 传通道选择信号
ADC0832_CLK=0;
_nop_();
ADC0832_DI=SGL_DIF;
ADC0832_CLK=1; // 上升沿锁住SGL/DIF信号
_nop_();
ADC0832_CLK=0;
_nop_();
ADC0832_DI=ODD_SIGN;
ADC0832_CLK=1; // 上升沿锁住ODD_SIGN信号
_nop_();
ADC0832_CLK=0; // 此下降沿开始转换,开始读取数值
_nop_();
// 读取AD转换数值
for(i=0;i<8;i++)
{
ADC0832_CLK=1; // CLK为1时,DO肯定保持在稳定态
_nop_(); // 故此时可读出数据
if(ADC0832_DO)
dat++;
dat=dat<<1;
ADC0832_CLK=0;
_nop_();
}
// 释放总线
ADC0832_CLK=1;
_nop_();
ADC0832_CLK=0;
_nop_();
ADC0832_CS=1; //读取完成,片选无效
return dat;
}
附录三 1602LCD显示模块程序
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=10;b>0;b--);
}
//LCD1602写命令
void write_com(uchar com)
{
P0=com;
rs=0;
rw=0;
lcden=0;
delay(10);
lcden=1;
delay(10);
lcden=0;
}
//LCD1602写数据
void write_date(uchar date)
{
P0=date;
rs=1;
rw = 0;
lcden=0;
delay(10);
lcden=1;
delay(10);
lcden=0;
}
//LCD1602初始化
void init()
{
delay(200);
write_com(0x38);
delay(20);
write_com(0x38);
delay(20);
write_com(0x38);
delay(20);
write_com(0x0c);
delay(20);
write_com(0x06);
delay(20);
write_com(0x01);
delay(20);
}
//LCD1602指定位置显示字符
void WriteChar(uchar pox_x,uchar pox_y,uchar chr)
{
uchar addr=0;
if( pox_y==0 )
{
addr = pox_x + 0x80;
}
else
{
addr = pox_x + 0xC0;
}
write_com(addr);
delay(10);
write_date(chr);
delay(10);
}
//LCD1602指定位置显示数值
void WriteNum(uchar pox_x,uchar pox_y,uint dat,uchar zero)
{
uchar b[4];
uchar i,j=0;
if(dat<10000)
{
b[0] = (dat%10000)/1000;
b[1] = (dat%1000)/100;
b[2] = (dat%100)/10;
b[3] = dat%10;
}
else
{
b[0] = dat/10000;
b[1] = (dat%10000)/1000;
b[2] = (dat%1000)/100;
b[3] = (dat%100)/10;
}
for(i=0;i<4;i++)
{
if(b[i]==0)
{
if(zero==0)
{
WriteChar(pox_x+j,pox_y,b[i]+0x30);
j++;
}
}
else
{
WriteChar(pox_x+j,pox_y,b[i]+0x30);
j++;
}
}
}
展开阅读全文