上位机程序

合集下载

RS485多机通信一主机两个下位机

RS485多机通信一主机两个下位机
RS485一主机两个下位机,上位机通过发送下位机地址查询下位机两个按钮的状态,仿真时同时在P1口和P2口显示按钮状态
一、原理图
二、程序
1、上位机程序
#include "main_host.h"
/*延时t毫秒*/
void delay(uint t)
{
uint i;
while(t--)
{
/*对于11.0592M时钟,约延时1ms */
}
/*主程序*/
void main()
{
uchar i = 0;
uchar addr_tmp;
uchar data_tmp;
init_serial();//串口初始化
EA = 0;//关闭所有中断
/*发送地址帧并接收应答信息,如果接收的信号与发送的地址信息不同,则重新发送地址帧*/
P0=0xff;
addr=P0; //下位机地址初值(第一个下位机地址)
P1=addr;
/*进入设备应答*/
while(1)
{
SM2 = 1;//只接收地址帧
/*如果接收到的地址帧不是本机地址,则继续等待*/
addr_tmp = addr-1;
while (addr_tmp!=addr)
{
addr_tmp=ReciveUart();
}
/*发送本机地址作为应答信号,准备接收数据*/
#define uint unsigned int
/*握手信号宏定义*/
#define DataCMD 0x55//接收成功
#define ERR 0xaa//接收错误
#define BASE_ADDR 0x51 //下位机地址基址

上位机操作规程

上位机操作规程

北台上位机操作规程一开关机操作:1) 开机:打开机箱面板,左上方第一排按钮即为开机启动键.按下按钮,开机键右边的指示灯变绿,显示器终端显示系统自检过程.系统自检完毕,即进入用户界面,输入用户名:键入回车,即显示输入密码:键入回车,即进入系统操作画面.双击操作画面下方第四个图标,弹出一对话框.当光标所在行以$符号开头时,即进入DCL命令操作.2) 关机:进入DCL命令操作对话框,在$操作符下键入SHUTDOWN,回车,系统将关闭($符为系统符号,无需键入),显示如下:$SHUTDOWN当系统显示为:POO>>>即可打开机箱面板,按下第一排的开机键,系统即关闭.3) 重新启动:打开机箱面板,第二排有两个按钮,按下右边的按钮,系统将重新启动.二系统操作命令:1)启动TCP/IP$SET DEF SYS$MANAGER$@TCPIP$CONFIG选择6,即启动TCP/IP2)启动系统进程:$API (查看系统进程状况)$OCOM (设定目录)$@XTDL_APPL_STARTUP IDLE (删除公共区)$@XTDL_APPL_STARTUP MASTER (装载公共区)3) 显示轧线跟踪状况:$SEEMILL显示整条轧线的检测器,区占有,CPDA等状况:上半部分:| 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 || 1 | | 0 | | 0 | | 0 | | 0 | | 0 | | 0 | | 0 | | 0 || CTB | | DTB | | R2E | | R2D | | ETB | | FM | | GTB | | CL1 | | CL2 || 0 | | 0 | | 0 | | 0 | | 0 | | 0 | | 0 | | 0 | | 0 || 9 | | 9 | | 9 | | 9 | | 9 | | 9 | | 5 | | 5 | | 8 |第一行:序列号第二行:区首检测器,1表示ON,0表示OFF第三行:区占有名称第四行: 区占有标志,1表示有钢,0表示无钢第五行:CPDA号下半部分:[--id1 --] [--id2 --] [--id3 --] [--id4 --]|11011 C11| |00011 H33| |00011 H43| |00100 FT7||00000 C14| |00000 H34| |00011 H44| |00000 H51||00000 C16| |00000 R2L| |00000 E2L| |00011 CT||00000 C17| |00011 RT2| |00000 F1L| |00000 H61||00001 LAS| |00000 H35| |00011 F2L| |00100 H62||00000 H21| |00011 H36| |00011 F3L| |00001 CL1||00011 S_L| |00000 H37| |00011 F4L| |00001 CL2||00000 EMP| |00000 FT0| |00011 F5L| |00001 UP1||00000 H31| |00100 H41| |00011 F6L| |00001 UP2||00100 H32| |00011 H42| |00000 F7L| |00011 EMP| (ID中:左边数字显示(从左到右):前两位表示检测器接通状况,1表示接通,0表示未接通;最后两位为历史记录;右边为检测器名称;)ID中:左第一位显示DPFTRUTH(mill state),左第二位显示TRKS(1,J),中间显示TRKS(2,J),第四位显示SCNFLG,第五位显示DPFOLD(millstate of last scanning)$SEEMILL1 (显示轧线检测器,负荷继电器,辊道正反转情况)4)板坯数据输入板坯原始数据及轧制规格数据,用PDI方式进行输入(PDI画面装在精轧数度主画面上)。

