您的当前位置:首页正文

单片机相关(论文)_1_

2022-05-31 来源:易榕旅网


中图分类号:TP274

本 科 生 毕 业 论 文(或设计)

(申请学士学位)

论文题目 基于单片机的电子秤的人机界面子系

统设计

作者姓名 王 世 前 所学专业名称 计算机科学与技术 指导教师 姚 光 顺

2009年6 月17 日

学 号:论文答辩日期:指 导 教 师:

5051251057

2009 年 06 月 17 日 (签字)

滁州学院本科毕业设计(论文)原创性声明

本人郑重声明:所呈交的设计(论文)是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果。本人完全意识到本声明的法律后果由本人承担。

作者签名: 年 月 日

目录

摘要 .................................................................................................................................................. 1 ABSTRACT ...................................................................................................................................... 1 1 绪论............................................................................................................................................. 2 1.1本设计的任务和主要内容 ..................................................................................................... 2 1.2基本工作原理及原理框图 ..................................................................................................... 2 2 单片机最小系统扩展 ................................................................................................................... 4 2.1单片机的引脚功能 ................................................................................................................. 4 2.2 存储器扩展原理及设计 ...................................................................................................... 5 2.2.1 程序存储器的扩展设计 ............................................................................................... 5 2.2.2 EPROM 接口设计 ....................................................................................................... 5 3 硬件电路的设计 ......................................................................................................................... 7 3.1控制键盘的设计择 ................................................................................................................. 7

3.1.1键盘的组合与去抖设计 .................................................................................................. 7 3.1.2与单片机的连接 .............................................................................................................. 8 3.2 12864模块设计 ...................................................................................................................... 8 3.2.1 液晶显示原理 ................................................................................................................. 8 3.2.2 显示器件介绍及其与单片机的连接 ............................................................................. 8 3.3总体工作电路原理图 ........................................................................................................... 10 4 软件的设计 ............................................................................................................................... 11 4.1 键盘控制模块程序设计 ...................................................................................................... 11 4.2 12864显示模块程序设计 .................................................................................................... 12 4.3 总体程序设计 ...................................................................................................................... 14 5 总结 ............................................................................................................................................ 16 参考文献......................................................................................................................................... 16 附录: ............................................................................................................................................ 17 致谢 ................................................................................................................................................ 32

滁州学院本科毕业设计

基于单片机的电子秤的人机界面子系统的设计

摘要:本文设计了一个基于AT89C51单片机的简易电子秤,主要设计了人机交互界面子系统的设计。

系统设计时采用AT89C51单片机作为核心控制芯片,对传感器采集的信号经过三运放大电路调理后经ADC0808进行A/D转换后输入单片机中进行处理,处理的结果以及商品的其他信息在12864LCD上显示,其中还设计了控制按键以进行简易的电子秤控制,实现的功能有控制显示欢迎界面,对单个商品进行称重并计价,对所有商品价钱进行总计等。系统设计部分通过Proteus仿真软件仿真通过。

关键词:电子秤;单片机;12864LCD;键盘

Design and Implemention Human-machine Interface Sub-System Based

On Single-Chip

Abstract: This paper designs a simple electronic scale based on a single-chip microcomputer AT89C51 ,

mainly designs the subsystem for the human-machine interface . The AT89C51 single-chip microcomputer is used as a core control chip in this system design, the sensor signal is amlicated for three times through amplifiers.After amplication,the single is convertered by ADC 0808 .In this process, the control buttons are desgined to simplely control the electronic weighing system , the function includescontroling and displaying welcome interface, weighing a single individual commoditie and pricing all commodities, and so on.Part of the system design is verifed by Proteus simulation software.

Keyword: Electronic scale ,One-chip computer 12864LCD,Keyboard

- 1 -

滁州学院本科毕业设计

1 绪论

随着时代科技的迅猛发展,微电子学和计算机等现代电子技术的成就给传统的电子测量与仪器带来了巨大的冲击和革命性的影响。常规的测试仪器仪表和控制装置被更先进的智能仪器所取代,使得传统的电子测量仪器在远离、功能、精度及自动化水平定方面发生了巨大变化,并相应的出现了各种各样的智能仪器控制系统,使得科学实验和应用工程的自动化程度得以显著提高。作为重量测量仪器,智能电子秤在各行各业开始显现其测量准确,测量速度快,易于实时测量和监控的巨大优点,并开始逐渐取代传统型的机械杠杆测量称,成为测量领域的主流产品。

本文介绍了基于AT89C51单片机的电子计价秤的软硬件设计方法,重点在于人机交互界面的设计。该方法是由应变片式传感器组成的全桥电路感应物料重量后转换成与之成线性关系的电压,再经过信号放大等处理后输入AT89C51单片机进行处理,且通过LCD液晶时时显示,并设计了适当的键盘以控制称重的过程。

[1]

1.1本设计的任务和主要内容

主要任务为数据的显示与控制,采用键盘来控制数据的显示,采用12864LCD来显示,以及如何来控制显示,在屏幕上达到什么样的效果进行描述。 ⑴ 12864LCD显示欢迎界面

⑵ 显示商品的名称、单价、重量以及总计 ⑶ 设计按键,以控制不同物品称重之间的切换 ⑷ 显示所有商品的价钱总额及致谢界面

