76范文网为您提供各类范文参考!
当前位置:76范文网 > 知识宝典 > 免费论文 > 基于单片机的数字采控器设计毕业论文

基于单片机的数字采控器设计毕业论文

来源:76范文网 | 时间:2019-03-28 01:40:05 | 移动端:基于单片机的数字采控器设计毕业论文

基于单片机的数字采控器设计毕业论文 本文简介:

毕业设计说明书基于单片机的数字采控器设计专业电气工程及其自动化学生姓名班级学号指导教师完成日期20XX年X月X日基于单片机的数字采控器设计摘要:数字采集系统简称DAS(DigitalAcquisitionSystem),是指将温度、压力、流量、位移等模拟量进行采集、量化转换成数字量后,以便由计算机进

基于单片机的数字采控器设计毕业论文 本文内容:

毕业设计说明书
基于单片机的数字采控器
设计
专业
电气工程及其自动化
学生姓名
班级
学号
指导教师
完成日期
20XX年X月X日
基于单片机的数字采控器设计

要:数字采集系统简称DAS(Digital
Acquisition
System),是指将温度、压力、流量、位移等模拟量进行采集、量化转换成数字量后,以便由计算机进行存储、处理、显示或打印的装置。数字采集系统是采集系统中最常见的类型,随着单片机技术的飞速发展,通过单片机对被控对象进行控制日益成为今后的一个重要发展的方向。人们需要一种应用范围广、性价比高的数据采集系统。
本次设计主要采集对象为数字量,通过单片机采集输入端的数字量去控制输出端继电器的动作。本设计包括两种控制方式:一种是本地控制;另一种是RS-485远程控制。两种设计同时实现以下功能:本机地址设置、波特率设置、继电器控制。通过RS-485通信时利用上位机控制继电器动作,并进行界面显示。
该设计是以STC89C52单片机为控制核心,选用RS-485通信技术进行远程控制。即通过串口通信实现单片机与PC机之间的通信,完成了单片机的多通道数据采集控制系统的设计。
关键词:数字采集器;单片机;
RS-485
Design
of
Microcontroller
-
Dased
Digital
Acquisition
Controller
Abstract:
Data
Acquisition
System
referred
to
DAS
(Data
Acquisition
System),
refers
to
the
temperature,
pressure,
flow,
displacement,
such
as
simulation
of
a
collection,
quantitative,
converted
into
digital,
so
as
to
provide
computer
storage,
processing,
display
or
print
device.
Digital
Acquisition
System
Acquisition
System
is
the
most
common
type,
with
the
rapid
development
of
SCM
technology,
the
object
through
the
MCU
control
has
increasingly
become
an
important
future
development
direction.
So
people
require
a
broad
scope
of
application,
high
reliability
and
low-cost
data
acquisition
system.
The
design
is
primarily
a
collection
of
objects
for
digital,
SCM
Acquisition
digital
input
to
control
the
action
of
output
relay.
This
design
includes
two
control
methods:
One
is
Local
control;
another
is
RS-485
remote
control.
The
two
designs
to
achieve
the
following
functions:
Local
address
is
set,
the
baud
rate
settings,
relay
control.
PC
control
relay
RS-485
and
interface
display.
The
design
is
based
on
STC89C52
microcontroller
as
the
core,
Selection
of
RS-485
communication
technology
for
remote
control.
Communication
between
the
MCU
and
PC
through
the
serial
communication,
the
complete
single-chip
multi-hannel
data
acquisition
and
control
system
design.
Key
Words:
Data
acquisition;
MCU;
Communication;
RS-485
目录
1
概述
1
1.1
课题研究的背景
1
1.2
课题研究的意义
1
1.3
课题研究的内容
2
2
系统方案设计
3
2.1
系统的设计要求
3
2.2
总体方案设计论证及选择
3
2.2.1
总体方案设计
3
2.2.2
单片机选型
3
2.2.3
数字量信号采集方案选择
7
2.2.4
数字量输入电路
7
2.2.5
数字量输出电路方案选择
9
2.2.6
通信电路方案选择
11
2.3
硬件开发环境
12
2.4
软件开发环境
13
3
硬件电路设计
14
3.1
系统硬件电路原理结构框图
14
3.2
系统模块电路设计
14
3.2.1
单片机最小系统设计
14
3.2.2
系统电源电路设计
15
3.2.3
系统数字量输入电路设计
16
3.2.4
系统数字量输出电路设计
17
3.2.5
RS-485通信电路设计
18
3.2.6
通信波特率和本机地址设置电路设计
18
4
软件设计
21
4.1
系统软件设计
21
5
系统调试
26
5.1
硬件调试
26
5.2
软件调试
27
6
结束语
36
参考文献
37
致谢
38
附录
39

录1
设计图纸
39

录2
元器件清单
42

