基于rs485的单片机通信系统大学本科毕业论文.doc
专业 课程设计任务书20132014 学年 第 2 学期第 16 周 19 周 题目基于RS-485的单片机通信系统设计内容及要求1.利用RS485实现单片机的双向通讯;2.通过键盘实现从机的选择、发送数据的输入;3.主机显示发送的数据及从机编号。4提高要求:通过键盘实现循环工作模式、指定从机这2种工作方式的切换。进度安排 16周:查找资料,进行系统硬件设计、软件方案设计; 17周:硬件制作、软件的分模块调试; 19周:系统联调; 19周:设计结果验收,报告初稿的撰写。学生姓名:11042104万娇 11042109赵佳慧指导时间:周一、周三、周五指导地点:E楼 610 室任务下达2014年 6 月 3 日任务完成2014年 6月 27 日考核方式1.评阅 2.答辩 3.实际操作 4.其它指导教师张小林系(部)主任注:1、此表一组一表二份,课程设计小组组长一份;任课教师授课时自带一份备查。2、课程设计结束后与“课程设计小结”、“学生成绩单”一并交院教务存档。摘要串口通信是一种广泛应用于各个领域的通信方式,在远距离数据传输和控制系统中,可以根据RS-485协议实现远距离传输。此次课设即利用MAX485芯片实现半双工串行通信的双向通信系统。系统主要由主机控制模块、通信模块、数据输入模块、数据显示模块和模数转换模块五个部分组成,实现了 利用RS-485实现单片机的双向通信,通过键盘实现从机的选择、发送数据,主机显示发送的数据及从机编号,通过键盘实现循环工作模式、指定从机这两种工作方式的切换。此系统具有使用方便、操作简单、便于实现、成本低、可靠性高、可拓展性强、易于维护等特点,具有较广泛的应用前景。关键字:单片机;RS-485总线;串行通信;数模转换目录前言1第一章 设计内容及要求21.1设计内容21.2设计要求2第二章 系统组成及工作原理32.1系统组成32.2 工作原理3第三章 硬件电路方案设计43.1 主机控制模块43.2 数据显示模块53.3 模数转换模块63.4 键盘输入模块73.5 通信模块83.5.1 RS485通信协议83.5.2 RS485通信格式93.6从机控制模块103.6.1 单片机最小系统103.6.2 显示模块11第四章 软件设计124.1 通信协议124.1.1 串行通信协议的比较RS232 RS422 RS485124.1.2 通信过程144.2 主机程序144.2.1 主程序流程图144.2.2 矩阵键盘输入子程序154.2.3 数码管显示子程序164.2.4 传输模块子程序174.3 从机程序174.3.1从机总流程图174.3.2 接收并显示子程序18第五章 实验调试和测试结果与分析19第六章 结论20第七章 参考文献21附录一 电路图22附录二 程序代码23前言单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统。而在以单片机为基础的数据采集和实时控制中,通过计算机中的RS-232接口进行计算机与单片机之间的命令和数据传送,就可以对现场进行监测和控制。由于计算机上的RS-232所传送的距离不超过30m,所以在远距离数据传送和控制时,可以利用MAX485的接口芯片将RS232协议转换成RS-485协议进行远距离传送。RS-485是双向、半双工通信协议,允许多个驱动器和接收器挂接在总线上,其中每个驱动器都能够脱离总线。接收器输入灵敏度为200mV,这就意味着若要识别符号或者间隔状态,接收端电压必须高于+200mV或者低于-200mV。最小接收器输入阻抗为12K,驱动器输出电压为1.5V(最小值)、5V(最大值)。0第一章 设计内容及要求1.1设计内容设计一个基于RS-485的单片机通信系统。1.2设计要求1.通过键盘输入数据和显示要传输的数据;2通过串口利用RS-485总线,将数据发给单片机主机,并显示。 单片机1 RS-485 RS-485 单片机2 图1.1 系统设计方案图 第二章 系统组成及工作原理2.1系统组成系统主要由主机控制模块、通信模块、数据输入模块、数据显示模块和数模转换模块五个部分组成。其系统框图如下: 通信从机 通信主机 数据显示 数据显示通信模块数据输入数模转换键盘图2.1 系统框图在本系统中,通信主机是核心部分,主要完成对数据的处理、操作和运算;数据输入模块主要完成数据的输入,所有人机交换的数据都从该模块中输入;数据显示模块完成了通信双方的数据显示;通信模块即完成数据的接受和发送,实现数据远距离传输。2.2 工作原理基于RS-485的单片机通信系统设计的原理是:利用数模转换模块或者键盘输入模块通过P3口或者P1口将数据输入到C51单片机主机里,C51单片机主机通过程序来控制共阴数码管显示数据并利用MAX485芯片将数据传输到C51单片机从机中,C51单片机从机再通过程序控制另一个共阴数码管显示传输过来的数据。第三章 硬件电路方案设计3.1 主机控制模块图3.1 主机控制模块89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROMFalsh Programmable and Erasable Read Only Memory)的低电压、高性能CMOS8位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器。 a.数据存储器片内为128个字节,片外最多可外扩至64k字节,用来存储程序在运行期间的工作变量、运算的中间结果、数据暂存和缓冲、标志位等,所以称为数据存储器。b.程序存储器由于受集成度限制,片内只读存储器一般容量较小,如果片内的只读存储器的容量不够,则需用扩展片外的只读存储器,片外最多可外扩至64k字节。c.中断系统具有5个中断源,2级中断优先权。d.定时器/计数器片内有2个16位的定时器/计数器, 具有四种工作方式。e. 串行口1个全双工的串行口,具有四种工作方式。可用来进行串行通讯,扩展并行I/O口,甚至与多个单片机相连构成多机系统,从而使单片机的功能更强且应用更广。P1口、P2口、P3口、P4口为4个并行8位I/O口。f.特殊功能寄存器共有21个,用于对片内的个功能的部件进行管理、控制、监视。实际上是一些控制寄存器和状态寄存器,是一个具有特殊功能的RAM区。g.微处理器该单片机中有一个8位的微处理器,与通用的微处理器基本相同,同样包括了运算器和控制器两大部分,只是增加了面向控制的处理功能,不仅可处理数据,还可以进行位变量的处理。由于集成度的限制,最小应用系统只能用作一些小型的控制单元。其应用特点:(1) 有可供用户使用的大量I/O口线。(2) 内部存储器容量有限。(3) 应用系统开发具有特殊性。3.2 数据显示模块本次课设采用八段共阴极数码管显示,利用51单片机程序来控制数码管的显示。图3.2 数据显示模块3.3 模数转换模块本次课设利用ADC0832来实现数模转换。图3.3 模数转换模块ADC0832 是美国国家半导体公司是生产的一种 8 位分辨率、双通道 A/D 转换芯片。其分辨率可达256级,芯片转换时间仅为32S,转换速度快且稳定性强,其芯片如下图所示:图3.4 ADC0832芯片其中各管脚功能为:片选使能,低电平芯片使能。CH0 模拟输入通道0,或作为IN+/-使用。 CH1 模拟输入通道1,或作为IN+/-使用。GND 芯片参考0 电位(地)。DI 数据信号输入,选择通道控制。DO 数据信号输出,转换数据输出。 CLK 芯片时钟输入。Vcc/REF 电源输入及参考电压输入(复用)。3.4 键盘输入模块图3.5 键盘输入模块本次课设采用矩阵式键盘,其突出优点是I/O端口利用率高,可循环操作,而且扫描键盘时占用CPU时间少,操作灵活,矩阵键盘控制状态多,编写程序较方便,故此模块采用矩阵式键盘。3.5 通信模块图3.6 通信模块MAX485接口芯片是Maxim公司的一种RS-485芯片。MAX485是用于RS-485与RS-422通信的低功耗收发器,器件中都具有一个驱动器和一个接收器。其驱动器摆率不受限制,可以实现最高2.5Mbps的传输速率。采用单一电源+5 V工作,额定电流为300 A,采用半双工通讯方式。它完成将TTL电平转换为RS485电平的功能。MAX485芯片的结构和引脚都非常简单,内部含有一个驱动器和接收器。RO和DI端分别为接收器的输出和驱动器的输入端,与单片机连接时只需分别与单片机的RXD和TXD相连即可;和DE端分别为接收和发送的使能端,当为逻辑0时,器件处于接收状态;当DE为逻辑1时,器件处于发送状态,因为MAX485工作在半双工状态,所以只需用单片机的一个管脚控制这两个引脚即可;A端和B端分别为接收和发送的差分信号端,当A引脚的电平高于B时,代表发送的数据为1;当A的电平低于B端时,代表发送的数据为0。在与单片机连接时接线非常简单。只需要一个信号控制MAX485的接收和发送即可。同时将A和B端之间加匹配电阻,一般可选100的电阻。两个RS485的1脚和4脚接在对应的单片机上以实现功能。3.5.1 RS485通信协议由于RS485通讯是一种半双工通讯,发送和接收共用同一物理信道。在任意时刻只允许一台单机处于发送状态。因此要求应答的单机必须在侦听到总线上呼叫信号已经发送完毕,并且没有其它单机发出应答信号的情况下,才能应答。半双工通讯对主机和从机的发送和接收时序有严格的要求。如果在时序上配合不好,就会发生总线冲突,使整个系统的通讯瘫痪,无法正常工作。要做到总线上的设备在时序上的严格配合,必须要遵从以下几项原则;1) 复位时,主从机都应该处于接收状态。SN75176芯片的发送和接收功能转换是由芯片的 RET,DE端控制的。RET=1,DE=1时,SN75176发送状态;RET=0,DE=0时,SN75176处于接收状态。一般使用单片机的一根口线连接RET,DE端。在上电复位时,由于硬件电路稳定需要一定的时间,并且单片机各端口复位后处于高电平状态,这样就会使总线上各个分机处于发送状态,加上上电时各电路的不稳定,可能向总线发送信息。因此,如果用一根口线作发送和接收控制信号,应该将口线反向后接入SN75176的控制端,使上电时SN75176处于接收状态。另外,在主从机软件上也应附加若干处理措施,如:上电时或正式通讯之前,对串行口做几次空操作,清除端口的非法数据和命令。2) 控制端RET,DE的信号的有效脉宽应该大于发送或接收一帧信号的宽度。在RS232,RS422等全双工通讯过程中,发送和接收信号分别在不同的物理链路上传输,发送端始终为发送端,接收端始终为接收端,不存在发送、接收控制信号切换问题。在RS485半双工通讯中,由于SN75176的发送和接收都由同一器件完成,并且发送和接收使用同一物理链路,必须对控制信号进行切换。控制信号何时为高电平,何时为低电平,一般以单片机的TI,RI信号作参考。发送时,检测TI是否建立起来,当TI为高电平后关闭发送功能转为接收功能;接收时,检测RI是否建立起来,当RI为高电平后,接收完毕,又可以转为发送。3.5.2 RS485通信格式RSS485协议的信息格式如下:(1) 编码格式;二进制代码。(2) 波特率:9600 bs。(3) 通信方式:半双工。(4) 每个字符由u 位组成;1位:起始位(0);8位:数据位;l位:停止位(1)。(5)主机询问的一般格式如下:从机地址码命令码 数据个数数据 校验和 表3.1 主机询问的一般格式(6)从机应答的一般格式如下:返回地址码命令码 数据个数数据校验和 表3.2 从机应答的一般格式按照要求,只需要实现双机通信即可,并无要求主从机特定地位,但是原理是相同的。3.6从机控制模块3.6.1 单片机最小系统图3.7 单片机最小系统单片机最小系统主要包括电源、复位电路和时钟电路等。 单片机复位电路原理是在单片机的复位引脚RST上外接电阻和电容,实现上电复位。当复位电平持续两个机器周期以上时复位有效。复位电平的持续时间必须大于单片机的两个机器周期。具体数值可以由RC电路计算出时间常数。 复位电路由按键复位和上电复位两部分组成。 (1)上电复位:STC89系列单片及为高电平复位,通常在复位引脚RST上连接一个电容到VCC,再连接一个电阻到GND,由此形成一个RC充放电回路保证单片机在上电时RST脚上有足够时间的高电平进行复位,随后回归到低电平进入正常工作状态,这个电阻和电容的典型值为10K和10uF。 (2)按键复位:按键复位就是在复位电容上并联一个开关,当开关按下时电容被放电、RST也被拉到高电平,而且由于电容的充电,会保持一段时间的高电平来使单片机复位。单片机时钟电路是由方向放大器构成。XTAL1为时钟电路的输入端,XTAL2为时钟电路的输出端。3.6.2 显示模块从机的显示模块与主机原理一致,这里就不再次叙述。 第四章 软件设计4.1 通信协议 4.1.1串行通信协议的比较RS232 RS422 RS485RS-232、RS-422与RS-485标准只对接口的电气特性做出规定,而不涉及接插件、电缆或协议,在此基础上用户可以建立自己的高层通信协议。例如:视频服务器都带有多个RS422串行通讯接口,每个接口均可通过RS422通讯线由外部计算机控制实现记录与播放。 视频服务器除提供各种控制硬件接口外,还提供协议接口,如RS422接口除支持RS422的Profile协议外,还支持 Louth、Odetics 、BVW等通过RS422控制的协议。 RS-232、RS-422与RS-485都是串行数据接口标准,都是由电子工业协会(EIA)制订并发布的,RS-232在1962年发布。RS-422由RS-232发展而来,为改进RS-232通信距离短、速率低的缺点,RS-422定义了一种平衡通信接口,将传输速率提高到10Mbps,传输距离延长到4000英尺(速率低于100Kbps时),并允许在一条平衡总线上连接最多10个接收器。RS-422是一种单机发送、多机接收的单向、平衡传输规范,被命名为TIA/EIA-422-A标准。为扩展应用范围,EIA又于1983年在RS-422基础上制定了RS-485标准,增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命名为TIA/EIA-485-A标准。 1. RS-232串行接口标准 目前RS-232是PC机与通信工业中应用最广泛的一种串行接口。RS-232被定义为一种在低速率串行通讯中增加通讯距离的单端标准。RS-232采取不平衡传输方式,即所谓单端通讯。收、发端的数据信号是相对于信号地。典型的RS-232信号在正负电平之间摆动,在发送数据时,发送端驱动器输出正电平在+5+15V,负电平在-5-15V电平。当无数据传输时,线上为TTL,从开始传送数据到结束,线上电平从TTL电平到RS-232电平再返回TTL电平。接收器典型的工作电平在+3+12V与-3-12V。由于发送电平与接收电平的差仅为2V至3V左右,所以其共模抑制能力差,再加上双绞线上的分布电容,其传送距离最大为约15米,最高速率为20Kbps。RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为3k7k。所以RS-232适合本地设备之间的通信。 2. RS-422与RS-485串行接口标准 (1) 平衡传输 RS-422、RS-485与RS-232不一样,数据信号采用差分传输方式,也称作平衡传输,它使用一对双绞线,将其中一线定义为A,另一线定义为B。通常情况下,发送驱动器A、B之间的正电平在+2+6V,是一个逻辑状态,负电平在-2V6V,是另一个逻辑状态。另有一个信号地C,在RS-485中还有一“使能”端,而在RS-422中这是可用可不用的。“使能”端是用于控制发送驱动器与传输线的切断与连接。当“使能”端起作用时,发送驱动器处于高阻状态,称作“第三态”,即它是有别于逻辑“1”与“0”的第三态。 (2) RS-422电气规定 由于接收器采用高输入阻抗和发送驱动器比RS232更强的驱动能力,故允许在相同传输线上连接多个接收节点,最多可接10个节点。即一个主设备(Master),其余为从设备(Salve),从设备之间不能通信,所以RS-422支持点对多的双向通信。RS-422四线接口由于采用单独的发送和接收通道,因此不必控制数据方向,各装置之间任何必须的信号交换均可以按软件方式(XON/XOFF握手)或硬件方式(一对单独的双绞线)实现。RS-422的最大传输距离为4000英尺(约1219米),最大传输速率为10Mbps。其平衡双绞线的长度与传输速率成反比,在100Kbps速率以下,才可能达到最大传输距离。只有在很短的距离下才能获得最高速率传输。一般100米长的双绞线上所能获得的最大传输速率仅为1Mbps。RS-422需要一终接电阻,要求其阻值约等于传输电缆的特性阻抗。在矩距离传输时可不需终接电阻,即一般在300米以下不需终接电阻。终接电阻接在传输电缆的最远端。(3) RS-485电气规定由于RS-485是从RS-422基础上发展而来的,所以RS-485许多电气规定与RS-422相仿。如都采用平衡传输方式、都需要在传输线上接终接电阻等。RS-485可以采用二线与四线方式,二线制可实现真正的多点双向通信。RS-485总线,在要求通信距离为几十米到上千米时,广泛采用RS-485 串行总线标准。RS-485采用平衡发送和差分接收,因此具有抑制共模干扰的能力。加上总线收发器具有高灵敏度,能检测低至200mV的电压,故传输信号能在千米以外得到恢复。 RS-485采用半双工工作方式,任何时候只能有一点处于发送状态,因此,发送电路须由使能信号加以控制。RS-485用于多点互连时非常方便,可以省掉许多信号线。应用RS-485 可以联网构成分布式系统,其允许最多并联32台驱动器和32台接收器。 RS-485与RS-422的不同还在于其共模输出电压是不同的,RS-485是-7V至+12V之间,而RS-422在-7V至+7V之间;RS-485满足所有RS-422的规范,所以RS-485的驱动器可以用在RS-422网络中应用。RS-485与RS-422一样,其最大传输距离约为1219米,最大传输速率为10Mbps。平衡双绞线的长度与传输速率成反比,在100Kbps速率以下,才可能使用规定最长的电缆长度。只有在很短的距离下才能获得最高速率传输。一般100米长双绞线最大传输速率仅为1Mbps。4.1.2 通信过程一次完整的通信过程分为3个阶段:发送机处理输入数据、通信和接收机显示输入数据。第一阶段,发送机判断输入的键值,将其打包处理;通信阶段,把打包处理好的数值发送给寄存器,再从寄存器发送给接收机;接收机显示阶段,把打包好的数据处理后还原原来的数据,通过查表以数码管的形式显示;此时接收机清除接收缓冲区及相关变量,准备与主机下次通信。任何一次完整的通信过程都是由发送机方发起的,两个单片机在无键值输入的情况下都处在接收状态。4.2 主机程序4.2.1 主程序总流程图多级双向通信的软件设计主要分为:系统初始化、确定主从及关系、双方进行握手、主机发送数据和从机接收数据等六大部分;每个功能米快快对于通信双方都是必不可缺的,只有这样主机才能很好的对外部的信息进行采集、分析和解决。系统初始化:系统初始化包括串口初始化和显示模块初始化。主要实现串口中断的开启、总中断的开启、定时器的选择及其工作方式的选择、串口工作方式的选择和显示模块初始化等功能。有键按下:通信双方进行通信时需确定双方的主从关系,然后通过键盘按下,显示所传输的数据。键值处理:在该部分中,通信逐句会发送握手信号给从机,主机发送的数据通过处理再传送给从机。送显数据:所发送的数据通过处理之后再发送给从机并显示。 开始从机接收数据:此部分功能较简单,只需完成从机不断接受主机发送的数据即可。 初始化有键按下 N Y 键值处理 主机显示数据 发送数据给从机机 从机显示数据图4.1 主程序流程图4.2.2 矩阵键盘输入子程序初始化后程序不断检测矩阵键盘状况,一旦检测到有键按下,消抖后即时开始处理输入的数据。先以行为单位确定按下的键在哪一行,然后再提取该行的数据,以相与的方式确定是该行的第几个键按下了,由此确定按下的到底是哪个键。确定了之后,用比较方便传输的16进制的数值来代替。开始有键按下 N 扫描行,确定按下键的行数 Y 扫描列,确定按键值转换成数值按键释放 N 数据显示并传输 Y 返回图4.2 矩阵键盘程序流程图4.2.3 数码管显示子程序 接收数据 开始查表,得到对应的码 将对应的码发给P2 P2接共阴数码管 数码管显示数据 返回图4.3 数码管显示子程序流程图4.2.4 传输模块子程序 所接收的数据经过处理之后发送给从机。 开始关闭串口中断 设置状态为发送 将要传输的数据给SBUF 传输后T1=0打开串口中断 返回 图4.4 传输模块子程序流程图4.3 从机程序4.3.1从机总流程图 开始 初始化数据传输 过来 N Y 键值处理 从机显示数据图4.5从机主流程图 4.3.2 接收并显示子程序 从机接收到主机传来的信息,经过处理之后在从机的数码管上显示。显示部分与主机显示部分相似。 开始中断标志位RI=0? N 打开接受 Y读缓存区的值 调用显示子程序 返回 图4.6 接收部分流程图第五章 实验调试和测试结果与分析先利用Proteus进行仿真,看能否满足要求,若满足要求后,再将写好的主机程序和从机程序分别烧录进两个单片机里,两个单片机的P3.0、P3.1控制RS485使能端,再接上数据输入输出两根导线,打开电源之后,两个单片机的数码管显示模块都处于显示的状态;将采集电压开关闭合,按下其中任意一个键时,在释放的瞬间两个单片机的数码管显示模块都全部显示了矩阵键盘输入的键值,而改变滑动电阻器的阻值时,数码管显示模块的数值并不发生变化;当采集电压开关关闭时,改变滑动电阻器的阻值,两个单片机的数码管显示模块都全部显示了滑动变阻器输入的阻值所对应的数值,但是按下任意矩阵键盘的键值,数码管的显示模块的数值不改变,证明串行通信成功。通过几次按键输入和模拟输入,确认单片机可以以半双工的方式串行通信。第六章 结论本次课设的内容是是RS485总线双机通信系统设计,本设计在单片机网络的通信的基础上,实现单片机双机通信。用RS485接口来实现单片机与单片机之间的通信。采用主从式,即在数个单片机中,有一个是主机,其余的是从机,从机要服从主机的调度、支配。利用80C51单片机的串行口方式来实现这种主从式的通信结构。同时利用了Keil和Proteus软件来实现单片机的C语言编程,然后在proteus仿真软件中设计电路。本次课设整个过程包括通过理论设计,仿真软件仿真,确定具体方案,安装实际电路,调试电路、测试结果等多个方面的内容。这就要求我们充分利用所学的知识进行思考、借鉴。可以说,本次课设是针对前面所学的知识进行的一次比较综合的检验。本次课设用时3个星期,成功的完成了任务。总结我这次课设之所以能成功的原因主要就是做好了充分准备,即熟练地掌握课本上的理论知识、做好仿真并打印出来和充分了解自己将要用到的芯片。这样才能对试验中出现的问题进行分析和解决。虽然最后还是出现了正确的结果,但我这次的设计还是存在很大的不足。一是程序略有繁琐;二是其实没有很好的显示出RS485的特别的功能。忽略这些不足,本次设计基本达到了实验要求。第七章 参考文献1 谭浩强. C程序设计.北京:清华大学出版社,2009.2 张先庭.单片机原理、接口与C51应用程序设计.北京:国防工业出版社,2011.3 张毅刚.单片机原理及应用M.高等教育出版社,2008.4 郭天祥.51单片机C语言教程.电子工业出版社,2011.5 张涵芳,徐爱卿.单片微型计算机及其应用M.北京:北京航空航天大学出版社,1991.附录一 电路图附录二 程序代码主机程序/*函数功能:AD转换子程序入口参数:CH出口参数:dat*/#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;sbit anjia=P32;sbit CS=P34;sbit Clk=P35;sbit DATI=P33;uchar a,key,num;uchar dat=0x00;uchar CH;uchar matrixkeyscan();void put(uchar);void display(uchar);void delayms(uint z)uint i,j;for(i=z;i>0;i-)for(j=110;j>0;j-);unsigned char adc0832(unsigned char CH) unsigned char i,test,adval; adval=0x00; test=0x00; Clk=0;/初始化 DATI=1; _nop_(); CS=0; _nop_(); Clk=1; _nop_(); if(CH=0x00)/通道选择 Clk=0; DATI=1; /通道的第一位 _nop_(); Clk=1; _nop_(); Clk=0; DATI=0;/通道的第二位 _nop_(); Clk=1; else Clk=0; DATI=1;/通道的第一位 _nop_(); Clk=1; _nop_(); Clk=0; DATI=1;/通道的第二位 _nop_(); Clk=1; Clk=0; DATI=1; for(i=0;i<8;i+)/读取前位的值 adval<<=1; Clk=1; _nop_(); Clk=0; if(DATI) adval|=0x01; else adval|=0x00; for(i=0;i<8;i+)/读取后位的值 test>>=1; if(DATI) test|=0x80;else test|=0x00; _nop_();Clk=1;_nop_();Clk=0; if(adval=test)/比较前位与后位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉? dat=test; _nop_(); CS=1;/释放ADC0832 DATI=1; Clk=1; return dat;void put(uchar c)SBUF=c;while(!TI);TI=0;void init()TMOD=0X20;TH1=0XFD;TL1=0XFD;TR1=1;SCON=0X50;EA=1;ES=1;/EX0=1;/IT0=0;void ser() interrupt 4if(RI=1)RI=0;a=SBUF;/*void display(uchar num)P2=tablenum; /显示函数只送段选数据/*uchar matrixkeyscan()uchar temp;P1=0xfe;temp=P1;temp=temp&0xf0;if(temp!=0xf0) delayms(10);temp=P1;temp=temp&0xf0;if(temp!=0xf0) temp=P1; switch(temp) case 0xee:key=0;break;case 0xde:key=1;break;case 0xbe:key=2;break;case 0x7e:key=15;break; while(temp!=0xf0) /等待按键释放 temp=P1; temp=temp&0xf0; /display(key);