1.2基本工作原理及原理框图

当被称物体放置在秤体的秤台上时,其重量便通过秤体传递到称重传感器,传感器随之产生力-电效应,将物体的重量转换成与被称物体重量成一定函数关系(一般成正比关系)的电信号(电压或电流等)。此信号由放大电路进行放大、经滤波后再由模/数(A/D)器进行转换,数字信号再送到微处器的CPU处理,CPU不断扫描键盘和各种功能开关,根据键盘输入内容和各种功能开关的状态进行必要的判断、分析、由仪表的软件来控制各种运算。运算结果送到内存贮器,需要显示时,CPU发出指令,从内存贮器中读出送到显示器显示。一般地信号的放大、滤波、A/D转换以及信号各种运算处理都在仪表中完成。原理框图如图1-1。

[2]

- 2 -

滁州学院本科毕业设计

图1-1 原理框图

- 3 -

滁州学院本科毕业设计

2 单片机最小系统扩展

2.1单片机的引脚功能

AT89C51单片机都采用DIP40引脚的双列直插封装方式。图 2-1 为引脚排列图。但是单片机为了实现功能需要的信号数目不止40个,所以为了解决这一矛盾,一些引脚定义了第二功能,即复

图2-1 单片机引脚

1234567891011121314151617181920P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7RST/VPDRXD P3.0TXD P3.1INT0 P3.2INT1 P3.3T0 P3.4T1 P3.5WR P3.6RD P3.7XTAL2XTAL1VSS[3]

VCCP0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7EA/VPPALE/PROGPSENP2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.04039383736353433323130292827262524232221用。引脚说明如下(只介绍主要引脚):

P0口(P0.0~P0.7)是一个8位漏极开路型双向I/O口,在访问外部存储器时,它是分时传送的低字节地址和数据总线,P0口能以吸收电流的方式驱动8个LSTTL负载。

P1口(P1.0~P1.7)是一个带有内部提升电阻的8位准双向I/O口。能驱动(吸收或输出电流)4个LSTTL负载。

P2口(P2.0~P2.7)是一个带有内部提升电阻的8位准双向I/O口。在访问外部存储器时,它输出高8位地址。P2口可以驱动(吸收或输出电流)4个LSTTL负载。

P3口(P3.0~P3.7)是一个带有内部提升电阻的8位准双向I/O口。能驱动(吸收或输出电流)4个LSTTL负载。P3口各位引脚都具有第二功能,如表2-1所示

表2-1 P3口线的第二功能

P3口引脚 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 第二功能 RXD TXD INT0 INT1 8031 8051 8751备注 串行数据接收 串行数据发送 外部中断0申请 外部中断1申请 定时器/计数器0计数输入 定时器/计数器1计数输入 T0 T1 WR 外部RAM写选通 外部RAM读选通 RD - 4 -

滁州学院本科毕业设计

2.2 存储器扩展原理及设计

本系统由于要存储商品的名称、单价等信息,当商品数量较多时,单片机自身的存储器的存储容量将不能满足系统要求,所以要考虑存储器的扩展[4]。

2.2.1 程序存储器的扩展设计

AT89C51应用系统通常为特定功能的专用计算机系统。在系统调试完后,其软件基本上定型,因此,AT89C51的程序存储器通常由ROM 或 EPROM 或E2PROM 电路构成。其特点是断电以后,内部的程序信息不会丢失,因而提高了系统的可靠性。

AT89C51 单片机扩展外部程序存储器的硬件电路如图2-2所示[6]。

[5]

图2-2 AT89C51 单片机外部程序存储器扩展

2.2.2 EPROM 接口设计

紫外线擦除电可编程只读存储器 EPROM 可作为 AT89C51 系列芯片的外部程序存储器,其典型的产品有 2716(2K×8),2764(4K×8) ,27128(16K×8) ,和27256(32K×8)等。这些芯片上均有一个玻璃窗口,在紫外线光下照射 5~20 分钟左右,存储器中的各位信息均变为 1,此时,可以通过相应的编程器将工作程序固化到这些芯片中,2716 ,2732 现在停产了,要买很难、价格又贵[7]。

下面介绍2764EPROM 存储器。2764 是一种 8K×8 位的紫外线擦除电可编程只读存储器,单一+5V 供电,工作电流为 100mA 维持电流为 50mA ,读出时间最大为 250ns[7]。

2764 为 28 线双列直插式封装,其管脚配置如图2-3所示。

- 5 -

滁州学院本科毕业设计

12345678910 11 1213 14Vpp VCC A12 __PGM A7 NC A6 A8 A5 A9 A4 A11 A3 __OE A2 A10 A1 __CE A0 D7 D0 D6 D1 D5 D2 D4 GND D3 2827262524232221201918171615

图2-3 2764管脚配置

A0~A12: 地址线;D0~D7: 数据输出线;CE: 片选线;PGM: 编程脉冲输入; VPP: 编程电源。2764 的 5 种工作方式如表2-2所示[8]

表2-2 2764 工作方式选