录3
程序清单
43
基于单片机的数字采控器设计
1
概述
在现实中要通过计算机对现实世界中的信息进行处理和显示,首先必须将计算机和现实世界联系起来,这需要将真实世界中的各种信号(称为模拟信号)转化为计算机可以识别、存储的信号(称为数字信号),这一过程即是数据采集。数据采集技术是以前端的模拟信号处理、模拟信号数字化、数字信号处理和计算机控制技术等高科技为基础而形成的一门综合技术。它在许多领域得到了广泛的应用。数字技术促进了上述这些领域的发展,而反过来又对数据采集系统提出了愈来愈高的要求。一个大型的数据采集系统由以下几个部分组成:数据测量、数据采集、数据传送、数据存储、数据处理、数据分析和数据显示等。
简而言之,数字采集技术的发展离不开计算机控制技术,网络化测量、采集和控制是其发展的必然趋势。
1.1
课题研究的背景
在计算机广泛应用的今天,数据采集在多个领域有着十分重要的应用。它是计算机与外部物理世界连接的桥梁。利用串行或红外通信方式,实现对移动数据采集器的应用软件升级,通过制定上位机(PC)与移动数据采集器的通信协议,实现两者之间阻塞式通信交互过程。在工业、工程、生产车间等部门,尤其是在对信息实时性能要求较高或者恶劣的数据采集环境中更突出其应用的必要性。例如:在工业生产和科学技术研究的各行业中,常常利用PC或工控机对各种数据进行采集。这其中有很多地方需要对各种数据采集,如液位、温度、压力、频率等。现在常用的采集方式是通过数据采集卡,常用的有A/D卡以及232、422、485等总线板卡。卫星数据采集系统是利用航天遥测、遥控、遥监等技术,对航天器远地点进行各种监测,并根据需求进行自动采集,经过卫星床书到数据中心处理后,送给用户使用的应用系统。
1.2
课题研究的意义
随着科学技术的发展和社会的进步,现场监控系统已越来越广泛地应用于金融、交通、商业、工农业生产等领域。数字采控器作为现场监控系统中数字量采集和控制的主要设备,其性能对整个系统的现场监控工作的稳定性具有十分重要的作用。因此,研制结构简单、性能稳定、可靠性高且成本低廉的新型数字采控器具有十分重要的意义。
在现实中要通过计算机对现实世界中的信息进行处理和显示,首先必须将计算机和现实世界联系起来,这需要将真实世界中的各种信号(称为模拟信号)转化为计算机可以识别、存储的信号(称为数字信号),这一过程即是数据采集。数据采集技术是以前端的模拟信号处理、模拟信号数字化、数字信号处理和计算机控制技术等高科技为基础而形成的一门综合技术。它在许多领域得到了广泛的应用。数字技术促进了上述这些领域的发展,而反过来又对数据采集系统提出了愈来愈高的要求。一个大型的数据采集系统由以下几个部分组成:数据测量、数据采集、数据传送、数据存储、数据处理、数据分析和数据显示等。
总而言之,数据采集技术的发展离不开传感器和计算机控制技术、网络化测量。采集和控制室器发展的必然趋势。
1.3
课题研究的内容
本论文主要对基于单片机的数字采集控制系统的结构和功能进行了分析及设计。分别从硬件和软件结构上进行了研究。以STC89C52为控制核心,通过RS-485总线的串口通信实现单片机与PC机之间的通信。进行了本机地址和波特率的设置。
本课题主要研究内容如下:
A.
根据课题要求,确定了系统硬件结构,完成了系统方案设计,。
B.
根据电路功能要求,完成硬件电路的设计。
C.
完成软件部分的设计,首先设计流程图,其次进行编程。
D.
进行软件仿真,并绘制原理图和PCB图。
E.
对实物进行硬件的调试。2
系统方案设计
2.1
系统的设计要求
A.
数字量输入路数:16路
B.
数字量输出路数及负载规格:16路,220V/5A或24V/10A
C.
通信:RS-485通信
D.
附加功能:地址设置——0~255;波特率设置:2400/4800/9600/19200
2.2
总体方案设计论证及选择
2.2.1
总体方案设计
本数字采集控制器硬件是以单片机为核心的,只要是实现通信、波特率设置、本机地址设置、16路数字量采集和16路数字量控制等功能。其系统的硬件组成框图如图2-1所示。
图2-1
系统整体硬件结构框图
本系统主要是由微控制器主控系统、通信接口、通信波特率和本机地址设置、16路数字输入电路、16路数字量输出电路、单片机最小系统和系统电源等组成。
2.2.2
单片机选型
A.
方案一:PIC单片机
由美国Micro
chip公司推出的PIC单片机系列产品,首先采用了RISG结构的嵌入式微控制器,其高速度、低电压、大电流LCD驱动能力和低价位OTP技术等都体现出单片机产业的新趋势。PIC
8位单片机具有指令少、执行速度快等优点,其只要原因是PIC系列单片机在结构上与其他单片机不同。该系列单片机引入了原用于小型计算机的双总线和两级指令流水结构。这种结构与一般采用CLSC(复杂指令集计算机)的单片机在结构上是有不同的。
PIC系列的单片机是一种用来开发去控制外围设备的集成电路(IC)。一种具有分散作用的(多任务)功能的CPU。与人类相比,大脑就是CPU,PIC共享的部分相当于人的神经系统。PIC单片机是一个小的计算机,PIC单片机有计算功能和记忆内存像CPU并由软件控制运行。然而,处理能力一存储器容量却很有限,这取决于PIC的类型。但是它们的最高操作频率大约都在20MHz左右,存储器容量用做写程序的大约1~4K字节。
B.
方案二:AVR单片机
AVR单片机是ATMEL公司1997年推出的精简指令集(RISC)单片机系列。ATMEL公司通过AVR把RISC技术带到了8位单片机世界里,这种全新的结构带来了很多优势。该系列的程序存储器是在片内的Flash存储器,可以反复修改上千次,这对新产品开发、产品升级都是很方便的。单片机的指令基本上都是单个晶振周期,能够到1MIPS/MHz的性能。该系列单片机针对应用C语言编程做了优化。这一系列单片机好多型号都是宽电压工作的,同时有各种睡眠模式,有利于降低系统功耗。再加上内部的振荡器、看门狗、上电复位、A/D输入、PWM输出等功能,它也可以称为“零外设”的单片机,具有片上系统的锥形。因此,AVR单片机适用于很多领域,表现出卓越性能。
C.
方案三:STC单片机
STC系列单片机价格最便宜(从性价比方便讲)功能多,抗干扰能力最强,EEPROM大,串口编程很方便,出厂时程序引导区就已经加密,并且STC解密的市面价格在1.5w~2.5w之间,可见解密难度大,在一定程度上保护了单片机工程师的利益和产品开发商的利益。生产时就已经考虑到与传统51的兼容问题,兼容做的很好,又增加了许多功能。STC89C52单片机学习版功能强大,具有报警、跑马灯、串行通信(MAX485)等十七种功能,供学习者你学习开发使用。
综上所述,由于PIC单片机解密容易,单片机价格较贵,性价比不高。而且PIC系列的单片机指令数量比较少。而AVR系列的单片机没有类似累加器A的结构,它只要是通过R16~R31寄存器来实现A的功能。在AVR中,没有类似51系列单片机的数据指针DPTR。STC系列单片机价格最便宜,性价比比较高、功能多、抗干扰能力最强、EEPROM大、串口编程很方便,出厂时程序引导区就已经加密,并且STC解密难度大,生产时已经考虑到与传统51单片机的兼容性问题,又增加了许多复位功能,所以本次设计选STC89C52作为控制核心。
STC89C52单片机概述:
STC89C52是低功耗、高性能CMOS
8位的微控制器,具有8K在系统可编程Flash存储器,片内含4KB的可反复擦写的程序存储器和128B的随机存取数据存储器(RAM),器件采用Atmel公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内配置通用8位中央处理器(CPU)和Flash存储单元,功能强大的STC89C52单片机可灵活应用于各种控制领域。
A)主要性能参数
a.
与MCS-51产品指令系统完全兼容
b.
4KB可反复擦写Flash闪速存储器
c.
1000次擦写周期
d.
时钟频率范围:0Hz—24MHz
e.
3级加密程序存储器
f.
128*8B内部RAM
g.
32个可编程I/O接口线
h.
2个16位定时/计数器
i.
6个中断源
j.
可编程串行UART通道
k.
低功耗空闲和掉电模式
B)功能特性概述
STC89C52提供以下标准功能:8KB的Flash闪速存储器,512B内部RAM,32个I/O接口线,三个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,STC89C52可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM、定时/计数器、串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其他所有部件工作直到下一个硬件复位。最高运作频率35MHz,6T/12T可选。
C)引脚性能概述
STC89C52芯片引脚图如图2-2所示
图2-2
STC89C52芯片引脚图
VCC:供电电压
GND:接地
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0
口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为STC89C52的一些特殊功能口,如下表所示:
P3.0(RXD):串行输入口
P3.1(TXD):串行输出口
P3.2(INT0(________)):外部中断0
P3.3(INT1(________)):外部中断1
P3.4(T0):记时器0外部输入
P3.5(T1):记时器1外部输入
P3.6(WR(______)):外部数据存储器写选通
P3.7(RD(_______)):外部数据存储器读选通
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:复位输入,当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时,
ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
PSEN(___________):外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次PSEN(___________)有效。但在访问外部数据存储器时,这两次有效的PSEN(___________)信号将不出现。
:当保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,将内部锁定为RESET;当端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
2.2.3
数字量信号采集方案选择
A.
方案一:采用A/D转换器
采用A/D转换电路,先采集模拟量,再通过A/D转换电路,将采集到的模拟量转换成所需的数字量。A/D转换就是模数转换,顾名思义,就是将模拟信号转换成数字信号。
数字采集电路一般由传感器、模拟信号调理电路、采样保持电路、A/D转换芯片、微处理器组成。结构框图如图2-3所示
图2-3
数据采集系统的基本组成框图
B.
方案二:采集开关量
本设计课题是数字采控器,只需要采集数字量,由于拨码开关只有两种状态:0和1,皆是数字量。当开关拨于“ON”时,开关处于接通状态,即值为1;当拨码开关拨在“OFF”处时,开关处于断开状态,即值为0。
综上所述,由于第二个方案简单、易实现,顾本设计选择方案二。
2.2.4
数字量输入电路
A.
方案一:串行输入方式
采用两级74HC165级联,可组成一个并行输入、串行输出的16位移位寄存器。
74HC165一款高速CMOS器件,74HC165遵循JEDEC标准no.7A。74HC165引脚兼容低功耗肖特基TTL(LSTTL)系列。74HC165是8位并行输入/串行输出的移位寄存器,可在末级得到互斥的串行输出(Q0和Q7),当并行读取(PL)输入为低时,从D0到D7口输入的并行数据将被异步地读取进寄存器内。而当PL为高时,数据将从DS输入端串行进入寄存器,在每个时钟脉冲的上升沿向右移移位(Q0→Q1→Q2→Q3等等)。利用这种特性,只要把Q7输出绑定到下一级的DS输入,即可实现并转串扩展。74HC165的时钟输入是一个“控或”构,允许其中一个输入端作为低有效时钟使能(CE)输入。CP和CE的引脚分配是独立的,并且在必要时为了布线的方便可以互换。只有在CP为高电平时,才允许CE由低转高。在PL上升沿来临之前,不论是CP还是CE,都应当置高,以防止数据的PL的活动状态发生位移。
B.
方案二:并行输入方式
选用74LS245数据总线收发器。74LS245属于并行通信,其有16个双向传输的数据端,即A1~A8和B1~B8。另有两个控制端,即允许段G和方向控制端DIR。G用于允许该收发器的操作,DIR用于控制数据传送的方向(A→B或B→A)。
若G信号无效(为高电平),则无论DIR为何种电平,下面两个“与门”的输出均为低电平,从而使两个方向的三态门的输出均为高阻态,收发器处于“隔开”状态,即两个方向上的数据传送均不能进行。若信号有效(为低电平),则可在某一方向上进行数据传送,到底在哪个方向上进行传送,则由方向控制端DIR的逻辑电平来决定。74LS245通信常用于数据的双向传送、缓冲与驱动。
综上所述,74HC165
是串行输入、而74LS245属于并行输入。由于并行的占用I/O
口较多,若直接用单片机的并行I/O口是肯定不够的,而串行输入可以扩张I/O接口,所以选择方案一。
74HC165简介:
A)主要电特性的典型值见表2-1
表2-1
74HC165电特性的典型值
型号