更新程序步骤

更新程序步骤

更新程序步骤一、更新上位机程序(一)传上位机程序1.连接网线;2.在开关上输入超级密码进入参数设置,“功能”+“模式转换”得到开关的IP地址;3.打开PC机,更改IP地址为“169.254.*.*”,子网掩码设为“255.255.0.0”,默认网关认为空,ping一下开关的IP,看看网络连接是否正常;4.在开关上选择菜单项“系统”->“刷新上位机程序”,确认进入接收程序界面;5.打开PC机的传上位机程序可执行文件,选择程序文件的路径,在IP地址栏中输入开关的IP地址;6.在开关的接收程序界面中按“侦听”键,窗体下面的状态栏中显示的“无连接”变成“正在监听……”;7.在PC机上单击“更新程序”按钮,这一步离第6步的时间最好不大于10秒,因为为了防止开关程序无限等待,开关程序20秒后自动关闭监听,这种情况下需要重新执行第6、7步。

8.程序传送完毕,PC机弹出提示框“文件传送完毕!”,关闭此程序,在开关上按“取消”键退出接收程序。

注:1. 第6、7步顺序不可反!2. PC机中开关程序文件夹的路径不能有中文,并且要求最后一层文件夹名称不能更改。

这时开关已经接收完上位机的新程序,并存在“HD\copy”目录下了。

(二)备份旧程序(保险起见添加该步骤,平时可以不用)1.插入键盘钥匙;2.输入超级密码进入参数设置;3.按“功能”+Y切换键盘,按“功能”+ X(注:十二组合程序直接按“功能”+ Q)进入退出程序界面,输入超级密码后“确认”即可退出程序;4.选择桌面上的“我的电脑”,按Tab键切换光标,使焦点在文件夹上,若Tab键无响应,需要重新插入键盘钥匙再按“功能”+Y切换键盘后再试,选择“HD”文件夹;5.在HD路径下,选择“MainControl”文件夹,按“菜单”键选择“文件”->“重命名”,更改文件夹名称作为备份。

(三)更新程序1.按“功能”+“复位”,上位机复位重新启动,若无响应,需要重新插入键盘钥匙再按“功能”+Y切换键盘后再试。

说把手教你编写LabView上位机程序

说把手教你编写LabView上位机程序

手把手教你从零开始用labview编写智能车上位机程序(1)labview, 智能, 手把手, 程序, 编写软件安装和基础知识准备其几天把我的上位机软件发布在里这里,发现大家对这个还是很感兴趣的,因为上位机软件对于做摄像头的来说是必备的工具(也许有人说他不需要,那我很佩服他的判断能力和程序调试能力,他肯定是天才级别的人物,希望我能拜他为师,呵呵!)。

不过这种东西还是自己编写的用起来顺手。

想显示什么就显示什么。

选择labview编写是因为labview容易上手,我从完全不会到编写到完成那个上位机软件也就用了一个星期而已。

如果学VC,MFC的话,你估计对用上1个月也许还做不出什么。

但是labview功能也很强大,可是我们用到的并不多,网上教程多,可是我们能用上的也并不多,学起来麻烦。

我下面就专门针对这个labview的智能车上位机软件的编写来讲解吧!首先发布一个关于labview的广告,大家了解一下labview主要是干什么的。

