课程设计(论文)基于DS18B20的温湿度巡检仪电路设计.doc
课设报告课程名称: 课 程 设 计 课设项目:基于DS18B20的温湿度巡检仪电路设计 专业班级: 测控技术与仪器0804 姓 名: 学 号: 课设室号: 信息-525 课设组号: 07 课设时间: 批阅时间: 指导教师: 成 绩: 目 录题目要求 02第一节 引 言 031.1 系统原理及基本框图 02 1.2 设计任务 031.3 设计目的 03第二节 硬件设计介绍 032.1 单片机简介及STC89C52RC主要性能 042.2 DS18B20 072.3 三极管9012 102.4 共阴极数码管 112.5 晶振 11第三节 软件设计介绍 123.1 程序流程图 123.2 调试 123.3 实物图 133.4小结 14第四节 个人心得体会 14参考文献 15 附1:元件清单 16附2:电路设计图 16附3:源程序 17题目主要研究内容及预期达到的目标:下载DS18B20的芯片资料 由DS18B20构成的多点温度测量系统基于AT89C51和DS18B20的最简温度测量系统的设计基于89C51+DS18B20的智能温控器的研制设计并画出系统电路图。撰写设计报告,包括总体框图及总体工作原理说明,各部分电路图及工作原理和元件及参数选择说明,总体程序流程图。第一节 引言现代生产生活中,温湿度的巡回检测与计算机的结合越来越普遍,特别是在冶金,化工,机械,医疗各类行业中广泛使用。及时采集其信息,及时发现潜在故障,并采取相应的处理措施,对确保其良好运行状态具有重要意义。单片机有着体积小,功耗低,功能强,性能价格比高等显著优点,将其用于温度巡回监测系统可大大提高控制质量和自动化水平,具有良好的经济效益和推广价值。利用单片机对温度进行测控的技术日益得到广泛应用。如何将温度通过传感器变成电信号, 再经过处理转换成计算机能够识别的数字量, 输入到计算机中, 由计算机将采集到的数字量进行不同的处理, 然后在显示器显示出来,并进行实时监控。这已经为当前计算机测量与控制领域的一个重要研究方向。鉴于此, 本文提出一种基于DS18B20和STC12C5608AD的低成本、远距离传输的温度检测系统设计方案。在目前的各种温湿度采集系统中, 多点温湿度采集是其中一个重要的方面。美国Dallas 公司推出的数字温度传感器DSl8B20接口简单, 方便与微控制器连接,对微控制器的口线占用少。我国宏晶科技公司的单片机STC12C5608AD是MCS-51系列单片机的派生产品, 在指令系统、硬件结构和片内资源上与标准8052单片机完全兼容。两者结合起来非常适合构建高精度多点温度采集系统。系统通过RS- 232总线与上位机进行通信, 完成数据传输1.1系统原理及基本框图如图1.1所示,实际干球温度和湿球温度经过DS18B20传感器转换后,然后送到单片机中进行数据处理。处理后的数据送到电子屏中显示。图1.1 系统硬件总体结构根据单片机应用系统的设计原则, 首先设计了系统硬件的总体结构如图1.1所示, 然后按模块分别对各单元电路进行电路设计, 而后进行硬件电路集成。单片机为系统的控制核心部分。 温度传感器信号由信号处理及放大电路进行处理之后送入A/D转换器, 再由单片机控制A/D转换器进行温度数据的采集, 而后对温度原始数据进行处理, 根据处理结果驱动声光报警电路和执行显示。电源采用直流电供电, 给整个系统提供电源电压。看门狗采用硬件看门狗电路, 防止程序在运行过程中“跑飞”, 保证系统运行的稳定、可靠。基于简单,稳定可靠,价格低廉的原理本文采用了STC12C5608AD单片机及DS18B20传感器。1.2 设计任务利用单片机与AD转换器设计一个八路温湿度巡回检测系统。1.3 设计目的通过文献调研、电路设计、计算机仿真及焊接、调试综合训练,提高学生在单片机及传感器应用方面的实践技能,培养学生综合运用理论知识解决实际问题的能力。初步掌握工程设计方法和组织实践的基本技能,逐步熟悉开展科学实践的程序和方法。第二节 硬件设计介绍 1.2 技术方案 针对设计要求,结合系统的基本框架,可将整个系统描述为如图 1.1 所示的方块模拟信号信号调理AD转换单片机串口发送图形绘制数据处理串口接收运算放大图1.1 系统方框图示波器最主要的性能指标就是带宽,即能测量信号的频率范围,为了达到较高的带宽就要求各部分的传输速率最要能达到不制约数据信号的传输。 香农(Shannon)采样定理:为了避免信息损失,带宽为 f 模拟信号必须用 fs>2f的采样速率进行采样。 奈氏(Nyquist)采样定理:设有一个频率带限信号x(t),其频带限制在(0,f)内,如果以不小于fs=2f的采样速率对x(t)进行等间隔采样,得到时间离散的采样信号x(n) =x(nTs)(其中Ts=1/fs称为采样间隔),则原信号x(t)将唯一的被所得到的采样样本x(n)完全确定。 带通采样定理:设一个频率带限信号 X(t),其频带限制在(f1,f2)内,如果采样速率fs满足:fs=2 (f1+f2)/(2n+1) 式中,n能取满足fs>2(f2-f1)的最大正整数(0,1,2.),则用 fs对x(t)进行等间隔采样所得到时间离散的采样信号 x(n)=x(nTs)(其中 Ts=1/fs 称为采样间隔)能准确确定原信号 x(t)。 如果假设要用本系统测量 0100KHz的信号,为了使信号不失真的显示在后端,要求采样速率为原始信号的4倍,即要求 AD转换速率为400KHz,也就是 2.5ms 转换一个数据,这个对所选用的STC12C5201系列A/D转换器是可以达到的。从官方说明书中得知,STC12C5201AD系列在高速情况下70个时钟周期转换一次,当选用33M晶振时,AD速度可达到471KHz。把数据从 A/D转换器接收到,下一条指令就可以发送出去,所以基本不影响传输速率。用计算机 USB 标准与单片机进行通信,USB2.0标准的问世,它以具有480Mbit/s的最大传输速率。1.3 系统设计中遇到的主要问题 一、数据处理 示波器需要对外界的各种电压电流信号进行测量。外界的电信号先由信号条理部分处理成A/D转换器转换范围内的电信号,然后 A/D转换器把模拟信号变成单片机能接受的数字信号,单片机再将这些信号发送给计算机。计算机得到的数字信号,往往要转换成人们所熟悉的工程值,才有它的意义,这就得进行标度变换。本系统中,就要在计算机中将从单片机接收到的数字量还原成前端测得的电压信号值。标度变换的方法有许多种,选择适合本系统的一种方法很是重要。 二、单片机与PC机的通讯 单片机与 PC机的通讯的设计应包含下面几方面的问题: 1、通信接口:利用USB转232芯片CH341或PL-23032、通信协议:要想保证通信,功通信双方必须有一系列的协议。作为发送方,必须清楚在何时发送信息,发送什么内容,作为接收方,必须清楚在何时接收信息,接收到的是什么内容。 3、波特率设定:在串行通信中波特率是一个非常重要的指标,它反映了串行通信的速率,也反映了对传输通道的要求。由于异步通信双方各用自己的时钟,要保证捕捉到正确的信息,最好采用较高频率的时钟,一般选择时钟频率比波特率高 16或64倍。若选择时钟频率低于波特率,则频率稍有偏差便会产生接收错误。而且通信双方需要设定相同的波特率。 本系统中波特率的设定更为重要,因为它直接关系到可测量信号的带宽,影响到整个系统的性能参数。 三、图形显示 同普通模拟示波器一样,需要使输入信号以波形的形式显示出来,在本系统中,这就要把计算机接收到的数字量转化成波形,并且当用户需要改变图形的大小,以清楚示值,则系统内部就要根据用户要求随时改变显示区每格代表的量值。 四、实时传输 因为本次设计的是示波器,这就要求前端信号改变时,波形立即跟随变化,这就要求程序代码极为优化,使相位误差降到最小。2 硬件设计2.1 信号调理 示波器的输入信号范围是很大的,普通示波器输入的安全电压是 450Vpp,可以有效测量的电压范围是 50Vpp,而在虚拟示波器中的 AD 转换集成电路的供电电压是+5V,最大也只有+12V, AD 电路的被测信号输入端的安全电压必须小于电源电压,否则将损坏AD 转换芯片。所以必须将输入的被测信号的电压限制到 AD 芯片的可测范围内,这样才能保证系统安全,正确地进行 AD转换。 另外,作为一种测量仪器,在对电路的某个信号进行量时,不能对被测电路的其他部分造成影响,这样就要求测量仪器的输入阻抗很大。基于以上原因,就有必要对输入的信号进行调理,保证在精确测量的同时保护仪器本身和测量电路的安全,并且不对被测电路造成影响。前端调理电路主要由保护电路,阻抗变换等部分组成。 2.2 数据采集 数据采集是本系统中非常重要的一部分,它负责将模拟量转换成数字量,现在常用的A/D转换器就可以对模拟信号进行采样、保持、量化,从而变成数字量,所以本次设计直接选用一种单片机 A/D一体的转换器,用单片机对其进行实时控制就可以完成数据采集模块的需要,减少了单片机与A/D通信所需要的执行时间。 2.2.1 常用的 A/D 转换器 常用的 A/D转换器按其转换原理可分为 4种:计数式 A/D 转换器,双积分式A/D转换器,逐次逼近式A/D转换器和并行式 A/D转换器。目前,在微机控制领域最常用的是双积分式和逐次逼近式转换器。 一、双积分式A/D转换器 双积分式 A/D转换器的主要特点是:转换精度高、抗干扰能力好、价格便宜,但其转换速度较慢。这种转换器主要用于对转换速度要求不高的场合。国内使用较多的双积分A/D转换器芯片有几种: 1、ICL7106/ICL7107/ICL7126 系列 这些芯片都是美国Intersil 公司产品,3位半精度。具有自校零、自动极性、单参考电压、静态 7 段码输出、可直接驱动 LED 和 LCD(液晶)显示器等特点。同类产品还有:TSC7106/TSC7107/TSC7126(美国 Teledyne 半导体公司产品) ;CH7106(上海无线电十四厂产品) ;DG7126(北京 878厂产品) 。 2、MCl4433美国 Motorola公司产品,3位半精度。具有自校零、自动极性、单参考电压、动态字位扫描 BCD 码输出(即千、百、十、个各位 BCD 码轮流在输出端输出) 、自动量程控制信号输出等特点。同类产品还有 5G14433(上海无线电五厂产品) 。 3、ICL7136 美国 Intersil公司产品,4位半精度。具有自校零、自动极性、单参考电压、动态字位扫描 BCD码输出等特点。 二、逐次逼近式A/D转换器 逐次逼近式 A/D转换器是一种转换速度较快、精度较高的转换器,其转换时间大约在几微秒到几百微秒之间。其典型芯片有以下几种: 1、ADC0801ADC0805 8 位 MOS 型 A/D 转换器,美国国家半导体公司产品,片内有三态数据输出锁存器,单通道输入。 2、ADC0808/0809 8位CMOS型A/D转换器可实现8路模拟信号的分时采集,片内有8路模拟选通开关,以及相应的通道地址锁存用译码电路。3、ADC0816/0817 这类产品除了输入通道数增加至16个以外,其他性能与ADC0808/0809型基本相同。 2.2.2 A/D 转换器的主要技术指标 一、分辨率 分辨率是指 A/D转换器能分辨的最小模拟输入量。通常用能转换成的数字量的位数来表示,如 8位、10位、12位、16位等。位数越高,分辨率越高。例如,对于 8位A/D转换器,当输入电压满刻度为 5V 时,其输出数字量的变化范围为 0255,转换电路对输入模拟电压的分辨能力为5V/256。二、转换时间 转换时间是 A/D转换器完成一次转换所需的时间。转换时间是编程时必须考虑的参数。若CPU 采用无条件传送方式,输入A/D转换器的数据,从启动 A/D芯片转换开始,到A/D芯片转换结束,需要一定的时间,此时间为延时等待时间,要将实现延时等待的一段延时程序,放在启动转换程序之后,此延时等待时间必须大于或等于 A/D转换的时间。 三、精度 精度是指与数字输出量所对应的模拟输入量的实际值与理论值之间的差值。A/D 转换电路中与每一个数字量对应的模拟输入量并非是单一的数值,而是一个范围。例如:对满刻度输入电压为5V的12位 A/D转换器,5V/FFFH122mV。 四、量程 量程是指 A/D转换器所能转换的输入电压范围。范围越大,转换器的工作越灵活。2.2.3 A/D 转换器的选用 一、A/D转换器的选用原则 1、分辨率和精度 应根据系统对数据采集总精度的要求,合理确定 A/D转换器的分辨率和精度。数据采集总精度除了A/D转换器的误差外,还包括传感器、放大器等器件的误差,甚至还包括软件中对信号的算法误差,因此,要合理地将总精度在个环节上恰当分配。一般来讲,A/D 转换器的位数至少要比总精度要求的最低分辨率高一位。转换精度与其它环节所能达到的精度相适应,只要不低于它们就行,选的太高没有意义,而且价格也会高出许多。 2、转换时间 选择何种转换速率的A/D转换器主要取决于被测信号变化的快慢和对转换精度的要求。根据采样定理,为了不失真的再现出原信号,采样频率应大于或等于被测信号中包含的最高信号频率的二倍。当频率较高时,应考虑使用采样/保持器。 不同类型的 A/D转换器其转换时间大不相同。双积分型,转换时间从几毫秒到几十毫秒不等,只能构成低速A/D,一般适用于温度、压力、流量等缓变参量的检测和控制。逐次逼近型转换时间从几微秒到几十微秒左右,属中速 A/D,常用于工业多通道单片机控制系统等。A/D 转换时间包括硬件传输时间和软件运行时间,所以还要考虑单片机本身的工作速度。当要求高速采样时,单片机读数据、存数据、再启动、循环记数等工作就比较困难,要继续提高采集数据的速度就不能用单片机控制,必须采用直接存储器访问(DMA)技术实现。 除了以上两个主要因素外,选择 A/D转换器还应考虑A/D 芯片的环境参数:如工作温度、功耗等;输入信号的类型:如多路还是单路、单极性还是双极性、最大幅值等;输出数据形式:如并行还是串行,二进制还是 BCD码;性价比高低,货源是否丰富等因素。 二、A/D转换器的选用 由于此次设计的虚拟示波器前端输入信号频率最大为100KHz, 如果用要求四倍采样速率,则要求A/D转换器的工作频率不低于 400KHz,即转换时间不大于 2.5us 。综合性能、价格、货源、总体设计等多种因素,最终选用与单片机一体的STC12CAD系列。STC12C5201AD系列ADSTC12C5201AD系列带A/D转换的单片机的A/D转换口在P1口(P1.7-P1.0),有8路8位高速A/D转换器,速度可达300KHz(21M晶振时)。要作为A/D使用时,需先将其设置为开漏模式或高阻输入,在P1M0、P1M1寄存器中对应的位进行设置。ADC_CONTR特殊功能寄存器:A/D转换控制特殊功能寄存器CHS2/CHS1/CHS0:模拟输入通道选择,CHS2/CHS1/CHS0,如下图的真值表。ADC_START:模数转换器(ADC)转换启动控制位,设置为“1”时,开始转换,转换结束后为0。ADC_FLAG:模数转换器转换结束标志位,当A/D转换完成后,ADC_FLAG=1,要有软件清0。不管是A/D转换完成后由该位申请产生中断,还是有软件查询该标志位A/D转换是否结束,当A/D转换完成后,ADC_FLAG=1,一定要软件清0。ADC_POWER:ADC电源控制位。0:关闭ADC电源;1:打开A/D转换器电源。如果软件设置进入空闲模式,ADC电源会自动关闭,启动AD转换前一定要确认AD电源已打开,AD转换结束后关闭AD电源可降低功耗,也可不关闭。初次打开内部A/D转换模拟电源,需适当延时,等内部模拟电源稳定后,再启动A/D转换。ADC_DATA/ADC_LOW2 特殊功能寄存器:A/D转换结果特殊功能寄存器模拟/数字转换结果计算公式如下:结果=1024*Vin/Vic。Vin为模拟输入通道输入电压,Vic为单片机实际工作电压,用单片机工作电压作为模拟参考电压。取ADC_DATA的8位为ADC转换的高8位,取ADC_LOW2的低2位,只用ADC_DATA寄存器的8位,则A/D转换结果为8位精度。即结果为: ADC_DATA7:0=256* Vin/Vic。2.3 数据处理 示波器需要对外界的各种电压电流信号进行测量。外界的电信号先由信号条理部分处理成A/D转换器转换范围内的电信号,然后用A/D转换器把模拟信号变成单片机能接受的数字信号,单片机再将这些信号发送给计算机。 计算机得到的数字信号,往往要转换成人们所熟悉的工程值,才有它的意义。这是因为被测对象的各种数据经转换后得到一系列的数码,这些数码值一般不等于原来带有量纲的参数值,它仅仅对应于参数值相对量的大小,故必须把它转换成带有量纲的数值后才能使人理解,这种转换便是标度变换。 标度变换有各种类型,实现的办法也有几种,应根据实际要求来选用适当的标度变换方法。软件实现法在智能仪表测量信号的标度变换中最为常见,它实现灵活,适用性广,能克服硬件实现标度变换的局限性。其实现的办法一般是借助于数学解析表达式来编写程序,从而达到变换定标的目的。其中利用线性变换是最常用的用软件实现标度变换的方法。 这种标度变换的前提是参数值与 A/D转换结果成线性关系,是最常用的变换方法。它的变换公式如下: Y(YmaxYmin)(XNmin)/(NmaxNmin)Ymin 式中:Y 为参数测量值;Ymax 为参数量程最大值;Ymin 为参数量程最小值;Nmax为Ymax对应的A/D转换后的输入值; Nmin为量程起点Ymin对应的A/D转换后的输入值;X为测量值 Y对应的A/D转换值。 考虑到本次设计示波器的数据输入到输出的转换完全满足线性关系,所以就使用软件实现线性标度变换,由于计算机机比单片机具有更强的数据处理计算能力,为使程序简单易行,在计算机语言下编写标度变换程序。2.4 串行通信 计算机技术在其发展过程中形成两个重要分支:通用计算机领域,现在以 PC 为代表,着重发展海量高速数值运算技术,而其控制能力是有限的;嵌入式计算机领域,现在以单片机为代表,着重发展计算机的控制技术,而其计算机速度是有限的。在目前的许多实时工业控制和数据采集系统中,常采用 PC 机做上位机单片机做下位机的主从式系统。在主从分布式控制系统中,单片机主要完成实时数据采集,被采集数据经初步处理后通过串口传送给主机。主机将从机发送来的数据进行处理后随时向用户提供各种统计报表和整个控制过程的具体数据。主机同时根据从从机(单片机)接收的过程参数进行判断处理并给从机发送各种控制命令。在这样的分布式控制系统中,就需要实现主机向从机发送数据或主机从从机接收数据,即单片机与微机的串行通信,这样便可以弥补单片机在数据处理方面的不足和 PC机在控制方面的欠缺。下面简要介绍一下 PC机与单片机之间的数据通信。 在计算机系统中,CPU 和外部通信有两种通信方式:并行通信和串行通信。一个信息的各位数据被同时传送的通信方法称为并行通信,而一条信息的各位数据被逐位顺序传送的通信方式称为串行通信。本设计中采用的是串行通信,图2.2是这两种通信方式的示意图。并行通信与串行通信相比较,串行通信能够节省传输线,特别是数据位数很多和远距离数据传送时,这一优点更为突出;串行通信方式的主要缺点是传送速度比并行通信要慢。由于本设计中采用的是串行通信方式,所以下面就串行通信作一简单的介绍。接收发送计算机1计算机2计算机1计算机2图2.2 并行通信与串行通信2.4.1 串行通信方式 按照串行数据的时钟控制方式,串行通信可分为同步通信和异步通信两类。 一、异步通信(Asynchronous Communication) 在异步通信中,数据通常是以字符为单位组成字符帧传送的。字符帧由发送端一帧一帧地发送,每一帧数据是低位在前,高位在后,通过传输线被接收端一帧一帧地接收。发送端和接收端可以由各自独立的时钟来控制数据的发送和接收,这两个时钟彼此独立,互不同步。 在异步通信中,接收端是依靠字符帧格式来判断发送端是何时开始发送何时结束发送的。字符帧格式是异步通信的一个重要指标。 1、字符帧(Character Frame) 字符帧也叫数据帧,由起始位、数据位、奇偶校验位和停止位等四部分组成。(1)起始位:位于字符帧开头,只占一位,为逻辑 0 低电平,用于向接收设备表示发送端开始发送一帧信息。 (2)数据位:紧跟起始位之后,用户根据情况可取 5位、6位、7位或8位,低位在前高位在后。 (3)奇偶校验位:位于数据位之后,仅占一位,用来表征串行通信中采用奇校验还是偶校验,由用户决定。 (4)停止位:位于字符帧最后,为逻辑 1高电平。通常可取 1位、1.5位或2位,用于向接收端表示一帧字符信息已经发送完,也为接收下一帧信息做准备。 在串行通信中,两相邻字符帧之间可以没有空闲位,也可以有若干空闲位,这由用户来决定。有 3个空闲位的字符帧格式。2、波特率(baud rate) 异步通信的另一个重要指标为波特率。波特率为每秒钟传送二进制数码的位数,也叫比特数,单位为bit/s,即位/秒。波特率用于表征数据传输的速度,波特率越高,数据传输速度越快。但波特率和字符的实际传输速率不同,字符的实际传输速率是每秒内所传字符帧的帧数,和字符帧格式有关。 通常,异步通信的波特率为 509600bit/s。异步通信的优点是不需要传送同步时钟,字符帧长度不受限制,故设备简单。缺点是字符帧中因包含起始位和停止位而降低了有效数据的传输速率。 二、同步通信(Synchronous Communication) 同步通信是一种连续串行传送数据的通信方式,一次通信只传输一帧信息。这里的信息帧和异步通信的字符帧不同,通常有若干个数据字符,单同步字符帧结构,双同步字符帧结构,但它们均由同步字符、数据字符和校验字符 CRC三部分组成。在同步通信中,同步字符可以采用统一的标准格式,也可以由用户约定。 同步通信的数据传输速率较高,通常可达 56000bit/s 或更高,其缺点是要求发送时钟和接收时钟必须保持严格同步。三、串行通信的制式 在串行通信中数据是在两个站之间进行传送的,按照数据传送方向,串行通信可分为单工(simplex)、半双工(half duplex)和全双工(full duplex)三种制式。在单工制式下,通信线的一端接发送器,一端接接收器,数据只能按照一个固定的方向传送。 在半双工制式下,系统的每个通信设备都由一个发送器和一个接收器组成。在这种制式下,数据能从 A 站传送到 B 站,也可以从 B 站传送到 A 站,但是不能同时在两个方向上传送,即只能一端发送,一端接收。其收发开关一般是由软件控制的电子开关。 全双工通信系统的每端都有发送器和接收器,可以同时发送和接收,即数据可以在两个方向上同时传送。图见教材单片微型计算机与接口技术在实际应用中,尽管多数串行通信接口电路具有全双工功能,一般情况只工作于半双工制式下,这种用法简单、实用。 在单片机应用系统中,数据通信主要采用异步串行通信,本次设计采用全双工通信方式,实际大多数情况只有单片机向 PC机发送数据。2.4.2 单片机与 PC 机连接2.4.3单片机与 PC 机串行通信波特率的计算 在串行通信中,收发双方对传送的数据速率即波特率要有一定的约定。 单片机的串行口通过编程可以有 4种工作方式。其中方式 0和方式2的波特率是固定的,方式 1 和方式 3 的波特率可变,由定时器 T1 的溢出率决定,下面加以分析。 1、方式 0和方式2 在方式 0中,波特率为时钟频率的 1/12,即fosc/12,固定不变。 在方式 2 中,波特率取决于 PCON 中的 SMOD 值,当 SMOD=0 时,波特率为 fosc/64;当SMOD=1 时,波特率为fosc/32。2、方式 1和方式3 在方式 1和方式3下,波特率由定时器 T1的溢出率和SMOD 共同决定。其中 T1的溢出率取决于单片机定时器 T1的计数速率和定时器的预置值。计数速率与TMOD寄存器中的 C/T位有关,当 C/T=0时,计数速率为fosc/12,当C/T=1时,计数速率为外部输入时钟频率。 实际上,当定时器T1做波特率发生器使用时,通常是工作在模式 2,即自动重装载的8位定时器,此时TL1作计数用,自动重装载的值在 TH1内。设计数的预置值(初始值)为 X,那么每过 256-X 个机器周期,定时器溢出一次。为了避免溢出而产生不必要的中断,此时应禁止T1中断。 本次设计中,如前 1.2 节 技术方案 中所证,因为单片机和 PC 机通信速度有限,制约整个系统带宽的因素就在于单片机和 PC机之间的串行通信,所以理论上应取最大的串行传输速率,即两端波特率对应取最大值。 3 系统软件设计一个完整的系统除了硬件电路外,还应该有适当的软件来对硬件进行控制才能实现其功能,否则,它将不会自己进行任何操作。前面第二章对虚拟示波器的硬件系统作了较详细的介绍,下面来设计它的软件系统。 3.1 单片机部分程序通讯原理程序流程图 画点程序流程图用keil4模拟通信初始化void Uart_Init() SCON=0x52; TMOD=0x20; TCON=0x69; TH1=0xF3;发送接收数据函数TMOD=0x02;TH1=0xE6;TL1=0xE6;TR1=1;SCON=0x40;for(n=0;n<4;n+)SBUF=tn;while(!TI);TI=0;发送接收数据函数TMOD=0x02;TH1=0xE6;TL1=0xE6;TR1=1;SCON=0x50;for(n=0;n<4;n+)while(!RI);RI=0;tn=SBUF;调用AD功能函数#include <intrins.h>typedef unsigned int WORD;typedef unsigned char BYTE; sfr ADC_CONTR = 0xC5; sfr ADC_DATA = 0xC6; sfr ADC_LOW2 = 0xBE; sfr P1M0 = 0x91; sfr P1M1 = 0x92; #define ADC_POWER 0x80 #define ADC_FLAG 0x10 #define ADC_START 0x08 #define ADC_SPEEDLL 0x00 #define ADC_SPEEDL 0x20 #define ADC_SPEEDH 0x40 #define ADC_SPEEDHH 0x60 void InitADC(); BYTE GetADCResult(BYTE ch); void ADDelay(WORD n);BYTE GetADCResult(BYTE ch) ADC_CONTR = ADC_POWER | ADC_SPEEDHH | ch | ADC_START; _nop_(); _nop_(); _nop_(); _nop_(); while( !(ADC_CONTR & ADC_FLAG) ); ADC_CONTR &= ADC_FLAG; return ADC_DATA; void InitADC() P1 = P1M0 = P1M1 = 0xff; ADC_DATA = 0; ADC_CONTR = ADC_POWER | ADC_SPEEDLL; ADDelay(2); void ADDelay(WORD n) WORD x; while (n-) x = 5000; while (x-); 3.2 PC机部分程序 图 正弦波数据显示/ CHelloView drawingvoid CHelloView:OnDraw(CDC* pDC)CHelloDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);pDC->TextOut(350,380," 基于STC12C5412AD的虚拟示波器设计 "); /绘制文本pDC->TextOut(350,400,"由C+编写通讯数据模拟绘图测控080401106");int data128=/*此处应该引用AD通讯数据,模拟时直接使用了sin数据*/;CRect rc;GetClientRect(rc); /是取得客户区矩形区域/下面是通过朝它的中心移动边,以缩小CRect。函数原型是void DeflateRect(int x,int y)。/参数x指定要向左或向右移动CRect边的数量,y指向要向上或向下移动CRect边的数量。rc.DeflateRect(50,50);int gridXnums=10; /定义网格变量x是10int gridYnums=8; /定义网格变量y是8int dx=rc.Width()/gridXnums;/宽度/xint dy=rc.Height()/gridYnums;/高度/y/下面这条语句是矩形构造函数CRect :CRect(int l,int t,int r,int b)/参数:l指定CRect的左边位置,t指定CRect的上边位置,r指定CRect的右边位置,/ b指定CRect的底边位置。这里是:左边位置,上边位置,右边位置(左边位置+宽度*/网格变量10),底边位置(上边位置+高度*网格变量8),实际是画笔行走范围。CRect gridRect(rc.left,rc.top,rc.left+dx *gridXnums,rc.top+dy *gridYnums); /下面这条语句是定义画笔对象CPen:Cpen(int nPenStyle,int nWidth,COLORREF crColor)/参数:nPenStyle指定画笔风格; nWidth指定画笔宽度;crColor包含画笔的RGB颜色值CPen gridPen(0,0,RGB(0,100,200);CPen *oldPen=pDC->SelectObject(&gridPen);for(int i=0;i<=gridXnums;i+)pDC->MoveTo(gridRect.left+i *dx,gridRect.bottom); /x方向开始画pDC->Li