54/74HC165
26MHz
210Mw
54/74LS165
35MHz
90mW
当移位/置入控制端(SH/)为低电平时,并行数据(A~H)被置入寄存器,而时钟(CLK、CLK、NH)及串行数据(SER)均无关。当SH/为高电平时,并行数功能被禁止。CLK和CLK、INH在功能上是等价的,可以交换使用。当CLK和CLK、INH有一个为低电平并且SH/为高电平时,另一个时钟可以输入。当CLK和CLK、INH有一个为高电平时,另一个时钟被禁止。只有在CLK为高电平时CLK、INH才可变为高电平。
B)引出端符号
CLK、CLK、INH:时钟输入端(上升沿有效)
A~H:并行数据输入端
SER:串行数据输入端
:输出端
:互补输出端
SH/:移位控制/
置入控制(低电平有效)
C)管脚图(见图2-4)
图2-4
74HC165管脚图
D)基本参数(见表2-2)
表2-2
74HC165参数值
参数
参数值
电压
2.0~6.0V
驱动电流
+/-5.2mA
传输延迟
16ns@5V
最高频率
56
MHz
逻辑电平
CMOS
工作温度
-40~+85℃
封装
SO16、SSOP16、DIP16、TSSOP16
E)74HC165特性:
a.
异步8位并行读取
b.
同步串行输入
c.
兼容JEDEC标准no.7A
d.
ESD保护
2.2.5
数字量输出电路方案选择
A.
方案一:采用并行扩展输出方式
采用8255A并行I/O扩展芯片。该芯片是一种常见的8位可编程并行接口芯片。
8255是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。
其各口功能可由软件选择,使用灵活,通用性强。8255可作为单片机与多种外设连接时的中间接口电路。8255作为主机与外设的连接芯片,必须提供与主机相连的3个总线接口,即数据线、地址线、控制线接口。同时必须具有与外设连接的接口A、B、C口。由于8255可编程,所以必须具有逻辑控制部分,因而8255内部结构分为3个部分:与CPU连接部分、与外设连接部
分、控制部分。
B.
方案二:采用串转并输出方式
输出采用74HC595芯片。74HC595是具有8位移位寄存器和一个存储器,三态输出功能。移位寄存器和存储器是分别的时钟。74HC595的主要优点是数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。这在串行速度慢的场合很有用处,数码管没有闪烁感。与164只有数据清零相比,74HC595还多有输出端使能/禁止控制端,可以使输出为高阻态。
综上所述,由于方案二是串转并口输出,使用的I/O口比较少,而方案一是并口输出,占用的接口比较多,单片机的I/O接口显然不够用,所以本设计选择方案二。
74HC595简介:
74HC595是具有8位移位寄存器和一个存储器。数据在的上升沿输入,在的上升沿进入的存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。移位寄存器有一个串行移位输入(),和一个串行输出(),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能
OE时(为低电平),存储寄存器的数据输出到总线(管脚图见图2-5)。

图2-5
74HC595管脚图
A)管脚功能简介
Q1~Q7:并行数据输出口,即存储寄存器的数据输出口
:串行输出口,其应该接SPI总线的MISO接口
:存储寄存器的时钟脉冲输入口
:移位寄存器的时钟脉冲输入口
:输出使能端
:芯片复位端
:串行数据输入
B)控制端说明
(10脚):低点平时将移位寄存器的数据清零。通常我将它接。
SCK(11脚):上升沿时数据寄存器的数据移位。QA→QB→QC→…→QH;下降沿移位寄存器数据不变。(脉冲宽度:5V时,大于几十纳秒就行了,我通常都选微秒级)
RCK(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。通常我将RCK置为低电平,当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了。我通常都选微秒级),更新显示数据。
(13脚):高电平时禁止输出(高阻态)。如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。比通过数据端移位控制要省时省力。
74164和74595功能相仿,都是8位串行输入转并行输出移位寄存器。74164的驱动电流(25mA)比74595(35mA)的要小,14脚封装,体积也小一些。74HC595的主要优点是具有数据存储寄存器。
C)真值表(见表2-4)
表2-4
74HC595真值表
输入管脚
输出管脚
S
I
SCK
SC
LR
RC
K
OE
X
X
X
X
H
QA~QH输出高阻
X
X
X
X
L
QA~QH输出有效值
X
X
L
X
X
移位寄存器清零
L
上沿
H
X
X
移位寄存器存储L
H
上沿
H
X
X
移位寄存器存储H
X
下沿

H
X
X
移位寄存器状态保持
X
X
X
上沿
X
输出寄存器锁存
移位寄存器中的状态值
X
X