方式 引脚 CE (20) VIL VIH VIL VIL VIH OE (22) VIL PGM (27) VIH Vpp (1) Vcc Vcc Vpp* Vpp* Vpp* Vcc (28) Vcc Vcc Vcc Vcc Vcc 输出 (11~13) (15~19) DOUT 读 维 持 编 程 编程校验 编程禁止 任意 VIL VIL 任意 任意 VIL VIH 任意 高阻 DIN DOUT 高阻

- 6 -

滁州学院本科毕业设计

3 硬件电路的设计

3.1控制键盘的设计择

3.1.1键盘的组合与去抖设计

单片机控制系统中,往往只需要几个功能键,此时,可采用独立式按键结构。

⑴ 独立式按键结构

独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O 图3-2为独立式按键电路口线,每个按键的工作不会影响其它I/O口线的状态。独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。图3-2中按键输入均采用低电平有效,此外,上拉电阻保证了按键断开时,I/O口线有确定的高电平。当I/O口线内部有上拉电阻时,外电路可不接上拉电阻[9]。

⑵独立式按键的软件结构

本设计采用独立式键盘组合设计。作为一个按键从没有按下到按下以及释放是一个完整的过程,也就是说,当我们按下一个按键时,总希望某个命令只执行一次,而在按键按下的过程中,不要有干扰进来,因为在按下的过程中,一旦有干扰过来,可能造成误触发过程,这并不是我们所想要的。 机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来[10]。其抖动过程如图3-1所示,抖动时间的长短与开关的机械特性有关,一般为4~5ms。

图3-1 按键干扰

在触点抖动期间检测按键的通与断状态,可能导致判断出错。即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施,可从硬件、软件两方面予以考虑。采用硬件将会增加单片机的体积和成本,本设计采用软件去抖。

软件上采取的措施是:在检测到有按键按下时,执行一个5ms左右(具体时间应视所使用的按键进行调整)的延时程序后,再确认该键电平是否仍保持闭合状态电平,若仍保持闭合状态电平,则确认该键处于闭合状态;同理,在检测到该键释放后,也应采用相同的步骤进行确认,从而可消除抖动的影响

- 7 -

滁州学院本科毕业设计

3.1.2与单片机的连接

独立式按键软件常采用查询式结构。先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序[9]。图3-2中的I/O口采用P2.5、P2.6、P3.7。

独立式键盘与单片机的连接如图3-2所示

图3-2 独立键盘与单片机的连接

3.2 12864模块设计

3.2.1 液晶显示原理

液晶显示器(LCD)是现在非常普遍的显示器。它具有体积小、重量轻、省电、辐射低、易于携带等优点。液晶显示器(LCD)的原理与阴极射线管显示器(CRT)大不相同。LCD是基于液晶电光效应的显示器件。包括段显示方式的字符段显示器件;矩阵显示方式的字符、图形、图像显示器件;矩阵显示方式的大屏幕液晶投影电视液晶屏等[11]。液晶显示器的工作原理是利用液晶的物理特性,在通电时导通,使液晶排列变得有秩序,使光线容易通过;不通电时,排列则变得混乱,阻止光线通过。

3.2.2 显示器件介绍及其与单片机的连接

(1)12864LCD模块介绍

本设计中我用到的是12864J-1图形液晶显示器,它主要由行驱动器/列驱动器及128*64全点阵液晶显示器组成,可完成图形显示,也可以显示8*4个汉字。其结构框图如下:

- 8 -

滁州学院本科毕业设计

图2-9 12864J-1结构框图

12864LCD液晶显示模块是128×64点阵型液晶显示模块,可显示各种字符及图形,可与CPU直接接口,具有8位标准数据总线、6条控制线及电源线。采用KS0108控制IC[11]。其管脚介绍如表3-1所示

表3-1 12864-1,12864-2,12864-5接口说明表

管脚号 1 2 3 4 管脚 VSS VDD V0 RS 方向 - - I I 说明 逻辑电源地。 逻辑电源+5V。 LCD调整电压,应用时接10K电位器可调端 数据\\指令选择:高电平:数据D0-D7将送入显示RAM; 低电平:数据D0-D7将送入指令寄存器执行。 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 R/W E DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 CS1 CS2 /RET VEE I I I/O I/O I/O I/O I/O I/O I/O I/O I I I O 读\\写选择: 高电平:读数据;低电平:写数据。 读写使能,高电平有效,下降沿锁定数据。 数据输入输出引脚。 数据输入输出引脚。 数据输入输出引脚。 数据输入输出引脚。 数据输入输出引脚。 数据输入输出引脚。 数据输入输出引脚。 数据输入输出引脚。 片选择信号,高电平时选择左半屏。 片选择信号,高电平时选择右半屏。 复位信号,低电平有效。 LCD驱动,负电压输出,对地接10K电位器 背光电源,LED+(5V)。 背光电源,LED-(0V)。 - 9 -

LEDA - LEDK - 滁州学院本科毕业设计

⑵ 12864模块与单片机的连接

AT89c51单片机的P1口与12864液晶显示器的数据口(DB0-DB7)相连,P2.0与接口E相

连,P2.1与接口R\\W相连,P2.2与接口DI相连。

图2-10 12864LCD模块与单片机的连接

3.3总体工作电路原理图

在总程序中,液晶显示器会先显示已设定好的字符。之后程序调用A/D转换函数,接收ADC0808转换过的数据,通过单片机P0口传入单片机,单片机P1口与显示器DB0-DB7相连,将数据传入显示器等待显示[12]。

