混凝土搅拌站称重仪表驱动程序C#源代码
基于CAN现场总线的智能混凝土搅拌站称重仪表

基于CAN现场总线的智能混凝土搅拌站称重仪表1.引言在混凝上搅拌站的混凝土生产过程中,物料称重、配料控制是影响商品混凝土质量的重要因素。
混凝上生产中需要水泥、大石、中石、小石、沙、水、添加剂等多种配料,目前,混凝土搅拌站配料拧制一般使用分布式控制系统,一套传统的典型的搅拌站分布式控制系统如CAN 总线技术是国际上前沿的现场总线技术,它布线简单,只需两根双绞线就可连接多个传输节点,节点增删灵活,传输距离长,抗干扰能力强,在工业现场运用极其广泛。
采用了CAN 总线的新型称重显示控制终端的搅拌站控制系统如由2.称重仪表硬件构成该型称重显示控制器由显示控制模块和传感器数据采集模块组成,模块之间由CAN 总线连接。
传感器数据采集模块不断地采集传感器模拟电压信号,通过内部放火、A/D 转换变成数字信号,并将数字信号经过通信子模块传到CAN 总线上去,供CAN 总线上的对应的显示控制模块接收处理,完成称重显示控制器主要功能,满足搅拌站称量系统的需要。
其工作原理如2.1 基于CAN 接口的传感器数据采集模块原理传感器数据采集模块由信号采集处理子模块、通信子模块和电源电路组成,如信号采集处理部分采用TI 公司的MSC1210 单片机,MSC1210 集成一个增强型的8051 内核、具有可编程增益(1-128 倍)放大器、8 路24 位高精度∑-△摸数转换器(A/D),可以容易地实现单片式低噪声高精度数据采集系统。
同时还具有温度传感器、32K FLASH 存储器、1.2KB 的SRAM、32 位累加器,可串行或并行编程,达10 万次擦除/写操作,工作电压2.7--5.25 V,温度范围- 40--+85℃。
通信子模块由PHILIPS 公司的独立CAN 总线控制器SJA1000、高速光隔离收发器6N137 和CAN 收发器A82C250 组成。
电源部分主要由TVS、LM2956 和DC-DC 模块设计而成。
LM2956 是一款性能优越的低压差稳压器,可以使系统的以较低的功耗工作,具有输入电压反接保护,使系统在不同的工作环境下更安全可靠,输出电压作为供电电源同时也作为AD 转换的基准电压,无需精确稳定的基准电压源即可实现精确的测量,降低了对供电电源和基准电压源的要求,简化了电路,同时也有效的降低了成本。
基于PLC的混凝土搅拌站控制系统设计

PLC plus touch
and display instrument is proposed in this paper.According
structure of
to
the requirement,the software and hardware and designed.
At first,the background paper
论文成果归广东工业大学所有。
申请学位论文与资料若有不实之处,本人承担一切相关责任,特此声明。
指导教师签字:
论文作者签字:
周秀善
z卯窘年多月么日
第一章绪论
第一章绪论
1.1选题背景及意义
混凝土搅拌站最初是以单机的形式出现,各工地自拌自用,随着基础设施建 设大规模的开展,商品混凝土的销售逐渐增大。随着计算机技术和测控技术的发 展,高可靠、高自动化的自动控制系统便成了混凝土搅拌站的发展方向。 在混凝土搅拌站自动控制系统中,系统的稳定性、数据采集处理的精确性直 接影响到混凝土的质量。而在市场竞争日趋激烈的今天,搅拌站自动控制系统的 性价比也与企业的生存紧密的联系在一起。因此,研究一种低成本、高可靠性的 新型搅拌站自动控制系统,具有极为广阔的市场前景。 混凝土搅拌站包括贮料、配料、物料称量、搅拌及卸料等过程,是一个受多 环节制约的复杂系统,物料的配比和称重精度等因素都直接影响混凝土的质量。 由于PLC运算速度高、指令丰富、功能强大、可靠性高、使用方便、编程灵活及 抗干扰能力强等特点,如今成为工业控制领域的主要控制设备,始终处于工业自 动化控制领域的主战场,为各种各样的自动化控制设备提供了安全可靠和比较完 善的控制应用;但由于其本身不具备人机交互功能,在工艺参数较多,需要人机 交互时,使用具有触摸操作功能的触摸屏是一种很好的选择,通过触摸屏和PLC 结合使用,可以在触摸屏中直接设定目标值与实际值进行比较,并可实时监控到 系统实际值的大小,实现报警等功能;配料控制器性能可靠、性价比高,可方便 地利用通信接口扩展成计算机控制系统。综上所述,本系统采用“PLC+触摸屏+ 显示仪表"这样一种控制方式的搅拌站系统有着重要的意义,适应当今技术发展
圣兰软件C.C.ERP混凝土解决方案

物资采购退货
物资仓库
成本分析
领料退料
盘点调价
借出还入
库存查询
SINCE 2002
生产流程
制作 生产 任务 单
已审 销售 合同
实验 室关 联配 方
调度 关联 罐车
机楼 打料 出厂
SINCE 2002
系统主界面
SINCE 2002
磅房管理
ERP无缝连接地磅、自动读取称重数据,避免人工干预称重数据,磅房管理 分为发货称重和收料称重两个模块。 发货称重:发货信息由调度人员生成并自动发送到磅房,磅房人员只需称 取罐车的皮重、毛重,打印发货小票,自动生成相关报表(整方量发车时, 无需磅房称重)。 收料称重:磅房人员记录车辆的车号、供应商、原材料类型等信息,并称 取毛重、皮重,可设置扣吨、并可指定料仓、搅拌机, 以便统计部门对料 仓库存进行查询、盘点,自动生成相关报表。
圣兰C.C.ERP合作案例遍布全国:江苏、河南、河北、湖南、湖北、山东、 辽宁、吉林、甘肃、新疆、四川、云南、天津、重庆、海南等二十多个省市, 2007年以来,市场占有率稳居国内第一。
SINCE 2002
各地代表案例
无锡伟鑫建材有限公司 (江苏伟业混凝土集团)——亚洲最大混凝土公司 常州伟业混凝土有限公司(江苏伟业混凝土集团) 江苏腾祥商品混凝土有限公司 云南建工经开绿色高性能混凝土有限公司(云南建工混凝土集团) 四川攀枝花环业混凝土有限公司(攀钢混凝土集团) 海南华盛集团(混凝土集团) 武汉新中环建材有限公司 天津荷意商品混凝土有限公司 河北张家口天石混凝土有限公司 青岛高新区环湾混凝土有限公司 辽宁朝阳德辅商品混凝土有限公司 湖北襄樊固王混凝土有限公司 湖南长沙志高混凝土有限公司 重庆慧江混凝土有限公司 长春飞达混凝土有限公司 鄂尔多斯大雄水泥制品有限责任公司 … …
基于CAN现场总线的智能混凝土搅拌站称重仪表