X
下沿
X
输出存储器状态保持
2.2.6
通信电路方案选择
A.
方案一:RS-232串行通信接口
目前RS-232是PC机与通信工业中应用最广泛的一种串行接口。RS-232采取不平衡传输方式,即所谓单端通讯。收、发端的数据信号是相对于信号地,典型的RS-232信号在正负电平之间摆动,在发送数据时,发送端驱动器输出正电平在+5~+I5V,负电平在-5~-15V电平。当无数据传输时,线上为TTL,从开始传送数据到结束,线上电平从TTL电平到RS-232电平再返回TTL电平。接收器典型的工作电平在+3~+12V与-3~-12V。由于发送电平与接收电平的差仅为2V至3V左右,所以其共模抑制能力差,再加上双绞线上的分布电容,其传送距离最大为约15m,最高速率为20kb/s,RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为3~7kΩ。所以RS-232适合本地设备之间的通信。计算机上的串行通信端口RS-232是标配,
B.
方案二:RS-485串行通信接口
由于RS-485是从RS-422基础上发展而来的,所以RS-485许多电气规定与RS-422相仿。RS-485可以采用二线与四线方式,二线制可实现真正的多点双向通信。而采用四线连接时,与RS-422一样只能实现点对多的通信,即只能有一个主(Master)设备,其余为从设备,但它比RS-422有改进,无论四线还是二线连接方式总线上可多接到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一样,其最大传输距离约为1219m,最大传输速率为10Mb/s。平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能使用规定最长的电缆长度。只有在很短的距离下才能获得最高速率传输。一般100m长双绞线最大传输速率仅为1Mb/s。
RS-485采用平衡发送和差分接收,因此具有抑制共模干扰的能力。加上总线收发器具有高灵敏度,能检测低至200mV的电压,故传输信号能在千米以外得到恢复。RS-485采用半双工工作方式,任何时候只能有一点处于发送状态,因此,发送电路须由使能信号加以控制。RS-485用于多点互连时非常方便,可以省掉许多信号线。应用RS-485
可以联网构成分布式系统,其允许最多并联32台驱动器和32台接收器。
在MCU之间中长距离通信的诸多方案中、RS-485因硬件设计简单、控制方便、成本低廉等优点广泛应用于工厂自动化、工业控制、小区监控、水利自动报测等领域,但RS-485总线在抗干扰、自适应、通信效率等方面存在缺陷、一些细节的处理不当常会导致通信失败甚至系统瘫痪等故障、因此提高RS-485总线的运行可靠性至关重要。
综上所述,RS-485总线是目前现场监控系统中最为常见的通信接口,因为RS-485总线允许的最大通信距离可达1200多米,每条总线上允许的设备最多可达32台,经过适当的串口扩展,完全能够满足现场监控系统对通信距离和设备和设备数量的要求。而RS-232存在共地噪声和不能抑制共模干扰等问题,传输距离短。所以本次设计选用RS-485通信接口。
2.3
硬件开发环境
方案一:Protel99SE
Protel99SE是Protel公司近10年来致力于Windows平台开发的最新结晶,能实现从电学概念设计到输出物理生产数据,以及这之间的所有分析、验证和设计数据管理。因而今天的Protel最新产品已不是单纯的PCB(印制电路板)设计工具,而是一个系统工具,覆盖了以PCB为核心的整个物理设计。
最新版本的Protel软件可以毫无障碍地读Orcad、Pads、Accel(PCAD)等知名EDA公司设计文件,以便用户顺利过渡到新的EDA平台。Protel99
SE共分5个模块,分别是原理图设计、PCB设计(包含信号完整性分析)、自动布线器、原理图混合信号仿真、PLD设计。
方案二:Altium
Designer
Altium
Designer
提供了一款统一的应用方案,其综合电子产品一体化开发所需的所有必须技术和功能。Altium
Designer
在单一设计环境中集成板级和FPGA系统设计、基于FPGA和分立处理器的嵌入式软件开发以及PCB版图设计、编辑和制造。并集成了现代设计数据管理功能,使得Altium
Designer成为电子产品开发的完整解决方案-一个既满足当前,也满足未来开发需求的解决方案。
综上所述,虽然方案二选择的软件功能比较强大,但是由于我们所学的是Protel99SE,按熟悉度而言,我选择方案一。
2.4
软件开发环境
A.
Keil编译器简介
Keil标准C编译器为微控制器的软件开发提供了C语言特点环境,同时保留了汇编代码高效、快速的特点。单片机编译器的功能不端增加,使你可以更加贴近CPU本身,及其它的衍生产品。单片机已经被完全集成到uVision4的集成开发环境中,这个集成开发环境包含:编译器、汇编器、实时操作系统,项目管理器,调试器。uVision4IDE可为它们提供单一而且灵活的开发环境。
B.
Proteus软件简介
Proteus软件是英国Labcenter
electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。