图2-11 总体仿真结构图

- 10 -

滁州学院本科毕业设计

4 软件的设计

4.1 键盘控制模块程序设计

图4-1 键盘控制流程图

键盘控制程序结构如下:

//判断是否1号键盘按下,显示欢迎界面 if(P25==0) {

Delay(800) ; lcd_init();

Chinese(0,2,table5); //欢 Chinese(16,2,table5+32); //迎 Chinese(32,2,table5+64); //使 Chinese(48,2,table5+96); //用 Chinese(64,2,table5+128); //电 Chinese(80,2,table5+160); //子 Chinese(96,2,table5+192); //秤 }

//判断是否2号键盘按下,显示计量过程 if(P26==0) {

- 11 -

滁州学院本科毕业设计

此部分为计量的控制部分,详见4.3节 }

//判断是否3号键盘按下,显示总额界面 if(P37==0) {

Delay(800); lcd_init(); sum[0]=0;

for(i=1;i<=k;i++)

sum[0]=sum[0]+sum1[i-1]; Chinese(0,0,table7);

Chinese(16,0,table7+32); Chinese(32,0,table7+64); Num(0,2,sum[0],0); } }

4.2 12864显示模块程序设计

首先初始化LCD显示器,R/W为1进行读操作,此时,E端由高电平条变成低电平,液晶执行命令。CS1为1,CS2为0选中做半屏,然后显示做半屏内容;CS1为0,CS2为1选中右半屏进行显示。如图4-2。

图4-2 液晶显示流程图

函数功能:

指令寄存器(IR) :当D/I=1 时,在E信号下降沿的作用下,指令码写入IR.

数据寄存器(DR) :当D/I=1时,在E信号的下降沿作用下,图形显示数据写入DR,或在E信号高电平作用下由DR读到DB7~DB0 数据总线.DR 和DDRAM之间的数据传输是模块内部自动执行的.

- 12 -

滁州学院本科毕业设计

忙标志:BF=1表示模块在进行内部操作,此时模块不接受外部指令和数据.BF=0时,模块为准备状态,随时可接受外部指令和数据.

显示控制触发器:DFF=1为开显示(DISPLAY ON),DDF=0为关显示(DISPLAY OFF)。 XY地址计数器 :XY地址计数器是一个9位计数器。高三位是X地址计数器,低6位为Y地址计数器,X地址计数器为DDRAM的页指针,Y地址计数器为DDRAM的Y地址指针。

显示数据RAM(DDRAM) :数据为1表示显示选择,数据为0表示显示非选择。

Z地址计数器 :Z地址计数器是一个6位计数器,此计数器具备循环记数功能,它是用于显示行扫描同步。

本设计中的液晶显示程序是被做成一个驱动程序的,然后在主程序中调用,完成液晶显示部分设计要求的,驱动程序包含void En_char()、void String()、void Num()、void Chinese()等函数。在主程序中通过特定参数调用这些函数时,这些参数的功能是为了定位显示位置与显示的字符。在LCD的驱动程序中涉及到的函数如下:

void lcd_reset(); //LCD复位

void lcd_onoff( unsigned char onoff); //控制显示器开关,onoff==1表示打开,onoff==0表示关闭 void lcd_init(); //LCD初始化

bit lcd_busy(); // LCD是否为busy状态,return 1表示处于忙的状态,return 0表示空闲

void lcd_fill(unsigned char fill); //全屏填充,fill==0xFF表示黑屏,fill==0x00表示清屏,其他为相应纹理

void lcd_setsl(unsigned char sl); //设置显示起始行从DDRAM中的sl行开始,用于实现滚屏 void lcd_setxy(unsigned char x, unsigned char y); //设置x[0~127],y[0~7],左上角为(0,0),横轴为x,纵轴为y

void w_xyd(unsigned char x, unsigned char y, unsigned char lcd_data); //在坐标x[0~127],y[0~7]处写入数据lcd_data

void En_char(unsigned char x, unsigned char y, unsigned char en); //在坐标x[0~127],y[0~7]处写入字符en

void String(unsigned char x, unsigned char y, unsigned char *str); //在坐标x[0~127],y[0~7]处写入字符数组str,暂不支持自动换行

void Num(unsigned char x,unsigned char y, unsigned int num, bit f); //在坐标x[0~127],y[0~7]处写入数字num,数字大小为[0~65535],f为反白,暂不支持自动换行

void chinese(unsigned char x, unsigned char y, unsigned char *hz); //在坐标x[0~127],y[0~7]处写入汉字*hz,汉字显示大小为16×16像素,每个汉字字模为32字节。

- 13 -

滁州学院本科毕业设计

4.3 总体程序设计

在总程序中,液晶显示器会先显示已设定好的字符。之后程序调用A/D转换函数,接收ADC0808转换过的数据,通过单片机P0口传入单片机,单片机P1口与显示器DB0-DB7相连,将数据传入显示器等待显示。

图4-3 主流程图

程序结构为

if(P26==0) //判断是否2号按键按下 {

Delay(800); lcd_init(); k=++k;

if(k==6) //只设置了5个商品,如果超过5个,则返回 { k=1; } if(k==1) {

显示第一个商品信息; } if(k==2)

