毕业设计(论文)基于单片机活动门控制系统的设计与实现毕业论文.doc_第1页
毕业设计(论文)基于单片机活动门控制系统的设计与实现毕业论文.doc_第2页
毕业设计(论文)基于单片机活动门控制系统的设计与实现毕业论文.doc_第3页
毕业设计(论文)基于单片机活动门控制系统的设计与实现毕业论文.doc_第4页
毕业设计(论文)基于单片机活动门控制系统的设计与实现毕业论文.doc_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于单片机活动门控制系统的设计与实现信息与电气工程学院课程设计说明书(2010 /2011 学年第 2 学期)课程名称 :单片机原理与应用课程设计题 目 :基于单片机活动门控制系 统的设计与实现 专业班级 :电子信息工程08级1班 学生姓名 : 吕 泽 学 号 : 080070119 指导教师 : 吴 开 兴 设计周数 : 2周 设计成绩 : 2011 年 6月 23日目录1 课程设计主要任务与技术要求 31.1主要任务 31.2技术要求 32 系统分析与设计 3 2.1 系统分析 3 2.2 活动门总体设计方案 43 单片机简介 53.1 80C51单片机功能与引绍 64 主要硬件电路 74.1电机驱动电路 74.2门限电路 94.3按键去抖电路 9 4.3.1 作用 9 4.3.2 技术方案 95 单片机与PC串口通信 106 单片机设计与验 106.1 单片机程序设计 106.1.1程序流程图 116.1.2源程序代码 126.2上位机程序设计 166.2.1控制界面 176.2.2程序代码 177 课程设计总结 21参考文献 21附录1 电路图 22附录2 PCB板 24附录2 实物图 251.课设主要任务与技术要求1.1主要任务(1)系统分析与设计:对系统进行调研,详细分析系统,设计出基于单片机的活动门控制系统的技术方案;(2)设计实现系统的关系技术:电机驱动、门限电路、软件控制;(3)系统电路的设计与实现:器件选择、地址分配和硬件连接;(4)系统软件的设计与实现:单片机代码的实现,计算机控制代码的实现;(5)系统调试:调试串口、调试按键、调试驱动;(6)系统联调。1.2技术要求(1)实现活动门的开关动作:在单片机的作用下,通过活动门上安装的控制按钮,控制外部电机实现活动门的开关动作(即用单片机控制电机的正反转);(2)实现上位机软件控制活动门:利用计算机的软件实现对活动门的开关动作(即单片机与上位机的通信,完成对活动门的正确控制);(3)使用单一供电电源,控制电机使用直流电机,活动门必须安装限位开关,实现门的自动控制。2系统分析与设计2.1系统分析5单片机与PC机串口通讯51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,我们采用了三线制连接串口,也就是说和电脑的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。全双工的串行通讯口原理图如图4.1所示:图4.1全双工的串行通讯口原理图6. 程序设计与实验活动门控制的程序包括两方面的内容;一个是单片机方面的编程,包括对活动门状态的监测和控制,以及微机指令的接收;另一方面是计算机软件编程,包括人机控制界面的编写和控制指令的发送。计算机软件编程方面的内容已在上一章作了详细介绍。下面主要介绍单片机的程序设计。6.1 单片机程序设计单片机的程序完成两个功能,首先是监测活动门开关状态,并以此为依据输出活动门的控制指令。6.1.1程序流程图主程序MAIN的流程图: 外部中断零程序INT的流程图:使发光二极L1和L2管都灭设置串口工作方式设置定时器T1工作方式并赋值开串口中断并设置串口中断触发方式开CPU中断和外部中断零等待中断保护现场P2.0=1?NY中断返回是否有键按下?Y电机正转L1亮L2灭N电机反转L1灭L2亮调用延时4秒程序电机停止L1和L2灭恢复现场中断返回开始中断入口串口中断程序D流程图:中断入口保护现场和清RI从SBUF中读数送累加器AA=10?YNP3.2=0?把01写入SBUF送到上位机NY电机正转L1亮P3.2=0?NY电机反转L2亮把10写入SBUF送到上位机调用4秒的延时程序电机停转灯灭清RI恢复现场中断返回6.1.2源程序的代码1系统分析与设计1.1系统分析要想实现微数字温度计的显示,从理论上分析,最简单的方法就是用开关控数码管的亮灭来控制温度的显示与否,也可以直接将温度显示在液晶显示屏上。也就是说,只要用单片机直接控制数码管的显示温度就可以了。为了实现更加人性化的便捷操作,通过PC上位机来显示温度更加的便利,PC上位机的显示界面可以同时显示多个温度值,极大地提高了需要严格控制温度时的场合,便于工作人员及时的调整需要,也提高了工作人员的工作效率,实现了现代工业的自动化与便利性。1.2 数字温度计总体设计方案2.软件控制2.1作用利用单片机实现数字温度计一个优点是可以利用软件控制温度的显示与否,从而将计算机软件和硬件动作联系起来,通过上位机的界面显示温度更加方便用户对环境的温度的测定。采用串口通信的方式连接上位计算机和单片机有若干好处。首先,对于危机而言,控制外部设备的接口有多种多样,如并口、串口、PCI、ISA等。从电路设计的简便性考虑,利用串口最为理想这是因为,一般的微机均带有4个以上的串行接口,而并口只有一个,机箱和微机的生产厂家不可能仅仅为了活动门而占用微机有限的并口资源。同样,使用PCI、ISA插槽不仅占用了主板资源,更是需要开发独立的驱动,开发成本较高;此外,从开发的成本和复杂性上考虑,采用串口无疑是最为简便而低廉的设计方案。2.2技术方案用户通过软件界面直接观测温度值。控制界面和单片机相当于是上、下位机的关系。控制界面通过串口通信接受来至下位机数据并且可以对数据进行保存。2.3 RS232通讯原理串行端口的本质功能是作为CPU和串行设备间的编码转换器。当数据从CPU经过串行端口发送出去时,字节数据转换为串行的位。在接收数据时,串行的位被转换为字节数据。串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial Bus或者USB混淆)。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。典型地,串口用于ASCII码字符的传输。通信使用3根线完成:a地址线、b发送、c接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通行的端口,这些参数必须匹配:(1)波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。(2)数据位:这是衡量通信中实际数据位的参数。(3)停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。(4)奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。2.4单片机与PC机串口通讯51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和电脑的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。全双工的串行通讯口原理图如图4.1所示: 3.3 SCI串行通信接口 DSP控制器串行通信接口(SCI)是一个标准的通用异步接收/发送(UART)通信接口。它的接收器和发送器都是双缓冲的。DSP控制器串行通信接口(SCI)有自已的使能和中断位,它们可以半双工或全双工方式工作。为了保证数据的完整性,串行通信接口对接收的数据进行间断检测、奇偶性、超时和帧错误的检查。位速率(波特率)可通过一个16位的比特率选择寄存器进行编程,因此,可以有超过65000种不同的速率。SCI模块是一个8位片内外设,通过DSP的16位外部数据总线的低8位与外部设备通信。SCI的物理描述:(1)两个I/O引脚。*SCIRXD(SCI接收数据输入)*SCITXD(SCI发送数据输出)(2)通过一个16位波特率选择寄存器的编程,可得到超过65000种不同的可编程位速率。*波特率的数量:64K(3)18的可编程数据字长。(4)长度为1位或2位的可编程停止位。(5)内部产生的串行时钟。(6)四个错误检测标志。*奇偶性错误*超限错误*帧错误*间断检验(7)两种唤醒多处理器模式,可与任意通信格式一起使用。*空闲线路唤醒*位寻址唤醒(8)半双工或全双工操作。(9)双缓冲接收和发送功能。(10)接收和发送操作均可通过中断或查询操作进行,相应的状态标志如下:发送器:TXRDY标志(发送器缓冲寄存器准备好接收另一个字符)和TXEMPTY标志(发送移位寄存器空)。接收器:RXRDY标志(准备从接收缓冲寄存器中读出一个新字符)、BRKDT标志(间断条件发生)和RXERROR,可用来监视四个中断条件。(11)发送器和接收器中断的分立的使能位(间断除外)。(12)SCI数据,不管是接收的、还是发送的,都是NRZ(非归零)格式的。3.3.1 串行通信的工作原理空闲位(某一位的扩展)SCIRXDSCITXDSCICLK起始位数据位校验位停止位12345678低位高位RS232DSP 控 制 器PC机MC1489MC1488TXDTXDRXDRXDGNDGND为了保证异步串行通信主、从机之间的同步,除了要有前面的通信数据格式外,还必须要求主、从机的发送和接收时钟具有相同的周期,既相同的波特率。为了保证同步,除了格式与周期外,还需解决的一个基本问题是主、从机必须按照统一的电气和物理接口标准来连接,如信号电平、信号定义与电缆特性等都必须按照统一的标准。如果主从机之间的电气和物理接口标准不一致,一定要进行电气和物理接口的转换。最典型的是DSP控制器与PC机串口连接时,前者是TTL(5V)电平,后者是RS232(15V)电平,必须进行电平转换,如图3.23所示。TTL电平的“1”和“0”分别为2.4和0.4V,因此需外接电路实现电平转换。传输线驱动器 MC1488 和传输线接收器 MC1489 可实现这种转换。RS-232输出MC1488TTL输入+12V12VRS232输入TTL输出MC1489+5V16位的波特率数值用BRR表示。SCI使用16位的波特率选择寄存器值来选择64K种不同的串行时钟频率中的一种。选择可以通过以下方法来确定:当 BRR =165535时(BRR=波特率选择寄存器中的16位值):波特率是按位计算的,而每位需要8个SCICLK周期。当 BRR = 0 时表1 一般SCI位速度的波特率选择值理想的波特率BRR实际的波特率误差(%)24002080(822H)2400048001040(411H)48030.069600520(208H)9597-0.0319200259(103H)192310.1638400129(81H)384620.16图4.1全双工的串行通讯口原理图上位机主要是对数字温度计的多个温度值的显示。(1) 控制界面如下(2) 上位机程序如下:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.IO;using System.IO.Ports;namespace WEUDUCELIANG public partial class Form1 : Form public Form1() InitializeComponent(); timer1.Interval = 1000;/设置timer控件时间间隔 timer1.Enabled = false; serialPort1.DataBits = 8; serialPort1.StopBits = System.IO.Ports.StopBits.One; serialPort1.ReadBufferSize = 500000; serialPort1.RtsEnable = true; /如果是RS232转RS485,此句必须要,否则不能通讯 serialPort1.NewLine = rn; private void button1_Click(object sender, EventArgs e) if (!serialPort1.IsOpen) /如果串口是关闭的 /设定串口信息和波特率 serialPort1.PortName = boBox1.SelectedItem.ToString(); serialPort1.BaudRate = Convert.ToInt32(boBox2.SelectedItem.ToString(); serialPort1.Parity = Parity.None; serialPort1.DataBits = Convert.ToInt16(boBox4.SelectedItem.ToString(); serialPort1.StopBits = StopBits.One; try serialPort1.Open(); /打开串口 btnOpen.Text = 关闭串口; /改变按钮上的字符 comboBox1.Enabled = false; comboBox2.Enabled = false; comboBox3.Enabled = false; comboBox4.Enabled = false; comboBox5.Enabled = false; catch MessageBox.Show(串口打开失败!n可能是串口已被占用!); else /如果串口是打开的 serialPort1.Close(); /关闭串口 btnOpen.Text = 打开串口; /改变按钮上的字符 comboBox1.Enabled = true ; comboBox2.Enabled = true; comboBox3.Enabled = true; comboBox4.Enabled = true; comboBox5.Enabled = true; private void btnCJ_Click(object sender, EventArgs e) try if (serialPort1.IsOpen) serialPort1.Write(rn); if (Convert.ToInt32(serialPort1.ReadLine() != 1820) MessageBox.Show(没有找到您要找的设备); return; serialPort1.Write(rn); double k = Convert.ToDouble(serialPort1.ReadLine(); double wendu = k * 0.0001; textBox1.Text = 温度: + wendu.ToString() + ; + 时间: + DateTime.Now.ToString(); btnCJ.Text = 停止采集; timer1.Start(); else timer1.Stop(); MessageBox.Show(串口未打开请先打开串口!); catch MessageBox.Show(没找到设备); timer1.Stop(); serialPort1.Close(); serialPort1.Dispose(); btnCJ.Text = 开始采集; private void button2_Click(object sender, EventArgs e) /清除listbox控件中的内容 textBox1.Text = ; private void button3_Click(object sender, EventArgs e) /保存温度数据 System.IO.FileStream objfile; saveFileDialog1.ShowDialog(); objfile = System.IO.File.Create(saveFileDialog1.FileName); objfile.Close(); objfile.Close(); objfile.Dispose(); System.IO.StreamWriter objfiles = new StreamWriter(saveFileDialog1.FileName); objfiles.Write(textBox1.Text); objfiles.Close(); objfiles.Dispose(); private void timer1_Tick(object sender, EventArgs e) serialPort1.Write(rn); double k = Convert.ToDouble(serialPort1.ReadLine(); double wendu = k * 0.0001; textBox1.Text = 温度: + wendu.ToString() + ; + 时间: + DateTime.Now.ToString(); btnCJ.Text = 停止采集; private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) this.serialPort1.PortName = boBox1.SelectedItem.ToString(); private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) this.serialPort1.BaudRate = Convert.ToInt32(boBox2.SelectedItem); private void comboBox3_SelectedIndexChanged(object sender, EventArgs e) switch (boBox3.SelectedItem.ToString() case None: this.serialPort1.Parity = Parity.None; break; case Even: this.serialPort1.Parity = Parity.Even; break; case Odd: this.serialPort1.Parity = Parity.Odd; break; default: this.serialPort1.Parity = Parity.None; break; private void comboBox4_SelectedIndexChanged(object sender, EventArgs e) this.serialPort1.DataBits = Convert.ToInt16(boBox4.SelectedItem); private void comboBox5_SelectedIndexChanged(object sender, EventArgs e) switch (Convert.ToInt16(boBox5.SelectedItem) case 1: this.serialPort1.StopBits = StopBits.One; break; case 2: this.serialPort1.StopBits = StopBits.Two; break; default: this.serialPort1.StopBits = StopBits.One; break; private void Form1_Load(object sender, EventArgs e) #region -以下各赋值语句都会触发相应的SelectedIndexChanged事件,同时会对串口进行初始化设- boBox1.SelectedItem = boBox1.Items0; /COM1; boBox2.SelectedItem = boBox2.Items3; /9600; boBox3.SelectedItem = boBox3.Items0; /8; boBox4.SelectedItem = boBox4.Items0; /Parity.None; boBox5.SelectedItem = boBox5.Items0; /StopBits.One #endregion 3.课程设计总结通过此次课程设计,使我更加扎实的掌握了有关高频电子线路方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。同时,设计让我感触很深。使我对抽象的理论有了具体的认识。通过这次课程设计,我掌握了常用元件的识别和测试;熟悉了常用仪器、仪表;了解了电路的连线方法;以及如何提高电路的性能等等,掌握了焊接的方法和技术,通过查询资料,也了解了收音机的构造及原理。我认为,在这学期的实验中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我们的将来也有很大的帮助。以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。 实验过程中,也对团队精神的进行了考察,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。4.参考文献1 曹克澄.单片机原理及应用. 机械工业出版社.2005.2 马俊编著.C#网络应用高级编程.2007.53 靳达编著.单片机应用系统开发实例导航.北京:人民邮电出版社,20034 南建辉、熊鸣、王军茹.MCS-51单片机原理及应用实例.清华大学出版社,2004课程设计评 语课程设计成 绩指导教师(签字) 年 月 日END6.2 上位机程序设计软件控制活动门需要实现两个功能:一是人机控制界面的编写,二是活动门控制信号的传送和执行。第一个功能的主要内容是Windows环境下可视化程序的开发;第二个功能主要是微机与单片机之间的通信。6.2.1控制界面6.2.2程序代码:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.IO.Ports;namespace HDMKZ public partial class Form1 : Form public Form1() InitializeComponent(); private void Form1_Load(object sender, EventArgs e) comboBox1.SelectedIndex = 0; byte Dout = new byte1; byte Din = new byte1; private void button1_Click(object sender, EventArgs e) if (serialPort1.IsOpen) serialPort1.Close(); button1.Text = 关闭串口; textBox1.Text = 串口未打开,不可以进行串口通信!; listBox1.Items.Add(初始化失败,禁止可以进行通信!); else try textBox3.Text = 9600bps; textBox4.Text = 8; textBox6.Text = 0; serialPort1.PortName = (String)comboBox1.SelectedItem; serialPort1.BaudRate = 9600; serialPort1.DataBits = 8; serialPort1.StopBits = StopBits.One; serialPort1.Parity = Parity.None; serialPort1.RtsEnable = true; serialPort1.Open(); button1.Text = 打开串口; textBox1.Text = 串口已打开,可以进行串口通信!; listBox1.Items.Add(初始化成功,可以进行通信!); catch MessageBox.Show(串口未打开!, 出错啦!, MessageBoxButtons.OK, MessageBoxIcon.Error); private void listBox1_SelectedIndexChanged(object sender, EventArgs e) private void button2_Click(object sender, EventArgs e) try if ( serialPort1.IsOpen) Dout0 = 10; this.serialPort1.Write(Dout, 0, Dout.Length); listBox1.Items.Add(已发送控制信号使电机正转!); catch MessageBox.Show(发送命令失败!, 出错啦!, MessageBoxButtons.OK, MessageBoxIcon.Error); private void button3_Click(object sender, EventArgs e) try if ( serialPort1.IsOpen) Dout0 = 01; this.serialPort1.Write(Dout, 0, Dout.Length); listBox1.Items.Add(已发送控制信号使电机正转!); catch MessageBox.Show(发送命令失败!, 出错啦!, MessageBoxButtons.OK, MessageBoxIcon.Error); private void serialPort1_DataReceived_1(object sender, SerialDataReceivedEventArgs e) Control.CheckForIlleg

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论