3
硬件电路设计
3.1
系统硬件电路原理结构框图
本设计系统主要是由STC89C52微控制器主控系统、RS-485通信接口、通信波特率设置和本机地址设置电路、16路数字量输入电路、16路数字量输出电路等组成。其系统的硬件组成框图如图3-1所示:
图3-1
硬件电路原理结构框图
3.2
系统模块电路设计
3.2.1
单片机最小系统设计
A.
时钟电路(如图3-2所示)
时钟电路在单片机系统硬件设计中往往是一个关键的部分,因为晶振体的工作频率很高,设计不当很有可能使其工作时的产生的高频信号对其他电路产生干扰,尤其是对模拟部分。STC89C52系列的单片机的时钟输入接口在其EXTAL和XTAL引脚上,通常是接一个11.0592MHz的晶振体。
本次设计单片机的时钟信号是利用单片机内部时钟电路产生的。如图4-2所示,用于产生单片机工作所需要的时钟信号,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。而在芯片外部,XTAL1和XTAL2之间跨接晶体震荡器和微调电容,从而构成一个稳定的自激震荡器,这就是单片机的时钟电路。时钟电路产生的震荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。在此电路中,电容C1和C2取33pF,晶振用11.0592
MHz。
时钟信号的产生:在STC89C52芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2,在芯片的外部通过这两个引脚跨接晶体振荡器和微调电容,形成反馈电路,就构成了一个稳定的自激振荡器。而晶体的振荡频率范围通常是1.2MHz~12MHz(本设计采用的是11.0592
MHz),晶体振荡频率高,则系统的时钟频率也高,单片机运行速度也就快。但反过来运行速度快对存储器的速度要求也高,对印制电路板的工艺要求也高(线间寄生电容要小)。
图3-2
时钟电路
B.
复位电路
复位是单片机的初始化操作,其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序。除了进入系统的正常初始化之外,当由于程序运行出错或操作错误是系统处于死锁状态时,为摆脱困境,也需要按复位键以重新启动。
单片机的复位电路有上电复位和手动按钮复位两种形式,RST/VPD端的高电平直接由上电瞬间产生高电平则为上电复位;若通过按钮产生高电平复位信号称为手动按键复位。在本设计中采用了按键电平复位方式,其复位电路如下图4-3所示。若运行过程中,需要程序从头开始执行,这只需要按图3-3中的按钮即可。上电瞬间RST端的电位与Vcc相同,随着电容充电电流的减小,+5V立即加到RST/VPD端,该高电平使单片机复位。单片机复位后,P0~P3四个并行接口全为高电平,其它寄存器全部清零,只有SBUF寄存器状态不确定。
图3-3
复位电路
3.2.2
系统电源电路设计
该电路输入220V交流电,经过变压器变压、全桥整流、稳压器稳压后输出稳定的+5V直流电。该电路方便实用,输出电压稳定,最大输出电流为1A,电路能带动一定的负载,电路原理框图如图3-4所示。
图3-4
系统电源原理框图
变压器输入端经过一个保险丝与电源插头相连,如果变压器或后面的电路发生短路,保险丝就会因为电流过大引发的高温熔化而断开。变压器后面接桥式整流电路,整流后就得到一个电压波动很大的直流电源,所以后面接一个330uF/25V的电解电容。变压器输出端的9V电压经桥式整流并电容滤波,在电容C1两端大约会有11V多一点的电压,假如从电容两端直接接一个负载,当负载变化或交流电源有少许波动都会使C1两端的电压发生较大幅度的变化,因此要得到一个比较稳定的电压,在这里接一个三端稳压器的元件,以保持稳压器的输出电压保持基本不变。因为我们要输出5V的电压,所以选用7805。三端稳压器后面接一个105的电容,这个电容有滤波和阻尼作用(电源电路如图3-5所示)。
图3-5 +5V电源设计电路
3.2.3
系统数字量输入电路设计
本设计的数字量输入电路主要是由拨码开关、TLP521-4光电耦合器、74HC165移位寄存器、排阻等组成。
使用STC89C52单片机的GPIO引脚直接作为16路数字量输入、16路数字量控制输出和通信波特率及本机地址设置是不可能实现的。需要通过并转串方式来减少单片机I/O口的使用率。因此,16路数字量输入电路采用两级并行输入/串行输出的8位移位寄存器74HC165级联得到16位移位寄存器,再加上光电耦合器TLP521-4进行隔离来对电路进行保护。数字量输入电路原理图如图3-6所示。
图3-6
数字量输入电路原理图
3.2.4
系统数字量输出电路设计
本设计数字量控制输出电路由74HC595移位寄存器、TLP521-4光电耦合器、驱动电路及输出继电器等组成。
当数字采集控制器收到远程监控中心发送的数字量输出指令命令后,可先由74HC595的锁存,然后串行输入/并行输出依次输出16位二进制控制信息。最后,在移位输出前完成16位二进制控制数据后,并在74HC595输出状态稳定后,再将新的二进制控制信息输出,控制输出端继电器动作,输出电路如图3-7所示。
图3-7
数字量输出控制电路原理图
3.2.5
RS-485通信电路设计
图3-8中,MAX487的和DE由STC89C52单片机的P2.7控制。由于MAX487以半双工的方式工作,因此由P2.7控制其发送与接收。当
P2.7为高电平时,驱动器使能而接收器为高阻态,此时可发送数据;而当P2.7为低电平时.接收器使能而驱动器为高阻态,此时接收数据。另外由于PC机的COM口是基于RS-232的串行通讯口。其电气特性与RS-485不一致,因此也需电平转换。
图3-8
RS-485通信仿真电路
3.2.6
通信波特率和本机地址设置电路设计
通信波特率和本机地址设置电路属于数字量输入电路,因此,可以由一块74HC165来完成。只是输入是由拨码开关设置。其中两组开关用于通信波特率设置,可设置2400
b/s、4800
b/s、9600
b/s和19200b/s四种通信波特率;其他八组开关用于本机地址设置,可设置成256个设备地址:0~255。取低10位二进制数作为通信波特率和本机地址设置值,取低8位为本机地址、高两位为通信波特率设置值(电路如图3-9
a、b所示)。
在选择波特率的时候需要考虑两点:首先,系统需要的通信速率。这要根据系统的运作特点,确定通信的频率范围。然后考虑通信时钟误差。使用同一晶振频率在选择不同的通信速率时通信时钟误差会有很大差别。为了通信的稳定,我们应该尽量选择时钟误差最小的频率进行通信(波特率设置见表3-1)。
图3-9
a
本机地址设置电路
图3-9
b
波特率设置电路
表3-1
波特率设置
SW2
SW1
波特率
0
0
2400
0
1
4800
1
0
9600
1
1
19200
4
软件设计
4.1
系统主程序设计
数字采控器软件流程图由主程序、系统初始化程序、RS-485串口程序等组成(主程序流程图如图4-1所示)。其中系统初始化程序是对单片机端口定义及中断服务程序的入口地址定义等。
本设计包括本地控制和远程控制两种方式。当系统启动时,可对数字采控器直接进行本地控制,包括:继电器控制和本机地址及波特率设置。远程控制是通过PC机发送命令来控制,本设计选用的RS-485串口通信。当使用远程控制时,本地控制是没禁止的。远程控制包括:通信检测、I/O口信息上传、继电器状态信息上传、远程控制继电器动作及改变本机地址和波特率设置。
图4-1
主程序流程图
4.2
系统初始化程序设计
在单片机上电启动后,进入主程序。系统将按下述步骤完成初始化操作:
A.
定义全部寄存器和单片机端口。
B.
初始化片内寄存器和端口状态。
C.
系统监控系统复位并启动,中断复位并等待。
D.
初始化命令应答包。
E.
读取串口通信地址,并初始化串口设备。
F.
开放中断源。
图4-2
初始化程序流程图

4.3
寄存器程序设计
移位寄存器在本设计中主要是起到I/O口扩展的作用,由于本设计要求是16路输入、输出。若将16路输入、输出和本机地址和波特率设置都接单片机的I/O,显然单片机的I/O口肯定不够,通过寄存器的扩展能达到设计的要求。本设计输入电路采用74HC165寄存器,输出采用74HC595寄存器(寄存器程序设计流程图如图4-3所示)。
图4-3
寄存器程序流程图

4.4
串口通信程序设计
本系统中单片机负责数据采集、处理和控制,通信协议采用半双工串行通信方式,选用RS-485通信进行收发转换,传输数据采用二进制数据。RS-485采用平衡发送和差分接收,具有抑制共模干扰的能力,发送信号需由使能信号加以控制(程序流程如图4-4所示)。
图4-4
串口通信流程图

5
系统调试
5.1
硬件调试
A.
实物正面
B.
实物反面
C.
运行中
由于笔记本没有串口,条件收到限制,所示实物没有485部分的设计。
5.2
软件调试
软件调试结果:
A.
本地控制
A)波特率设置(如图5-1所示)
波特率设置是由两个自锁开关完成的。
B)本机地址设置(如图5-2所示)
本机地址是由8位拨码开关设置的,可设置成256个设备地址:0~255。
C)本地控制继电器(如图5-3所示)
当拨动输入端的拨码开关时,输出端对应的继电器会动作,与继电器串联的发光二极管也会导通发光。
B.
RS-485通信设置(x-本地地址;y-校验和;z-继电器状态;m-波特率设置;n-地址设置)
RS-485通信是由PC机发送指令,完成以下任务:改变波特率、本机地址、控制继电器动作、上传单片机的I/O口的状态和继电器的状态。当用户选择用485通信控制时,此时本地控制必须禁止,指令为0x01。若要回复本地控制,则需将命令设置为0x00。(系统启动时,可以进行本地直接控制。485通信控制时,地址和波特率初始值都是采用的本地设置值)
A)通信测试(如图5-4所示)
指令为:AA
01
x
00
y
B)I/O口信息上传(如图5-5所示)
指令为:AA
02
x
00
y
C)继电器状态上传(如图5-6所示)
指令为:AA
03
x
00
y
D)控制继电器(如图5-7所示)
指令为:AA
04
x
03
01
z
y(01-禁止本地控制)
E)更改波特率(如图5-8所示)
指令为:AA
05
x
02
01
m
y(01-禁止本地控制)
F)更改设备地址(如图5-9所示)
指令为:AA
06
x
02
01
n
y(01-禁止本地控制)
C.
本地设置调试如下图所示
图5-1
本地波特率设置
图5-2
本机地址设置

图5-3
本地控制继电器
D.
RS-485通信控制如下图所示

图5-4
通信测试
图5-5
I/O口状态显示

图5-6
继电器状态显示

图5-7
485通信控制继电器动作
图5-8
波特率设置
图5-9
地址设置