- 14 -

滁州学院本科毕业设计

{

显示第二个商品信息; } if(k==3) {

显示第三个商品信息; } if(k==4) {

显示第四个商品信息;} if(k==5) {

显示第五个商品信息;} }

系统显示的3种界面分别如下:

图4-4 主流程图欢迎子界面

图4-5 称重计价子界面

图4-6 总计及致谢子界面

- 15 -

滁州学院本科毕业设计

5 总结

AT89C51单片机为核心部件,利用软件系统编程,通过键盘控制和液晶显示不仅实现了设计任务书中对于电子计价秤的基本功能要求和扩展要求,包括:商品信息存储、商品信息显示、商品价格的输入的显示。系统设计尽量做到硬件电路简单可靠,充分发挥了AT89C51内部软硬件资源。由于时间有限和本身知识水平的发挥,我认为本系统还有需要改进和提高的地方,例如选用更高好的外设,如标准输入键盘、LCD显示等;设计更加可靠的硬件接口电路。

同时我也学会了很多芯片的原理,虽然我们只用上几个芯片,可我们是从很多很多芯片中筛选出来了,因此对很多芯片都有了初步的了解。像AT89C51等芯片在平常学习时并不清楚它的具体功能,也没想到他们会与我们的生活联系那么密切,通过毕业设计,我查资料,仔细研究它们的逻辑功能,用途,要求等,终于基本完成了设计。这激发了我们学习专业知识的兴趣,也增强了我们的动手能力。

参考文献

[1] 杨刚,嵌入式基础实践教程[M]. 北京:北京大学出版社,2007. [2] 龚运新,单片机C语言开发技术[M]. 北京:清华大学出版社,2006.

[3] 三恒星科技,MCS-51单片机原理与应用实例[M]. 北京:电子工业出版社,2008.

[4] 周景润,张丽娜,基于PROTEUS的AVR单片机设计与仿真[M]. 北京:北京航空航天大学出版社. [5] 潘新民,王燕芳编著.微型机算计与传感技术[M].北京:人民邮电出版社,1988 [6] 施汉谦,宋文敏.电子秤技术[M].北京:中国计量出版社,1991

[7] 施昌彦.电子称重技术现状和发展趋势[J].称重技术,2002,2 (1) ,p111 [8] 8-bit Microcontroller

with

4K Bytes Flash AT89c51

http://www.atmel.com/dyn/resources/prod_documents

[9] Intel 80C31/80C51BH/87C51 MCS51 Chmos single-chip 8-bitmicrocontroller

[10] [11] [12]

http:/www.zymcu.com/datasheet/intel/

丁元杰.单片微机原理与应用[M].机械工业出版社,2004

梁廷贵.积分式 A/D 转换器其他专用集成电路分册[M].科学技术文献出版社,1999 杨保和.金刚石薄膜压力传感器研制[D].河北:河北工业大学,2003 .

- 16 -

滁州学院本科毕业设计

附录:

液晶显示驱动程序 #include #define DB P1 sbit E=P2^0; sbit RW=P2^1; sbit RS=P2^2; sbit CS_L=P2^4; sbit CS_R=P2^3; sbit RST=P2^7;

void Sdelay(unsigned char t); void Ldelay(unsigned char t); void lcd_reset();

void w_code(unsigned char lcd_code);

void w_data(unsigned char lcd_data, bit csl, bit csr); void lcd_onoff( unsigned char onoff); void lcd_init(); bit lcd_busy();

void lcd_fill(unsigned char fill); void lcd_setsl(unsigned char sl);

void lcd_setxy(unsigned char x, unsigned char y);

void w_xyd(unsigned char x, unsigned char y, unsigned char lcd_data); void En_char(unsigned char x, unsigned char y, unsigned char en); void String(unsigned char x, unsigned char y, unsigned char *str); void Num(unsigned char x,unsigned char y, unsigned int num, bit f); void Chinese(unsigned char x, unsigned char y, unsigned char *hz); unsigned char code En_Code_1[]; unsigned char code En_Code_2[]; unsigned char code Num_Code[]; unsigned char code fh[]; void Sdelay(unsigned char t) {//延迟时间为t*3 us

while(--t);}

void Ldelay(unsigned char t)

- 17 -

滁州学院本科毕业设计

{//延时为t/100 S

unsigned char x,y; for(; t>0; t--)

for(x=50; x>0; x--)

for(y=100; y>0; y--);}

void lcd_reset() {//lcd复位

RST=0; Sdelay(200); RST=1; Sdelay(200);}

void w_code(unsigned char lcd_code) {//写入显示指令lcd_code

CS_L=1; CS_R=1; Sdelay(10); RW=0; RS=0; DB=lcd_code; E=1; E=0; Sdelay(10);}

void w_data(unsigned char lcd_data, bit csl, bit csr)

{//写入显示数据lcd_data,csl和csr为LCD左右屏的使能,1有效0无效

CS_L=csl; CS_R=csr; Sdelay(10); RW=0; RS=1; DB=lcd_data; E=1; E=0; Sdelay(10);}

void lcd_onoff( unsigned char onoff)

{//控制显示器开关,onoff==1表示打开,onoff==0表示关闭

unsigned char lcd_code; lcd_code=0x3E+onoff; w_code(lcd_code);}

