




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录TOC\o"1-3"\h\u1、前言12、总体方案设计22.1设计容22.2设计方案比较22.3方案论证32.4方案选择33、单元模块设计43.1各单元模块功能介绍与电路设计43.1.1按键输入电路43.1.2LED数码管显示电路53.1.3温度采集电路73.1.4报警模块设计73.1.5串口通信模块设计83.1.6电源电路93.1.789C52单片机模块103.2特殊器件的介绍113.3.1DS18B20器件介绍114、软件设计134.1软件设计原理与所用工具134.1.1设计原理134.1.2KeilC、Proteus与VB软件介绍134.2设计流程图144.2.1主程序设计原理144.2.2温度采集子程序流程图154.2.3RS232串口通信的程序流程图165、系统调试175.1硬件调试175.2软件调试176、系统功能、指标参数216.1系统功能216.2系统指标参数指标216.3系统功能与指标参数分析217、结论228、总结与体会238.1设计小结238.2设计体会238.3设计改进与建议239.辞2410、参考文献25附录一:相关设计图与源程序261.系统的原理电路图262.系统PCB图273.源程序代码28附录二:外文资料翻译381、前言温度测控系统是比较常见的和典型的过程系统,温度是工业生产过程中重要的被控参数之一,在冶金、机械、食品、化工等各类工业生产过程中广泛使用的各种加热炉、热处理炉、反应炉,对工件的处理温度等均需要对温度严格测量控制。当今计算机控制技术在这方面的应用,已使温度测控系统达到自动化、智能化。在半导体技术的支持下,温度测控器件发展迅速。而温度传感器是各式各样的传感器中经常使用的一种,如今温度传感器的外形都非常小巧,这样更为我们的生活提供了许多功能和便利,并且也让它广泛应用于生产实践的各个领域中。21世纪以来,智能温度传感器正朝着高精度、多功能、高可靠性与安全性、总线标准化、网络传感器和开发虚拟传感器、研制单片测温系统等高科技的方向迅速发展。传统的温度检测以热敏电阻为温度敏感元件。热敏电阻的成本低,但需后续信号处理电路,而且可靠性相对较差,测温准确度低,检测系统也有一定的误差。这里设计的数字温度测控系统具有读数方便,测温围广,测温精确,数字显示,串口通信,适用围宽等特点。本文所研究和开发的课题是温度测控的仿真设计,目的在于模拟空调的温度测控与自动开关系统。本设计选用Intel公司生产的STC89C52芯片作为主控制器件,DS18B20温度传感器作为温度测定采集系统,通过LED数码管实现实时温度和设定温度的显示,还可通过按键设定空调的目标温度,报警系统模拟空调的自动开关控制,通过串口还能与PC机通信以模拟空调的遥控系统。通过DS18B20温度传感器直接读取被检测的温度值,并进行数据的转换,此器件的线性度较好,物理和化学性能也稳定,在0℃~100℃围最大线性偏差小于0.01℃2、总体方案设计2.1设计容设计一种基于单片机的温度测控的方法,以模拟空调的温度测控与自动开关系统,要求:(1)能够实时地检测温度,并能在空调主机和遥控器上显示出来。(2)可通过空调主机和遥控器的按键设定目标温度,按键可移位。(3)设定温度状态下,应能闪烁显示。(4)实时温度超过设定温度的某一个门限围时,空调自动开启(用报警电路模拟即可)。2.2设计方案比较方案一:由单片机STC89C52来实现温度控制系统的设计,外围电源采用+5V电源供电,通过DS18B20温度传感器采集实时温度,由按键电路设定目标温度,LED数码管可显示正常状态下的实时温度和设定状态下的目标温度,中央处理器由STC89C52单片机来完成,可通过串口与PC机通信,并在超出门限值时报警(模拟空调的自动开关控制)。这种方案,结构简单容易掌握,各部分电路实现起来都非常容易,在传统的温度测控设计中也应用得较为广泛,技术成熟。其原理框图如图2.1:LED显示LED显示PC机报警电路电源电路DS18B20温度传感器STC89C52按键电路图2.1单片机原理实现框图方案二是基于CPLD温度采集系统,通过CPLD构成的控制器输出一个脉冲给MAX232部A/D转换器的CLK端,使其开始A/D转换,同时将CPLD部地址发生器产生的地址信号经地址选择器(在CPLD部)直接送到存储器,A/D转换器所采集到的数据经数据总线直接输入到存储器中保存,如此便完成一个采样周期,重复上述步骤,直到完成预定数量的数据采集。首先以外置的双极型二极管去感知外部的温度变化并且转化为电流信号;然后将电流信号传送给温度传感器进行ADC转换;最后通过CPLD完成数据的串并转化,并将数据发送到LED。方案二原理框图如图2.2所示。成批采集结束中断处理程序地址发生器产生地址信号成批采集结束中断处理程序地址发生器产生地址信号存储器地址选择器控制器存储器地址选择器控制器MAX232MAX232A/D数据转换采集图2.2CPLD实现的原理框图2.3方案论证通过方案一和方案二的比较,可以看出方案一的设计使用单片机,而直接用单片机编程,用硬件电路搭建方便,通过STC89C52单片机编写程序,来控制LED的亮灭以与与PC机通信。这样可以大大简化系统结构,降低材料的成本。而方案二采用CPLD芯片实现的电路,在智能化领域,虽说CPLD功能更强大,但价位较高,对于这样一个小系统,没有必要用价格昂贵的集成芯片,这样会增加成本。2.4方案选择设计直接用单片机编程,用硬件电路搭建方便,通过STC89C52单片机编写程序,来控制LED的亮灭以与与PC机通信。这样可以大大简化系统结构,降低材料的成本。提高系统的先进性和可靠性,能实现控制器的系统编程。所以从节约成本和功能方面综合考虑,本次设计我们采用了方案一。3、单元模块设计本节主要介绍系统各单元模块的具体功能、电路结构、工作原理、以与各个单元模块之间的联接关系;同时本节也会对相关电路中的参数计算、元器件选择、以与核心器件进行必要说明。3.1各单元模块功能介绍与电路设计经过以上所述的设计容与要求的分析,可以将主要电路分为以下几部分:温度采集模块,按键模块,LED显示模块,报警模块,串口通信系统。单片机初始化之后,将不停地扫描这些模块。温度采集模块会实时地采集当前温度,按键模块判断是否有按键按下,并实现对应的功能,显示模块能显示正常状态下的实时温度和设定状态下的目标温度,报警模块实现越限报警功能,串口通信发送模块将采集到的实时温度值发送给上位机显示出来,串口通信接收模块能接收上位机发送下来的设定温度值。3.1.1按键输入电路本设计采用行列式键盘,如图3.1,行列式键盘用于按键数量较多的场合,它由行线和列线组成,按键位于行、列交叉点上,也称矩阵键盘,相对于独立式键盘更加节省硬件资源。按键处理方法采用循环扫描,即直接在主程序中利用循环扫描查询和按键相连的I/O电平,然后进行相应处理。循环扫描又分为行扫描和列扫描,本设计采用的是列扫描,即行线连接的单片机I/O口作为输入口,列线连接的单片机I/O口作为输出口。具体方法如下:行初始化电平为1,列初始化电平为0。检查各行线输入电平是否为全“1”。如果不是全“1”,则有键按下。然后逐列置零电平,其余各列为高,检查行线的电平是否变为零,有,则该行列交叉的按键判断为按下。本设计只使用前两列按键,即一个4行×2列的一个矩阵键盘。各个按键功能是:S2:设定状态下对选定位加1。S3:设定状态下对选定位减1。S4:设定状态下左移选定位。S5:设定状态下右移选定位。S6:确定键(显示实时温度)。S7;设定温度(显示设定温度)。S9:启动/停止(开/关显示)。图3.1按键电路3.1.2LED数码管显示电路7段数码管一般由8个发光二极管组成,其中由7个细长的发光二极管组成数字显示,另外一个圆形的发光二极管显示小数点。当发光二极管导通时,相应的一个点或一个笔画发光。控制相应的二极管导通,就能显示出各种字符,尽管显示的字符形状有些失真,能显示的数符数量也有限,但其控制简单,使有也方便。数码管显示电路采用共阳极数码管,P0作位选,P2作段选。位码:P0.7…P0.00xF7:11110111LED2LED1段码:hgfedcba0xC0:11000000图3.2数码管段码图3.3四位数码管图3.4LED显示电路3.1.3温度采集电路三针插孔用来插DS18B20的芯片,DS18B20的数据端二脚接到单片机的P36管脚,用单片机来控制DS18B20,实现电路对温度的监控。DS18B20为单总路线芯片,单片机通过对芯片二管脚的时序控制,来启动温度转换和写入温度上下限,读出温度转换值等一系列操作,并将温度转换的值存入单片机中,单片机通过串口将数据传输到电脑中,通过VB的控件MSCOMM1来接收数据,并用文本框TEXT显示出来。该设计对温度的测控是用温度芯片DS18B20来实现的,该模块的电路图如图3.5所示。通过单线总线端口访问DS18B20的协议如下:步骤1.初始化步骤2.ROM操作指令步骤3.DS18B20功能指令每一次DS18B20的操作都必须满足以上步骤,若是缺少步骤或是顺序混乱,器件将不会返回值。图3.5温度采集电路3.1.4报警模块设计本设计采用蜂鸣器越限报方式(实际用LED代替),当采集到的实时温度超过设定温度的±2℃图3.6报警电路3.1.5串口通信模块设计MAX232是目前最常用的串行接口标准,也是美国电子工业协会正式公布的串行总线标准,用来实现计算机与外设之间、计算机与计算机之间的数据通讯。MAX232串行接口总线适用于:传输速率最大为20kBps,设备之间的通讯距离不大于15m。MAX232协议以-5V~-15V表示逻辑1;以+5V~15V表示逻辑0。ATmega8单片机带有一个通用同步/异步全双工串行收发模块USART,其主要特点如下:支持同步或异步操作;全双工操作;同步操作时,可主机时钟同步,也可从机时钟同步;支持5、6、7、8和9位数据位,1位或2位停止位的串行数据帧结构;独立的高精度波特率发生器,不占用定时/计数器;由硬件支持的奇偶校验位发生和校验;数据溢出检测;帧错误检测;包括错误起始位的检测的噪声滤波器和数字低通滤波器;三个完全独立的中断,TX发送完成、TX发送数据寄存器空、TX接收完成;支持多机通信模式;支持倍速异步通信模式。MAX232串行通信接口电路图如图3.7所示。图3.7MAX232串口通信原理图3.1.6电源电路电源电路如图3.8所示。电源电路为整个系统提供直流电。J16接USB接口,经USB接口提供+5V电压,开关S1控制电源是否导通,导通LED灯亮,单片机上电。电阻R10起到限流的作用,保护LED灯。图3.8电源电路图3.1.789C52单片机模块此模块主要包含89C52单片机、时钟电路、复位电路。在此次设计中时钟电路之所以选择11.0592M的晶振是因为它能够准确地划分成时钟频率,与UART(通用异步接收器/发送器)常见的波特率相关。特别是较高的波特率(19600,19200),这些晶振的振荡频率都是准确的。在复位电路中复位高电平有效,当按键没有按下时,RST端接地,为低电平。按键按下,VCC与R22导通,分压后RST为高电平,单片机复位。89C52是89C51增强型单片机版本,它结合了CMOS的低功耗特征与CMOS的高速与高密度技术,它基于标准的MCS-51单片机指令系统和体系结构,集成了向上或向下计数器和时钟输出等更多的功能,适合于类似机体控制等应用场合。89C52置8位中央处理单元、8k片程序存储器(ROM)、256字节部数据存储器(RAM)、32个双向输入/输出(I/O)口、3个16位定时/计数器、5个两级中断结构、一个全双工串行通信口和片时钟振荡电路,更优于89C51。图3.989C52单片机模块3.2特殊器件的介绍本系统中主要使用了DS18B20此功能器件。下面就此器件的功能特点、主要参数和使用方法作相应说明。3.3.1DS18B20器件介绍●独特的单线接口仅需一个端口引脚进行通讯●每个器件有唯一的64位的序列号存储在部存储器中●简单的多点分布式测温应用●无需其他多余外部器件●可通过USB数据线供电。供电围为3.0V到5.5V。●测温围为-55~+125℃(-67~+257●在-10~+85℃围误差不超过±●温度计分辨率可选择为9~12位●最多在750ms将温度转换为12位数字●用户可定义的非易失性温度报警设置●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件●与DS1822兼容的软件图3.10DS18B20实物图4、软件设计4.1软件设计原理与所用工具本节主要介绍系统软件设计原理与KeilC、Proteus与VB软件开发环境。4.1.1设计原理以单片机STC89C52为主控器件,利用DS18B20采集外部温度,并将温度值存入一个4位数组num1[],按键模块先判断是否有按键按下,若有,则实现对应的功能——对存设定温度值的数组num[]某一位进行加、减、左移、右移等,LED显示分两个状态,由按键控制,正常状态下显示num1[]中的实时温度,设定状态下显示num[]中的目标温度(门限温度),报警模块将数组num[]和num1[]转化为对应的数值并比较,若实时温度超过设定温度的一定围,则LED点亮报警,串口通信发送模块将数组num1[]中的数不断发送给上位机VB界面显示出来,保证显示的温度为当前温度,串口通信接收模块接收上位机发送下来的设定温度值。4.1.2KeilC、Proteus与VB软件介绍KeilC51是由美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、可读性、结构性、可维护性上有明显的优势,因而易学易用。使用汇编语言后再使用C来开发,体会更加深刻。KeilC51软件提供丰富的函数库和功能强大的集成开发调试工具,全新Windows界面。另外重要的一点是,只要看一下编译后生成的汇编代码,就能明显体会到KeilC51生成的目标代码效率是非常之高的,多数语句生成的汇编代码都很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。Proteus软件是由英国Labcenterelectronics公司出版的EDA工具软件。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机与外围器件。它是目前最好应用最广的仿真单片机与外围器件的工具。虽然目前国推广刚刚起步,但已经受到单片机爱好者、从事单片机教学的老师、致力于单片机开发应用的科研工作者的青睐。Proteus是世界上著名的仿真软件,从原理图布图、程序调试到单片机与外围电路的协同仿真,一键切换至PCB设计,真正实现了从概念到产品上的完整设计。Proteus是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台。在编译方面,它也支持Keil、IAR和MPLAB等多种编译器。VisualBasic是一种由微软公司开发的包含协助开发环境的事件驱动编程语言。它源自于BASIC编程语言。从任何标准来说,VB都是世界上使用人数最多的语言——不仅是盛赞VB的开发者还是抱怨VB的开发者的数量。同时VB拥有快速应用程序开发(RAD)系统和图形用户界面(GUI),可以轻易的使用RDO、DAO、ADO连接数据库,还可以轻松的创建ActiveX控件。程序员可以轻松的使用VB提供的组件快速建立一个应用程序。VB的程序可以包含一个主窗体和多个子窗体,或者是一个或多个窗体,类似于操作系统的样子。VB的组件既可以拥有用户界面,也可以没有。有很少功能的对话框窗口(比如没有最大化和最小化按钮的窗体)可以用来提供弹出功能。这样一来,服务器端程序就可以处理增加的模块。4.2设计流程图4.2.1主程序设计原理图4.1软件设计流程图如图4.1所示,本设计程序流程可分为以下几个主要部分:首先初始化,声明子函数、全局变量,并且打开、设定相关中断,设置波特率。然后温度采集,建立DS18B20的温度采集协议,将DS18B20采集到的实时温度保存到数组中。接下来进行按键扫描,若没有按键按下,直接显示实时温度。若点设定温度键,显示设定温度值,并且选定的那一位闪烁,通过按键可对选定位加1,减1,左移,右移;再点确定键,返回正常显示状态,显示实时温度值。然后再判断实时温度是否超过设定温度的门限围,若超过则报警,然后返回温度采集子程序,如此循环执行,若没有超过则直接返回温度采集进行循环。4.2.2温度采集子程序流程图图4.2温度采集子程序流程图如上图所示,由于通过单线总线端口访问DS18B20必须遵守一定的协议,因此该子程序的设计也必须严格按照协议步骤的顺序实现。首先初始化,定义子程序变量,调用复位子程序,复位DS18B20准备采集温度。然后调用写字节子程序,执行ROM操作命令,将其跳过。然后再次调用写字节子程序,执行温度转换,这里需要一个延时,等待程序转换完成后,便可将采集到的温度值的各位对应的写入存放实时温度的数组num1[]。接下来再次初始化、执行ROM操作命令,然后执行存储器操作命令,将温度值读出并计算,从而得到实时温度值的每一位数值。4.2.3RS232串口通信的程序流程图图4.3串口通信RS232控件的程序流程图上位机使用RS232控件与下位机通信,程序中使用该控件的OnComm事件,使整个子程序循环执行,不断接收下位机传上来的数据。程序流程如图4.3所示,首先进行初始化,设置通信端口、波特率等参数,建立通信协议,然后接收数据并转换。当收到的数据为接收标志位时,则清空数据,等待接收数据,然后返回接收转换数据,接收完四个字节的数据后,将数据转换成数值型,最后显示在对应的文本框中,然后还要再次返回接收数据,不断循环,以保证显示温度为当前的温度值。5、系统调试5.1硬件调试经过KeilC和Proteus的仿真调试之后,我们将程序下载到了单片机实验板进行硬件仿真,基本实现了和软件仿真接近的结果,但是仍然有一些问题:第一,数码管总有一位不能点亮,但其位选标志P03口控制的LED灯是亮的。用万用表对连接在数码管上的三极管进行导通测量,发现三极管不能导通,换了一个三极管后,那位数码管还是不能点亮,再用万用表检测,发现是由于那块焊盘挨得比较紧密,焊接时不小心使相邻两个三极管相连,导致PNP不能正常工作。第二,键盘和单片机I/O口连线不正确,导致键盘不能起作用。后面结合原理图和程序重新连好线即可。由于我们用了报警电路,其控制端口为P3.3口,在按键选用的时候,也用了P3.3口,导致报警电路不能正常工作,按键按下P3.3口,蜂鸣器就鸣叫,这个问题修改按键的控制端口即可。第三,液晶不能显示。调节W2即液晶的背光调节即可正常显示。5.2软件调试程序主要包括按键扫描,温度采集,LED数码管显示扫描,报警子程序以与串口通信发送、接收子程序。在程序设计初期遇到很多设计错误上的问题,通过反复整理思路,修改程序流程图,更正这些错误。在设计后期,程序调试的过程中,又遇到了几个可靠性和稳定性方面的问题,经过仔细地研究、反复地推敲和不断地尝试,也逐一解决了这些问题,是整个系统更加稳定可靠。下面介绍一下在整个调试过程中遇到的问题,以与我们解决的方法。第一,按键时LED非正常闪烁。最初设计的按键扫描程序在调试的时,会出现一个问题——每按下一次按键,LED就会闪烁一次;若按下按键不松开,则LED会不显示,直到松开按键才会重新显示。这是由于先前设计的程序中在执行按键功能之后有一个while语句判断按键是否松开,即while((P1&0xe2)!=0xe2);若所以当按键按下到松开按键的时间,整个程序一直在这里停留,所以不会显示或者执行其他子程序,从而就使得每按键一次LED显示闪烁一次。解决方法:设置一个按键标志位z,按前z=0,按下后按键子程序只讲将z置为1,然后跳出,继续执行其他子程序。下一次扫描按键子程序的时候,先判断z的值,若为0,则不执行按键功能程序,若为1,则执行按键功能程序,并将z重新置为0,等待下一次按键的到来。这样,按键子程序不会进入while语句的死循环,因此LED显示在按键时也就不会闪烁,使得整个显示更加稳定、流畅。第二,闪烁显示时按键不灵敏。在LED闪烁显示设定温度时,按键不够灵敏,有时有效有时无效。这是由于LED闪烁显示是由两个90次的循环程序完成的。因此该子程序的延时会相对较大,所以导致按键时程序可能正在执行该循环,并没有扫描到按键,从而按键变得不灵敏。解决方法:解决这个问题的方法很简单,只需要在LED闪烁显示程序的每一次循环中都调用一次按键子程序Getch(),判断是否有键按下。这样整个系统的按键会更加可靠、更加灵敏。第三,串口通信下位机接收错位。上位机通过串口向下位机发送设定温度时,下位机接收到的数据错开一位。这是由于上位机每一次发送4个数,而下位机程序却判断、接收了5次,因此错开一位。解决方法:将原程序中的while语句改成do..while语句并设置一个标志位t,以判断4个数是否接收完毕。以下是修改前的串口通信下位机接收子程序(左)和修改后的串口通信下位机接收子程序(右)的对比。voidR_temp(){unchark;if(RI) { for(k=0;k<4;k++) { while(!RI); num[k]=SBUF; RI=0; } }}voidR_temp(){unchark=0;do{if(RI) { num[k]=SBUF; RI=0; k++; t=1; if(k==4) { t=0; ES=0;}}} while(t);第四,延时问题。DS18B20器件对时序要求严格,之前由于延时问题,导致出现温度不能正常采集的情况。温度传感器DS18B20的延时首先是一个480~960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都是高电平说明总线上无器件应答。做为从器件的DS18B20在一上电后就一直在检测总线上是否有480-960微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待。写周期最少为60微秒,最长不超过120微秒。而完成一个读时序过程,也至少需要60us才能完成等等,对延时都有严格的要求,否则温度不能正常显示。温度采集仿真图如下:图5.1软件仿真图上位机显示图如下:图5.2上位机显示图6、系统功能、指标参数6.1系统功能温度采集模块会实时地采集当前温度,按键模块判断是否有按键按下,并实现对应的功能,显示模块能显示正常状态下的实时温度和设定状态下的目标温度,报警模块实现越限报警功能,串口通信发送模块将采集到的实时温度值发送给上位机显示出来,串口通信接收模块能接收上位机发送下来的设定温度值。6.2系统指标参数指标本系统主要是对温度的实时监测与控制。所以测试系统指标参数时主要是对温度值的测试。表6.1温度测量变化值测定次数123456LED显示手温变化(℃)29.7530.1231.5031.8732.6234.506.3系统功能与指标参数分析本系统只实现了主要的温度测控功能,对于比较完善的系统功能实现则还有比较大的差距。1、本设计只能按键设定目标温度,不能设定目标温度的门限围,即门限围只能是目标温度±2℃2、设计中可以把下位机采集到的实时温度通过串口发送给上位机显示,上位机也能把设定温度通过串口发送给下位机,但是当下位机通过按键设定目标温度时,不能将设定的温度发送给上位机显示,所以程控部分还有待改善。3、上位机通过串口发送设定温度给下位机的VB程序中的延时,从10ms~1000ms,经过反复调试最终设定为30ms,虽已能满足要求,但是不能在下位机显示设定温度状态下发送数据,否则接收错误。并且对于该延时对系统的影响仍不清楚,有待进一步的分析和思考。7、结论在本次设计中,基本完成了本设计的主要的要求与功能。在设计开始前我对各个模块进行了详细的分析和设计准备工作,设计过程中,相互协调,积极请教参与完成各个技术实现的难点。本设计要现报警温控器设计,实时温度是通过DS18B20采集的,按键可以设定目标温度,实时温度超出设定的门限围,则将P3.3口置为低电平,LED灯点亮报警。VB界面能接收和显示下位机传上来的实时温度值,也能将设定温度值(一个4位的数组)发送给下位机,这是本次设计的难点,也是一个很大的创新点,真正实现了远程测控的功能,在VB程序中我们设置了通信端口选择,这并不会出现因为通信端口的不同而不能实现测控的情况,从而使上位机与下位机之间能够相互通信,远程测控功能对温度值有严格要求的系统来说是非常方便的。当然,在本次设计中,还有存在很多不足的地方。比如,下位机设定的目标温度不能发送给上位机显示,这在远程测控系统中是一个很大的不足,另外,上位机VB程序的延时与下位机接收之间的问题也有待改善,这些不足希望可以在以后的设计中加以改善,使系统更加完善。8、总结与体会8.1设计小结在本次设计中,我遇到了很多不明白的地方,在寻求帮助的情况下,最终完成了设计。设计难免出现问题,但是出现问题最重要的就是学会解决,利用软、硬件的调试,将整个设计完善到最好。本次设计的主要任务我达到了,实现了设计的基本要求。本设计采用模块化设计思想,进行了软件设计,通过对系统主程序的流程进行分析,编写了系统程序,同时说明了各模块的功能,利用软件仿真、调试和硬件调试,最终设计出了具有报警功能的温控器,基本实现了其要求。8.2设计体会通过本次的智能化设计,不论是理论方面,还是实践方面,我都获益匪浅,归纳起来,有以下几个方面的收获:(1)学习与掌握了STC89C52单片机的基本原理与其应用,对它的各种硬件接口与软件设计方法有更加深入的认识和理解。尤其是对串口通信有了更深的了解。(2)学会了基本的C语言编程,掌握了用C语言编程控制51单片机的方法以与它的具体程序实现步骤;(3)进一步巩固了VB知识,学会了用VB界面对电路系统的实时测控。(4)对利用万用表检测、调试硬件电路的方法有了非常大的认识与掌握,对利用万用表判断电路导通截止的方法也有了充分的掌握;(5)在这次设计中,充分认识到与人协作和与人交流是非常重要的,对电路各个板块有些不熟悉,但在遇到问题相互讨论交流才使问题能得以解决。8.3设计改进与建议由于时间、条件和个人水平与经验所限,本次设计还有许多不足,需要改进。下位机设定的目标温度不能发送给上位机显示,这在远程测控系统中是一个很大的不足,另外,上位机VB程序的延时与下位机接收之间的问题也有待改善,这些不足希望能在以后的学习中改进。9.辞在老师的辛勤指导下,在实验室同学的友好帮助下,我积极参与讨论和思考,完成本此毕业设计,此次设计,使我受益匪浅。我很珍惜有这次毕业设计的机会,感电气信息学院各位老师的帮助。在本次设计中,我要特别感海川老师与研究生师兄对我的指导,也要感同学们对我的帮助,有了你们的帮助,我才得以顺利完成设计。10、参考文献[1]毅刚、喜元.单片机原理与应用[M].:高等教育,2003[2]海兵、敏.PROTEL电路设计实例与分析[M].:人民邮电,2005[3]春葆、金晶.C语言程序设计辅导[M].:清华大学,2007[4]将新、华军.单片机程序设计与应用(第三版)[M].:电子工业,2006[5]鲁捷、焦振宇.PROTEL2004电路设计[M].:清华大学,2006[6]康光华、大钦.电子技术基础模拟部分(第四版)[M].高等教育.1987[7]自美主编.电子线路设计.实验.测试(第二版)[M].华中理工大学,2005[8]康光华、邹寿彬.电子技术基础数字部分(第五版)[M].:高等教育,2006[9]维成、勇.微机原理与接口技术[M].华中科技大学,2009[10]徐凤霞,成安.STC89C52单片机温度控制系统[J].大学学报,2004,(01)[11]开生,郭国法.MCS-51单片机温度控制系统的设计[J].微计算机信息,2005,(07)[12]萍.单片机温度控制系统的设计与实现[J].师专学报,1999,(06)[13]马明建.数据采集与处理技术[M].交通大学,2005.9,(02)[14]龙汉,安才,高占国.MCS-51单片机原理与应用[M].,2004.10[15]龚红军.单片机温度控制系统[J].电气时代,2002,(10)附录一:相关设计图与源程序1.系统的原理电路图2.系统PCB图3.源程序代码下位机程序:#include<reg51.h>#include<intrins.h>#defineuncharunsignedchar#defineunintunsignedint#definenop()_nop_()sbitDQ=P3^6;sbit speaker=P3^3;unsignedchardispbitcode[8]={0xf7,0xfb,0xfd,0xfe/*0xfe,0xef,0xdf,0xbf,0x7f*/};unsignedchardispcode[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};unchart=0;uninttemper;unchara1,a2,a3,a4; voiddisplys(void);voiddelay1ms(void);voiddelay_10ms(void);voidTempDelay(uncharus);voidwrite_byte(unchardate);uncharread_byte();voidget_tem();voidAlarm123();voidInitial_();voidT_temp();voidR_temp();unintnum[]={0,0,5,2};unintnum1[]={0,0,0,0};unints=0; unintz=0; unintq=0; unintmark=4;unintstart=0; unsignedcharx,y;voidreset(){ uncharst=1; DQ=1; nop(); nop(); while(st) {DQ=0; TempDelay(112); DQ=1; TempDelay(8);//56us if(DQ==1) st=1; else st=0; TempDelay(74); }}voidwrite_byte(unchardate){ unchari,temp; DQ=1; nop();nop(); for(i=8;i>0;i--) { temp=date&0x01; DQ=0; TempDelay(1); if(temp==1) DQ=1; TempDelay(5); DQ=1; date=date>>1; }}uncharread_byte(){ unchari,date; staticbitj; for(i=8;i>0;i--) { date=date>>1; DQ=1; nop();nop(); DQ=0; nop();nop();nop();nop();nop();nop(); DQ=1; nop();nop();nop();nop(); j=DQ; if(j==1) date=date|0x80; TempDelay(2); } return(date);}voidget_tem(){ unchartem1,tem2,tempnum; floataaa; reset(); write_byte(0xCC); write_byte(0x44); for(tempnum=100;tempnum>0;tempnum--); num1[0]=a4; num1[1]=a3; num1[2]=a2; num1[3]=a1; reset(); write_byte(0xCC); write_byte(0xBE); tem1=read_byte(); tem2=read_byte(); aaa=(tem2*256+tem1)*6.25; temper=(int)aaa; a1=temper/1000; a2=temper%1000/100; a3=temper%100/10; a4=temper%10;}voidTempDelay(uncharus){ while(us--);}voiddelay_10ms(void){unsignedchari,j;for(i=0;i>0;i--)for(j=248;j>0;j--);}voidGetch(){ P1=P1|0xE2;P3=0x7b;y=P1&0xe2;if(y!=0Xe2){delay_10ms();if(y!=0Xe2) {z=1; P3=0XFB;x=P1&0xe2; if(x!=0xe2) q=0; else { P3=0X7F; x=P1&0xe2; if(x!=0xe2) q=1; } } }elseif(z==1){ z=0; if(q==0) {switch(x){case0xe0:if(num[s]==9){num[s]=0;break;}num[s]=num[s]+1;break;case0xc2:if(num[s]==0){num[s]=9;break;}num[s]=num[s]-1;break;case0xa2:if(s<3)++s,mark=s;break;case0x62:if(s>0)--s,mark=s;break; } } elseif(q==1) {switch(x){case0xe0:s=0;mark=4;break;case0xc2:s=0;mark=0;break; case0xa2:break;case0x62:start=!start;s=0;mark=4;break;} } }}voiddisplys(){if(start==1){chark;charl;switch(mark) { case4:for(k=0;k<4;k++){ P0=dispbitcode[k]; P2=dispcode[num1[k]];delay1ms(); if(k==2) P2&=0x7f;delay1ms(); P0=0xff; P2=0xc6;P0=0xdf;delay1ms(); P0=0xff;delay1ms();} break; case0: for(l=0;l<90;l++) { Getch(); for(k=0;k<4;k++) { if(k==0)k++; P0=dispbitcode[k]; P2=dispcode[num[k]]; delay1ms(); if(k==2) P2&=0x7f;delay1ms(); P0=0xff; P2=0xc6; P0=0xdf; delay1ms(); P0=0xff; delay1ms();}} for(l=0;l<90;l++) { Getch(); for(k=0;k<4;k++) { P0=dispbitcode[k]; P2=dispcode[num[k]]; delay1ms(); if(k==2) P2&=0x7f; delay1ms(); P0=0xff; P2=0xc6; P0=0xdf; delay1ms(); P0=0xff; delay1ms(); } } break; case1: for(l=0;l<90;l++) { Getch(); for(k=0;k<4;k++) { if(k==1) k++; P0=dispbitcode[k]; P2=dispcode[num[k]]; delay1ms(); if(k==2) P2&=0x7f; delay1ms(); P0=0xff; P2=0xc6; P0=0xdf; delay1ms(); P0=0xff; delay1ms(); } } for(l=0;l<90;l++) { Getch(); for(k=0;k<4;k++) { P0=dispbitcode[k]; P2=dispcode[num[k]]; delay1ms(); if(k==2) P2&=0x7f; delay1ms(); P0=0xff; P2=0xc6; P0=0xdf; delay1ms(); P0=0xff; delay1ms(); } } break; case2: for(l=0;l<90;l++) { Getch();for(k=0;k<4;k++){ if(k==2) k++; P0=dispbitcode[k]; P2=dispcode[num[k]]; delay1ms(); delay1ms(); P0=0xff; P2=0xc6; P0=0xdf; delay1ms(); P0=0xff; delay1ms(); } } for(l=0;l<90;l++) { Getch(); for(k=0;k<4;k++) { P0=dispbitcode[k]; P2=dispcode[num[k]]; delay1ms(); if(k==2) P2&=0x7f; delay1ms(); P0=0xff; P2=0xc6; P0=0xdf; delay1ms(); P0=0xff; delay1ms(); } } break; case3: for(l=0;l<90;l++) { Getch(); for(k=0;k<3;k++) { P0=dispbitcode[k]; P2=dispcode[num[k]]; delay1ms(); if(k==2) P2&=0x7f;delay1ms(); P0=0xff; P2=0xc6; P0=0xdf; delay1ms(); P0=0xff; delay1ms(); } } for(l=0;l<90;l++) { Getch(); for(k=0;k<4;k++) { P0=dispbitcode[k]; P2=dispcode[num[k]]; delay1ms(); if(k==2) P2&=0x7f; delay1ms(); P0=0xff; P2=0xc6;P0=0xdf; delay1ms(); P0=0xff; delay1ms(); } } break; } }}voiddelay1ms(){ unsignedchari; for(i=124;i>0;i--);}voidAlarm123(){floatm,n;m=num[0]*0.01+num[1]*0.1+num[2]*1+num[3]*10;n=num1[0]*0.01+num1[1]*0.1+num1[2]*1+num1[3]*10;if(start==1){if((n<m-2)||(n>m+2)) speaker=0; else speaker=1;}}voidmain(void){Initial_();while(1){Getch();get_tem();displys();Alarm123(); R_temp(); T_temp();}}voidInitial_(){EA=1;ES=1;ET1=1;SCON=0x50;TMOD=0x20;PCON&=0xef; TH1=0xfd;TL1=0xfd;TR1=1;}voidT_temp(){unchark;if(start==1) { SBUF=0x0a; while(!TI); TI=0; for(k=0;k<4;k++) { SBUF=num1[k]; while(!TI); TI=0; } }}voidR_temp(){unchark=0;do{if(RI) { num[k]=SBUF; RI=0; k++; t=1; if(k==4) { t=0; ES=0; } }} while(t);}上位机程序:OptionExplicitPrivateDeclareSubSleepLib"kernel32"(ByValdwMillisecondsAsLong)Dimshu1$,quanshu1$,shiwei$,gewei$,xiaoshu1$,xiaoshu2$,quanshu2$,quanshu3AsInteger,wenduzhiAsDouble,nAsDoublePrivateSubCommand1_Click()'########################################'上位机向下位机发送数据'########################################Dimshu2%,yiwei%,erwei%,sanwei%,siwei%Dimoutbyte0(0)AsByte,outbyte1(0)AsByte,outbyte2(0)AsByte,outbyte3(0)AsByten=Val(Text1.Text)shu2=n*100yiwei=shu2Mod10erwei=(shu2\10)Mod10sanwei=(shu2\100)Mod10siwei=shu2\1000outbyte0(0)=CByte(yiwei)outbyte1(0)=CByte(erwei)outbyte2(0)=CByte(sanwei)outbyte3(0)=CByte(siwei)MSComm1.OutBufferCount=0MSComm1.Output=outbyte0Sleep(30)MSComm1.Output=outbyte1Sleep(30)MSComm1.Output=outbyte2Sleep(30)MSComm1.Output=outbyte3MsgBox"数据发送成功"Text1=Format$(Val(Text1),"#0.00")&"℃"'显示格式If(n<Val(Text2.Text)-2)Or(n>Val(Text2.Text)+2)ThenText2.ForeColor=RGB(255,0,0)ElseText2.ForeColor=RGB(0,0,0)EndIfEndSubPrivateSubCommand5_Click()EndEndSubPrivateSubCommand6_Click()'########################################'串口使能'########################################MSComm1mPort=Combo1.TextMSComm1.PortOpen=TrueMSComm1.Settings="9600,n,8,1"MSComm1.InputLen=1MSComm1.RThreshold=1Command6.Enabled=FalseText1=Format$(25,"#0.00")&"℃"'显示格式EndSubPrivateSubForm_Load()'########################################'串行端口配置设置'########################################'MSComm1mPort=1'########################################Combo1.AddItem"1"Combo1.AddItem"2"Combo1.AddItem"3"Combo1.Text=1EndSubPrivateSubMSComm1_OnComm()'########################################'接收下位机的数据'########################################DimindataAsVariantDimarr(0)AsByte'Dimshu1$,quanshu1$,gewei$,xiaoshu1$,xiaoshu2$,quanshu2$,quanshu3AsInteger,dianyazhiAsDoubleindata=MSComm1.Input'MSComm1.InBufferCount=0arr(0)=AscB(indata)'Printarr(0)Ifarr(0)=10Thenshu1=""Elseshu1=shu1&Str$(arr(0))IfLen(shu1)=8Thenquanshu1=shu1'Printquanshu1shiwei=Mid$(quanshu1,8,1)gewei=Mid$(quanshu1,6,1)xiaoshu1=Mid$(quanshu1,4,1)xiaoshu2=Mid$(quanshu1,2,1)quanshu2=shiwei&gewei&xiaoshu1&xiaoshu2quanshu3=Val(quanshu2)wenduzhi=quanshu3/100Text2.Text=Format$(wenduzhi,"#0.00")&"℃"'Printdiantazhishu1=""EndIfEndIfEndSubPrivateSubText1_Click()Text1=""EndSubPrivateSubText2_Change()If(n<Val(Text2.Text)-2)Or(n>Val(Text2.Text)+2)ThenText2.ForeColor=RGB(255,0,0)ElseText2.ForeColor=RGB(0,0,0)EndIfEndSub附录二:外文资料翻译译文:DS-18B20数字温度传感器DS-18B20数字温度传感器,该产品采用美国DALLAS公司生产的DS18B20可组网数字温度传感器芯片封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。1、技术性能描述:1.1独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。1.2测温围-55℃~+125℃,固有测温分辨率0.5℃。1.3支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定,实现多点测温1.4工作电源:3~5V/DC1.5在使用中不需要任何外围元件1.6测量结果以9~12位数字量方式串行传送1.7不锈钢保护管直径Φ61.8适用于DN15~25,DN40~DN250各种介质工业管道和狭小空间设备测温1.9标准安装螺纹M10X1,M12X1.5,G1/2任选1.10PVC电缆直接出线或德式球型接线盒出线,便于与其它电器设备连接。2、应用围:2.1该产品适用于冷冻库,粮仓,储罐,电讯机房,电力机房,电缆线槽等测温和控制领域2.2轴瓦,缸体,纺机,空调,等狭小空间工业设备测温和控制。2.3汽车空调、冰箱、冷柜、以与中低温干燥箱等。2.4供热/制冷管道热量计量,中央空调分户热能计量和工业领域测温和控制3、产品型号与规格:型号测温围安装螺纹电缆长度适用管道TS-18B20-55~125无1.5mTS-18B20A-55~125M10X11.5mDN15~25TS-18B20B-55~1251/2G接线盒DN40~604、接线说明:特点独特的一线接口,只需要一条口线通信多点能力,简化了分布式温度传感应用无需外部元件可用数据总线供电,电压围为3.0V至5.5V无需备用电源测量温度围为-55℃至+125℃。华氏相当于是-67到257华氏度-10℃至+温度传感器可编程的分辨率为9~12位温度转换为12位数字格式最大值为750毫秒用户可定义的非易失性温度报警设置应用围包括恒温控制,工业系统,消费电子产品温度计,或任何热敏感系统描述该DS18B20的数字温度计提供9至12位(可编程设备温度读数。信息被发送到/从DS18B20通过1线接口,所以中央微处理器与DS18B20只有一个一条口线连接。为读写以与温度转换可以从数据线本身获得能量,不需要外接电源。因为每一个DS18B20的包含一个独特的序号,多个ds18b20s可以同时存在于一条总线。这使得温度传感器放置在许多不同的地方。它的用途很多,包括空调环境控制,感测建筑物温设备或机器,并进行过程监测和控制。DS18B20部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。该装置信号线高的时候,部电容器储存能量通由1线通信线路给片子供电,而且在低电平期间为片子供电直至下一个高电平的到来重新充电。DS18B20的电源也可以从外部3V-5.5V的电压得到。DS18B20采用一线通信接口。因为一线通信接口,必须在先完成ROM设定,否则记忆和控制功能将无法使用。主要首先提供以下功能命令之一:1、读ROM2、ROM匹配3、搜索ROM4、跳过ROM5、报警检查。这些指令操作作用在没有一个器件的64位光刻ROM序列号,可以在挂在一线上多个器件选定某一个器件,同时,总线也可以知道总线上挂有多少,什么样的设备。若指令成功地使DS18B20完成温度测量,数据存储在DS18B20的存储器。一个控制功能指挥指示DS18B20的演出测温。测量结果将被放置在DS18B20存中,并可以让阅读发出记忆功能的指挥,阅读容的片上存储器。温度报警触发器TH和TL都有一字节EEPROM的数据。如果DS18B20不使用报警检查指令,这些寄存器可作为一般的用户记忆用途。在片上还载有配置字节以理想的解决温度数字转换。写TH,TL指令以与配置字节利用一个记忆功能的指令完成。通过缓存器读寄存器。所有数据的读,写都是从最低位开始。DS18B20有4个主要的数据部件:(1)光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不一样,这样就可以实现一根总线上挂接多个DS18B20的目的。(2)DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以0.0625℃DS18B20的存储器包括高速暂存器RAM和可电擦除RAM,可电擦除RAM又包括温度触发器TH和TL,以与一个配置寄存器。存储器能完整的确定一线端口的通讯,数字开始用写寄存器的命令写进寄存器,接着也可以用读寄存器的命令来确认这些数字。当确认以后就可以用复制寄存器的命令来将这些数字转移到可电擦除RAM中。当修改过寄存器中的数时,这个过程能确保数字的完整性。高速暂存器RAM是由8个字节的存储器组成;第一和第二个字节是温度的显示位。第三和第四个字节是复制TH和TL,同时第三和第四个字节的数字可以更新;第五个字节是复制配置寄存器,同时第五个字节的数字可以更新;六、七、八,三个字节是计算机自身使用。用读寄存器的命令能读出第九个字节,这个字节是对前面的八个字节进行校验。64位光刻ROM的前8位是DS18B20的自身代码,接下来的48位为连续的数字代码,最后的8位是对前56位的CRC校验。64-位的光刻ROM又包括5个ROM的功能命令:读ROM,匹配ROM,跳跃ROM,查找ROM和报警查找。DS18B20可以使用外部电源VDD,也可以使用部的寄生电源。当VDD端口接3.0V—5.5V的电压时是使用外部电源;当VDD端口接地时使用了部的寄生电源。无论是部寄生电源还是外部供电,I/O口线要接5KΩ左右的上拉电阻。配置寄存器是配置不同的位数来确定温度和数字的转化。R1,R0是温度的决定位,由R1,R0的不同组合可以配置为9位,10位,11位,12位的温度显示。这样就可以知道不同的温度转化位所对应的转化时间,四种配置的分辨率分别为0.5℃,0.25℃,0.125℃DS18B20在出厂时以配置为12位,读取温度时共读取16位,所以把后11位的2进制转化为10进制后在乘以0.0625便为所测的温度,还需要判断正负。前5个数字为符号位,当前5位为1时,读取的温度为负数;当前5位为0时,读取的温度为正数。16位数字摆放是从低位到高位。指令约定代码操作说明:温度转换44H启动DS18B20进行温度转换读暂存器BEH读暂存器9个字节容写暂存器4EH将数据写入暂存器的TH、TL字节复制暂存器48H把暂存器的TH、TL字节写到E2RAM中重新调E2RAMB8H把E2RAM中的TH、TL字节写到暂存器TH、TL字节,读电源供电方式B4H启动DS18B20发送电源供电方式的信号给主CPUDS18B20的初始化。(1)先将数据线置高电平“1”。(2)延时(该时间要求的不是很严格,但是尽可能的短一点)(3)数据线拉到低电平“0”。(4)延时750微秒(该时间的时间围可以从480到960微秒)。(5)数据线拉到高电平“1”。(6)延时等待(如果初始化成功则在15到60毫秒时间之产生一个由DS18B20所返回的低电平“0”。据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制)。(7)若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。(8)将数据线再次拉高到高电平“1”后结束。原文:TheDS-18B20numbertemperaturespreadsafeelingmachineTheDS-18B20numbertemperaturespreadsafeelingmachine,theproductadoption'sUnitedStates'DALLAScompanyproducesofDS18B20cansetnetnumberthetemperaturespreadthefeelingmachinechiptopackbutbecomeandhavetobeartowhettobeartotouch,thephysicalvolumeissmall,useconvenience,sealtopackaform
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 私人田地买卖合同协议书
- 混凝土工合同分包协议书
- 空压机出租租赁合同范本
- 食堂托管承包协议书范本
- 瓷砖墙改造租房合同范本
- 申请签订意向协议书范本
- 机械技术学徒培训协议书
- 电梯广告发布协议书范本
- 独家合作分发协议书范本
- 船舶清洁合同协议书范本
- 胡寿松 自动控制原理(第7版)笔记和课后习题(含考研真题)及答案详解(第七版-上册)
- 2023年重庆市大渡口区八桥镇社区工作人员考试模拟题及答案
- GB/T 19466.1-2004塑料差示扫描量热法(DSC)第1部分:通则
- GB/T 18606-2001气相色谱-质谱法测定沉积物和原油中生物标志物
- GB 2811-1989安全帽
- 《中国近现代史纲要》 课件 第十一章 中国特色社会主义进入新时代
- 金字塔原理(完整版)
- “扬子石化杯”第36届中国化学奥林匹克(初赛)选拔赛暨2022年江苏赛区复赛试题及答案
- 公共经济学ppt课件(完整版)
- 浙江省引进人才居住证申请表
- DB62∕T 4134-2020 高速公路服务区设计规范
评论
0/150
提交评论