6
结束语
时间飞逝,接近三个多月的毕业设计即将步入尾声,经过几个月的奋战,我的毕业设计也即将完成,这过程虽然很艰辛,但是很快乐。这次设计是我大学里的最后一项任务了,刚开始我就决心要把它做好,虽然在完成的过程中遇到好多困难,但是我没有放弃,继续坚持着。这次毕业设计让我受益匪浅,不仅学到了书本上的知识,还学到了许多书本之外的东西。设计组一共十几个人组成的,虽然来自不同的班级,但是大家并没有陌生感,大家就像一个大家庭一样,在一起有说有笑,遇到问题时大家一起讨论,寻找解决的办法,我从这个集体里学到了最最珍贵的知识——团队精神。
这次设计是大学里最最正式的一次比较完整的毕业设计,包括选题、完成开题报告、选择方案、设计硬件电路、软件调试、仿真、焊接电路板、拽写设计说明书等步骤。之前包括实习(拽写实习报告)、外文翻译、文献摘抄。
本设计是基于单片机的数字采集控制器设计。刚开始拿到课题时,脑子里一片空白,不知道该如何从哪里着手设计,后来在老师的指导下,有了点头绪,再后来自己通过各种途径去查阅资料,进一步对设计的内容有了深入的了解。这次毕业设计还用到了几个软件:Ptoteus、Protel、Keil。这次课程设计让我们熟练的掌握了这几个软件。虽然之前也接触过,但因为时间相隔太久,许多设置已经生疏了,当遇到问题时,我习惯上网搜解决的办法,或者是咨询、请教被别人。
在焊接实物时,由于实现课题功能的电路比较复杂,元器件比较多、线杂,所以焊接的时候难度比较大。但是,我焊接了两天最终完成了任务,在焊接实物时,我先把单片机最小系统焊接好了,就先测试了下,结果是成功的。因为最小系统是单片机的核心,绝对不能出错。当板子焊好后,心里就默默地祈祷调试一定要成功!
这次设计教会了我好多东西,也磨练了我的耐力。提高了我解决问题的能力。通过这次毕业设计我深深地感受大了自己的知识面是多么的欠缺,这次设计让我明白了只有真正全面系统的学习知识才能真正的掌握真正的技能。这次设计对我来说具有很重要的意义,为即将步入社会工作岗位的我奠定了基础。

参考文献
[1]
马明建.
数据采集与处理技术[M].西安:西安交通大学出版社,2005:1-43.
[2]
张祖晋.数据采集的发展现状[J].北京:数据采集与处理,2002,3(3):25-26.
[3]
吴黎明.单片机原理及应用技术[M].北京:科学出版社,2005:184-192.
[4]
陆子明,徐长根.单片机设计与应用基础教程[M].北京:国防工业出版社,2004.09:
89-95.
[5]
许强.基于8位单片机的数据采集系统的研究[N].湖南广播电视大学学报,2005,1(1):
57-58.
[6]
段谟意.两种串行通信实现方法的比较[J].工业控制计算机,2004,4(11):184-192.
[7]
门雅彬.采用MAX487E的RS-232/422/485隔离转换器[J].电子元器件应用,2005,2(1):22-25.
[8]
张毅刚,刘杰.单片机原理及应用[M].哈尔滨:哈尔滨工业大学出版社,2004.6:23-28.
[9]
冯建华,赵亮.单片机应用系统设计与产品开发[M].北京:人民邮电出版社,2005.:320-325.
[10]
张晓莹,刘丽华.74HC154和AD595制作的温度采集仪[J].电子技术应用,2003,2(2):21.
[11]M.
Michael.
Space
Science
Studies
Come
to
the
Internet[J].Aviation
Week
&
Space
Technology,1998(6):59-66.
[12]张淑俭.PC机与单片机之间的串行通信[J].电脑知识与技术,2005,4(14):34-36.
[13]王幸之,王雷,王闪著.单片机应用系统抗干扰技术[M].北京:北京航空航天大学出版社,1999.12:347-371.
[14]李叶紫等.MCS-51单片机应用教程[M].北京:清华大学出版社,2004:263-265.致谢
在为期近四个月的毕业设计结束之即,我首先要感谢X老师给予我的指导和帮助。在刚拿到设计题目时,脑子里一片空白,感觉很难,一直很迷茫。但是在外界的帮助下,我才对这个设计有了一定的了解和理解。在这次设计中,我学到了好多东西。
最后,我还要感谢本设计小组的每一位成员对我的帮助!
附录

录1
设计图纸
A.
PCB图
B.
仿真图

录2
元器件清单
名称
规格
数量
万能板
12*18
1
单片机
STC89C52
1
插座
40P
1
瓷片电容
30pF
2
电解电容
10uF
1
晶振
11.0592MHz
1
电阻
10K
41
按钮
SW
1
自锁开关
8.5*8.5MM
2
拨码开关
8P
3
排阻
103
4
串行输入/并行输出移位寄存器
74HC165
3
并行输入/串行输出寄存器
74HC595
2
插座
16P
5
电阻
180
24
电阻
100
16
电阻
1K
32
三极管
S9013
16
光耦
TLP521-4
10
继电器
SRD-05VDC-SL-C
16
发光二极管
3MM
24
MAX485
DIP-8
2
排针
2.54mm
40
杜邦线
20CM
40附
录3
程序清单
#include

#include

#include
"common.h"
#include
"comcmd.h"
#include
"com.h"
#ifndef
__COMMOM_H__
#define
__COMMOM_H__
#define
UCHAR
unsigned
char
#define
UINT
unsigned
int
#define
ULONG
unsigned
long
#define
BOOL
unsigned
char
#define
COMEVENT
UCHAR
#define
TRUE
1
#define
FALSE
0
#define
VCC
1
#define
GND
0
#define
HIGH
1
#define
LOW
0
#define
XTAL
11059200//系统晶振11.0592MHz
#define
timer0_TL
0xFF
#define
timer0_TH
0xDB
#define
SUBID
0x20
#define
HOSTID
0x04
#define
MAX_SBUF
20
UCHAR
SubID;
//子机ID
UCHAR
HostID;
//主机ID
UCHAR
baurd_SetVal;
UCHAR
SubID_SetVal;
sbit
RS485_Re_EN=P3^2;
//定义发送/接收控制
bit
SetUp=1;
//按键加上升延中间变量
bit
SetDown=1;
//按键减上升延中间变量
sbit
SW1=P3^6;