LabVIEW是一种程序开发环境,由美国国家仪器(NI)公司研制开发的,类似于C和BASIC开发环境,但是LabVIEW与其他计算机语言的显著区别是:其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G编写程序,产生的程序是框图的形式。

与C和BASIC一样,LabVIEW也是通用的编程系统,有一个完成任何编程任务的庞大函数库。

LabVIEW的函数库包括数据采集、GPIB、串口控制、数据分析、数据显示及数据存储,等等。

LabVIEW也有传统的程序调试工具,如设置断点、以动画方式显示数据及其子程序(子VI)的结果、单步执行等等,便于程序的调试。

虚拟仪器(virtual instrumention)是基于计算机的仪器。

计算机和仪器的密切结合是目前仪器发展的一个重要方向。

粗略地说这种结合有两种方式,一种是将计算机装入仪器,其典型的例子就是所谓智能化的仪器。

上位机操作规程

上位机操作规程

上位机操作规程上位机操作规程1 范围本规程规定了西南管道公司上位机的操作。

本规程适用于西南管道公司Telvent OASYS上位机、Cegelec Viewstar上位机、Honeywell PKS上位机、Schneider InTouch上位机、FactoryTalk上位机、Epipeview上位机的操作。

2 规范性引用文件下列文件对于本文件的应用是必不可少的。

凡是注日期的引用文件,仅所注日期的版本适用于本文件。

凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。

Q/SY 201 油气管道监控与数据采集系统通用技术规范Q/SY 1596 油气管道监控与数据采集系统运行维护规程XNGD/CX.shch.05-2019-1/D 仪表自动化专业管理程序OASYS系统软件操作维护规程钦州-南宁成品油输油管线SCADA系统操作及维护手册Factory Talk View Studio 系统操作规程安宁首站操作手册与用户指南Epipeview4.0软件用户手册3 术语和定义下列术语和定义适用于本文件。

3.1 SCADASupervisory Control And Data Acquisition系统,全名为监视控制与数据采集系统。

3.2 OASYSTelvent 公司的上位机工程软件。

PKSProcess Knowledge System,Honeywell公司的上位机工程软件。

3.3 ViewstarCegelec公司的上位机工程软件。

3.4 InTouchSchneider公司的上位机工程软件。

3.5 FactoryTalkAB公司的上位机工程软件。

3.6 Epipeview中油龙慧自动化工程有限公司的上位机工程软件。

3.7 ESDEmergency Shut Down紧急关断系统,是故障安全型控制系统。

3.8 HMIHuman Machine Interface,人机界面。

3.9 上位机上位机也叫操作员工作站,人机界面提供给操作员一个监视过程参数和控制生产过程的操作显示窗口。

计算机C++USB上位机开发

计算机C++USB上位机开发

第10章 上位机程序开发在USB设备开发中,上位机程序是用于与用户进行接口的。

上位机程序通过USB设备驱动程序和外部的USB硬件进行通信,USB固件程序执行所用的硬件操作。

一般来说,根据选择开发平台的不同,可以使用Visual C++、Visual C#和LabVIEW等开发上位机程序。

本章首先介绍了Visual C++中控制USB设备的相关函数,接着介绍了Visual C#中读写USB设备的主意函数,最后介绍了在LabVIEW中如何读写USB设备。

本章内容包括:Visual C++读写USB设备;Visual C#读写USB设备;LabVIEW读写USB设备。

10.1 Visual C++读写USB设备在USB设备开发过程中,上位机程序可以采用广泛应用的Visual C++来实现。

对于Cypress公司的EZ-USB系列芯片,其提供了全面的CY3684开发包。

在该开发包中,可以使用CYIOCTL控制函数类和CyAPI控制函数类来实现Visual C++环境下对USB设备的读写。

10.1.1 CYIOCTL控制函数类CYIOCTL控制函数类为Cypress公司的EZ-USB FX2LP系列USB接口芯片,提供了简单的控制接口。

在使用Cypress公司提供的驱动程序基础上,只需在主机Visual C++程序中加入头文件cyioctl.h,然后便可以调用相应的控制函数。

为了能够使用这些函数,主机程序必须首先获得USB设备的控制句柄。