S ANY n lo g tr lv n a e t . a d a s o ee a t t n s p
Key or w ds: CAN el i f d bus; Concr e m i aton; ei n i r ent CAN ot et xerst i W ghi g nstum : pr ocol
。
传 统 分 布 式 搅 拌 站 控 制 系统
辫 采用cN A总线的新型搅拌站控制系统
, … ~ 一 一 2 7 1 O 第1 期 O
寺镟 EE TO I U L Y LC R NC Q A I 一~ … S T .
维普资讯
c cr e m i er st i on et x at on wei ghi g n r n i st um en ,based on CAN el bus and devel t i f d oped t a l b our ves, ot l y y sel ar al o n r e s i t oduc ed n det i.The new t l i t um ent ha i a l s y e ns r s ve been appl i ncr e i t tons i ed n c o et m xer s a i of
相 应 料 斗 传 感 器 信 号 , 换 算 成 重
量 , 同 时 根 据 混 凝 土 的 配 方 进 行
配 料 的 过 程 控 制 ” 。 这 种 显 示 控
制 和 传 感 器 信 息 采 集 一 体 化 的 称
重 显 示 控 制 终 端 在 远 距 离 模 拟 信 号 的 传 输 中 , 外 部 干 扰 的 串 入 以 及 传 输 过 程 中 信 号 的 衰 减 都 直 接
搅拌站称量仪表参数设置步骤

搅拌站称量仪表参数设置步骤1. 长按确认进入设置菜单。
系统参数设置→诊断与维护→重装出厂值→选择→√→修改为1→确定(一定要先操作这一步.注意!).2. 参数设置表如下:红色部分表示需要修改的部分。
120站骨料最大称量值为4000,180站最大称量值为5000。
3. 根据表格设置:最大称量设置,分度值选择,物料数设置,进料门选择,延时启动时间.以下是具体的设置步骤.系统参数设置→通讯参数设置→仪表地址设置系统参数设置→秤接口参数设置→最大称量设置系统参数设置→秤接口参数设置→分度值选择系统参数设置→配料参数设置→物料数设置系统参数设置→配料参数设置→进料门设置系统参数设置→配料参数设置→时间参数设置→延时启动时间4. 参数修改完毕,系统参数设置→诊断与维护→保存调试参数→密码:3368→确定。
这个设置是防止参数被修改了,可以直接通过释放调试参数来恢复到已经保存的调试参数。
5. 如果是出口站,需在显示终端设置→使用语言设置→英语。
6. 校称步骤: 系统参数设置→秤接口参数设置→秤零点校正→√(相当于三一仪表的F1.5零点标定)系统参数设置→秤接口参数设置→秤量程校正→√→输入砝码值(相当于三一仪表的F1.6砝码标定)加载砝码必须是最大称量值的20%以上。
7. 如果不要自动修改落差,可以把系统参数设置→配料参数设置→修正频次设置→改为0.如果目标值超过一定范围,不能自动投料,请把系统参数设置→秤接口参数设置→动态检测范围→改大点即可.9. 如果不能校称,说明仪表版本不是1.20版本,需操作以下步骤. 仪表上电时会显示版本号1秒钟左右.9.1系统参数设置→秤接口参数设置→查看校正参数→确认→确认→修改为80000→确认9.2系统参数设置→配料参数设置→修正频次设置→确认→确认→修改为2→确认9.3系统参数设置→配料参数设置→修正范围设置→确认→确认→修改为1.0%→确认。
中联重科混凝土搅拌机控制系统详解