sbit
SW2=P3^7;
sbit
LCK=P2^5;
//并行输出时钟
,上升沿锁存
sbit
DS=P2^4;
//串行数据输入
sbit
SCK=P2^3;
//移位输入时钟
,上升沿移位
sbit
CLK_165=P2^2;
sbit
QH_165=P2^0;
sbit
SHLD_165=P2^1;
UCHAR
get_Value[3];
UCHAR
flag=1;
//允许本地设置波特率
UCHAR
flag_ID=1;//允许本地设置ID
UCHAR
flag_Relay=1;
void
delay1ms()//1ms延时子程序(11.0592MHZ)
{
unsigned
char
i,j;

for(i=0;i<10;i++)
for(j=0;j<33;j++);}
void
hc74_165(unsigned
char
*str,unsigned
char
n)
{
unsigned
char
i,j,p;
SHLD_165=0;
_nop_();
_nop_();
SHLD_165=1;
delay1ms();
CLK_165=0;
for(j=0;j{

p=0;

for(i=0;i<8;i++){p<<=1;p|=QH_165;CLK_165=0;_nop_();_nop_();CLK_165=1;_nop_();

}
*str++=p;
}
}
void
Writ_595_HL(UCHAR
datH,UCHAR
datL)
//十六位数据输出
{
UCHAR
i;UCHAR
sdataH,sdataL;
sdataH=
datH;
sdataL=
datL;
for(i=0;i<8;i++)
{

SCK=0;

if(sdataL&0x01)DS
=
1;
//串行数据输出
  
else
DS
=
0;

SCK=1;
//移位输入时钟,上升沿输入
 sdataL>>=1;_nop_();

_nop_();
_nop_();
}

for(i=0;i<8;i++)
{SCK=0;if(sdataH&0x01)
DS
=
1;
//串行数据输出
  

else

DS
=
0;SCK=1;
//移位输入时钟,上升沿输入
 

sdataH>>=1;

_nop_();
_nop_();
_nop_();}

LCK=0;
//并行输出时钟
  
_nop_();
_nop_();
_nop_();
LCK=1;
}
main()
{
UCHAR
*lpc
;

BOOL
COM_OK=FALSE;
UCHAR
lpxdata[5];
UCHAR
tmp=0x00;
RS485_Re_EN=0;
tmp=P3;
//P3=0xFF;获取本地波特率设置
tmp=(tmp&0xC0)>>6;
baurd_SetVal=tmp;
hc74_165(get_Value,3);
//获取模块ID设置
SubID_SetVal=get_Value[2];
SetSubID(SubID_SetVal);
Init_COM(SubID_SetVal,HOSTID,tmp,VERIFY_NONE,0);
//初始化串口
ClrCOM();
//清除缓存
EA
=
1;
//开中断
while
(
1
)

{
RS485_Re_EN=0;

//使能485接收
lpc=GetCOM_Event(SCommand);
//获取串口通信事件

switch(lpc[IDX_CMD])

{case
CMD_COMM_TEST://0x01{

//COM通信测试
WriteCom(CMD_COMM_TEST,"TEST
OK",7);
COM_OK=TRUE;
break;

}case
CMD_IO_IN://0x02{
//IO输入信息上传hc74_165(get_Value,3);
lpxdata[0]=get_Value[0];
//要上传的数据
lpxdata[1]=get_Value[1];
lpxdata[2]=get_Value[2];
WriteCom(CMD_IO_IN,lpxdata,3);
break;
}case
CMD_RELAY_IN:{//本地控制继电器信息上传hc74_165(get_Value,3);
lpxdata[0]=get_Value[0];
//要上传的数据
lpxdata[1]=get_Value[1];
WriteCom(CMD_RELAY_IN,lpxdata,2);
break;

}case
CMD_RELAY_SET://0x04
{//继电器控制if(lpc[IDX_DATA])
{
flag_Relay=0x00;
Writ_595_HL(lpc[IDX_DATA+1],lpc[IDX_DATA+2]);
}
else
{flag_Relay=0x01;
}
break;

}case
CMD_BRAD_SET://0x05{//波特率设置
EA=0;
if(lpc[IDX_DATA])
{
flag=0x00;
if(lpc[IDX_DATA+1]<=0x03)
{
Init_COM(SubID,HostID,lpc[IDX_DATA+1],VERIFY_NONE,0);
ClrCOM();
EA
=
1;
}
}
else
{flag=0x01;
}
break;
}case
CMD_SUBID_SET://0x06{//模块地址设置if(lpc[IDX_DATA])

{
SetSubID(lpc[IDX_DATA+1]);

flag_ID=0x00;

}

else

{
flag_ID=0x01;

}
break;

}case
CMD_HOSTID_SET://0x07{//监控中心主模块地址设置
SetHostID(lpc[IDX_DATA]);
break;

}default:

break;

}

if(flag)

//设置波特率

{

tmp=P3;

tmp=(tmp&0xC0)>>6;if(tmp!=baurd_SetVal){
EA=0;
baurd_SetVal=tmp;
Init_COM(SubID,HostID,tmp,VERIFY_NONE,0);
ClrCOM();
EA
=
1;}

}
hc74_165(get_Value,3);
//获取输入

if(flag_ID)

//设置模块SubID

{if(SubID_SetVal!=get_Value[2]){EA=0;ClrCOM();
SubID_SetVal=get_Value[2];
SetSubID(SubID_SetVal);
EA
=
1;}

}

P0=
~get_Value[0];

//输出控制LED灯

P1=
~get_Value[1];

if(flag_Relay)

{
Writ_595_HL(get_Value[1],get_Value[0]);

}
}

}
//-----
通信命令定义
#ifndef

__COMCMD_H__
#define

__COMCMD_H__
#define

CMD_COMM_TEST0x01//测试子机通信情况
#define

CMD_IO_IN
0x02//IO输入信息上传
#define

CMD_RELAY_IN
0x03//继电器信息上传
#define

CMD_RELAY_SET
0x04//继电器控制
#define

CMD_BRAD_SET
0x05//波特率设置
#define

CMD_SUBID_SET
0x06//子机地址设置
#define

CMD_HOSTID_SET0x07//主机地址设置
COMEVENT
code
SCommand[]
=
{
{
CMD_COMM_TEST},

{
CMD_IO_IN},

{
CMD_RELAY_IN},

{
CMD_RELAY_SET},

{
CMD_BRAD_SET},

{
CMD_SUBID_SET},

{
CMD_HOSTID_SET},

{
0
}
//命令结束
}
#ifndef
__COM_H__
#define
__COM_H__
#include
"common.h"
//波特率定义
#define
COMBaud_Rate_2400
0x00
#define
COMBaud_RateD_4800
0x01
#define
COMBaud_Rate_9600
0x02
#define
COMBaud_Rate_19200
0x03
//串口工作方式定义
#define
UART0_COM_MODE_8BIT
0x00
#define
UART0_COM_MODE_9BIT
0x01
//奇偶校验定义
#define
VERIFY_EVEN
0x01
#define
VERIFY_ODD

0x02
#define
VERIFY_NONE
0x00
//通信协议格式
#define
IDX_SYHEAD

0x00
#define
IDX_CMD0x01
#define
IDX_SUBID0x02
#define
IDX_SIZE0x03
#define
IDX_DATA0x04
//波特率发生参数定义
#define
TIMECOM_2400
0xF4
#define
CTRLCOM_2400
0x00
#define
TIMECOM_4800
0xFA
#define
CTRLCOM_4800
0x00
#define
TIMECOM_9600
0xFD
#define
CTRLCOM_9600
0x00
#define
TIMECOM_19200
0xFD
#define
CTRLCOM_19200
0x80
#define
MAX_SERIERS
40

//串口数据存储区大小定义
#define
MAX_SERIERSTACK15

//串口数据缓冲区大小定义
typedef
struct
_tgCOMBaud_Rate

//串口波特率设置数据结构定义

{
UCHAR
time;
UCHAR
ctrl;
}

COMBaud_Rate,
*
LPCOMBaud_Rate;
//函数声明
void
Init_COM(UCHAR
subID,UCHAR
hostID,UCHAR
cRate,UCHAR
cVerify,UCHAR
cMode);

//初始化串口
void
SetHostID(UCHAR
hID);
//设置主机ID
void
ClrCOM(void);
//清楚串口接收缓冲区,准备接收数据void
Send_Byte(UCHAR
d);

//串口发送一个Bytevoid
WriteCom(UCHAR
cmd
,
UCHAR
*lpdata,UCHAR
size);
//串口发送数据
UCHAR
*
GetCOM_Event(COMEVENT
*
lp);//获取串口事件消息
#include
"com.h"
sbit
RS485_Re_EN=P3^2;
//定义发送/接收控制
UCHAR
COMVerify;
//奇偶校验
UCHAR
BuftoDataPC;
//数据从缓冲区转移到存储区的个数计数
UCHAR
RecDataPC;