可以通过以下的代码在程序中获得连接到主机的USB设备句柄。

CCyUSBDevice *USBDevice = new CCyUSBDevice(); //USB设备HANDLE hDevice = USBDevice->DeviceHandle(); //打开设备句柄其中,hDevice即为获得的USB设备句柄。

在退出程序的时候,需要释放该USB设备句柄,使用如下的语句即可:delete USBDevice;在主程序获得USB设备的控制句柄后,便可以调用CYIOCTL控制函数类提供的接口控制函数,下面分别进行介绍。

上位机及下位机程序编写规范及建议

上位机及下位机程序编写规范及建议

PLC程序编写规范及建议为了提高程序的可读性,稳定性,高效性,易调用,方便各部门PLC程序的编写,调试及维护工作,有必要也务必要制定一项通用的程序编写规范,鉴于此,本人提出以下几个方面的规范建议,以供大家共同商讨。

控制功能方面:阀门的控制,由于电动阀门的控制中,一个控制周期较长,为了不让在调试或者阀门的误操作上面,让阀门开关过程影响相关设备的控制,造成设备安全影响,故需要将阀门的控制做一个逻辑上的中间停止中断操作,即可让阀门处于一个中间状态,然后再进行开关控制选择。

各设备控制每个参与控制的设备,必须事先预留自控、触摸屏、故障屏蔽接口,以便功能扩展。

设备在控制方式转变后必须考虑设备安全的前提下,值得注意的是,建议转换开关由远程切换到手动时,上位机给出输出的指令一律清零,以免造成再次将设备由手动转换到远程,设备继续执行上一次的转换前动作,造成手动动作造成的远程指令!自动控制必须事先了解整个工艺流程的情况下,预先考虑到每个设备间的各种组合搭配,一一做出相应的条件判断,然后做出相应符合条件的指令。

在程序编译前,应详尽的做出中文注释,注释包含组合搭配条件,运行条件,在每一符合条件的程序段必须注释条件及指令。

当自动控制从最小满足条件的集合跳出为无法满足条件后,必须考虑相关设备的安全,能关闭的关闭,必须记录并将输出报警,并将报警反馈到上位机。

自动触发条件参数应以变量设定可调,有多个变量参数可能产生冲突时,在程序中加以判断,并做出相应的调整或恢复默认值,并以提示的方式告知用户,避免程序冲突而让用户产生不必要的损失。

手动、远程、自动三级控制应该严格区分,各级控制权限不得越级。

在硬件配置上,为了更好的检查模块是否正常的情况先,建议每个数字量输入输出模块必须预留一个点,以此来检查模块是否正常状态。

模拟量输出方面:建议每个仪表的量程上限必须以变量的方式预留接口,以便仪表进行维修、更换或者重新设置时造成额外不必要的问题。