- 18 -

滁州学院本科毕业设计

void lcd_init() {//lcd初始化

lcd_reset(); lcd_onoff(0); lcd_fill(0x00); lcd_onoff(1); lcd_setsl(0);}

void lcd_fill(unsigned char fill)

{//全屏填充,fill==0xFF表示黑屏,fill==0x00表示清屏,其他为相应纹理

unsigned char x,y; for(y=0; y<10; y++)

for(x=0; x<128; x++)

w_xyd(x,y,fill);}

void lcd_setsl(unsigned char sl)

{//设置显示起始行从DDRAM中的sl行开始,用于实现滚屏

unsigned char lcd_code; lcd_code=0xC0+sl; w_code(lcd_code);}

void lcd_setxy(unsigned char x, unsigned char y)

{//设置x[0~127],y[0~7],左上角为(0,0),横轴为x,纵轴为y

unsigned char lcd_code; lcd_code=0xB8+y; w_code(lcd_code); if(x<64) lcd_code=0x40+x; else lcd_code=0x40+(x-64); w_code(lcd_code);}

void w_xyd(unsigned char x, unsigned char y, unsigned char lcd_data) {//在坐标x[0~127],y[0~7]处写入数据lcd_data

bit csl,csr; lcd_setxy(x,y); if(x<64) {csl=1; csr=0;} else

{csl=0; csr=1;}

- 19 -

滁州学院本科毕业设计

w_data(lcd_data,csl,csr);}

void En_char(unsigned char x, unsigned char y, unsigned char en) { }

void String(unsigned char x, unsigned char y, unsigned char *str) {

unsigned char *temp; temp=str;

for( ; *temp!=0; temp++) { }

- 20 -

unsigned char i; unsigned char *p; if(en>='A' && en<='Z')

p=&En_Code_1[(en-'A')*16];

else if(en>='a' && en<='z')

p=&En_Code_2[(en-'a')*16];

else if(en==':')

p=fh;

else if(en=='-')

p=(fh+16);

else if(en==' ')

p=(fh+32);

else if(en=='.')

p=(fh+48);

else if(en=='/')

p=(fh+64);

else return; for(i=0; i<16; i++) { }

w_xyd(x+i/2,y+i%2,*(p++));

if(*temp==' ') continue; //处理空格

En_char(((temp-str)*8+x)%128,(((temp-str)*8+x)/128+y)*2,*temp);

滁州学院本科毕业设计

}

void Num(unsigned char x,unsigned char y, unsigned int num, bit f) {//显示数字,f为反白

unsigned char i,t; unsigned int temp; unsigned char *p; if(num==0) {

for(i=0; i<16; i++) { }

if(f) w_xyd(x+i/2,y+i%2,~Num_Code[i]); else w_xyd(x+i/2,y+i%2,Num_Code[i]);

return; } if(num<0) { }

for(temp=10000; (t=num/temp) <= 0; temp/=10); p=&Num_Code[t*16]; for(i=0; i<16; i++) { }

if(num>=0 && num<=9) return; num=num%temp;

- 21 -

for(i=0; i<16; i++) { }

Num(x+8,y,-num,f); return;

if(f) w_xyd(x+i/2,y+i%2,~fh[i+16]); else w_xyd(x+i/2,y+i%2,fh[i+16]);

if(f) w_xyd(x+i/2,y+i%2,~*(p++)); else w_xyd(x+i/2,y+i%2,*(p++));

滁州学院本科毕业设计

}

Num(x+8,y,num,f); //注意: 不会自动换行

void Chinese(unsigned char x, unsigned char y, unsigned char *hz) { }