//接收数据个数计数
UCHAR
RecData[MAX_SERIERS];
//串口接收数据存储区
UCHAR
RecBuffPC;
//数据缓冲区个数计数
UCHAR
RecBuff[MAX_SERIERSTACK+1];
//串口接收数据缓冲区
BOOL

Buff_full;
//缓冲区是否接收满
//局部变量定义
COMBaud_Rate
code
com_mode[]={
//串口波特率发生定时器设置参数
{TIMECOM_2400,CTRLCOM_2400},
{TIMECOM_4800,CTRLCOM_4800},
{TIMECOM_9600,CTRLCOM_9600},
{TIMECOM_19200,CTRLCOM_19200},
};
extern
UCHAR
SubID;
//子机ID
extern
UCHAR
HostID;//主机ID
//函数定义void
Init_COM(UCHAR
subID,UCHAR
hostID,UCHAR
cRate,UCHAR
cVerify,UCHAR
cMode)
//初始化COM
{
UCHAR
tmp;
SubID
=
subID;
HostID
=
hostID;
BuftoDataPC
=0;
RecDataPC

=
0;
RecBuffPC

=
0;
Buff_full
=
FALSE;
COMVerify
=
cVerify;
//设置串口奇偶校验if(cMode)
//设置串口工作方式
SCON
=
0xD0;
else
SCON
=
0x50;
//SCON:
设置成串口1的工作方式,允许w接收8
位可变波特率,无奇偶校验位
tmp
=
TMOD;
tmp
=
tmp&0x0F;
tmp
=
tmp|0x20;
TMOD
=
tmp;
//TMOD:
定时器1,模式2,8位重载
TL1
=
TH1
=
com_mode[cRate].time;
PCON
=
com_mode[cRate].ctrl;
COMVerify
=
cVerify;ES
=
0x01;IP
=
0x10;ET1
=
0;TR1
=
0x01;

}void
SetHostID(UCHAR
hID)
//设置主机ID{
HostID
=
hID;
}
void
SetSubID(UCHAR
subID)
{
SubID
=
subID;
}
void
ClrCOM(void)
//清楚串口接收缓冲区,准备接收数据
{
UCHAR

i;
BuftoDataPC
=0;
RecDataPC

=
0;
RecBuffPC

=
0;
Buff_full

=FALSE;
for(i=0;i<=MAX_SERIERSTACK;i++)

RecBuff[i]=0xFF;
}
void
COM_interrupt_Serve(void)
interrupt
4
using
2

//串口中断服务程序

{

UCHAR
tmp_SBUF;
if(
RI
)
{

tmp_SBUF=SBUF;

switch
(COMVerify)

{case
VERIFY_NONE:
//无校验
RecBuff[RecBuffPC]
=
tmp_SBUF;
RecBuffPC
++;
RecBuffPC
&=
MAX_SERIERSTACK;
if(RecBuffPC==MAX_SERIERSTACK)
//实现缓冲区循环
RecBuffPC=0;
if
(
RecBuffPC
==
BuftoDataPC
)
{
Buff_full
=
TRUE;
}else
{
Buff_full
=
FALSE;
}
break;case
VERIFY_EVEN:
//偶校验break;case
VERIFY_ODD:
//奇校验
break;}RI
=
0;
}
}
UCHAR
*
GetCOM_Event(COMEVENT
*
lp)
//获取串口事件消息
{
BOOL
bfind;
UCHAR
i;
static
UCHAR
Verify_Sum;

if
(
RecDataPC
==
(IDX_SYHEAD+1))
//判定是否为合法的帧同步头
{

if
((RecData[IDX_SYHEAD]
!=
0xAA))

{RecDataPC=0;
////如果是不合法的帧同步头,则要去掉return
0;

}
}
if
(RecDataPC
==
0)
{

Verify_Sum
=
0;
}if
(Buff_full!=TRUE)
{

if
(BuftoDataPC
==
RecBuffPC)

{return
0;

}
}

Buff_full
=
FALSE;
RecData[RecDataPC]
=
RecBuff[BuftoDataPC];
BuftoDataPC
++;
BuftoDataPC
&=
MAX_SERIERSTACK;
if
(RecDataPC
<
MAX_SERIERS
)RecDataPC
++;
if
(RecDataPC
==
(IDX_SYHEAD+1))
return
0;
//只有同步头if
(
RecDataPC
==
(IDX_CMD+1)
)
{

i
=
0;

bfind
=
FALSE;

while
(lp[i]
!=
0
)

{if
(
RecData[IDX_CMD]
==
lp[i])
{
bfind
=
TRUE;
break;}i
++;

}

if
(
bfind
!=
TRUE
)

{//如果没有查找到命令则不合法,删除RecDataPC
=0;return
0;

}

else

{Verify_Sum=RecData[IDX_CMD];return
0;
}
}

if
(
RecDataPC
==
(IDX_SUBID+1)
)
//判定是否是发给自己的数据包
{
if
(
RecData[IDX_SUBID]
!=
SubID)

{//如果不是发给自己的包则全部删掉RecDataPC
=0;return
0;

}
}

if
(
RecDataPC
==
(IDX_SIZE+1)
)

//
判定待接收数据的个数
{
//
如果发过来的数据包超过缓冲区表示非法,删除

if
(
RecData[IDX_SIZE]>(MAX_SERIERS-5
)
)

{RecDataPC
=0;return
0;

}
}

if
(
RecDataPC
>=(IDX_SIZE+1))
//判定收到的数据个数
{

if
(
(RecData[IDX_SIZE]+5)
==
RecDataPC)

{if
(
RecData[RecDataPC-1]
==
Verify_Sum
){
RecDataPC=0;ClrCOM();return
(&RecData[0]);}else{
RecDataPC
=0;
return
0;}

}
}

Verify_Sum+=RecData[RecDataPC-1];
//做累加和
return
0;
}
void
Send_Byte(UCHAR
d)

//串口发送一个Byte
{
switch
(
COMVerify)
{

case
VERIFY_NONE:
//无校验
break;

case
VERIFY_EVEN:
//偶校验ACC
=
d;
TB8
=
P;
break;

case
VERIFY_ODD:
//奇校验ACC
=
d;TB8
=
~P;
break;
}
RS485_Re_EN=1;

SBUF
=
d;
while
(TI==0);
TI
=
0;

RS485_Re_EN=0;
}
void
WriteCom(UCHAR
cmd
,
UCHAR
*lpdata,UCHAR
size)
//串口发送数据
{
UCHAR
i,sum;
i
=
0;
TI
=
0;
Send_Byte(0xAA);
//帧同步头
sum
=
0;
sum
+=
cmd;
Send_Byte(cmd);
//
传送命令

sum
+=
HostID;
Send_Byte(HostID);
//
传送主机ID

sum
+=
size;
Send_Byte(size);
//
传送数据大小

for
(
i
=
0
;
i
<
size
;
i
++)
{sum
+=lpdata[i];

Send_Byte(lpdata[i]);
}
Send_Byte(sum);
}

基于单片机的数字采控器设计毕业论文 本文关键词:单片机,毕业论文,数字,设计,采控器

基于单片机的数字采控器设计毕业论文  来源:网络整理

  免责声明:本文仅限学习分享,如产生版权问题,请联系我们及时删除。


基于单片机的数字采控器设计毕业论文》由:76范文网互联网用户整理提供;
链接地址:http://www.yuan0.cn/a/76232.html
转载请保留,谢谢!