单片机与上位机通信系统设计说明
单片机多机通信课程设计
1设计任务多机串行通信的设计基本任务1.设计三个以上单片机实现主从式串行通信的系统,主机发送数据到指定站号的从机端,也可以群发到所有从机端,并在LED数码管上显示。
2.可通过接在主机上的键盘输入数据,通过主机发送到从机。
3.从机也可输入数据,并可在查询到主机空闲时将数据发送给主机。
4*.从机间可相互通信(从机—)主机 另一从机),通信协议遵从modbus规范。
4@. 其他功能(创新部分)仿真模块例2设计方案2.1设计任务本文在参考了现在普遍的多机通信系统的基础上,设计了一种基于51单片机STC89C51的多机通信系统。
在proteus上设计并仿真电路图。
进入proteus程序仿真,启动程序系统,首先主机通过按键选择准备通信的从机,接通后,主机通过矩阵键盘上的数字按键与从机通信,使从机上的数码管显示对应的数字,以此实现多机通信。
如,与2号机通信并传输“8”这个数字。
首先主机从选择从机按键上按“2号机”键,与2号机连通后按下主机矩阵键盘上的“8”键,对应的2号机数码管上会显示数字“8”,证明通信成功。
2.2串行通信简介串行通信可以分为同步通信和异步通信两类。
同步通信是一种连续串行传送数据的通信方式,一次通信只传送一帧信息。
这里的信息帧与异步通信中的字符帧不同,通常含有若干个数据字符。
它们均由同步字符、数据字符和校验字符(CRC)组成。
其中同步字符位于帧开头,用于确认数据字符的开始。
数据字符在同步字符之后,个数没有限制,由所需传输的数据块长度来决定;校验字符有1到2个,用于接收端对接收到的字符序列进行正确性的校验。
同步通信的缺点是要求发送时钟和接收时钟保持严格的同步。
异步通信中,在异步通行中有两个比较重要的指标:字符帧格式和波特率。
数据通常以字符或者字节为单位组成字符帧传送。
字符帧由发送端逐帧发送,通过传输线被接收设备逐帧接收。
发送端和接收端可以由各自的时钟来控制数据的发送和接收,这两个时钟源彼此独立,互不同步。
基于51单片机的上位机通讯系统课程设计说明书
目录摘要 0 (1) (1) (1)1.3 设计思路 (1) (2) (2) (2) (3)2.2.1 +5V电源原理及设计 (3) (4) (5)2.2.4 RS-232接口电器特性 (5) (8) (8)3.2 主控制部分――AT89C52单片机简介 (9) (16) (16)5.课程设计总结 (31)参考文献 (33)摘要随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。
现代化集中管理需要对现场数据进行统计、分析、制表、打印、绘图、报警等,同时,又要求对现场装置进行实时控制,完成各种规定操作,达到集中管理的目的。
加之单片机的计算能力有限,难以进行复杂的数据处理。
因此在功能比较复杂的控制系统中,通常以PC机为上位机,单片机为下位机,由单片机完成数据的采集及对装置的控制,而由上位机完成各种复杂的数据处理及对单片机的控制。
本文介绍了一种基于AT89C52 单片机与上位机通信系统, 并对其工作原理及软、硬件的设计和实现方法进行了详细的阐述。
在单片机的输入输出控制中,除直接接上小键盘和LCD显示等方法外,一般都通过串口和上位机PC进行通信,后面一种方法由于PC机拥有强大的数据处理功能以及友好的控制界面并且能实现远程控制所以显得尤为有用。
此系统可以由上位机控制,通过串口操作单片机模块实现其相应功能。
本次设计就是来完成由上位机通过串口控制来实现,以发光二极管的发光状态模拟开关电路的通断,用上位机的DOS命令对其进行控制。
并用LED屏显示程序的传输。
关键字AT89C52单片机;上位机;串口通信;开关电路.1)通过单片机课程设计,熟练掌握汇编语言的编程方法,将理论联系到实践中去,提高我们的动脑和动手的能力。
2)通过上位机通信系统的设计,了解上位机通信系统的工作原理和简单的程序编写,最终提高我们的逻辑思维能力。
上位机设计方案
前言在我国采用斜井开拓方式的矿井中,随着矿井的不断开采和延伸,井下作业地点距离越来越长。
长期以来,职工只能步行,把大量体力和时间消耗在过程中。
为此应切实解决井下作业人员体力和时间的武功消耗,确保井下作业的工作和工程质量。
目前随着科技水平的不断提高,许多矿井都选用架空人车负担煤矿人员的运输。
基于物联网的矿山井下架空人车系统的基本功能是通过无线传输对车厢进行实现监控,车厢内的工作人员可以在意外事故发生后按下紧急按钮通知地面主控制室采取有效措施,防止灾难发生。
本设计是以组态王软件做为矿井架空人车无线监控系统上位机,完成之后,可以实现对轿厢内情况的视频监控、语音通信、报警以及MP3播放等功能。
控制室可以通过上位机来监控轿厢机内的情况以及和任何一个轿厢进行语音通信,以实现控制室对每个轿厢内状态的监控。
1概述1.1矿用架空人车的概况矿用架空人车为矿山长距离安全快速地人员运输提供了经济使用的解决方案。
其工作原理类似于地面旅游索道,它通过电动机传动减速机上的摩擦轮作为驱动装置,以架空、无极循环的钢丝绳作为牵引承载,此钢丝绳靠尾轮张紧装置进行张紧和绳长调节,沿途采用托绳支撑,以维持钢丝绳在托轮间的贴合力;抱索器将乘人抱索器或物料箱与钢丝绳连接并循环运行,从而实现运送人员及物料的目的。
其优势能长期运输,实现无人值守和远程智能监控运行,无需专门操作司机,维护工作量较少。
这种矿用架空人车与斜井人车运输相比较,具有更安全使用、运送能力大、动力消耗小,设备结构简单、维护工作量小等优点,深受井下工人的欢迎,大大提高了井下辅助运输的效率。
与国内快速发展的煤矿采掘机械化水平相比,矿井辅助运输明显落后,已成为制约我国煤炭生产发展的主要因素之一。
利用架空乘人装置运送井下人员,减少工人上下班的时间和体力消耗,对矿井的高产高效起到推动作用。
矿用架空人车的最新发展方向呈现大运量、高速度、集中控制、稳定安全等特点。
具有大运量、连续运输、连续变坡拐弯的特点,而且运行可靠,易于实现自动化和集中控制,经济效益十分明显。
51单片机与PC机通信
《专业综合实习报告》专业:电子信息工程年级:2013级指导教师:学生:目录一:实验项目名称二:前言三:项目内容及要求四:串口通信原理五:设计思路5.1虚拟串口的设置5.2下位机电路和程序设计5.3串口通信仿真六:电路原理框图七:相关硬件及配套软件7.1 AT89C51器件简介7.2 COMPIN简介7.3 MAX232器件简介7.4友善串口调试助手7.5 虚拟串口软件Virtual Serial Port Driver 6.9八:程序设计九:proteus仿真调试十:总结十一:参考文献一:实验项目名称:基于51单片机的单片机与PC机通信二:前言在国内外,以PC机作为上位机,单片机作为下位机的控制系统中,PC机通常以软件界面进行人机交互,以串行通信方式与单片机进行积极交互,而单片机系统根据被控对象配置相应的前向,后向信息通道,工作时作为主控机测对象,作为被控机接受PC机监督,指挥,定期或受命向上位机提供对象及本身的工作状态信息。
目前,随着集成电路集成度的增加,电子计算机向微型化和超微型化方向发展,微型计算机已成为导弹,智能机器人,人类宇宙和太空和太空奥妙复杂系统不可缺少的智能部件。
在一些工业控制中,经常需要以多台单片机作为下位机执行对被控对象的直接控制,以一台PC机为上位机完成复杂的数据处理,组成一种以集中管理、分散控制为特点的集散控制系统。
为了提高系统管理的先进性和安全性,计算机工业自动控制和监测系统越来越多地采用集总分算系统。
较为常见的形式是由一台做管理用的上位主计算机(主机)和一台直接参与控制检测的下位机(单片机)构成的主从式系统,主机和从机之间以通讯的方式来协调工作。
主机的作用一是要向从机发送各种命令及参数:二是要及时收集、整理和分析从机发回的数据,供进一步的决策和报表。
从机被动地接受、执行主机发来的命令,并且根据主机的要求向主机回传相应烦人实时数据,报告其运行状态。
用串行总线技术可以使系统的硬件设计大大简化、系统的体积减小、可靠性提高。
上下位机通信方案(新改)
上下位机通信方案控制板电源由上位机用0x00打开,控制板电源关闭时单片机处于失电状态不工作,控制板电源可以由单片机关闭。
一旦上电,单片机即启动,控制所有输出量为无效状态(所有模拟输出为零,所有开关输出为高),且上传一帧数据表述准备好,然后进入等待状态。
单片机的工作完全受上位机控制,单片机的工作1.检测到测量点的变化,将其变化以一定的格式发送给上位机。
2.单片机接收上位机传送的命令,并按照协议执行。
单片机接受的命令有下面几种:1、关闭电源(执行该命令后,单片机会失电。
只能由上位机用0x00再打开)2、是否上传数据,及上传数据的变化量3、控制输出开关量4、控制输出模拟量握手协议:通讯双方在每次通讯时,接收方返回应答帧校验正确,返回0xFC校验错误,返回0xFD 同时丢掉当前帧,对方将从发此帧注:应答帧只发送一个字节面板指示编号:(具体编号由上位机拟定)数字输出量1 电源指示灯0xA0 61 DO02 预热塞加热指示灯62 DO13 加油泵指示灯63 DO24 急停警示指示灯64 DO35 无65 DO46 系统I 气泡观察0xC1 66 DO57 系统I仪表照明指示灯67 DO68 系统I 0-28Mpa指示灯68 DO79 系统I 主泵卸荷指示灯69 DO810 系统I自循环指示灯70 DO911 系统I输出指示灯71 DO1012 系统II 气泡观察0xC2 72 DO1113 系统II车厢照明指示灯73 DO1214系统II 0-28Mpa指示灯74 DO1315系统II主泵卸荷指示灯75 DO1416系统II 自循环指示灯76 DO1517系统II 输出指示灯77 DO1618 系统I开式灯78 DO1719 系统I 闭式灯79 DO1820系统II 开式灯0Xbf 80 DO1921系统II 闭式灯0xC0 81 DO2022 液位低指示灯82 DO2123 发电机故障指示灯83 DO2224 机油压力故障指示灯84 DO2325 空气滤故障指示灯85 DO2426 液位高指示灯86 DO2527 系统I低出滤指示灯87 DO2628 系统I 高粗滤指示灯0Xaf 88 DO2729 系统I高精滤I指示灯0xB0 89 DO2830 系统I 高精滤II指示灯90 DO2931 系统I压力报警指示灯91 DO30 32系统II 低出滤指示灯92 DO31 33系统II高粗滤指示灯93 DO32 34系统II 高精滤I指示灯94 DO33 35系统II高精滤II指示灯95 DO34 36系统II 压力报警指示灯96 DO3540 V5039 SHCLK38 SHDAT37 SHRET36 GND31 GND30 GND数字输入量1电源开关0xE0 23 DI02预热塞加热开关22 DI13加油泵开关21 DI24紧急停车按钮20 DI35油门启动按钮19 DI46系统I 气泡观察18 DI57系统I 仪表照明开关17 DI68系统I 0-28Mpa开关16 DI79系统I 主泵卸荷15 DI810系统I 自循环14 DI911系统I 输出13 D1012系统II 气泡观察12 D1113系统II 车厢照明11 DI214系统II 0-28Mpa开关10 DI1315系统II 主泵卸荷9 DI1416系统II 自循环0xEF 8 DI1517系统II 输出0xF0 7 DI1618系统I 开式开关0xF1 6 DI1719系统I 闭式开关0xF2 5 DI1820系统II 开式开关0xF3 4 DI1921系统II 闭式开关0xF4 3 DI2041 V120 模拟输出量1.电流0xD0 42 AO0 2.柴油油量43 AO1 3.汽缸盖温度44 AO2 4.机油温度45 AO3 5.机油压力46 AO4 6.转速47 AO5 7.系统I 输出压力48 AO6 8.系统I 辅助压力49 AO7 9.系统I 回油压力50 AO8 10.系统I 流量51 AO9 11.系统I 温度52 AO10 12.系统II 输出压力53 AO11 13.系统II 辅助压力54 AO12 14.系统II 回油压力55 AO13 15.系统II 流量56 AO14 16.系统II 温度0Xdf 57 AO1560 V120模拟输入量1.油门0x90 1 AI12.系统I 压力调节0x91 2 AI23.系统II 压力调节0x92 3 AI3。
RS485实验指导书
实验一实验板点对点通信【实验目的】1. 建立双机通信的概念2. 掌握单片机串行口通信的编程和调试方法。
3. 掌握异步串行通信的数据格式及数据协议设定。
【实验环境】PC机一台,keil开发环境一套,RS232通信线【实验重点及难点】串行口通信的程序的设计,以及硬件的连接数据通信的协议等。
【实验原理介绍】1.1 程序下载方式介绍1.1.1 RS232与上位机通信下载程序由于要从上位机中下载程序到单片机中,所以需要建立他们之间的通信线路。
本实验采用MAX232芯片,max232是一种把电脑的串行口rs232信号电平(-10 ,+10v)转换为单片机所用到的TTL信号点平(0 ,+5)的芯片,下面介绍一下max232引脚图,看下面的图。
图3.1 max232引脚图本实验中采用11、12、13、14号管脚作输入输出,其中13、14与DB9连接,11、12与单片机连接。
1.1.2 485通信485通信的过程如下:从DB9接收数据,经过max485芯片实现电平转换,然后max485芯片经过高速光耦与单片机通信,将数据送入单片机中进行处理;处理完成后将数据返回至max485,再经DB9输出。
如此就可实现两单片机之间的通信或单片机与上位机间的通信。
下面介绍一下max485芯片接线方法,如下图示:图2 max485接线图其中1、4为输入输出管脚,经光耦与单片机连接,2、3为使能端,6、7为与外部通信接口。
1.2 MCU功能介绍本实验中选择stc12c5a60s2系列单片机,其管脚图如下:图3 tc12c5a60s2单片机管脚图stc12c5a60s2系列单片机是单时钟的单片机,增强型8051内核,速度比普通8051快8~12倍,宽电压:5.5~3.5V,2.2~3.8V,低功耗设计:空闲模式,掉电模式,工作频率:0~35MHz.时钟:外部晶体或内部RC振荡器可选,在ISP下载编程用户程序时设置。
全双工异步串行口,兼容8051的串口。
单片机课程设计PC机与单片机通信
信息科学与技术学院《单片机原理》课程设计报告PC机与单片机通信目录第一章设计任务及要求 (3)1.1 设计任务 (3)1.2 设计要求 (3)第二章设计设计思路与原理 (3)2.1设计思路 (3)2.2设计原理 (4)第三章系统功能模块 (5)3.1 总原理图 (5)3.2温度测量电路 (5)3.3通信模块 (8)3.4发光二极管电路 (10)3.5复位电路及时钟电路 (11)第四章程序设计 (12)4.2 软硬件功能............................................................................错误!未定义书签。
第五章参考结论与体会 .. (13)第六章参考文献 (15)附录 (15)一、设计任务及要求1.1 设计任务PC机与单片机通信1.2 设计要求1、通过DS18B20采集当前温度2、将当前温度发送至PC机,在PC机上设计接收温度界面,(并绘制接收温度曲线);3、根据温度值向单片机传送不同字符,并点亮相应的二极管。
若温度值在20~26,传送字符A,点亮绿灯;温度值在27~30,传送B,点亮黄灯;温度值在31~40,传送C,点亮蓝灯。
二、设计思路与原理2.1 设计思路在测控系统中,经常采用单片机在操作现场进行数据采集,但是单片机数据储存和数据处理能力较低,当需要处理较复杂数据或需要对多个采集数据进行综合处理以及需要进行集散控制时,单片机的算术运算和逻辑运算能力显的不足,这时往往需要借助计算机系统。
将单片机采集的数据通过串行口传给PC机,由PC机高级语言或数据库语言进行处理,或者实现PC机对远程单片机进行控制。
所以一般情况下单片机通过串行口与PC机的串行口相连,把采集到的数据传送到PC机上。
总体思路:首先利用DS18b20采集温度数据,然后使用单片机串口将温度数据发送至PC机。
再判断温度值的范围控制发光二级管。
2.2 设计原理目前RS-232是PC与通信工业中应用最广泛的一种串行接口,其中EIA代表美国电子工业协会,RS代表推荐标准,232是标识号。
基于单片机串口通信的上位机和下位机实践
基于单片机串口通信的上位机和下位机实践标准化管理处编码[BBX968T-XBB8968-NNJ668-MM9N]基于单片机串口通信的上位机和下位机实践串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial Bus或者USB混淆)。
大多数计算机包含两个基于RS232的串口。
串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。
同时,串口通信协议也可以用于获取远程采集设备的数据。
串口通信的概念非常简单,串口按位(bit)发送和接收字节。
尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。
它很简单并且能够实现远距离通信。
比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。
首先亮出C#的源程序吧。
主要界面:只是作为简单的运用,可以扩展的。
源代码:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.IO.Ports;using System.Timers;namespace 单片机功能控制{public partial class Form1 : Form{public Form1(){InitializeComponent();}SerialPort sp = new SerialPort();private void button1_Click(object sender, EventArgs e) {String str1 = comboBox1.Text;//串口号String str2 = comboBox2.Text;//波特率String str3 = comboBox3.Text;//校验位String str4 = comboBox5.Text;//停止位String str5 = comboBox4.Text;//数据位Int32 int2 = Convert.ToInt32(str2);//将字符串转为整型 Int32 int5 = Convert.ToInt32(str5);//将字符串转为整型 groupBox3.Enabled = true;//LED控制界面变可选try{if (button1.Text == "打开串口"){if (str1 == null){MessageBox.Show("请先选择串口!", "Error"); return;}sp.Close();sp = new SerialPort();sp.PortName = comboBox1.Text;//串口编号sp.BaudRate = int2;//波特率switch (str4)//停止位{case "1":sp.StopBits = StopBits.One;break;case "1.5":sp.StopBits = StopBits.OnePointFive; break;case "2":sp.StopBits = StopBits.Two;break;default:MessageBox.Show("Error:参数不正确", "Error"); break;}switch (str3){case "NONE":sp.Parity = Parity.None; break;case "ODD":sp.Parity = Parity.Odd; break;case "EVEN":sp.Parity = Parity.Even; break;default:MessageBox.Show("Error:参数不正确", "Error"); break;}sp.DataBits = int5;//数据位sp.Parity = Parity.Even;//设置串口属性sp.Open();//打开串口button1.Text = "关闭串口";textBox1.Text = Convert.ToString(sp.PortName) + "已开启!"; }else{sp.Close();button1.Text = "打开串口";groupBox3.Enabled = false;//LED控制界面变灰色textBox1.Text = Convert.ToString(sp.PortName) + "已关闭!"; }}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void Form1_Load(object sender, EventArgs e) {//初始化textBox1.Text = "欢迎使用简易的串口助手!";groupBox3.Enabled = false;//LED控制界面变灰色 groupBox6.Enabled = false;groupBox7.Enabled = false;groupBox8.Enabled = false;button3.Enabled = false;button6.Enabled = false;timer1.Start();try{foreach (string com inSystem.IO.Ports.SerialPort.GetPortNames()) //自动获取串行口名称boBox1.Items.Add(com);//默认设置comboBox1.SelectedIndex = 0;//选择第一个com口comboBox2.SelectedIndex = 4;//波特率4800comboBox3.SelectedIndex = 0;//校验位NONEcomboBox4.SelectedIndex = 0;//停止位为1comboBox5.SelectedIndex = 0;//数据位为8}catch{MessageBox.Show("找不到通讯端口!", "串口调试助手"); }}private void timer1_Tick(object sender, EventArgs e){label6.Text = DateTime.Now.ToString();}private void button2_Click(object sender, EventArgs e) {try {if (button2.Text == "开启"){groupBox6.Enabled = true;radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;button3.Enabled = true;textBox2.Text = String.Empty; button2.Text = "关闭";}else{groupBox6.Enabled = false;button3.Enabled = false;button2.Text = "开启";textBox2.Text = String.Empty; }}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void button3_Click(object sender, EventArgs e){groupBox6.Enabled = true;label7.Text = "已发送";if (textBox2.Text == "")MessageBox.Show("发送失败,请选择发送的数据!");elsesp.WriteLine(textBox2.Text);//往串口写数据}private void checkBox1_CheckedChanged(object sender, EventArgs e){try {if (checkBox1.Checked){checkBox1.Checked = true; checkBox2.Checked = false; checkBox3.Checked = false; checkBox4.Checked = false; checkBox5.Checked = false; checkBox6.Checked = false; checkBox7.Checked = false; checkBox8.Checked = false; label7.Text = "准备发送"; textBox2.Text = "1";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void checkBox2_CheckedChanged(object sender, EventArgs e) {try {if (checkBox2.Checked){checkBox1.Checked = false;checkBox2.Checked = true;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;label7.Text = "准备发送";textBox2.Text = "2";radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error"); return;}}private void checkBox3_CheckedChanged(object sender, EventArgs e) {try{if (checkBox3.Checked){checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = true;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;label7.Text = "准备发送";textBox2.Text = "3";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void checkBox4_CheckedChanged(object sender, EventArgs e) {try{if (checkBox4.Checked){checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = true;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;radioButton1.Checked = false; radioButton2.Checked = false; radioButton3.Checked = false; radioButton4.Checked = false; label7.Text = "准备发送";textBox2.Text = "4";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void checkBox5_CheckedChanged(object sender, EventArgs e) {try{if (checkBox5.Checked){checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = true;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;radioButton1.Checked = false; radioButton2.Checked = false; radioButton3.Checked = false; radioButton4.Checked = false; label7.Text = "准备发送";textBox2.Text = "5";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void checkBox6_CheckedChanged(object sender, EventArgs e) {try{if (checkBox6.Checked){checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = true;checkBox7.Checked = false;checkBox8.Checked = false;radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;label7.Text = "准备发送";textBox2.Text = "6";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error"); return;}}private void checkBox7_CheckedChanged(object sender, EventArgs e) {try{if (checkBox7.Checked){checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = true;checkBox8.Checked = false;radioButton1.Checked = false;radioButton2.Checked = false;radioButton3.Checked = false;radioButton4.Checked = false;label7.Text = "准备发送";textBox2.Text = "7";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error");return;}}private void checkBox8_CheckedChanged(object sender, EventArgs e) {try{if (checkBox8.Checked){checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = true;radioButton1.Checked = false; radioButton2.Checked = false; radioButton3.Checked = false; radioButton4.Checked = false; label7.Text = "准备发送";textBox2.Text = "8";}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error"); return;}}private void button5_Click(object sender, EventArgs e) {try{if (button5.Text == "开启"){radioButton1.Checked = false;radioButton2.Checked = false; radioButton3.Checked = false; radioButton4.Checked = false; checkBox1.Checked = false;checkBox2.Checked = false;checkBox3.Checked = false;checkBox4.Checked = false;checkBox5.Checked = false;checkBox6.Checked = false;checkBox7.Checked = false;checkBox8.Checked = false;groupBox7.Enabled = true;button6.Enabled = true;textBox2.Text = String.Empty; button5.Text = "关闭";}else{groupBox7.Enabled = false;button6.Enabled = false;button5.Text = "开启";textBox2.Text = String.Empty;}}catch (Exception er){MessageBox.Show("Error:" + er.Message, "Error"); return;}}private void button6_Click(object sender, EventArgs e) {label7.Text = "已发送";if (textBox2.Text == "")MessageBox.Show("发送失败。
用Delphi实现上位机与单片机串行通信源代码及效果图
用Delphi实现上位机与单片机串行通信效果图及源代码只公布下位机(单片机)程序//***************************************************************************** ***********************////本设计使用AT89C2051单片机,//时钟频率为11.0592MHz,12MHz也可以//用共阳极LED数码管显示及使用DS18B20智能温度传感器。
// //设计日月科技,QQ512566413#include <reg51.h>#include <intrins.h>//_nop_();延时函数,用于小于1us延时#define uchar unsigned char#define uint unsigned int#define disdata P1 //段码输出口sbit din=P1^5; //LED小数点控制//#define discan P3 //动态扫描口//占用整个P3口了,现改为指定下面的端口,//把多余端口占用的空出来//列扫描控制IO口sbit led_1 = P2^0;sbit led_2 = P2^1;sbit led_3 = P2^2;sbit led_4 = P2^3;sbit dq= P3^3; //温度输入口uchar ch;uchar crc;//***温度小数部分用查表法*********//uchar data RomCode[8]={0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00};uchar code ditab[16]={0x00, 0x01, 0x01, 0x02,0x03, 0x03, 0x04, 0x04,0x05, 0x06, 0x06, 0x07,0x08, 0x08, 0x09, 0x09};/*uchar code dis_7[12]={0xC0, 0xF9, 0xA4, 0xB0,0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0xff, 0xbf};*/uchar code dis_7[12]={0x28,0xEE,0x32,0xA2,0xE4,0xA1,0x21,0xEA,0x20,0xA0,0xff,0xF7};//共阴极LED段码表"0""1""2""3""4""5""6""7""8""9""不亮""-"uchar code str[12]={'0','1','2','3','4','5','6','7','8', '9',' ','-'};//uchar code scan_con[4]={0x04,0x08,0x10,0x20};//列扫描控制字,P3.2 P3.3 P3.4 P3.5//0x04化成二进制就是0000 0100//0x08化成二进制就是0000 1000//0x10化成二进制就是0001 0000//0x20化成二进制就是0010 0000//0x40化成二进制就是0100 0000//0x80化成二进制就是1000 0000uchar data temp_data[2]={0x00, 0x00}; // 读出温度暂放uchar data display[5]={0x00, 0x00, 0x00, 0x00, 0x00};//显示单元数据,共4个数据,一个运算暂存用//串口初始化晶振为11.0592M 方式1 波特率300-57600void InitCom(void){#define XTAL 11059200 // CUP 晶振频率#define baudrate 9600 // 通信波特率TMOD = 0x20; //定时器1方式2 定时器0方式1//用在别处可以不用定时器0,TMOD=0x20 TH1=TL1=(unsigned char)(256-(XTAL/(32L*12L*baudrate))); //THTL;SCON = 0x50; //串口方式1,允许接收//TCON = 0x40; //设定时器1开始计数//PCON = 0x80; //波特率加倍控制,SMOD位PCON=0x00;RI=0; //清收发标志TI=0;IE=0x90; //0x00=禁止任何中断,0x90开启T1中断,0x92开启全部中断TR1=1; //启动定时器1}//向串口输出一个字符(非中断方式)void ComOutChar(unsigned char OutData){SBUF=OutData; //输出字符while(!TI); //空语句判断字符是否发完TI = 0; //清TI}//串口接收中断函数void serial () interrupt 4 //using 3{if(RI){RI=0 ;ch=SBUF;}}//****11微秒延时函数*********************//void delay(uint t){for(;t>0;t--);}//***********显示扫描函数*************//void scan(void){char k;for (k=0;k<4;k++) //四位LED扫描控制从左到右{Disdata = dis_7[display[k]];//discan = scan_con[k];switch (k){case 0:LED_1 = 0;break;case 1:LED_2 = 0;DIN = 0;break;case 2:LED_3 = 0;break;case 3:LED_4 = 0;break;default:break;}delay(100);//scan_con-列扫描控制字;//discan-P3口列扫描输出//discan=0x00; //灭字switch(k){case 0:LED_1 = 1;break;case 1:LED_2 = 1;break;case 2:LED_3 = 1;break;case 3:LED_4 = 1;break;default:break;}}}//******18B20复位函数***********//void Init_DS18B20(void){char presence=1;while (presence){while (presence){DQ = 1;_nop_();_nop_(); //总线上拉DQ = 0; //下拉delay(50); //维持550us,最短维持480usDQ = 1; //总线上拉delay(6); //检测总线上升沿,66uspresence = DQ; //DS18B20发存在低电平信号(60-240us);presence=0继续下一步}delay(30);//延时300us,总线恢复高电平,DQ=1;presence=~DQ; //取反,跳出循环}DQ = 1;}//****18B20写命令函数************//void WriteOneChar(uchar val){uchar i;for(i=8;i>0;i--) //定义8 bit,写8 bit{DQ = 1;_nop_();_nop_();DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_(); //5usDQ=val&0x01; //最低位移出,并写入总线delay(6); //66usval=val>>1;//右移一位,倒数第二位变为最低位}DQ=1;delay(1); //高电平维持11us,写结束}//*******18B20读1个字节函数*********************//uchar ReadOneChar(void){uchar i;uchar value = 0;for (i = 8; i > 0; i--){DQ = 1;_nop_();_nop_();value>>=1; //右移一位DQ=0;_nop_();_nop_();_nop_();_nop_(); //4usDQ=1;_nop_();_nop_();_nop_();_nop_(); //4us ,读时隙if(DQ)value|=0x80;//DQ=1,则写入为10000000delay(6); //66us}DQ = 1;return(value);}/**************************************//* *//* 读取64位序列码*/ /* *//**************************************/void Read_RomCord(void){uchar j;Init_DS18B20();WriteOneChar(0x33); // 读序列码的操作for(j=0;j<8;j++){RomCode[j]=ReadOneChar();}}/******************************************//* *//*DS18B20的CRC8校验程序*//* *//******************************************/uchar CRC8(void){uchar i, x;uchar crcbuff;crc = 0;for(x=0;x<8;x++){crcbuff=RomCode[x];for(i=0;i<8;i++){if(((crc^crcbuff)&0x01)==0)crc>>=1;else{crc^=0x18; //CRC=X8+X5+X4+1crc>>=1;crc|=0x80;}crcbuff>>=1;}}return crc;}//*********读出温度函数*****************//void ReadTemperature(void){uchar n=0; //存储符号Init_DS18B20(); //总线复位WriteOneChar(0xCC); // 发Skip ROM命令WriteOneChar(0xBE); // 发读命令temp_data[0]=ReadOneChar(); //温度低8位temp_data[1]=ReadOneChar(); //温度高8位Init_DS18B20();WriteOneChar(0xCC); // Skip ROMWriteOneChar(0x44); // 发转换命令//******温度数据处理函数*********************//if ((temp_data[1]&0xf8)==0xf8){temp_data[1]=~temp_data[1]; //负温度求补码temp_data[0]=~temp_data[0]+1;if (temp_data[0]==0x00)temp_data[1]++;n = 1;}//查表得到温度小数部分display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]]; //处理小数位//获取温度整数部分//(高字节的低三位与低字节的高四位)//低八位屏蔽小数位后右移四位//与高八位屏蔽符号位后左移四位合并//display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);display[3]=display[4]/100; //百位display[2]=display[4]%100/10; //十位display[1]=display[4]%10; //个位if (!display[3]){display[3] = 0x0A;//最高位为0时都不显示,控制字为0xffif (!display[2]){display[2]=0x0A;}}if (n){display[3]=0x0B; //负温度时最高位显示"-"}}/*void Timer0(void) interrupt 1 //定时器0中断{TH0 = 0x4c;TL0 = 0x00;}*///*********************主函数*********************//void main(void){uint h, i; //定义循环变量uchar iRom;InitCom(); //初始化串口for (h=0;h<4;h++){display[h]=8; //开机测试LED,显示"8888"}Init_DS18B20(); // 开机先转换一次WriteOneChar(0xCC); // Skip ROM;允许总线控制器不用提供64位ROM编码就可以使用存储器操作命令。
基于单片机与上位机的通信系统设计
基于单片机与上位机的通信系统设计本论文主要阐述的是基于单片机与上位机的通信系统设计,实现上位机与AVR单片机之间数据的传输。
第一部分详细说明了系统的结构框图和系统中各个重要模块的设计方案,并根据情况的不同选择了不同的方案。
第二部分是系统中下位机各部分的原理及具体硬件电路图的设计,并使用了protel 99se辅助软件绘制原理图。
这部分包括温度检测、液晶显示等,可以通过串口将当前温度值传递给上位机。
第三部分是串口通信的说明及通信协议的制定。
第四部分是系统上位机用户界面的设计和实现。
这里应用了Visual Basic 6.0编程软件设计操作界面。
用户可以根据需要设置串口,发送指令并可以在操作界面显示。
第五部分说明了本设计的程序软件流程图,具体说明了程序的运行流程,说明了软件设计思想。
本系统综合单片机原理及接口技术、串口传输技术、上位机控制等技术设计出基于AVR单片机与上位机的通信系统。
该系统可以用于简单的数据传输,检测控制等。
具有较好实用价值。
关键字:上位机串行通信通信协议This paper mainly expounds the single chip microcomputer and computer communication system design, realization between SCM and PC AVR micro data transmission. The first part detailed explanation of the system structure diagram and system design scheme of various important modules, and according to the situation of different choice different scheme. The second part is the system of machine parts below the principle and specific hardware circuit design, and using the Protel 99se auxiliary software rendering diagram. This section includes temperature detection, LCD display, etc, can be passed through serial current value to PC. The third part is the serial communication and communication agreement. The fourth part is the system PC user interface design and realization. Here the Visual Basic 6.0 programming application software design interface. Users can set according to need, can send instructions and serial interface display in. The fifth part of the program design shows the software flow chart, the procedure of the operation process, the software design thought.This system integrated SCM principle and interface technology, serial transmission technology, computer control technology is designed based on AVR SCM and PC communications system. This system can be used in the simple data transmission, test and control, etc. Have good practical value.Key words: PC Serial communication Communications protocol目录第一章绪论 (1)1.1系统设计介绍 (1)1.2系统设计意义 (1)1.1系统下位机设计 (3)1.1.1数据显示 (3)1.1.2温度检测 (4)1.2系统通信方式 (4)1.3系统上位机设计 (5)第二章系统下位机硬件设计与实现 (6)2.1控制电路 (6)2.2电源 (7)2.3DS18B20温度检测 (8)2.4单片机显示 (10)第三章串口通信 (13)3.1异步串行通信原理 (13)3.2同步/异步串行收发器USART (13)3.3RS-232串行通信 (15)3.4本设计的通信协议 (18)第四章系统上位机软件设计与实现 (20)4.1初识V ISUAL B ASIC (20)4.2V ISUAL B ASIC 串行通信控件MSC OMM介绍 (22)4.1.1 MSComm控件的引用 (22)4.1.2 MSComm控件工作方式 (24)4.1.3 MSComm控件控制原则 (24)4.1.4 MSComm控件属性说明 (24)4.3上位机系统操作界面的设计与实现 (26)第五章系统程序编写与设计 (28)5.1下位机部分主程序 (28)5.2上位机部分主程序 (28)I总结 (30)致谢 (31)参考文献 (32)附录A:程序 (33)(1)上位机部分程序 (33)(2)单片机部分程序 (36)附录B:电路图 (42)(1)系统总体电路图 (42)(2)电源部分电路图 (43)II第一章绪论1.1 系统设计介绍本课题是基于AVR单片机与上位机通信系统的设计,此设计包括下位机AVR单片机检测,串口通信,上位机用户操作界面部分等。
上位机设计方案
上位机设计方案1. 引言本文档旨在介绍上位机设计方案的详细内容。
作为一种用于控制下位机设备的软件应用程序,上位机在工业自动化和嵌入式系统中扮演着至关重要的角色。
本文将介绍上位机的概念、设计原则、功能需求以及具体的软件实现方案。
2. 概述2.1 上位机的定义上位机是指运行在PC或嵌入式平台上的一种软件应用程序,用于与下位机设备进行通信、监控和控制。
上位机可通过各种通信协议(如RS232、CAN、以太网等)与下位机通信,并与用户交互界面实现数据的可视化和操作控制。
2.2 设计原则上位机设计应遵循以下原则:•界面友好性:提供直观、易用的用户界面,使操作人员能够方便地进行操作和监控。
•实时性:能够实时获取并显示下位机设备的状态和数据,及时采取相应的控制措施。
•可扩展性:支持多种通信协议和设备接口,能够与不同类型的下位机设备进行通信。
•稳定性和可靠性:保证上位机应用程序的稳定运行,防止数据丢失和系统崩溃。
3. 功能需求基于上述设计原则,下面列出了上位机的主要功能需求:•与下位机通信:支持各种通信协议,如RS232、CAN、以太网等,确保与下位机设备的稳定通信。
•数据采集和显示:实时获取下位机设备的传感器数据,通过图表、表格等方式显示给用户。
•参数设置和控制:支持设置下位机设备的参数,并根据需要进行控制。
•数据存储和导出:将采集到的数据存储在本地数据库中,并支持导出到Excel等格式。
•报警和事件处理:根据设定的阈值进行报警,并能够及时处理异常事件。
•远程监控和控制:支持远程访问和操作,方便对设备进行远程监控和控制。
4. 软件实现方案基于上述功能需求,我们将采用以下软件技术和工具来实现上位机应用程序:•开发语言:选择一种主流的编程语言,如Python、C#、Java等,根据项目需求选择合适的开发语言。
•开发平台:选择一种常用的集成开发环境(IDE),如Visual Studio、Eclipse等。
•数据库:选择一种适用于数据存储和查询的数据库,如MySQL、SQLite等。
上位机与51单片机串口通信
上位机与51单片机串口通信目录:1、单片机串口通信的应用2、PC控制单片机IO口输出3、单片机控制实训指导及综合应用实例4、单片机给计算机发送数据:[实验任务]单片机串口通信的应用,通过串口,我们的个人电脑和单片机系统进行通信。
个人电脑作为上位机,向下位机单片机系统发送十六进制或者ASCLL码,单片机系统接收后,用LED显示接收到的数据和向上位机发回原样数据。
[硬件电路图][实验原理]RS-232是美国电子工业协会正式公布的串行总线标准,也是目前最常用的串行接口标准,用来实现计算机与计算机之间、计算机与外设之间的数据通讯。
RS-232串行接口总线适用于:设备之间的通讯距离不大于15m,传输速率最大为20kBps。
RS-232协议以-5V-15V表示逻辑1;以+5V-15V 表示逻辑0。
我们是用MAX232芯片将RS232电平转换为TTL电平的。
一个完整的RS-232接口有22 根线,采用标准的25芯插头座。
我们在这里使用的是简化的9芯插头座。
注意我们在这里使用的晶振是11.0592M的,而不是12M。
因为波特率的设置需要11.0592M的。
“串口调试助手V2.1.exe”软件的使用很简单,只要将串口选择‘CMO1’波特率设置为‘9600’数据位为8 位。
打开串口(如果关闭)。
然后在发送区里输入要发送的数据,单击手动发送就将数据发送出去了。
注意,如果选中‘十六进制发送’那么发送的数据是十六进制的,必须输入两位数据。
如果没有选中,则发送的是ASCLL码,那么单片机控制的数码管将显示ASCLL码值。
//参考源程序#include "reg52.h" //包函8051 内部资源的定义unsigned char dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容sbit gewei=P2^4; //个位选通定义sbit shiwei=P2^5; //十位选通定义sbit baiwei=P2^6; //百位选通定义unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; //1~10 void Delay(unsigned int tc) //延时程序{while( tc != 0 ){unsigned int i;for(i=0; i<100; i++);tc--;}}void LED() //LED显示接收到的数据(十进制){gewei=0; P0=table[dat%10]; Delay(10); gewei=1;shiwei=0; P0=table[dat/10]; Delay(10); shiwei=1;baiwei=0; P0=table[dat/100]; Delay(10); baiwei=1;}///////功能:串口初始化,波特率9600,方式1/////////void Init_Com(void){TMOD = 0x20;PCON = 0x00;SCON = 0x50;TH1 = 0xFd;TL1 = 0xFd;TR1 = 1;}/////功能:把从上位机接收到的数据原样发送回去///////void main(){Init_Com();//串口初始化while(1){if ( RI ) //扫描判断是否接收到数据,{dat = SBUF; //接收数据SBUF赋与datRI=0; //RI 清零。
(完整word版)单片机与PC机RS-485串行通信设计
沈阳航空航天大学课程设计(论文)题目单片机与PC机RS-485的串行通信设计班级学号学生姓名指导教师目录0 前言 (1)1 总体方案设计 (1)2 硬件电路设计 (2)2.1 AT89C51单片机 (2)2.2 时钟电路 (3)2.3 按键复位电路 (4)2。
4 MAX485转换芯片 (4)2.5 PC机RS—485 通信的接口电路 (5)3 软件设计 (6)4 调试分析 (8)5 结论及进一步设想 (8)参考文献 (8)课设体会 (9)附录1 电路原理图 (10)附录2 程序清单 (11)单片机与PC机RS-485串行通讯设计摘要:本文提出了一种PC机与单片机进行串行通信的方案,该方案通过PC机的RS232串口、485总线实现与51单片机的串口通信,PC机送出的信号进行电平转换后送到485总线,单片机则接受MAX485芯片转换得到的信号,从而进行串行通信。
该系统的特点是电路设计简单可行、通信稳定、实用性强。
关键词:PC机;单片机;串口通信;MAX485芯片;0前言在计算机测控领域经常会采用一台PC 机与一个或多个单片机组成小型的测控网络,这种测控系统充分发挥了单片机功能强, 抗干扰性能好, 温度适应范围宽,面向控制的优点,同时又可以利用计算机弥补单片机在数据处理和交互性等方面的不足。
在测控系统中一般是以PC 机作为主控机,采用串行通讯定时扫描以单片机为核心的智能控制器(从机)以便采集数据或发送信号。
PC机的串口一般采用RS-232的总线标准,但由于RS—232接口标准发布较早,难免有不足之处,主要体现在以下四点:1、接口信号的电平值较高,已损坏接口电路芯片,又因为与TTL 电平不兼容故需使用电平转换电路方能与TTL电路连接;2、传送速率较低,在异步传送时,波特率为20Kbps;3、接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱;4、传输距离有限,最大传输距离标准为50英尺,实际上也只能用在50m左右。
单片机课程设计--上位机
《单片机接口设计》课程设计报告班级:电1001-2班姓名:齐春叶学号: 20102496 日期: 6.26--7.07一.课程设计要求1.定时呼叫下面每一个下位机(如5秒)应答则表示通,显示:地址_P(如1_P);不应答表示不通,显示:地址_E(如3_E)2.可通过按键决定反复呼叫某个地址3.通过按键控制要某地址的数据并显示(要数据命令为AAH)4.通过按键控制修改某地址的数据并显示(修改定值或指示电梯楼层命令为55H)5.显示下位机报警,如:1:FF二.硬件系统说明1.整体电路图电路图说明:单片机P1.0~P1.3接四个按键作为输入,按P1.0按键主机发送反复呼叫命令,按P1.1按键发送要数据命令,按P1.2按键发送修改数据命令,P0口接八个数码管,P2口接八个数码管的位选,P1.4连接蜂鸣器,按P1.0按键,从机报警,MAX232串口通信,40管脚接电源,接有电源指示灯,20管脚接地,10脚11脚串口通信,18、19脚接12M晶振,9脚接复位按键。
2.整体的PCB图说明:我的主要任务(1)反复呼叫某个地址,地址可通过按键来控制,没按一次P1.0反复呼叫的地址加一,向下位机发送呼叫地址,等待一段时间后接受下位机发送回来的数据,若与发送的数据相同则调用通信成功子程序,显示0地址-P,若不同则调用非正常通信子程序,显示0地址-E。
(2)按P1.1键向从机要数据,地址由按键控制,通信不成功,则调用非正常通信子程序,显示0地址-E,通信成功,则向下位机发送AAH命令,下位机接收到命令,回发命令,并向上位机发送数据,上位机接收数据,并调用显示子程序,把接收到的数据显示出来。
(3)按P1.2键从机修改数据,地址由按键控制,通信不成功,则调用非正常通信子程序,显示0地址-E,通信成功,则向下位机发送55H命令,下位机接收到命令,回发命令,表示收到,一段延时之后,上位机向下位机发送要修改的数据,并把要修改的数据,显示出来,下位机接收到数据进行修改。
单片机与上位机通信协议的制定解析
单片机与上位机通信协议的制定单片机和上位机的串口通信协议分为上行协议和下行协议,要分别制定!上行协议,即由单片机向上位机发送数据。
下行协议,即由上位机向单片机发送数据。
而通信协议又要分固定长度和不定长度两种本文所介绍的协议属于简单的固定字长的通信协议!下行协议由四个字节构成上表是简单的上位机对单片机的控制指令下述函数是C艸封装的串口通信类中的发送函数的封装public void SerSe ndCommu(byte orderDef, byte data)// 参数1为命令字,参数二为要发送的数//据,需要时可直接调用Byte[] BSe ndTemp = new Byte[SEND_LENTH];BSe ndTemp[O] = PRE;BSe ndTemp[1] = orderDef;BSe ndTemp[2] = data;BSe ndTemp[3] = END; this.serialPort1.Write(BSendTemp, 0, SEND_LENTH);}下位机中用中断方式接收字符,本文用的是GCC语言,下面是串口接收数据中断ISR(USART_RXC_vect) 〃串口接收中断{un sig ned char status,data;status = UCSRA; //** 首先读取UCSRA勺值,再读取UDR fi,顺序不能颠倒,否则读取UDR后的UCSRA勺//值即会改变**data = UDR;if(!Uart_RecvFlag)〃判断缓存中的数据是否读完,读完则接收指令{if((status&( (1<<FE)|(1<<PE)|(1<<DOR)))==0){rx_buffer[rx_cou nter]=data;rx_co un ter++;switch(rx_cou nter){case 1:if(data!=USART_BEGIN_STX)rx_co un ter=0;break;case 4:rx_co un ter=0;if(data==USART_END_STX)Uart_RecvFlag=1;break;}}}在单片机主循环程序的最前部分进行指令译码if(Uart_RecvFlag)〃接收到命令{ _switch(rx_buffer[1]){ _case OxAA://单片机状态命令控制;ucWorkStatue=rx_buffer[2];〃指令数据break;case OxDD://PWM值修改指令OCR2=rx_buffer[2];break;case 0xFF://初始温度设定break;} Uart_RecvFlag=0;} _//随后进行执行指令switch(ucWorkStatue) {case 1:// 空闲模式break;case 2://测量模式,但不输出break;case 3://测量模式,由串口输出break; case 4://PWM输出测试break;default:break;}这样就可以利用串口对单片机进行在线命令控制了;上行协议的制定!和下行协议基本一致!在AVR单片机程序中定义了串口通信输出缓冲区,缓冲区的字长正好为协议的长//串口发送缓冲区变量声明volatile un sig ned char tx_buffer[TX_BUFFER_SIZE];〃定义串口发送缓冲区volatile unsigned char tx_wr_index=0,tx_rd_index=0,tx_counter=0;//rx_wr_index 针,rx_rd」ndex 读指针,rx_counter 缓冲区数据个数写指//USART发送函数void USART_Transmit(unsigned char data)// 发送数据函数{while(tx_counter==TX_BUFFER_SIZE);// 输出缓冲区满,等待asm("cli");if(tx_counter||((UCSRA & DATA_REGISTER_EMPTY)==0)){tx_buffer[tx_wr_index]=data;if(++tx_wr_index==TX_BUFFER_SIZE)tx_wr_index=0;++tx_counter;}elseUDR = data;asm("sei");}// 发送中断服务程序ISR(USART_TXC_vect)//USAR■发送数据中断{if(tx_counter){--tx_counter;UDR=tx_buffer[tx_rd_index]; if(++tx_rd_index==TX_BUFFER_SIZE){tx_rd_index=0;}}}在C#编写的上位机中,利用串口接收事件响应方法定义serialPort1.ReceivedBytesThreshold = RECEIVE_LENTH;在时间响应事件中调用协议分析处理函数serialPortCaculate() 来分析协议private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e){bel_dispzedNum.Invoke(newMethodInvoker(delegateint inNumSData=0; try{inNumSData =this.serialPort1.BytesToRead;b_serial_bufin_diplay.T// 串行数据处理 // 图像显示 byte dataID= 0x00; double temp =this.serialPortCaculate(ref dataID);switch(dataID){case TEMVAL:()break;}// 匿名方法catch { }ext = inNumSData.ToString();break;default:this.serialPort1.DiscardInBuffer}));/////// 接收转换协议, 接收数据时直接调用private double serialPortCaculate(ref byte dataID){Byte[] BReceiveTemp = new Byte[RECEIVE_LENTH];for (int i = 0; i < RECEIVE_LENTH; i++)// 接收定长数据字符串{ BReceiveTemp[i] = Convert.ToByte(this.serialPort1.ReadByte());}dataID=BReceiveTemp[1];switch (BReceiveTemp[1]){case TEMVAL: default :}}。
单片机与上位机通信系统设计
JIU JIANG UNIVERSITY《单片机原理与应用》大作业题目单片机与上位机通信系统设计院系信息科学与技术学院专业计算机应用设计姓名班级学号指导教师2011年12月14信息科学与技术学院单片机大作业任务书作业名称基于AT89C52单片机与上位机通信系统设计1、设计任务:设计一个基于AT89C52的单片机应用系统2、设计要求(1)可以由上位机通过串口操作单片机模块。
(2)利用单片机自身功能实现通信。
完成时间2011-2012学年第一学期目录一、摘要 (4)二、总体方案设计与论证 (5)1、设计 (5)2、框图设计 (5)3、知识点 (5)三、系统硬件设计 (7)1、电路原理图···················································四、系统软件设计 (11)五、系统硬件PROTEUS仿真原理图 (13)六、系统PROTEUS运行情况图 (13)七、心得体会 (18)八、致谢 (2)摘要本文介绍了一种基于AT89C52 单片机与上位机通信系统, 并对其工作原理及软、硬件的设计和实现方法进行了详细的阐述。
在单片机的输入输出控制中,除直接上小键盘和LCD显示等方法外,一般都通过串口和上位机PC进行通信,后面一种方法由于能实现远程控制并且PC机拥有强大的数据处理功能以及友好的控制界面所以显得尤为有用。
上位机PC与单片机通信.
四、串行数据传送方向:
1、单工通讯:数据单向传送。(1条数据线,单向)
2、半双工通讯:数据可分时双向传送。(2条数据线,双向)
3、全双工通讯:可同时进行发送和接收。
数据线
(1条或2条数据线,双向) 数据线
DEC R7 SJMP RCV1 RCV2:DJNZ R7,RCV0
调制器
“0” “1”
市话线 频率信号
解调器
收方
通常: “1”:1270Hz或2225Hz; “0”:1070Hz或2025Hz。
2、因通信时(有干扰)信号要衰减,所以常采用
RS232电平负逻辑,拉开“0”和“1”的电压档次,
以免信息出错:
TTL正逻辑:
RS232负逻辑(EIA电平): “0”:+3V—+25V; “1”: -3V— -25V。
多机通讯
3
2SMOD/32 T1
溢出率
11位 (同方式2)
TXD RXD 多机通讯
8-4 串行口的应用
串行口初始化编程格式:
SIO:MOV SCON,#控制状态字 ;写方式字且TI=RI=0
( MOV PCON,#80H )
;波特率加倍
( MOV TMOD,#20H ) ( MOV TH1,#X )
时序图:
写入 SBUF
TXD 数据输出
起始位 D0
D1 D2
D3
D4
D5 D6
D7 停止位
TI (a) 发送时序图
检测 负跳变
RXD 输入数据
RI
起始位 D0
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JIU JIANG UNIVERSITY
《单片机原理与应用》大作业
题目单片机与上位机通信系统设计院系信息科学与技术学院
专业计算机应用设计
姓名
班级学号
指导教师
2011年12月14
信息科学与技术学院
单片机大作业任务书
作业名称基于AT89C52单片机与上位机通信系统设计
2、设计要求
(1)可以由上位机通过串口操作单片机模块。
(2)利用单片机自身功能实现通信。
完成时间2011-2012学年第一学期
目录
一、摘要 (4)
二、总体方案设计与论证 (5)
1、设计 (5)
2、框图设计 (5)
3、知识点 (5)
三、系统硬件设计 (7)
1、电路原理图···················································
四、系统软件设计 (11)
五、系统硬件PROTEUS仿真原理图 (13)
六、系统PROTEUS运行情况图 (13)
七、心得体会 (18)
八、致 (2)
摘要
本文介绍了一种基于AT89C52 单片机与上位机通信系统, 并对其工作原理及软、硬件的设计和实现方法进行了详细的阐述。
在单片机的输入输出控制中,除直接上小键盘和LCD显示等方法外,一般都通过
串口和上位机PC进行通信,后面一种方法由于能实现远程控制并且PC机拥有强大的数据处理功能以及友好的控制界面所以显得尤为有用。
此系统可以由上位机控制通过串口操作
单片机模块
本单元就是来完成由上位机通过串口控制来实现以发光二极管的发光状态模拟开关电路的
通断,用上位机的DOS命令对其进行控制
通过此次作业能够更加牢固的掌握单片机的应用技术,增强动手能力、硬件设计能力以及软件设计能力。
关键词:AT89C52; 上位机,单片机
二.总体方案论证与设计
1设计
本论文是设计一基于AT89C52单片机应用系统,可以由上位机通过串口操作控制单片机模块以发光二极管的发光状态模拟开关电路的通断,用上位机DOS命令来控制
2框图设计
基于AT89C52单片机与上位机通信系统设计由电源电路,单片机主控电路,按键控制电路数码管控制对像和上位机接口组成,系统框图如图所示
三知识点
本项目需要通过学习和查阅资料,掌握和了解如下知识:
a +5V电源原理及设计
b 单片机复位电路工作原理及设计
c 单片机晶振电路工作原理机设计
d 单片机与上位机通信的接口电路设计
e 发光二极管的特性
f AT89C52单片机引脚
g 单片机汇编语言机程序设计
四.系统硬件设计
电路原理图
基于AT89C52单片机与上位机通信系统设计原理图如图19-2所示。
电源电路为单片机以及其他模块提供标准的电源。
晶振模块为单片机提供时钟标准,使系统各部分能协调工作。
复位电路模块为单片机提供复位功能。
单片机作为主控制器,根据输入信号对系统进行相应的控制处理。
9针接口电路和上位机的接口相连实现上位机和单片机之间的通信。
发光二极管是单片机控制的控制对象实际应用中,它连接相应的光电隔离和驱动电路。
五.系统软件设计
程序流程图如图19-3所示,其中初始化主要是对串口工作方式等设置
程序清单:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar a;
sbit d = P3^7;
//--------------------------------------
say_CR_LF()
{
SBUF = 13; while (TI == 0); TI = 0;
SBUF = 10; while (TI == 0); TI = 0;
}
//--------------------------------------
say_yeah()
{
SBUF = a; while (TI == 0); TI = 0;
SBUF = ','; while (TI == 0); TI = 0;
SBUF = ' '; while (TI == 0); TI = 0;
SBUF = 'y'; while (TI == 0); TI = 0;
SBUF = 'e'; while (TI == 0); TI = 0;
SBUF = 'a'; while (TI == 0); TI = 0;
SBUF = 'h'; while (TI == 0); TI = 0;
SBUF = '!'; while (TI == 0); TI = 0;
say_CR_LF();
}
//--------------------------------------
say_hello()
{
SBUF = 'H'; while (TI == 0); TI = 0;
SBUF = 'e'; while (TI == 0); TI = 0;
SBUF = 'l'; while (TI == 0); TI = 0;
SBUF = 'l'; while (TI == 0); TI = 0;
SBUF = 'o'; while (TI == 0); TI = 0;
SBUF = '!'; while (TI == 0); TI = 0;
say_CR_LF();
}
//--------------------------------------
void init()
{
SCON = 0x50; //设置串口通信方式1, 允许接收 PCON &= 0x7F;
TMOD = 0x20; //设置T1定时方式2
TH1 = 0xfd; //9600bps11.0592MHz
TL1 = 0xfd;
TR1 = 1; //启动T1
ES = 1; //开串口中断.
EA = 1; //开总中断.
say_hello();
}
//--------------------------------------
void delay(uint z)
{
uint x, y;
for(x = z; x > 0; x--) for(y = 110; y > 0; y--); }
//--------------------------------------
void main()
{
init();
TI = 1;
a = '4';
while(1) {
if(a == '1') {
d = 0; delay(400);
d = 1; delay(400);
}
else if(a == '2') {
d = 0; delay(200);
d = 1; delay(200);
}
else if(a == '3') {
d = 0; delay(100);
d = 1; delay(100);
}
else if(a == '4') {
d = 1;
} } }
//--------------------------------------
void ser() interrupt 4
{
if (TI == 1) TI = 0;
if (RI == 1) {
RI = 0;
P0 = SBUF;
a = SBUF; //中间变量.
say_yeah();
} }
六.系统硬件P R O T E U S仿真原理图
七.系统P r o t e u s仿真运行情况图显示开始测试界面
输入123
输入879
. .. .
八.致
论文的写作是枯燥艰辛而又富有挑战的。
老师的谆谆诱导、同学的出谋划策及家长的支持鼓励,是我坚持完成论文的动力源泉。
在此,我特别要感我的导师严青老师。
从论文的选题、文献的采集、框架的设计、结构的布局到最终的论文定稿,从容到格式,从标题到标点,都他费尽心血。
没有严青老师的辛勤栽培、孜孜教诲,就没有我论文的顺利完成。
感601寝室的各位同学,与他们的交流使我受益颇多。
最后要感我的家人以及我的朋友们对我的理解、支持、鼓励和帮助,正是因为有了他们,我所做的一切才更有意义;也正是因为有了他们,我才有了追求进步的勇气和信心。
我很真诚的感一直来帮助我做这个作业的老师和同学,!
.. .. .. ..。