砼站系统一、安全生产:为了确保安全,在设备安装、调试、使用过程中应严格执行以下规定:1.每次启动搅拌主机、斜皮带机前,应按电铃三次,每次间隔时间为10秒。
第三次电铃响过5秒后,方可启动设备。
2.严禁无故进入搅拌主机内部,确属维修需要,应断开电源,挂上“有人工作,严禁合闸!”的标志牌,并派专人看护。
确定搅拌罐内无人后,方可启动搅拌主机。
3.严禁在设备运行时进行维修工作,不得触及设备的机械运动部分。
4.设备安装完毕,应根据搅拌站所在场地的地质、气候条件对筒仓作加固处理,并按《GB50057-1994 建筑物防雷击设计规范》自行安装防雷击装置。
5.供气系统中的空气压缩机和储气罐为压力容器,请勿随意调动安全阀的泄放压力值,请确保气力驱动设备在其允许的气压范围内工作。
6.对气力驱动设备检修时应关闭相应的供气阀门,以免发生意外事故。
7.原则上,与生产无关的人员不得进入工作区域,不得进入控制室,更不得触摸、扳动按钮手柄。
8.对电气设备的检修和维护,应做到持证上岗,遵守和执行电力部门的有关规定。
不得私自在电控柜内搭接其他电力设备。
9.其他未列的注意事项,应遵照国家和行业的相关安全运行规定。
敬请设备的管理和操作人员务必牢记掌握!!!二、慨况1. 型号的组成及其意义H Z S 120 J理论生产率120 m3∕h;J:设计序列号主机为双卧轴搅拌主机混凝土搅拌站2. 使用环境条件作业温度1~40°C湿度90%最大雪载荷800Pa最大风载荷700Pa作业海拔高度≦2000m三、自动控制的方式中联重科所开发的搅拌站控制系统是上位工控机和下位PLC来搭建的控制系统,1.系统组成:2.各部分的功能:工控机部分(上位机部分):a )研华工业控制计算机(简称工控机)一台;b )三星彩色显示器一台;d) 打印机:24针OKI 型打印机一台e) 为了保证系统稳定,本系统配有1000VA 不间断电源(UPS )一台。
功能:实现人机对话,输入生产参数;在启动时将信息传送给下位机;从下位机读取信息进行监控;故障报警;控制打印机打印数据;贮存数据。
混凝土校称操作规程
混凝土校称操作规程混凝土称量是混凝土搅拌站生产过程中非常重要的一个环节,称量准确与否直接影响到混凝土的质量。
为了确保混凝土的称量准确可靠,制定了一套混凝土校称操作规程如下:一、设定准确的秤值1. 在进入生产前,操作人员应仔细检查和调整混凝土搅拌站的电子秤,确保称量仪器和设备的正常工作。
2. 按照预定的设计比例和混凝土配比要求,将混凝土材料的密度和比重进行准确测定,然后根据测定值设置和校准电子秤的秤值。
3. 根据混凝土的生产工艺和评价要求,调整和设定不同材料的称量目标值,确保可调控性和准确性。
二、检查称量设备1. 进行称重前,需要检查各个称量设备的工作状态,如输送带、斗式提升机、输送泵等,并及时消除设备故障或异响。
2. 检查秤体的传感器、称重电路和仪表的连接情况,确保其连接良好。
3. 检查存储控制器和储存器,确保数据的正确性和可靠性。
三、确保称量准确1. 混凝土生产过程中,应分别进行水泥、骨料、矿粉等各种材料的称量检验,确保称量准确。
2. 在称量过程中,操作人员应密切观察仪表指针是否平稳,记录和监测每一次称量的波动情况。
3. 需要定期校正零点和满量程,以保证电子秤的准确性。
四、操作要点1. 每次称量时,应预先清除秤台上的杂物,以确保称量准确。
2. 检查称量系统是否按要求进行自检,确保系统正常工作。
3. 每次称量结束后,及时将称量数据记录,确保数据安全和可靠。
4. 对于秤体的保养和维护,必须按规定进行,防止磨损和腐蚀。
五、数据保存和分析1. 称量数据应保存在电子设备中,以备将来的数据分析和比较。
2. 不定期对称量数据进行统计和分析,定期制定各种数据报表,以便判断生产过程中是否存在问题。
3. 根据分析结果,及时采取措施,纠正出现的偏差和问题。
总之,混凝土校称操作规程是混凝土搅拌站生产过程中非常重要的一环,操作人员应按照规程进行操作,确保称量准确、可靠,提高混凝土质量。
同时,也需要不断总结和积累经验,完善操作规程,以适应不同环境和要求的生产。
基于PLC的混凝土搅拌站控制及监控程序设计毕业设计论文
基于PLC的混凝土搅拌站控制及监控程序设计摘要随着我国经济建设的飞速发展,许多大型的基础工程及建筑工程相继开工。
建设优质的工程需要高品质的混凝土,而且随着人们环保意识的加强,为了减少城市噪音和污染,交通和建筑管理部门要求施工用的混凝土集中生产和管理。
这样,不仅要求混凝土的配料精度高,而且要求生产速度快,因此,混凝土生产过程中搅拌设备自动控制系统日益受到人们的重视。
可编程控制器具有可靠性高、功能完善、编程简单且直观,能够有效地弥补继电器控制系统的缺陷。
基于上述原因,我设计了基于的商品混凝土搅拌设备自动控制系统。
常见的混凝土搅拌站控制方式有继电器直接控制、PLC和计算机结合以及PLC 和配料控制器结合3种控制方式。
采用PLC和配料控制器结合控制的搅拌站性能可靠、性价比高,可以保证混凝土的质量,提高混凝土生产效率。
作为混凝土搅拌站的核心,控制及监控程序在计量精确、控制可靠、管理方便等方面的要求也日益提高。
本文针对PLC和配料控制器结合控制的搅拌站来设计其控制及监控程序设计中主要要完成的任务有系统构造、PLC的I/O分配、工作流程图及PLC程序的编写。
关键词:混凝土搅拌站;I/O分配;可编程控制器(PLC);自动控制The designing of the controlling and monitoring program for concrete mixing stations which based on PLCABSTRACTWith the rapid development of China's economic construction, the basis for many large engineering and construction projects have been started. Construction of high quality project needs high-quality concrete, and with the strengthening of environmental consciousness, in order to reduce urban noise and pollution, traffic and construction management department for the construction of concrete used in concentration of production and management. This requires not only the ingredients of concrete, high precision, and require the production speed, therefore, the production process of concrete mixing equipment automatic control system has attracted attention. Programmable controller with high reliability, functional, simple and intuitive program can effectively make up for the relay control system defects. For these reasons, I designed the product based automatic control system of concrete mixing equipment.Common control of concrete mixing station has direct control of relays, PLC and computer and PLC integration and combination of ingredients controller 3 control. Batching Controller using PLC and the control of mixing with reliable, cost-effective, can guarantee the quality of concrete to improve concrete production efficiency. As the core of concrete mixing station, control and monitoring procedures in the measurement of precise, reliable control, easy management, and other requirements are increasing.In this paper, combined with PLC control and ingredients mixing station controller to design the control and monitoring process design of the main tasks to be accomplished in a systematic structure, PLC's I / O allocation, work flow and procedures for the preparation of PLC.KEY WORDS: Concrete mixing station; The I / O distribut- ion;Programmable logic controller(PLC); Automatic control目录前言 (1)第1章混凝土搅拌站系统概述 (3)1.1 混凝土搅拌站的组成 (3)1.2 电控系统的构成 (5)1.3 称重传感器的选择 (7)1.4 小结 (8)第2章混凝土搅拌站控制系统设计 (9)2.1 控制系统设计的基本原则及步骤 (9)2.2PLC的工作原理 (10)2.3 可编程控制器的选用及编程调试软件选择 (13)2. 3.1 可编程控制器的选用 (13)2. 3.2 编程调试软件选择 (15)第3章混凝土搅拌站PLC程序设计 (18)3.1 混凝土搅拌站PLC程序设计思想 (18)3.2 混凝土搅拌装置的工艺流程 (18)3.3 系统初始化程序及主程序设计 (19)3.4 报警电路的设计 (21)3.5 断电保护程序设计 (21)3.6I/O分配表和模拟量输入地址 (22)3.7 位存储区(M)的使用概况 (24)3.8 小结 (25)第4章程序调试 (26)4.1 模拟调试的准备工作 (26)4.2 仿真调试 (26)4.2.1 系统初始化程序及主程序调试 (26)4.2.2 报警程序的调试 (29)4.3 小结 (30)结论 (31)谢辞 (32)参考文献 (33)附录 (34)前言可编程序逻辑控制器(PLC)自它诞生以来至今,以其极高的性能价格比以及一系列人所共识的优点,受到越来越多的工程技术人员的重视。
《圣兰混凝土搅拌站管理系统》--C.C.ERP 系统介绍
《圣兰混凝土搅拌站管理系统》--C.C.ERP 系统介绍混凝土搅拌站ERP系统《圣兰混凝土搅拌站管理系统》--C.C.ERP,适用于商品混凝土生产企业。
该系统将商品混凝土生产企业所有的核心业务,运用计算机信息管理技术进行智能融合,可实现生产自动化,并使所有业务通过信息共享、协同办公实现高效化、精细化管理,可以有效降低企业的运营...《圣兰混凝土搅拌站管理系统》--C.C.ERP,适用于商品混凝土生产企业。
该系统将商品混凝土生产企业所有的核心业务,运用计算机信息管理技术进行智能融合,可实现生产自动化,并使所有业务通过信息共享、协同办公实现高效化、精细化管理,可以有效降低企业的运营成本、管理成本,提高工作效率。
系统运行环境及其它:∙W INDOWS2000/XP以及以上操作系统;∙采用B/S与C/S结合的模式;∙采用Microsoft SQL Server 2000 数据库;∙可支持互连网访问;∙可与市场流行的其它应用软件(如:金碟,用友)实现连接;∙采用多层数据安全保护,保证数据库的安全运行。
该ERP系统包括以下几个模块:1.物流(磅房)管理2.生产管理3.机楼管理4.调度管理5.合同管理6.实验、质检管理7.仓库管理8.销售、结算管理9.设备、车队管理10.财务套帐(内帐)11.系统设置12.综合管理具体介绍:∙1.物流(磅房)管理该模块实现电子地磅与系统无缝连接,实现发货、收料的称重,自动记录结果保存在数据库中。
发货自动去皮重、结算净重,并根据方量比换算为方量,打印多联票据。
该模块可提供发货、收料、工地发货、品种发货、司机车次统计、收料统计等各种报表,并可方便查询、修改。
∙2.生产管理根据已签合同,或口头通知生成生产通知单,内容包括:工程名称,委托单位,工程部位、混凝土标号、集料、外加剂、塌落度等技术参数,然后提交,由实验室匹配配合比,然后发送给生产、材料、设备部门要求落实或准备安排生产计划。
《称重仪表程序》word版
#ifndef _MAIN_H#define _MAIN_H#include <reg52.h>#include<intrins.h>#include<stdio.h>#include<absacc.h>#define LcdDataPort P0 //数据端口#ifndef UCHAR_DEF#define UCHAR_DEF#define SGL 1#define DIFF 0#define uint unsigned inttypedef unsigned char uchar;#endifsbit tuidai = P3^6; //推袋输出sbit supply_1 = P1^6; //粗喂料口sbit supply_2 = P1^7; //细喂料口/**MCP3204定义**/sbit AD_CLK = P1^0;sbit AD_DIN = P1^1;sbit AD_DOUT = P1^2;sbit AD_CS = P1^3;sbit LED = P2^7;/**ampire12864定义**/sbit Reset = P2^0; //复位sbit RS = P2^1; //指令数据选择sbit E = P2^2; //指令数据控制sbit CS1 = P2^4; //左屏幕选择,低电平有效sbit CS2 = P2^5; //右屏幕选择sbit RW = P2^3; //读写控制sbit busy = P0^7; //忙标志sbit CE = P2^6; //总线驱动器使能端sbit BUT = P2^7;uchar p; //临时存储P0口数据uchar key; //键值uchar inisign = 0; //判断是否测皮重信号uchar taodai = 0; //套袋信号uchar setcount = 0; //按键设置计数float xgzl = 40.00; //细给重量uchar tdys = 1; //推袋延时(s)uint tdcount = 0; //推袋延时计数,20为1suchar timeflag = 0;//uchar k = 0; //判断推袋延时或细口给料延时标志uchar xzw = 0; //选择位uchar pzsign = 0; //是否称皮重标志float idata x[9]; //采样数据存放数组float idata y[9];void SetOnOff(uchar onoff); //开关显示void SelectScreen(uchar screen);//选择屏幕void ClearScreen(uchar screen); //清屏void Show1616(uchar lin,uchar colum,uchar *address);//显示一个汉字void CheckState(); //判断状态void LcdDelay(unsigned int time); //延时void WriteData(uchar dat); //写数据void SendCommand(uchar command); //写指令void SetLine(uchar line); //置行地址void SetColum(uchar colum);//置列地址void SetStartLine(uchar startline);//置显示起始行void InitLcd(); //初始化void ResetLcd(); //复位/*********************************************************************/ void int_time0() interrupt 1 using 2{TH0 = 60;TL0 = 176;tdcount ++;if(tdcount == 20*tdys){EX0 = 1; //系统闲,可进行设置EX1 = 1;TR0 = 0;ET0 = 0;tdcount = 0;tuidai = 0;tuidai = 1;timeflag = 0;}/*else if((tdcount == 6) && (!k)){tdcount = 0;supply_2 = !supply_2;} */}void int_time1() interrupt 3 using 3{TH1 = 60;TL1 = 176;tdcount ++;if(tdcount == 20){taodai = 1;TR1 = 0;tdcount = 0;pzsign = 1;}}int mcp3204(uchar mode,uchar channel) { int i;int c = 0;uchar D1,D0;if(channel & 0x01) D0 = 1;else D0 = 0;if(channel & 0x02) D1 = 1;else D1 = 0;AD_CS = 1;AD_CS = 0;AD_CLK = 0; //起始位 AD_DIN = 1;AD_CLK = 1;AD_CLK = 0;AD_DIN = mode; //模式位 AD_CLK = 1;AD_CLK = 0;AD_DIN = 0;AD_CLK = 1;AD_CLK = 0;AD_DIN = D1;AD_CLK = 1; //通道选择 AD_CLK = 0;AD_DIN = D0;AD_CLK = 1;AD_DOUT = 1; //释放数据线AD_CLK = 0;AD_CLK = 1;AD_CLK = 0;AD_CLK = 1; //null位跳过 for(i = 0;i < 12;i++){ c = c<<1;AD_CLK = 0;AD_CLK = 1;if(AD_DOUT == 1) c = c + 1;}AD_CS = 1;return c;}/***********LCD部分**********/void CheckState(){E = 1;RS = 0;RW = 1;LcdDataPort = 0xff;while(!busy);}void LcdDelay(unsigned int time){while(time --);}void WriteData(uchar dat){CheckState();E = 1;RS = 1;RW = 0;LcdDataPort = dat;E = 0;}void SendCommand(uchar command){CheckState();E = 1;RW = 0;RS = 0;LcdDataPort = command;E = 0;}void SelectScreen(uchar screen) //2-全屏,0—左屏,1-右屏{switch(screen){case 0 :CS1 = 0;LcdDelay(2);CS2 = 1;LcdDelay(2);break;case 1 :CS1 = 1;LcdDelay(2);CS2 = 0;LcdDelay(2);break;case 2 :CS1 = 0;LcdDelay(2);CS2 = 0;LcdDelay(2);break;}}void ClearScreen(uchar screen) // screen 2-全屏,0—左屏,1-右屏{uchar i,j;SelectScreen(screen);for(i = 0;i < 8;i ++){SetLine(i);SetColum(0);for(j = 0;j < 64; j ++)WriteData(0);}}void Clear1616(uchar line,uchar colum,uchar screen) //清除16*16的方阵{uchar i,j;SelectScreen(screen);for(j = 0;j < 2;j ++){SetLine(line + j);SetColum(colum);for(i = 0;i < 16; i ++)WriteData(0);}}void SetLine(uchar line) //line -> 0 : 7{line = line & 0x07;line = line | 0xb8; //1011 1xxxSendCommand(line);}void SetColum(uchar colum) //colum -> 0 :63{colum = colum & 0x3f;colum = colum | 0x40; //01xx xxxxSendCommand(colum);}void SetStartLine(uchar startline) //startline -> 0 : 63{startline = startline & 0x3f;startline = startline | 0xc0; //11xxxxxxSendCommand(startline);}void SetOnOff(uchar onoff) //1-开显示 0-关{if(onoff == 1)SendCommand(0x3f); //0011 111xelseSendCommand(0x3e);}void ResetLcd(){Reset = 0;LcdDelay(2);Reset = 1;LcdDelay(2);RS0 = 0;LcdDelay(2);RS1 = 0;LcdDelay(2);SetOnOff(1);}void InitLcd(){ResetLcd();SetOnOff(0);ClearScreen(2);SetLine(0);SetColum(0);SetStartLine(0);SetOnOff(1);}void Show1616(uchar lin,uchar colum,uchar *address) {uchar i;SetLine(lin);SetColum(colum);for(i = 0;i < 16;i ++)WriteData(*(address ++));SetLine(lin + 1);SetColum(colum);for(i = 0;i < 16;i ++)WriteData(*(address ++));}/*******I2C部分24c04******//*void delayus(int n){int i;for(i = 0;i < n;i++){_nop_();}}void start_iic(){SCK = 1;delayus(5);SDA = 1;delayus(5);SDA = 0;delayus(5);SCK = 0;}void stop_iic(){SDA = 0;SCK = 1;delayus(5);SDA = 1;delayus(5);SCK = 0;}void ask_iic(){SDA = 0;SCK = 1;delayus(4);SCK = 0;SDA = 1;}void nask_iic(){SDA = 1;SCK = 1;delayus(4);SCK = 0;SDA = 0;}void write_iic(uchar byte) { int i;for(i = 0;i < 8;i++){if(byte & 0x80) SDA = 1;else SDA = 0;delayus(5);SCK = 0;byte = byte << 1;}SDA=1;while(SDA);SCK=1;delayus(4);if(SDA==0) flag=1;else flag = 0;SCK = 0;}uchar read_iic(){int i;uchar byte = 0x00;SDA = 1;for(i = 0;i < 8;i ++){delayus(4);SCK = 1;byte = byte << 1;if(SDA == 1) byte += 1;SCK = 0;}ask_iic();nask_iic();stop_iic();return byte;}void writebyte_iic(uchar address,uchar byte) { int w = 1;while(w){start_iic();write_iic(0xA0);if(flag == 0) break;write_iic(address);if(flag == 0) break;write_iic(byte);if(flag == 0) break;}stop_iic();}uchar readbyte_iic(uchar address){int r = 1;uchar byte = 0x00;while(r){start_iic();write_iic(0xA0);if(flag == 0) break;write_iic(address);if(flag == 0) break;start_iic();write_iic(0xA1);if(flag == 0) break;byte = read_iic();r = 0;}stop_iic();return byte;}void write2byte_iic(uchar address,uchar bytea,uchar byteb) //重量信号是12位,因此用两字节{int w = 1;while(w){start_iic();write_iic(0xA0);if(flag == 0) break;write_iic(address);if(flag == 0) break;write_iic(bytea);if(flag == 0) break;write_iic(byteb);w = 0;}stop_iic();} */void int_button() interrupt 0 using 1{EX0 = 0;p = LcdDataPort; //临时存储P0口数据LcdDataPort = 0xff;CE = 0;key = LcdDataPort;CE=1;if(key == 0x1e) //SET BUTTON{setcount ++;if(setcount == 3) setcount = 0;if(setcount != 1) xzw = 0; //只在设置1时有选择位操作,所以到设置2时清零,避免误操作}if(key == 0x1d) //选择位{if(setcount == 1){xzw ++;if(xzw == 4) xzw = 0;}} //BUTTON2if(key == 0x1b){if(setcount == 1){if(xzw == 1) xgzl += 1;if(xzw == 2) xgzl += 0.1;if(xzw == 3) xgzl += 0.01;if(xgzl >= 46) xgzl = 40;}else if(setcount == 2){tdys ++;if(tdys == 4) tdys = 1;}} //BUTTON3if(key == 0x17){if(setcount == 1){if(xzw == 1) xgzl -= 1;if(xzw == 2) xgzl -= 0.1;if(xzw == 3) xgzl -= 0.01;if(xgzl <= 39) xgzl = 45;}else if(setcount == 2){tdys --;if(tdys == 0) tdys = 3;}}key = 0x00;LcdDataPort = p;EX0 = 1;}void int_td() interrupt 2 using 1{EX0 = 0; //系统忙,不能进行设置EX1 = 0;ET0 = 1;ET1 = 1;timeflag = 0;TR1 = 1;pzsign = 0;}/****************main.c*****************/const uchar code SZ_tab[] = {0x00,0x00,0x00,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x00,0x00, //0 0x00,0x00,0x00,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x08,0x88,0x48,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x20,0x10,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3f,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x20,0x20,0x11,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x08,0x08,0xc8,0x38,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x22,0x21,0x21,0x22,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x10,0x08,0x08,0x10,0xe0,0x00,0x00,0x00,0x00,0x00, //9 0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0f,0x00,0x00,0x00,0x00,0x00};const uchar code HZ_tab[] = {0x20,0x30,0xac,0x63,0x20,0x18,0x00,0xfc,0x04,0x04,0xfc,0x04,0x04,0xfc,0x00,0x00, //细 0x22,0x67,0x22,0x12,0x12,0x12,0x00,0xff,0x41,0x41,0x7f,0x41,0x41,0xff,0x00,0x00,0x20,0x30,0xac,0x63,0x10,0x20,0x50,0x48,0x44,0x43,0x44,0x48,0x50,0x20,0x20,0x00, //给0x22,0x67,0x22,0x12,0x12,0x00,0xfe,0x42,0x42,0x42,0x42,0x42,0xfe,0x00,0x00,0x00,0x00,0x08,0x08,0x0a,0xea,0xaa,0xaa,0xaa,0xff,0xa9,0xa9,0xa9,0xe9,0x08,0x08,0x08, //重0x00,0x40,0x40,0x48,0x4b,0x4a,0x4a,0x4a,0x7f,0x4a,0x4a,0x4a,0x4b,0x48,0x40,0x40,0x00,0x40,0x40,0x40,0xdf,0x55,0x55,0x55,0xd5,0x55,0x55,0x55,0xdf,0x40,0x40,0x40, //量0x00,0x40,0x40,0x40,0x57,0x55,0x55,0x55,0x7f,0x55,0x55,0x55,0x57,0x50,0x40,0x40,0x10,0x10,0x10,0xff,0x10,0x50,0x20,0xf8,0x4f,0x48,0x49,0xfa,0x48,0x48,0x08,0x00, //推0x04,0x44,0x82,0x7f,0x01,0x00,0x00,0xff,0x22,0x22,0x22,0x3f,0x22,0x22,0x20,0x00,0x04,0x84,0xc4,0xb4,0x8c,0x00,0x00,0xe4,0x04,0x04,0xfe,0x42,0x43,0x42,0x00,0x00, //延0x80,0x44,0x28,0x18,0x27,0x20,0x40,0x4f,0x48,0x48,0x4f,0x48,0x48,0x48,0x40,0x00,0x00,0xfc,0x84,0x84,0x84,0xfc,0x00,0x10,0x10,0x10,0x10,0x10,0xff,0x10,0x10,0x00, //时0x00,0x3f,0x10,0x10,0x10,0x3f,0x00,0x00,0x01,0x06,0x40,0x80,0x7f,0x00,0x00,0x00};const uchar code FH_tab[] = {0x30,0x30 //"." };const uchar code DW_tab[] = {0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //s 0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xf8,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00, //kg 0x20,0x3f,0x24,0x02,0x2d,0x30,0x20,0x00,0x00,0x6b,0x94,0x94,0x94,0x93,0x60,0x00};void delay1s(){uint i,j;for(i = 0;i < 100;i ++){for(j = 0;j < 1000;j ++)_nop_();}}void sz(){int q,b,s,g;uint j = 0;uchar i,line,colum ;uchar *address ;ClearScreen(2);EX1 = 0;while(1){ if(setcount == 0){//writebyte_iic(0x00,xgzl);//writebyte_iic(0x01,tdys);EX1 = 1;break;}while(j < 160){j ++;switch(xzw){case 0:break;case 1:Clear1616(5,16,0);break;case 2:Clear1616(5,34,0);break;case 3:Clear1616(5,48,0);break;}}j ++;if(j == 180) j = 0;switch(setcount - 1){case 0:{q = (int)xgzl / 10;b = (int)xgzl % 10;s = (int)(xgzl*10) %10;g = (int)(xgzl*100) % 10;colum = 32;line = 1;address = HZ_tab;for(i = 0;i < 2;i ++){SelectScreen(0);Show1616(line,colum ,address);colum += 16;address += 32; //向DDRAM中写入数据 }colum = 0;for(i = 0;i < 2;i ++){SelectScreen(1);Show1616(line,colum,address);colum += 16;address += 32;}line = 5;colum = 0;for(i = 0;i < 4;i ++){switch(i){case 0:address = SZ_tab + q*32;break;case 1:address = SZ_tab + b*32;break;case 2:address = SZ_tab + s*32;break;case 3:address = SZ_tab + g*32;break;}SelectScreen(0);Show1616(line,colum ,address);colum += 16;if(colum == 64) colum = 0;}address = DW_tab + 32;SelectScreen(1);Show1616(line,colum ,address);colum = 32;SelectScreen(0);line=line + 1;address = FH_tab;SetLine(line); //显示“.”SetColum(colum);for(i = 0;i < 2;i ++){WriteData(*(address + 1));}}break;case 1:{Clear1616(5,32,0);Clear1616(5,48,0);Clear1616(5,0,1);colum = 32;line = 1;address = HZ_tab + 4*32;SelectScreen(0);Show1616(line,colum,address);colum += 16;address = HZ_tab + 32;SelectScreen(0);Show1616(line,colum,address);colum = 0;address = HZ_tab + 5*32;for(i = 0;i < 2;i ++){SelectScreen(1);Show1616(line,colum,address);colum += 16;address += 32;}line = 5;colum = 0;address = SZ_tab + tdys*32;SelectScreen(0);Show1616(line,colum,address);colum += 16;address = DW_tab;SelectScreen(0);Show1616(line,colum,address);}break;}}ClearScreen(2);}uint lb(uint adata,int i){int k,l;uint adata1;x[i] = adata;for(k = 0;k < 9;k ++){y[k] = x[k];}for(k = 0;k < 8;k ++){for(l = k + 1;l < 9;l ++){if(x[k] > x[l]){adata1 = x[k];x[k] = x[l];x[l] = adata1;} }}adata = x[3] + x[4] + x[5];adata /= 3;for(k = 0;k < 9;k ++){x[k] = y[k];}return adata;}uchar main(){int g,s,b,q; //个十百千万位int t;float sj,sj1;uint adata,adata1;uchar i,line,colum ;uchar *address ;uint j = 0; //延时计数uint j1 = 0;InitLcd();CE = 1; //关闭总线驱动器245supply_1 = 1;supply_2 = 1;EA = 1;EX0 = 1;EX1 = 1;TMOD = 0x11;TH0 = 60;TL0 = 176;TH1 = 60;TL1 = 176;IT0 = 1;IT1 = 1;while(1){if(setcount != 0) sz();j1 ++;if(j1 == 10){j1 = 0;adata1 = mcp3204(SGL,0x00);adata = lb(adata1,t);t ++;if(t == 9) t = 0;}sj = (float)adata*5/4096; //通过计算得的电压值sj = sj*50/3;if(pzsign == 0){sj1 = sj;sj = 0;}else{sj = sj - sj1;}if(sj > (float)xgzl){supply_1 = 1; //关闭粗喂料口//TR0 = 1;}if(sj > 50){supply_2=1; //关闭细喂料口//k = 1;if(timeflag == 0){TR0 = 0;tdcount = 0;TR0 = 1;timeflag = 1;}}if(taodai == 1){//k = 0;TR0 = 0;supply_1 = 0;supply_2 = 0;taodai = 0; //粗细喂料口全开} j++;if(j == 380){j = 0;sj = sj * 100;q = (int) sj / 1000 % 10;b = (int) sj /100 % 10;s = (int) sj /10 % 10;g = (int) sj % 10;colum = 32;line = 1;address = HZ_tab + 64;for(i = 1;i < 3;i ++){if(i < 2)SelectScreen(0);else{SelectScreen(1);colum = 64 - colum; }Show1616(line,colum ,address);colum += 16;if(colum > 63)colum = 0;address += 32; //向DDRAM中写入数据}line = 5;colum = 0;if(q != 0){address = SZ_tab + q*32;SelectScreen(0);Show1616(line,colum ,address);}elseClear1616(line,colum,0);colum = 16;for(i = 0;i <3; i ++){switch(i){case 0:address = SZ_tab + b*32;break;case 1:address = SZ_tab + s*32;break;case 2:address = SZ_tab + g*32;break;}if(i < 3)SelectScreen(0);elseSelectScreen(1);Show1616(line,colum ,address);colum += 16;if(colum > 63)colum = 0;}colum = 32;SelectScreen(0);line=line + 1;address = FH_tab;SetLine(line); //显示“.”SetColum(colum);for(i = 0;i < 2;i ++){WriteData(*(address + 1));}}//SelectScreen(2);//SetOnOff(1); // 开显示//for(i = 0;i < 50;i ++) //延时//LcdDelay(1000);}return 0;}#ifndef _MAIN_H#define _MAIN_H#include <reg52.h>#include<intrins.h>#include<stdio.h>#include<absacc.h>#define LcdDataPort P0 //数据端口#ifndef UCHAR_DEF#define UCHAR_DEF#define SGL 1#define DIFF 0#define uint unsigned inttypedef unsigned char uchar;#endifsbit tuidai = P3^6; //推袋输出sbit supply_1 = P1^6; //粗喂料口sbit supply_2 = P1^7; //细喂料口/**MCP3204定义**/sbit AD_CLK = P1^0;sbit AD_DIN = P1^1;sbit AD_DOUT = P1^2;sbit AD_CS = P1^3;sbit LED = P2^7;/**ampire12864定义**/sbit Reset = P2^0; //复位sbit RS = P2^1; //指令数据选择sbit E = P2^2; //指令数据控制sbit CS1 = P2^4; //左屏幕选择,低电平有效sbit CS2 = P2^5; //右屏幕选择sbit RW = P2^3; //读写控制sbit busy = P0^7; //忙标志sbit CE = P2^6; //总线驱动器使能端sbit BUT = P2^7;uchar p; //临时存储P0口数据uchar key; //键值uchar inisign = 0; //判断是否测皮重信号uchar taodai = 0; //套袋信号uchar setcount = 0; //按键设置计数float xgzl = 40.00; //细给重量uchar tdys = 1; //推袋延时(s)uint tdcount = 0; //推袋延时计数,20为1suchar timeflag = 0;//uchar k = 0; //判断推袋延时或细口给料延时标志uchar xzw = 0; //选择位uchar pzsign = 0; //是否称皮重标志float idata x[9]; //采样数据存放数组float idata y[9];void SetOnOff(uchar onoff); //开关显示void SelectScreen(uchar screen);//选择屏幕void ClearScreen(uchar screen); //清屏void Show1616(uchar lin,uchar colum,uchar *address);//显示一个汉字void CheckState(); //判断状态void LcdDelay(unsigned int time); //延时void WriteData(uchar dat); //写数据void SendCommand(uchar command); //写指令void SetLine(uchar line); //置行地址void SetColum(uchar colum);//置列地址void SetStartLine(uchar startline);//置显示起始行void InitLcd(); //初始化void ResetLcd(); //复位/*********************************************************************/ void int_time0() interrupt 1 using 2{TH0 = 60;TL0 = 176;tdcount ++;if(tdcount == 20*tdys){EX0 = 1; //系统闲,可进行设置EX1 = 1;TR0 = 0;ET0 = 0;tdcount = 0;tuidai = 0;tuidai = 1;timeflag = 0;}/*else if((tdcount == 6) && (!k)){tdcount = 0;supply_2 = !supply_2;} */}void int_time1() interrupt 3 using 3{TH1 = 60;TL1 = 176;tdcount ++;if(tdcount == 20){taodai = 1;TR1 = 0;tdcount = 0;}}int mcp3204(uchar mode,uchar channel) { int i;int c = 0;uchar D1,D0;if(channel & 0x01) D0 = 1;else D0 = 0;if(channel & 0x02) D1 = 1;else D1 = 0;AD_CS = 1;AD_CS = 0;AD_CLK = 0; //起始位AD_DIN = 1;AD_CLK = 1;AD_CLK = 0;AD_DIN = mode; //模式位AD_CLK = 1;AD_CLK = 0;AD_DIN = 0;AD_CLK = 1;AD_CLK = 0;AD_DIN = D1;AD_CLK = 1; //通道选择 AD_CLK = 0;AD_DIN = D0;AD_CLK = 1;AD_DOUT = 1; //释放数据线 AD_CLK = 0;AD_CLK = 1;AD_CLK = 0;AD_CLK = 1; //null位跳过 for(i = 0;i < 12;i++){ c = c<<1;AD_CLK = 0;AD_CLK = 1;if(AD_DOUT == 1) c = c + 1;}return c;}/***********LCD部分**********/void CheckState(){E = 1;RS = 0;RW = 1;LcdDataPort = 0xff;while(!busy);}void LcdDelay(unsigned int time){while(time --);}void WriteData(uchar dat){CheckState();E = 1;RS = 1;RW = 0;LcdDataPort = dat;E = 0;}void SendCommand(uchar command){CheckState();E = 1;RW = 0;RS = 0;LcdDataPort = command;E = 0;}void SelectScreen(uchar screen) //2-全屏,0—左屏,1-右屏{switch(screen){case 0 :LcdDelay(2);CS2 = 1;LcdDelay(2);break;case 1 :CS1 = 1;LcdDelay(2);CS2 = 0;LcdDelay(2);break;case 2 :CS1 = 0;LcdDelay(2);CS2 = 0;LcdDelay(2);break;}}void ClearScreen(uchar screen) // screen 2-全屏,0—左屏,1-右屏{uchar i,j;SelectScreen(screen);for(i = 0;i < 8;i ++){SetLine(i);SetColum(0);for(j = 0;j < 64; j ++)WriteData(0);}}void Clear1616(uchar line,uchar colum,uchar screen) //清除16*16的方阵{uchar i,j;SelectScreen(screen);for(j = 0;j < 2;j ++){SetLine(line + j);SetColum(colum);for(i = 0;i < 16; i ++)WriteData(0);}}void SetLine(uchar line) //line -> 0 : 7{line = line & 0x07;line = line | 0xb8; //1011 1xxxSendCommand(line);}void SetColum(uchar colum) //colum -> 0 :63{colum = colum & 0x3f;colum = colum | 0x40; //01xx xxxxSendCommand(colum);}void SetStartLine(uchar startline) //startline -> 0 : 63 {startline = startline & 0x3f;startline = startline | 0xc0; //11xxxxxxSendCommand(startline);}void SetOnOff(uchar onoff) //1-开显示 0-关{if(onoff == 1)SendCommand(0x3f); //0011 111xelseSendCommand(0x3e);}void ResetLcd(){Reset = 0;LcdDelay(2);Reset = 1;LcdDelay(2);RS0 = 0;LcdDelay(2);RS1 = 0;LcdDelay(2);SetOnOff(1);}void InitLcd(){ResetLcd();SetOnOff(0);ClearScreen(2);SetLine(0);SetColum(0);SetStartLine(0);SetOnOff(1);}void Show1616(uchar lin,uchar colum,uchar *address) {uchar i;SetLine(lin);SetColum(colum);for(i = 0;i < 16;i ++)WriteData(*(address ++));SetLine(lin + 1);SetColum(colum);for(i = 0;i < 16;i ++)WriteData(*(address ++));}/*******I2C部分24c04******//*void delayus(int n){int i;for(i = 0;i < n;i++){_nop_();}}void start_iic(){SCK = 1;delayus(5);SDA = 1;delayus(5);SDA = 0;delayus(5);SCK = 0;}void stop_iic(){SDA = 0;SCK = 1;delayus(5);SDA = 1;delayus(5);SCK = 0;}void ask_iic(){SDA = 0;SCK = 1;delayus(4);SCK = 0;SDA = 1;}void nask_iic(){SDA = 1;SCK = 1;delayus(4);SCK = 0;SDA = 0;}void write_iic(uchar byte) { int i;for(i = 0;i < 8;i++){if(byte & 0x80) SDA = 1;else SDA = 0;SCK = 1;delayus(5);SCK = 0;byte = byte << 1;}SDA=1;while(SDA);SCK=1;delayus(4);if(SDA==0) flag=1;else flag = 0;SCK = 0;}uchar read_iic(){int i;uchar byte = 0x00;SDA = 1;for(i = 0;i < 8;i ++){delayus(4);SCK = 1;byte = byte << 1;if(SDA == 1) byte += 1;SCK = 0;}ask_iic();nask_iic();stop_iic();return byte;}void writebyte_iic(uchar address,uchar byte) { int w = 1;while(w){start_iic();write_iic(0xA0);if(flag == 0) break;write_iic(address);if(flag == 0) break;write_iic(byte);if(flag == 0) break;w = 0;}stop_iic();}uchar readbyte_iic(uchar address){int r = 1;uchar byte = 0x00;while(r){start_iic();write_iic(0xA0);if(flag == 0) break;write_iic(address);if(flag == 0) break;start_iic();write_iic(0xA1);if(flag == 0) break;byte = read_iic();r = 0;}stop_iic();return byte;}void write2byte_iic(uchar address,uchar bytea,uchar byteb) //重量信号是12位,因此用两字节{int w = 1;while(w){start_iic();write_iic(0xA0);if(flag == 0) break;write_iic(address);if(flag == 0) break;write_iic(bytea);if(flag == 0) break;write_iic(byteb);w = 0;}stop_iic();} */void int_button() interrupt 0 using 1{EX0 = 0;p = LcdDataPort; //临时存储P0口数据LcdDataPort = 0xff;CE = 0;key = LcdDataPort;CE=1;if(key == 0x1e) //SET BUTTON{setcount ++;if(setcount == 3) setcount = 0;if(setcount != 1) xzw = 0; //只在设置1时有选择位操作,所以到设置2时清零,避免误操作}if(key == 0x1d) //选择位{if(setcount == 1){xzw ++;if(xzw == 4) xzw = 0;}} //BUTTON2if(key == 0x1b){if(setcount == 1){if(xzw == 1) xgzl += 1;if(xzw == 2) xgzl += 0.1;if(xzw == 3) xgzl += 0.01;if(xgzl >= 46) xgzl = 40;}else if(setcount == 2){tdys ++;if(tdys == 4) tdys = 1;}} //BUTTON3if(key == 0x17){if(setcount == 1){if(xzw == 1) xgzl -= 1;if(xzw == 2) xgzl -= 0.1;if(xzw == 3) xgzl -= 0.01;if(xgzl <= 39) xgzl = 45;}else if(setcount == 2){tdys --;if(tdys == 0) tdys = 3;}}key = 0x00;LcdDataPort = p;EX0 = 1;}void int_td() interrupt 2 using 1{EX0 = 0; //系统忙,不能进行设置EX1 = 0;ET0 = 1;ET1 = 1;timeflag = 0;TR1 = 1;pzsign = 0;}/****************main.c*****************/const uchar code SZ_tab[] = {0x00,0x00,0x00,0x00,0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x00,0x00, //0 0x00,0x00,0x00,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x08,0x88,0x48,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x20,0x10,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3f,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x08,0x88,0x00,0x00,0x00,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x11,0x20,0x20,0x11,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x08,0x08,0xc8,0x38,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x22,0x21,0x21,0x22,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x10,0x08,0x08,0x10,0xe0,0x00,0x00,0x00,0x00,0x00, //9 0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0f,0x00,0x00,0x00,0x00,0x00};const uchar code HZ_tab[] = {0x20,0x30,0xac,0x63,0x20,0x18,0x00,0xfc,0x04,0x04,0xfc,0x04,0x04,0xfc,0x00,0x00, //细 0x22,0x67,0x22,0x12,0x12,0x12,0x00,0xff,0x41,0x41,0x7f,0x41,0x41,0xff,0x00,0x00,0x20,0x30,0xac,0x63,0x10,0x20,0x50,0x48,0x44,0x43,0x44,0x48,0x50,0x20,0x20,0x00, //给 0x22,0x67,0x22,0x12,0x12,0x00,0xfe,0x42,0x42,0x42,0x42,0x42,0xfe,0x00,0x00,0x00,0x00,0x08,0x08,0x0a,0xea,0xaa,0xaa,0xaa,0xff,0xa9,0xa9,0xa9,0xe9,0x08,0x08,0x08, //重 0x00,0x40,0x40,0x48,0x4b,0x4a,0x4a,0x4a,0x7f,0x4a,0x4a,0x4a,0x4b,0x48,0x40,0x40,0x00,0x40,0x40,0x40,0xdf,0x55,0x55,0x55,0xd5,0x55,0x55,0x55,0xdf,0x40,0x40,0x40, //量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
public event DataReceived dataReceived;
public StringBuilder recdata; void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) {
public void Send(CmdType Cmd, params int[] wtdate) {
if (serialPort1.IsOpen) try { serialPort1.WriteLine(ToComString(Cmd, wtdate)); } catch { }
}
//public delegate void DataReceived(byte[] Data); //委托
for (int j = 0; j < 8; j++) {
if (s.Substrபைடு நூலகம்ng(j * 7 + 1, 1) == "+") flag = 1; else flag = -1;
readvalue[j] = flag * Convert.ToDouble(s.Substring(j * 7 + 2, 6)) / 100;
public void Close() {
_Status = false; try {
if (serialPort1.IsOpen) {
serialPort1.Close(); } } catch (Exception exp) { throw new Exception(exp.Message); } }
case CmdType.设置小数位数: return "D.P "+wtdate[0].ToString() + Environment.NewLine;//
default: return "";
} }
#region IDisposable 成员
public void Dispose() {
Close();
}
SerialPort serialPort1; public bool _Status;
public void Open() {
_Status = true; try {
if (!serialPort1.IsOpen) serialPort1.Open(); recdata.Remove(0, recdata.Length); } catch (Exception exp) { throw new Exception(exp.Message); } }
public void Open() {
try {
Status = true; if (!serialPort1.IsOpen) {
recdata.Remove(0, recdata.Length); serialPort1.Open(); } } catch (Exception exp) { throw new Exception(exp.Message); }
public enum CmdType {
初始化, 读取称值, 称值清零, 设置小数位数 }
读值
/// <summary> /// 生成指令字符串,适用于 ADAM 单路路仪表 /// </summary> public static string ToComString(CmdType cmd,params int[] wtdate) {
serialPort1.Encoding = Encoding.Default;
serialPort1.DataReceived
+=
new
SerialDataReceivedEventHandler(serialPort1_DataReceived);
recdata = new StringBuilder();
void analyseBuf(byte[] buf) {
string buff = Encoding.Default.GetString(buf); for (int i = 0; i < buff.Length; i++) {
if (buff[i]=='>') {
if (recdata.Length > 0) recdata.Remove(0, recdata.Length); recdata.Append(buff[i]); } else if(buff[i]=='\r') { recdata.Append(buff[i]); int flag = 1; double[] readvalue = new double[8]; string s = recdata.ToString(); if (s.Length == 58) {
readvalue = flag * Convert.ToDouble(s.Substring(7, 7).Trim());
dataReceived(true, readvalue); } else
{ dataReceived(false, readvalue);
} recdata.Remove(0, recdata.Length); } } } } }
} dataReceived(true, readvalue); } else { dataReceived(false, readvalue); } recdata.Remove(0, recdata.Length); } else { recdata.Append(buff[i]); }
} }
/// <summary> /// 生成指令字符串,适用于 ADAM 多路仪表 /// </summary> private string ToComString() {
return "#01\r"; }
#region IDisposable 成员
public void Dispose() {
Close(); serialPort1.Dispose(); }
public void Send() {
if (serialPort1.IsOpen) {
serialPort1.Write(ToComString()); } }
public delegate void DataReceived(bool enableData, double[] Data); //委 托
serialPort1.BaudRate = 9600;
serialPort1.StopBits = StopBits.One;
serialPort1.Parity = Parity.None;
serialPort1.DataBits = 8;
serialPort1.Encoding = Encoding.Default;
}
public void Close() {
try {
Status = false; if (serialPort1.IsOpen) {
serialPort1.Close(); } } catch (Exception exp) { throw new Exception(exp.Message); } }
if (dataReceived != null) {
try {
int i = serialPort1.BytesToRead; byte[] buf = new byte[i]; serialPort1.Read(buf, 0, i);
analyseBuf(buf); } catch { } } } }
switch (cmd) {
case CmdType.初始化: return "PROG" + Environment.NewLine;//初始化
case CmdType.读取称值: return "READ" + Environment.NewLine;//读值
case CmdType.称值清零: return "ZERO ON" + Environment.NewLine;//读值
serialPort1.PortName = "COM" + ComPort;
serialPort1.BaudRate = BaudRate;
serialPort1.StopBits = StopBits.One;
serialPort1.Parity = Parity.Even;
serialPort1.DataBits = 7;
if (_Status) {
if (dataReceived != null) {
try {
int i = serialPort1.BytesToRead; byte[] buf = new byte[i]; serialPort1.Read(buf, 0, i); analyseBuf(buf); } catch { } } } }
serialPort1.DataReceived
+=
new
SerialDataReceivedEventHandler(serialPort1_DataReceived);
recdata = new StringBuilder();
}
SerialPort serialPort1; public bool Status;
serialPort1.Dispose(); }