unsigned char code fh[]={\":\

unsigned char code Num_Code[]={\"0\主程序: #include

#include \"LCD12864_DRIVE.h\" unsigned char dispbuf[4]; unsigned int i; unsigned int j; unsigned char getdata; unsigned int temp; unsigned int temp1; unsigned char count; unsigned char d; long sum[2];

float sum1[5]={0.0,0.0,0.0,0.0,0.0}; float danJ[]={2.5,1.8,1.0,2.0,0.8}; //float zhongL[]={2.5,3.4,6.3,1.5,3.2}; unsigned char k; sbit ST=P3^0; sbit OE=P3^1; sbit EOC=P3^2; sbit CLK=P3^3; sbit P34=P3^4; sbit P35=P3^5;

- 22 -

unsigned char i; for(i=0; i<32; i++) { }

w_xyd(x+i%16,y+i/16,*(hz++));

滁州学院本科毕业设计

sbit P36=P3^6; sbit P25=P2^5; sbit P26=P2^6; sbit P37=P3^7; void TimeInitial(); void Delay(unsigned int i);

unsigned char code table1[]={\"物\品\单\价\重\量\合\计\unsigned char code table3[]={\"元\千\克\" }; unsigned char code table4[]={\"/\

unsigned char code table5[]={\"欢\迎\使\用\电\子\秤\

unsigned char code table6[]={\"葡\萄\南\瓜\西\瓜\番\茄\白\萝\卜\unsigned char code table7[]={\"总\金\额\

unsigned char code table8[]={\"谢\谢\使\用\!\void TimeInitial() { TMOD=0x10; TH1=(65536-200)/256; TL1=(65536-200)%256; EA=1; ET1=1; TR1=1; }

void Delay(unsigned int i) {

unsigned int j; for(;i>0;i--) {

for(j=0;j<125;j++) {;} } }

void main() {

int a,b,c,e,f; TimeInitial();

- 23 -

滁州学院本科毕业设计

while(1) { ST=0; OE=0; ST=1; ST=0; P34=0; P35=0; P36=0; P25=1; P26=1; P37=1; while(EOC==0); OE=1; getdata=P0; OE=0;

temp=getdata*1.0/255*2000; dispbuf[0]=temp%10; dispbuf[1]=temp/10%10; dispbuf[2]=temp/100%10; dispbuf[3]=temp/1000; if(P25==0) {

Delay(800) ; lcd_init();

Chinese(0,2,table5); Chinese(16,2,table5+32); Chinese(32,2,table5+64); Chinese(48,2,table5+96); Chinese(64,2,table5+128); Chinese(80,2,table5+160); Chinese(96,2,table5+192); } if(P26==0)

//欢 //迎 //使 //用 //电 //子 //秤 - 24 -

滁州学院本科毕业设计

{

Delay(800); lcd_init(); k=++k; if(k==6) { k=1; } if(k==1) {

Chinese(0,0,table1); //物 Chinese(16,0,table1+32); //品 En_char(32,0,':');

Chinese(0,2,table1+64); //单 Chinese(16,2,table1+96); //价 En_char(32,2,':');

Chinese(0,4,table1+128); //重 Chinese(16,4,table1+160); //量 En_char(32,4,':');

Chinese(0,6,table1+192); //合 Chinese(16,6,table1+224); //计 En_char(32,6,':');

Chinese(48,0,table6); //葡 Chinese(64,0,table6+32); //萄 Num(48,2,2,0); En_char(56,2,'.'); Num(64,2,5,0);

Chinese(112,2,table3); //元 Num(40,4,dispbuf[3],0); Num(48,4,dispbuf[2],0); En_char(56,4,'.'); Num(64,4,dispbuf[1],0); Num(72,4,dispbuf[0],0); Chinese(96,4,table3+32); //千

- 25 -

滁州学院本科毕业设计

Chinese(112,4,table3+64); //克 sum1[0]=a=danJ[0]*temp/10; Num(40,6,a/10000,0); Num(48,6,(a%10000)/1000,0); Num(56,6,(a%10000%1000)/100,0); Num(64,6,(a%10000%1000%100)/10,0); En_char(72,6,'.');

Num(80,6,(a%10000%1000%100)%10,0); if(k==2) {

Chinese(0,0,table1); //物 Chinese(16,0,table1+32); //品 En_char(32,0,':');

Chinese(0,2,table1+64); //单 Chinese(16,2,table1+96); //价 En_char(32,2,':');

Chinese(0,4,table1+128); //重 Chinese(16,4,table1+160); //量 En_char(32,4,':');

Chinese(0,6,table1+192); //合 Chinese(16,6,table1+224); //计 En_char(32,6,':');

Chinese(48,0,table6+64); //南 Chinese(64,0,table6+96); //瓜 Num(48,2,1,0); En_char(56,2,'.'); Num(64,2,8,0);

Chinese(112,2,table3); //元 Num(40,4,dispbuf[3],0); Num(48,4,dispbuf[2],0); En_char(56,4,'.'); Num(64,4,dispbuf[1],0); Num(72,4,dispbuf[0],0); Chinese(96,4,table3+32); //千

} - 26 -

滁州学院本科毕业设计

Chinese(112,4,table3+64); //克 sum1[1]=b=danJ[1]*temp/10; Num(40,6,b/10000,0); Num(48,6,(b%10000)/1000,0); Num(56,6,(b%10000%1000)/100,0); Num(64,6,(b%10000%1000%100)/10,0); En_char(72,6,'.');

Num(80,6,(b%10000%1000%100)%10,0); } if(k==3) {

Chinese(0,0,table1); //物 Chinese(16,0,table1+32); //品 En_char(32,0,':');

Chinese(0,2,table1+64); //单 Chinese(16,2,table1+96); //价 En_char(32,2,':');

Chinese(0,4,table1+128); //重 Chinese(16,4,table1+160); //量 En_char(32,4,':');

Chinese(0,6,table1+192); //合 Chinese(16,6,table1+224); //计 En_char(32,6,':');

Chinese(48,0,table6+128); //西 Chinese(64,0,table6+160); //瓜 Num(48,2,1,0); En_char(56,2,'.'); Num(64,2,0,0);

Chinese(112,2,table3); //元 Num(40,4,dispbuf[3],0); Num(48,4,dispbuf[2],0); En_char(56,4,'.'); Num(64,4,dispbuf[1],0); Num(72,4,dispbuf[0],0); Chinese(96,4,table3+32); //千

- 27 -

滁州学院本科毕业设计

Chinese(112,4,table3+64); //克 sum1[2]=c=danJ[2]*temp/10; Num(40,6,c/10000,0); Num(48,6,(c%10000)/1000,0); Num(56,6,(c%10000%1000)/100,0); Num(64,6,(c%10000%1000%100)/10,0); En_char(72,6,'.');

Num(80,6,(c%10000%1000%100)%10,0); } if(k==4) {

Chinese(0,0,table1); //物 Chinese(16,0,table1+32); //品 En_char(32,0,':');

Chinese(0,2,table1+64); //单 Chinese(16,2,table1+96); //价 En_char(32,2,':');

Chinese(0,4,table1+128); //重 Chinese(16,4,table1+160); //量 En_char(32,4,':');

Chinese(0,6,table1+192); //合 Chinese(16,6,table1+224); //计 En_char(32,6,':');

Chinese(48,0,table6+192); //番 Chinese(64,0,table6+224); //茄 Num(48,2,2,0); En_char(56,2,'.'); Num(64,2,0,0);

Chinese(112,2,table3); //元 Num(40,4,dispbuf[3],0); Num(48,4,dispbuf[2],0); En_char(56,4,'.'); Num(64,4,dispbuf[1],0); Num(72,4,dispbuf[0],0);

Chinese(96,4,table3+32); //千

- 28 -

滁州学院本科毕业设计

Chinese(112,4,table3+64); //克 sum1[3]=e=danJ[3]*temp/10; Num(40,6,e/10000,0); Num(48,6,(e%10000)/1000,0); Num(56,6,(e%10000%1000)/100,0); Num(64,6,(e%10000%1000%100)/10,0); En_char(72,6,'.');

Num(80,6,(e%10000%1000%100)%10,0); } if(k==5) {

Chinese(0,0,table1); //物 Chinese(16,0,table1+32); //品 En_char(32,0,':');

Chinese(0,2,table1+64); //单 Chinese(16,2,table1+96); //价 En_char(32,2,':');

Chinese(0,4,table1+128); //重 Chinese(16,4,table1+160); //量 En_char(32,4,':');

Chinese(0,6,table1+192); //合 Chinese(16,6,table1+224); //计 En_char(32,6,':');

Chinese(48,0,table6+256); //白 Chinese(64,0,table6+288); //萝 Chinese(96,0,table6+320); //卜 Num(48,2,0,0); En_char(56,2,'.'); Num(64,2,8,0);

Chinese(112,2,table3); //元 Num(40,4,dispbuf[3],0); Num(48,4,dispbuf[2],0); En_char(56,4,'.'); Num(64,4,dispbuf[1],0); Num(72,4,dispbuf[0],0);

- 29 -

滁州学院本科毕业设计

Chinese(96,4,table3+32); //千 Chinese(112,4,table3+64); //克 sum1[4]=f=danJ[4]*temp/10; Num(40,6,f/10000,0); Num(48,6,(f%10000)/1000,0); Num(56,6,(f%10000%1000)/100,0); Num(64,6,(f%10000%1000%100)/10,0); En_char(72,6,'.');

Num(80,6,(f%10000%1000%100)%10,0);} } if(P37==0) {

Delay(800); lcd_init(); sum[0]=0; for(i=1;i<=k;i++)

sum[0]=sum[0]+sum1[i-1]; Chinese(0,0,table7); Chinese(16,0,table7+32); Chinese(32,0,table7+64); Num(0,2,sum[0]/10000,0); Num(8,2,(sum[0]%10000)/1000,0); Num(16,2,(sum[0]%10000%1000)/100,0); Num(24,2,(sum[0]%10000%1000%100)/10,0); En_char(32,2,'.');

Num(40,2,(sum[0]%10000%1000%100)%10,0); Chinese(112,2,table3); Chinese(0,4,table8); Chinese(16,4,table8+32); Chinese(32,4,table8+64); Chinese(48,4,table8+96); Chinese(64,4,table8+128);} } }

- 30 -

滁州学院本科毕业设计

void t1(void) interrupt 3 using 0 {

TH1=(65536-200)/256; TL1=(65536-200)%256; CLK=~CLK; }

- 31 -

滁州学院本科毕业设计

致谢

毕业论文暂告收尾,这也意味着我在滁州学院大学四年的学习生活既将结束。回首既往,自己一生最宝贵的时光能于这样的校园之中,能在众多学富五车、才华横溢的老师们的熏陶下度过,实是荣幸之极。在这四年的时间里,我在学习上和思想上都受益非浅。这除了自身努力外,与各位老师、同学和朋友的关心、支持和鼓励是分不开的

论文的写作是枯燥艰辛而又富有挑战的。老师的谆谆诱导、同学的出谋划策及家长的支持鼓励,是我坚持完成论文的动力源泉。在此,我特别要感谢我的导师姚光顺老师。从论文的选题、文献的采集、框架的设计、结构的布局到最终的论文定稿,从内容到格式,从标题到标点,他都费尽心血。没有姚光顺老师的辛勤栽培、孜孜教诲,就没有我论文的顺利完成。

感谢计算机科学技术系的各位同学,与他们的交流使我受益颇多。最后要感谢我的家人以及我的朋友们对我的理解、支持、鼓励和帮助,正是因为有了他们,我所做的一切才更有意义;也正是因为有了他们,我才有了追求进步的勇气和信心。

时间的仓促及自身专业水平的不足,整篇论文肯定存在尚未发现的缺点和错误。恳请阅读此篇论文的老师、同学,多予指正,不胜感激!

- 32 -

因篇幅问题不能全部显示,请点此查看更多更全内容