资源描述
江苏信息职业技术学院毕业设计
毕业设计
程控放大器系统设计
系 电子信息工程系
专业 电子信息工程技术 姓名 杨晨
班级 电信101 学号 1001043136
指导教师 陈洁 职称 副教授
设计时间 2012.9.15-2013.1.4
摘 要
本设计介绍一种基于AT89C51单片机的简易程控放大器系统,主要由单片机丶数模转换器和运算放大器组成。系统的基本工作原理:单片机通过改变DAC0832的数字输出量改变系统的增益。单片机通过按键改变DAC0832的数字量,使得程控放大器的增益发生变化。增益放大倍数和输出电压值通过液晶显示。
关键词:AT89C51单片机,DAC0832,数模转换器,运算放大器
I
目 录
摘 要 I
目 录 II
第1章 绪 论 1
1.1 课题来源 1
1.2 设计思路 1
第2章 方案设计 2
2.1 核心模块的方案论证与比较 2
2.1.1 控制模块 2
2.1.2 显示模块 2
2.2 系统设计要求 2
2.3 系统设计思路 2
2.4 系统硬件框图 3
第3章 系统硬件设计 4
3.1 单片机的应用与选择 4
3.2 芯片简介 4
3.2.1 AT89C51性能简介 4
3.2.2 AT89C51的主要特性 4
2.2.3 AT89C51管脚功能 5
3.2 控制显示电路 6
3.3 键盘电路 8
3.4 D/A转换电路 8
3.4.1 管脚功能 9
3.4.2 D/A转换电路 10
3.5 放大电路 11
3.6整机电路 11
第 4 章 软件设计及仿真 12
4.1 软件流程图 12
4.2 程序代码 12
4.3 仿真设计 12
4.3.1 VW简介 13
4.3.2 PROTUES仿真 14
总 结 17
参考文献 18
致 谢 19
附录A 程序 20
附录B 系统原理图 25
II
第1章 绪 论
1.1 课题来源
程控放大器,又名可编程放大器,是一种放大倍数由程序控制的放大器。程控放大器可以通过软件改变增益,利用模数转换器可以自动适应大范围变化的模拟信号电平,因此越来越多地应用在自动控制系统丶智能化仪器仪表中。本课题适用于科学教研、生产实践和教学实验等领域。它是有AT89C51单片机、DAC0832。通过按键来实现放大的产生。
1.2 设计思路
本系统的主控制模块是由单片机最小系统,两个独立按键构成的,每一个按键对应一种调整模式。按下按键后,会执行相应的按键功能,松开后停止。
具体实现过程:系统上电后先对DAC0832和LCD1602液晶初始化,再对按键进行扫描。当按键有按下时,系统的数字输入量发生改变,从而改变系统的增益,使得输出电压发生相应的变化。系统的放大倍数和输出电压通过液晶实时显示。
第2章 方案设计
2.1 核心模块的方案论证与比较
2.1.1 控制模块
方案一:4*4矩阵键盘控制
此方案可以直接输入所需要的波形放大倍数,方便快捷,但是程序操作复杂,故不采用这种方案。
方案二:独立按键控制
此方案利用两个独立按键共同控制放大倍数,其中一个按键用来控制倍数的放大,另外一个控制倍数的衰减,以此来达到放大倍数的调节,由于本系统元件较少,而且51单片机正好有两个外部中断口可以利用,程序设计简单,故采用此方案。
2.1.2 显示模块
方案一:数码管显示
此方案中利用共阴极数码管并对0~9这10数字进行编码,并利用数码管的动态扫描形式来显示不同的数字,以达到显示放大倍数的目的。由于本系统仅需对放大倍数进行显示,利用四段数码管已经足以达到要求,但程序设计相对繁琐,故本设计不采用这种方案实现。
方案二:1602液晶显示
此方案中液晶显示器可以由ASCll码控制,控制简单,可以显示更多的信息,比如放大倍数和单位等,故为本系统所采用。
2.2 系统设计要求
本系统设计的程控放大器可以实现如下功能:
(1)可以通过按键输入来控制输出的电压大小。
(2)输出的值可通过LCD1602液晶显示。
(3)可以通过按键输入改变放大器的放大倍数。
2.3 系统设计思路
本系统的主控制模块由单片机最小系统,两个独立按键构成的,每一个按键对应一种调整模式。按下键后,会执行相应的按键功能,松开后停止。
程控放大器的输出电压V0与DAC0832的输入电压Vref的关系式:V0=-[(Vref·Rf)]/2nR(Dn-1·2n-1+Dn-2·2n-2+...+D0·20)。Rf为系统的反馈信号输入线电阻,R为DAC0832的数字输出量,就相当于改变系统的增益。
具体实现过程:系统的数字输入量发生改变,从而改变系统的增益,使得输出电压发生相应的变化。系统的放大倍数和输出电压通过液晶实时显示。
LCD显示
MCU
键盘
D/A转换
放大器
输出
2.4 系统硬件框图
图2.1 系统硬件框图
第3章 系统硬件设计
3.1 单片机的应用与选择
8051是MCS-51系列单片机中的代表产品,它内部集成了功能强大的中央处理器,包含了硬件乘除法器、21个专用控制寄存器、64kB的程序存储器 、256B字节的数据存储器、4组8位的并行口、两个16位的可编程定时/计数器、一个全双工的串行口以及布尔处理器。
由于MCS-51集成了几乎完善的8位中央处理单元,处理功能强,中央处理单元中集成了方便灵活的专用寄存器,硬件的加、减、乘、除法器和布尔处理机及各种逻辑运算和转移指令,这给应用提供了极大的便利。
3.2 芯片简介
3.2.1 AT89C51性能简介
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
3.2.2 AT89C51的主要特性
⑴ 8031 CPU与MCS-51兼容
⑵4K字节可编程FLASH存储器(寿命:1000写/擦循环)
⑶全静态工作:0Hz-24KHz
⑷三级程序存储器保密锁定
⑸128*8位内部RAM
⑹32条可编程I/O线
⑺两个16位定时器/计数器
⑻5个中断源
⑼可编程串行通道
⑽低功耗的闲置和掉电模式
⑾片内振荡器和时钟电路
2.2.3 AT89C51管脚功能
MCS-51系列单片机芯片均为40个引脚,HMOS工艺制造的芯片采用双列直插(DIP)方式封装,其引脚示意及功能分类如图3.1:
图3.1 MCS-51引脚图
MCS-51系列单片机的40个引脚中有2个专用于主电源的引脚,2个外接晶体的引脚,4个控制或与其它电源复用的引脚,以及32条输入输出I/O引脚。
VCC:供电电压。
GND:接地。
① P0口(P0.0~P0.7) 为双向8位三态I/O口,当作为I/O口使用时,可直接连接外部I/O设备。它是地址总线低8位及数据总线分时复用口,可驱动8个TTL负载。一般作为扩展时地址/数据总线口使用。
② P1口(P1.0~P1.7) 为8位准双向I/O口,它的每一位都可以分别定义为输入线或输出线(作为输入时,口锁存器必须置1),可驱动4个TTL负载。
③ P2口(P2.0~P2.7) 为8位准双向I/O口,当作为I/O口使用时,可直接连接外部I/O设备。它是与地址总线高8位复用,可驱动4个TTL负载。一般作为扩展时地址总线的高8位使用。
④ P3口(P3.0~P3.7) 为8位准双向I/O口,是双功能复用口,可驱动4个TTL负载。
P3口也可作为AT89C51的一些特殊功能口,如下所示:
P3口管脚 备选功能
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 /INT0(外部中断0)
P3.3 /INT1(外部中断1)
P3.4 T0(记时器0外部输入)
P3.5 T1(记时器1外部输入)
P3.6 /WR(外部数据存储器写选通)
P3.7 /RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
综上所述,MCS-51系列单片机的引脚作用可归纳为以下两点:
⑴单片机功能多,引脚数少,因而许多引脚都具有第2功能;
⑵单片机对外呈3总线形式,由P2、P0口组成16位地址总线;由P0口分时复用作为数据总线;由ALE、PSEN/、EA/与P3口中的INT0/、INT1/、T0、T1、WR/、RD/共10个引脚组成控制总线。
3.2 控制显示电路
本设计用AT89C51单片机最小控制系统,显示部分采用LCD1602液晶显示器LCD引脚图如图3.2所示。
图3.2 LCD1602引脚图
脚号
管脚名称
LEVER
管脚功能描述
1
VSS
0V
电源地
2
VDD
5.0V
电源电压
3
VEE
对比调整电压
4
RS
H/L
RS=“H”,表示DB7~DB0为显示数据
RS=“L”,表示DB7~DB0为显示指令数据
5
R/W
H/L
R/W=“H”,E=“H”,数据被读到DB7~DB0
R/W=“L”,E=“H→L” DB7~DB0的数据被写到IR或DR
6
E
H/L
使能信号:R/W=“L”,E信号下降沿锁存DB7~DB0
R/W=“H”,E=“H”
DRAM
数据读到
D7~D0
7
D0
H/L
数据线
8
D1
H/L
数据线
9
D2
H/L
数据线
10
D3
H/L
数据线
11
D4
H/L
数据线
12
D5
H/L
数据线
13
D6
H/L
数据线
14
D7
H/L
数据线
LCD1602引脚及其功能介绍如表3-1所示。
表3.1
AT89S52的P0口接上拉电阻,P0口输出显示数据,控制信号由P1口部分引脚控制输出。
图3.3 显示控制电路
3.3 键盘电路
键盘电路如图3.4所示,通过按键控制输出电压大小。P3.0接输出增加按钮,
P3.1接输出减小按钮
图3.4 键盘电路
3.4 D/A转换电路
D/A转换电路采用DAC0832来实现,首先来介绍下DAC0832芯片。
3.4.1 管脚功能
图3.5 DAC0832管脚图
DAC0832管脚功能如图3.5所示。
DAC0832的主要特性参数如下:
* 分辨率为8位;
* 输出为电流信号,电流的建立时间为1us;
* 可单缓冲、双缓冲或直接数字输入;
* 只需在满量程下调整其线性度;
* 单一电源供电(+5V~+15V),低功耗,20mW;
* 参考电压可以达到±10V;
* 直接的数字接口可以与任何一款单片机相连。
DAC0832的引脚功能:
* D0~D7:8位数据输入线,TTL电平,通常与单片机的数据总线相连,用于输入CUP送来的待转换数字量。有效时间应大于90ns(否则锁存器的数据会出错);
* ILE:数据锁存允许控制信号输入线,高电平有效;
* CS(————):片选信号输入线(选通数据锁存器),低电平有效;
* WR1(——————):数据锁存器写选通输入线,负脉冲(脉宽应大于500ns)有效。由ILE、CS(————)、WR1(——————)的逻辑组合产生LE1,当LE1为高电平时,数据锁存器状态随输入数据线变换,LE1的负跳变时将输入数据锁存;
* XFER(————————):数据传输控制信号输入线,低电平有效,负脉冲(脉宽应大于500ns)有效;
* WR2(——————):DAC寄存器选通输入线,负脉冲(脉宽应大于500ns)有效。由WR1(——————)、XFER(————————)的逻辑组合产生LE2,当LE2为高电平时,DAC寄存器的输出随寄存器的输入而变化,LE2的负跳变时将数据锁存器的内容打入DAC寄存器并开始D/A转换。
* IOUT1:电流输出端1,其值随DAC寄存器的内容线性变化;
* IOUT2:电流输出端2,其值与IOUT1值之和为一常数;
— 当DAC寄存器内容全为1时,IOUT1为最大,IOUT2=0;
— 当DAC寄存器内容全为0时,IOUT1=0,IOUT2为最大;
为了保证输出电流的线性,应将IOUT1 及IOUT2接到外部运算放大器的输入端上。
* Rfb:反馈信号输入线,改变Rfb端外接电阻值可调整转换满量程精度;
* Vcc:芯片工作电源,范围为+5V~+15V;
* VREF:基准电压输入线,VREF的范围为-10V~+10V;
* AGND:模拟信号地,为模拟信号和基准电源的参考地;
* DGND:数字信号地,为工作电源地和数字逻辑地
3.4.2 D/A转换电路
图3.6 D/A转换电路
单片机的P2口输出信号给0832的8位并口数据输入,控制端口控制信号由P1口部分引脚控制输出。输出信号至运算放大器。
3.5 放大电路
运放与DAC0832连接的运放电路如图3-5所示。DAC0832输出的转换结果为电流形式,在本设计中利用一个高输入阻抗的线性运算放大器——TL061AMN将其转换为模拟电压信号。运放的反馈电阻通过Rfb端应用片内固有电阻。图中所示运算放大器U2的作用是反向器,是输出的电压与D/A转换的电压相同。
运放与DAC0832连接的运放电路如图3.6所示。
图3.7 运放与DAC0832连接电路图
3.6整机电路
3.8整机电路图
第 4 章 软件设计及仿真
4.1 软件流程图
图4.1 软件流程图
4.2 程序代码
见附录A
4.3 仿真设计
硬件电路完成以后,进行系统的软件设计,首先要分析系统对软件的要求,然后进行软件的总体设计,包括程序总体结构设计和对程序进行模块化设计。按照整体功能分成多个不同模块,单独设计、编程、调试然后将各个模块装配调试,组成完整的软件。在编程语言方面,选择的是C语言进行编程。
C语言是近年来国内外普遍使用的一种编程语言,C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,而且能直接对计算机硬件进行操作。既有高级语言的特点,又有汇编语言的特点。
4.3.1 VW简介
1.双平台
DOS版本,WINDOWS版本。其中WINDOWS版本功能强大。中文界面,英文界面可任选,用户源程序的大小不再有任何限制,支持ASM,C,PLM语言混合编程,具有项目管理功能,为用户的资源共享,课题重组提供强有力的手段。支持点屏显示,用鼠标左键点一下源程序中的某一变量,即可显示该变量的数值。有丰富的窗口显示方式,多方位,动态地显示仿真的各种过程,使用极为便利。本操作系统一经推出,立即被广大用户所喜爱。
2.双工作模式
1 软件模拟仿真(不要仿真器也能模拟仿真)。
2 硬件仿真。
双CPU结构,100% 不占用户资源。
全空间硬件断点,不受任何条件限制,支持地址、数据、外部信号、事件断点、支持实时断点计数、软件运行时间统计。
3.双集成环境
编辑、编译、下载、调试全部集中在一个环境下。
多种仿真器,多类CPU仿真全部集成在一个环境下。可仿真51系列,196系列,PIC系列,飞利蒲公司的552.LPC764.DALLAS320,华邦438等51增强型CPU。为了跟上形势,现在很多工程师需要面对和掌握不同和项目管理器、编辑器、编译器。他们由不同的厂家开发,相互不兼容,使用不同的界面。学习使用都很吃力。伟福 WINDOWS调试软件为您提供了一个全集成环境,统一的界面,包含一个项目管理器,一个功能强大的编辑器,汇编Make、Build和调试工具并提供一个与第三方编译器的接口。
VW编译如图4.2所示
图4.2 VW编译界面图
4.3.2 PROTUES仿真
Protues软件是英国Labcenter electronics公司出版的EDA工具软件。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。
其特点是:支持当前的主流单片机,如51系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列、68000系列等[14]。
1)提供软件调试功能
2)提供丰富的外围接口器件及其仿真
RAM,ROM,键盘,马达,LED,LCD,AD/DA,部分SPI器件,部分IIC器件。这样很接近实际。在训练学生时,可以选择不同的方案,这样更利于培养学生。
3) 提供丰富的虚拟仪器
利用虚拟仪器在仿真过程中可以测量外围电路的特性,培养学生实际硬件的调试能力。
4) 具有强大的原理图绘制功能
在PROTUES绘制好原理图后,调入已编译好的目标代码文件:*.HEX,可以在PROTUES的原理图中看到模拟的实物运行状态和过程[15]。
系统的仿真结果图如下所示,初始状态如图4.3,当按下“输出增加”键时如图4.4,当按下“输出减小”键时如图4.5。
图4.3 仿真初始状态
图4.4 按下输出增加键时
图4.5 按下输出减小键时
总 结
本设计介绍了一种利用AT89C51单片机和DAC0832及放大器实现的程控放大器系统的设计。电路简介丶操作方便丶性能良好,而且其设计简练丶易懂,所用器件常见,电路模块具有通用性,整个系统具有更实用的意义和更强大的功能。在本课题的设计过程中主要完成以下工作:
完成开题报告,设计方案总结。学习PROTEL软件的使用,原理图的基本绘制方法。并根据题目要求,已经完成原理图绘制。通过查阅相关资料,独立学习仿真软件的使用方法,同时在PROTEUS环境中完成了仿真图的绘制。并且配合VW软件完成了程序的编写。经过反复调试,完成了运行效果的仿真。仿真效果良好,达到了设计预期的目的。软件的编写和调试。针对本课题要实现的基本功能编写了本课题一些基本程序,并在调试过程中不断的改善编程方法。
参考文献
[1]王炜.程控放大器及其典型应用的实例[J].中国科学院长春光学精密机械研究所.1998:89 ~94.
[2]周春光.程控放大器在数据采集系统中的应用[J].电子技术应用.1987,3:77~80.
[3]傅越千.程控放大器的设计与应用[J].宁波高等专科学校学报,2002,4:
37 ~40.
[4]房慧龙.程控放大器的实现方法{J}.常州信息职业技术学院电子信息工程系.2004,8:52~56.
[5]邵雄凯,张文灿,黄文斌.一种程控放大器的分析与实现[J].湖北工学院学报,1997,4:45~51.
[6]吴建平,李建强.数字程控放大器设计与应用[J].成都理工学院报,2002,6:665~668.
[7]余锡存,曹国华编著.单片机原理及接口技术[M].西安:西安电子科技大学出版社,2000,7:27~28.
[8]彭楚武主编.微机原理与接口技术[M].长沙:湖南大学出版社,2004,7: 200~204.
[9]童诗白,华成英主编.模拟电子技术基础[M].北京:高等教育出版社,2001:310 ~316.
[10]胡斌,蔡月红.放大器电路识图与故障分析轻松入门[M].北京:人民邮电出版社,2003.9:146~149.
[11]肖景和.集成运算放大器应用精粹[M].北京:人民邮电出版社,2006:109.
[12] 蔡锦福.运算放大器原理与应用[M].北京:科学出版社,2003:210 ~214.
[13]Graeme,J.G.Optimizing Op Amp Performance,McGraw-Hill,New York,1997.
[14]Rosenstark,S.Feedback Amplifier Principles.Macmillan New York,1986.
[15]Roberge.J.K.Operational Amplifiers. Theory and Practice.John Wiley & Sons,New York,1975
致 谢
本论文是在陈洁老师的悉心指导下完成的,论文的选题由陈洁老师确定,在具体的设计过程中给予了我诸多的技术支持。工作中陈洁老师渊博的专业知识、勤奋严谨的治学精神和丰富的实际经验使我为之赞叹。在做本设计期间,我不仅学到了许多本专业的最新知识,也从各位师长身上学到了许多为人处事的方法。在此,向在本设计过程中给予我帮助的师长表示衷心的感谢!
这三年里,从身边的老师和同学中学习了许多知识,使我受益无穷。通过本次设计,对大学三年期间学习内容做了系统的总结。同时,也增强了实践中的动手能力、扩展了见识和积累了实践经验。
谨以此文献给所有关心和帮助我的师长、同学、朋友和家人!
附录A 程序
#include"reg51.h"
#include"intrins.h"
sbit dacs=P1^0;
sbit dawr=P1^1;
sbit lcdrs=P1^5;
sbit lcdrw=P1^6;
sbit lcde=P1^7;
sbit lcd_flag=P0^7;
void disp(void);
void lcd_delay(unsigned int );
void lcd_deal(unsigned char ,unsigned char ,unsigned char );
void _1602(void);
void lcd_init(void);
void lcd_moveto(unsigned char ,unsigned char );
void lcd_putchar(unsigned char );
unsigned char code shuzi[]={0,1,2,3,4,5,6,7,8,9};
unsigned char code lcd_Assic[12]={
0x30,0x31,0x32,0x33,0x34,0x35,
0x36,0x37,0x38,0x39,0x56,0x2e};
unsigned char dis[2][16]={{
0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20},
{0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20}};
//0x20默认输出是空,即空格
unsigned char val=0;
void main (void)
{
dacs=0;
dawr=0;
P2=0;
disp();
while (1)
{
switch (P3)
{
unsigned char i;
case 0xfe: lcd_delay(10);
if (0xfe==P3)
{
val++;
disp();
for (i=0;i<=100;i++)
{
lcd_delay(10);
if (0xfe==P3)continue;
else break;
}
for (i=0;;i++)
{
lcd_delay(10);
if(0xfe==P3)
{
if (i%50==0)
{
val++;
disp();
if (i==250) i=0;
}
}
else break;
}
for (;;)
{
while (0xfe==P3);
lcd_delay(10);
if (0xfe==P3)
continue;
else break;
}
}
break;
case 0xfd: lcd_delay(10);
if (0xfd==P3)
{
val--;
disp();
for (i=0;i<=100;i++)
{
lcd_delay(10);
if (0xfd==P3)
continue;
else break;
}
for (i=0;;i++)
{
lcd_delay(10);
if(0xfd==P3)
{
if (i%50==0)
{
val--;
disp();
if (i==250) i=0;
}
}
else break;
}
for (;;)
{
while (0xfd==P3);
lcd_delay(10);
if (0xfd==P3)
continue;
else break;
}
}
break;
default: break;
}
}
}
void disp(void)
{
P2=val;
lcd_deal(0,0,val/100);
lcd_deal(0,1,val%100/10);
lcd_deal(0,2,val%10);
lcd_deal(1,2,(unsigned char)((float)val/256*5)%10);
lcd_deal(1,3,11); //.
lcd_deal(1,4,(unsigned char)((float)val/256*50)%10);
lcd_deal(1,5,(unsigned int)((float)val/256*500)%10);
lcd_deal(1,6,10); //V
_1602();
}
void lcd_delay(unsigned int k)
{ // 12M
unsigned int i0;
unsigned char i,j;
for(i0=0;i0<k;i0++)
for(i=5;i>0;i--)
for(j=97;j>0;j--);
}
void _1602(void)
{
unsigned char *p;
lcd_init(); //初始化
lcd_delay(10);
lcd_moveto(0,0);
for(p=dis[0];p<dis[0]+16;p++)
{
lcd_putchar(*p);
}
lcd_moveto(1,0);
for(p=dis[1];p<dis[1]+16;p++)
{
lcd_putchar(*p);
}
}
void lcd_deal(unsigned char i,unsigned char j,unsigned char dat)
{
dis[i][j]=lcd_Assic[dat];
}
bit lcd_busy() //判断是否忙碌 RS=Low,RW=High,E=High:读状态
{
bit flag=0;
lcdrs=0; //寄存器为Low
lcdrw=1; //是否读写为High
lcde=1; //使能端为High
if (lcd_flag==1) flag=1;
else flag=0;
lcde=0;
return flag; //返回标志,判断是否LCD忙碌
}
void lcd_putcommand(unsigned char command) //写指令 RS=Low,RW=Low,E=High:写指令
{
while (lcd_busy()); //判断是否忙碌
lcdrs=0;
lcdrw=0;
lcde=0;
P0=command;
lcde=1;
lcde=0;
}
void lcd_putchar(unsigned char putchar) //写数据 RS=High,RW=Low,E=High:写数据
{
while(lcd_busy()); //判断是否忙碌
lcdrs=1;
lcdrw=0;
lcde=0;
P0=putchar;
lcde=1;
lcde=0;
}
void lcd_moveto(unsigned char x,unsigned char y) //显示字符的位置:第x行y列(X=1或2,Y=0~15)
{
if (x==0) lcd_putcommand(0x80|y); //第一行,并初始化从第y-1个字符开始显示
if (x==1) lcd_putcommand(0xc0|y); //第二行,并............
}
void lcd_init(void)
{
lcd_putcommand(0x38); lcd_delay(1); //LCD为2行,5×7字
lcd_putcommand(0x0c); //纯粹是为了显数据,关闭光标比较好
lcd_delay(1);
lcd_putcommand(0x06); lcd_delay(1);//每次右移一字符
}
附录B 系统原理图
25
展开阅读全文