单片机控制8路舵机程序+串口通讯上位机程序(C#带图)

单片机控制8路舵机程序+串口通讯上位机程序(C#带图)

单片机控制8路舵机程序+串口通讯上位机程序(C#):单片机控制8路舵机程序; T1 serial port to high T2 pwm PWMOUT0 BIT P0.0PWMOUT1 BIT P0.1PWMOUT2 BIT P0.2PWMOUT3 BIT P0.3PWMOUT4 BIT P0.4PWMOUT5 BIT P0.5PWMOUT6 BIT P0.6PWMOUT7 BIT P0.7T2CON DATA 0C8HTF2 BIT T2CON.7 EXF2 BIT T2CON.6RCLK BIT T2CON.5TCLK BIT T2CON.4EXEN2 BIT T2CON.3TR2 BIT T2CON.2C_T2 BIT T2CON.1CP_RL2 BIT T2CON.0T2 BIT P1.0T2EX BIT P1.1RCAP2L DATA 0CAHRCAP2H DATA 0CBHTL2 DATA 0CCHTH2 DATA 0CDHET2 BIT IE.5PT2 BIT IP.5////////////////////////////////////////// PWMWID EQU 048H; [16]048H~05FH; First low 8bits then high 8bits channel EQU 032H;pha EQU 033H;////////////////////////////////////////// ORG 0000HLJMP MAINORG 000BHLJMP T0_ISRORG 002BHLJMP T2_ISRORG 0100H MAIN:MOV SP, 60HMOV 96H, #00HMOV 8EH, #00H; InitSETB EA; enable interruptSETB ET2CLR TCLKCLR RCLKMOV SCON, #050H; 8bit serialMOV TL2, #000HMOV TH2, #000HMOV RCAP2L, #03CH; 2.5msMOV RCAP2H, #0F6HCLR TF2SETB TR2CLR ES; disable serial interruptCLR TI; clear serial FLAGMOV TMOD, #21HMOV TH0, #000H; make time for T0_ISR to runCLR TF0SETB ET0CLR TR0MOV TL1,#0F3HMOV TH1,#0F3HSETB TR1CLR AMOV pha,AMOV A, #035HMOV PWMWID+00H, AMOV PWMWID+02H, AMOV PWMWID+04H, AMOV PWMWID+06H, AMOV PWMWID+08H, AMOV PWMWID+0AH, AMOV PWMWID+0CH, AMOV PWMWID+0EH, AMOV A, #0FAHMOV PWMWID+01H, AMOV PWMWID+03H, AMOV PWMWID+05H, AMOV PWMWID+07H, AMOV PWMWID+09H, AMOV PWMWID+0BH, AMOV PWMWID+0DH, AMOV PWMWID+0FH, A; CommunicationCOMMU:JNB RI, COMMUCLR RIMOV channel,SBUFMOV SBUF,channelMOV A,channelJNB ACC.7, COMMUJB ACC.6, COMMUJNB RI, $ANL channel, #07FHMOV A, #PWMWIDADD A, channelADD A, channelMOV R0, AMOV R1, SBUFCLR CMOV A, #0FFHSUBB A, R1; ADDC A, #12HMOV SBUF, AMOV @R0, ACLR RIJNB RI, $MOV R1, SBUFMOV A, #0FFHSUBB A, R1INC R0MOV SBUF, AMOV @R0, ACLR RISJMP COMMUT0_ISR:PUSH ACCCLR TR0MOV A,phaRL AMOV DPTR, #TABLEJMP @A+DPTR TABLE:SJMP S0SJMP S1SJMP S2SJMP S3SJMP S4SJMP S5SJMP S6SJMP S7S0:CLR PWMOUT0POP ACCRETIS1:CLR PWMOUT1POP ACCRETIS2:CLR PWMOUT2POP ACCRETIS3:CLR PWMOUT3POP ACCRETIS4:CLR PWMOUT4POP ACCRETIS5:CLR PWMOUT5POP ACCRETIS6:CLR PWMOUT6POP ACCRETIS7:CLR PWMOUT7POP ACCRETIT2_ISR:CLR TF2PUSH ACCINC phaANL pha, #07HMOV A,phaRL AMOV DPTR,#TABLE2JMP @A+DPTRTABLE2:SJMP SS0SJMP SS1SJMP SS2SJMP SS3SJMP SS4SJMP SS5SJMP SS6SJMP SS7SS0:MOV TH0,PWMWID+01HMOV TL0,PWMWID+00HSETB PWMOUT0SETB TR0POP ACCRETISS1:MOV TH0,PWMWID+03HMOV TL0,PWMWID+02HSETB PWMOUT1SETB TR0POP ACCRETISS2:MOV TH0,PWMWID+05HMOV TL0,PWMWID+04HSETB PWMOUT2SETB TR0POP ACCRETISS3:MOV TH0,PWMWID+07HMOV TL0,PWMWID+06HSETB PWMOUT3SETB TR0POP ACCRETISS4:MOV TH0, PWMWID+09HMOV TL0, PWMWID+08HSETB PWMOUT4SETB TR0POP ACCRETISS5:MOV TH0, PWMWID+0BHMOV TL0, PWMWID+0AHSETB PWMOUT5SETB TR0POP ACCRETISS6:MOV TH0, PWMWID+0DHMOV TL0, PWMWID+0CHSETB PWMOUT6SETB TR0POP ACCRETISS7:MOV TH0,PWMWID+0FHMOV TL0,PWMWID+0EHSETB PWMOUT7SETB TR0POP ACCRETIEND串口通讯上位机程序(C#):using System;using System.Collections.Generic; using ponentModel; using System.Drawing; using System.Text;using System.Windows.Forms; namespace Cois {public partial class Cois : Form {private byte [] P = new byte [4]; private byte checker; public Cois() {InitializeComponent(); }private void Form1_Loa d(object sender, EventArgs e) { init(); }private void Message(){ throw new NotImplementedException (); }private void init() {GetPortName(); this .CBx_baud.Text =global ::Cois.Properties.Settings .Default.BaudRate; }private void GetPortName() {string [] portNames = System.IO.Ports.SerialPort .GetPortNames(); CBx_port.Items.Clear();foreach (string name in portNames) { CBx_port.Items.Add(name); }if (!CBx_port.Items.Contains(CBx_port.Text)) { try {this .CBx_port.Text = (string )CBx_port.Items[0]; } catch {this .CBx_port.Text =global ::Cois.Properties.Settings .Default.PortName; } } }private void CBx_port_SelectedIndexChanged(object sender, EventArgs e) {serialPort.PortName = CBx_port.Text; }private void CBx_baud_SelectedIndexChanged(object sender, EventArgs e) {serialPort.BaudRate =Convert .ToInt32( CBx_baud.Text);}private void write(int number){ byte[] CMD = new byte[3];CMD[0] = (byte)number;CMD[0] |= (byte)0x80;switch(number){case 0: CMD[1] = (byte) ((Servo0.Value+17)%256);CMD[2] = (byte)((Servo0.Value +17)/ 256);serialPort.Write(CMD, 0, 3);break;case 1: CMD[1] = (byte)((Servo1.Value+17)%256);CMD[2] = (byte)((Servo1.Value+17) / 256);serialPort.Write(CMD, 0, 3);break;case 2: CMD[1] = (byte)((Servo2.Value+17)%256);CMD[2] = (byte)((Servo2.Value +17)/ 256);serialPort.Write(CMD, 0, 3);break;case 3: CMD[1] = (byte)((Servo3.Value+17)%256);CMD[2] = (byte)((Servo3.Value+17) / 256);serialPort.Write(CMD, 0, 3);break;case 4: CMD[1] = (byte)((Servo4.Value+17)%256);CMD[2] = (byte)((Servo4.Value+17) / 256);serialPort.Write(CMD, 0, 3);break;case 5: CMD[1] = (byte)((Servo5.Value+17)%256);CMD[2] = (byte)((Servo5.Value+17) / 256);serialPort.Write(CMD, 0, 3);break;case 6: CMD[1] = (byte)((Servo6.Value+17)%256);CMD[2] = (byte)((Servo6.Value+17) / 256);serialPort.Write(CMD, 0, 3);break;case 7: CMD[1] = (byte)((Servo7.Value+17)%256);CMD[2] = (byte)((Servo7.Value+17) / 256);serialPort.Write(CMD, 0, 3);break;}}private void Btn_connect_Click(object sender, EventArgs e) {if (serialPort.IsOpen){ Btn_connect.Text = "Unconnected";Btn_connect.CheckState =System.Windows.Forms.CheckState.Unchecked;serialPort.Close();}else{ try{ serialPort.Open();}catch{ Btn_connect.CheckState =System.Windows.Forms.CheckState.Unchecked;}if (serialPort.IsOpen){ Btn_connect.Text = "Connected";Btn_connect.CheckState =System.Windows.Forms.CheckState.Checked;write(0);write(1);write(2);write(3);write(4);write(5);write(6);write(7);}}}private void CBx_port_DropDown(object sender, EventArgs e) {GetPortName();}private void Servo0_MouseUp(object sender, MouseEventArgs e) { //if (serialPort.IsOpen) write(0);}private void Servo1_MouseUp(object sender, MouseEventArgs e) { //if (serialPort.IsOpen) write(1);}private void Servo2_MouseUp(object sender, MouseEventArgs e) { //if (serialPort.IsOpen) write(2);}private void Servo3_MouseUp(object sender, MouseEventArgs e) { //if (serialPort.IsOpen) write(3);}private void Servo4_MouseUp(object sender, MouseEventArgs e) { //if (serialPort.IsOpen) write(4);}private void Servo5_MouseUp(object sender, MouseEventArgs e) { //if (serialPort.IsOpen) write(5); }private void Servo6_MouseUp(object sender, MouseEventArgs e) { //if (serialPort.IsOpen) write(6); }private void Servo7_MouseUp(object sender, MouseEventArgs e) { //if (serialPort.IsOpen) write(7); }private void Servo0_Scroll(object sender, EventArgs e){ textBox1.Text = Servo0.Value.ToString();if (serialPort.IsOpen) write(0); } private void Servo1_Scroll(object sender, EventArgs e) { if (serialPort.IsOpen) write(1); }private void Servo2_Scroll(object sender, EventArgs e) { if (serialPort.IsOpen) write(2); }private void Servo3_Scroll(object sender, EventArgs e){ if (serialPort.IsOpen) write(3); }private void Servo4_Scroll(object sender, EventArgs e) { if (seria lPort.IsOpen) write(4); }private void Servo5_Scroll(object sender, EventArgs e) { if (serialPort.IsOpen) write(5); }private void Servo6_Scroll(object sender, EventArgs e) { if (serialPort.IsOpen) write(6); }private void Servo7_Scroll(object sender, EventArgs e) { if (serialPort.IsOpen) write(7); }}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

经过调试,以上功能基本实现,目前可以通过上位机对单片机进行实时控制。

程序如下:
//这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收//和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的
#include< reg51.h>
#include< stdio.h>
#include< string.h>
#define INBUF_LEN 4 //数据长度
unsigned char inbuf1[INBUF_LEN];
unsigned char checksum,count3 , flag,temp,ch;
bit read_flag=0;
sbit cp=P1^1;
sbit DIR=P1^2;
int i;
unsigned int xdata *RAMDATA; /*定义RAM地址指针*/
unsigned char a[6] ={0x11,0x22,0x33,0x44,0x55,0x66} ;
void init_serialcomm(void)
{
SCON=0x50; //在11.0592MHz下,设置串行口波特率为9600,方式1,并允许接收
PCON=0x00;
ES=1;
TMOD=0x21; //定时器工作于方式2,自动装载方式
TH0=(65536-1000)%256;
TL0=(65536-1000)/256;
TL1=0xfd;
TH1=0xfd;
ET0=1;
TR0=1;
TR1=1;
EA=1;
// TI=1;
RAMDATA=0x1F45;
}
void serial () interrupt 4 using 3 {
if(RI)
{ RI=0;
ch=SBUF;
TI=1; //置SBUF空
switch(ch)
{
case 0x01 :printf("A"); TI=0;break; case 0x02 :printf("B"); TI=0;break; case 0x03 :printf("C"); TI=0;break; case 0x04 :printf("D"); TI=0;break; default :printf("fg"); TI=0;break; }
}
}
//向串口发送一个字符
void timer0() interrupt 1 using 3{ // char i;
flag++;
TH0=0x00;
TL0=0x00;
if(flag==10)
{// cp=!cp;
// for(i=0;i<6;i++)
TI=1;
temp=*RAMDATA;
printf("%c",temp);
TI=0;
// RAMDATA--;
flag=0;
}
}
//主程序
main()
{
init_serialcomm(); //初始化串口
//向6264中送数据
{
*RAMDATA=0x33;
}
while(1)
{
*RAMDATA=0x33;;
}
}
调试过程中遇到的问题:
1. 发送过程:在发送时必须保证TI=1:即发送缓冲器为空,否则将导致数据发不出去,如果想强制发送可以用:TI=1.具体发送数据:利用printf(“akjdfaklfj”);函数直接发送
即可。

2. 接收过程:在接收时多选用中断方式,这样可以节约CPU的时间,提高效率.。

相关文档
最新文档