详解一个电脑串口控制单片机驱动继电器的例子全部源代码.docx

上传人:b****6 文档编号:4426706 上传时间:2022-12-01 格式:DOCX 页数:15 大小:71.75KB
下载 相关 举报
详解一个电脑串口控制单片机驱动继电器的例子全部源代码.docx_第1页
第1页 / 共15页
详解一个电脑串口控制单片机驱动继电器的例子全部源代码.docx_第2页
第2页 / 共15页
详解一个电脑串口控制单片机驱动继电器的例子全部源代码.docx_第3页
第3页 / 共15页
详解一个电脑串口控制单片机驱动继电器的例子全部源代码.docx_第4页
第4页 / 共15页
详解一个电脑串口控制单片机驱动继电器的例子全部源代码.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

详解一个电脑串口控制单片机驱动继电器的例子全部源代码.docx

《详解一个电脑串口控制单片机驱动继电器的例子全部源代码.docx》由会员分享,可在线阅读,更多相关《详解一个电脑串口控制单片机驱动继电器的例子全部源代码.docx(15页珍藏版)》请在冰豆网上搜索。

详解一个电脑串口控制单片机驱动继电器的例子全部源代码.docx

详解一个电脑串口控制单片机驱动继电器的例子全部源代码

开源详解(看完如觉得不错,请顶一下哦!

声明:

软件版权归作者完全所有。

未经作者授权,请勿在任何第三方杂志、报刊、网站转载或发表,本程序仅供学习研究用,您可以自由拷贝、散发本程序,但不能用于商业目的。

很多网上认识的朋友,提到这个话题,在此用此例给热爱单片机的朋友!

---一个简单的串口控制继电器的例子(全部源代码)

--马工2006-5-820:

00

下面的文章详细的说明了如何在PC端编制控制程序,并且通过串口输出数据来控制单片机硬件,单片机外围连接了若干继电器,达到控制继电器开关的作用。

要说的是,有很多的方法可以实现上述的功能,下面的方法只是其中的一种,并且出于便于大家学习阅读的目的,很多代码并没有进行优化,而是将其展开编写,在你理解后,你完全可以在此基础上修改、优化代码,使之更优化和精简,并符合你的其他要求。

如果你读完这篇文章,觉得给你带来了帮助,我非常高兴。

如果你无法理解,你应该再看一下其他更基础的书籍、文章。

我想应该分成二个部分来讲(单片机部分、PC程序部分),并且希望能写得较为详细,把基础的讲述清楚。

1、单片机部分

电路图:

此主题相关图片如下:

单片机源代码(asm格式):

;--------------------------------------------------

;--------------------------------------------------

;设置串行口波特率9600

;串行口设置MODE1,SM1=0,REN=1,SMOD=1

;晶振11.0592,定时设置为0FDH

;常用端口设置参数

;FD9600

;FA4800

;F42400

;E81200

;--------------------------------------------------

;***********************************************************

ORG00H

JMPSTART

ORG23H

JMPUART

ORG30H

START:

MOVSP,#70H

MOVSCON,#50H

MOVTMOD,#00100001B;TIM1在模式2TIM0在模式1

MOVTH1,#0F4H;设置定时时间

SETBTR1;启动定时器1

SETBES;允许串口中断

SETBEA;允许总中断

MOVP0,#0;P0、P2输出低电平

MOVP2,#0

JMP$;等待状态

;*****************************************

;串行口中断

;*****************************************

UART:

PUSHACC

PUSHPSW

CLRES;关闭串行口中断

MOVTH0,#HIGH(65536-65536)

MOVTL0,#LOW(65536-65536)

SETBTR0;开定时器0

MOV30H,#00;同步位

MOV31H,#00;数据1

MOV32H,#00;数据2

MOV33H,#00;结束位

MOVR0,#30H

REC:

jbctf0,FS;接收时间是否超时?

是则执行FS

JNBRI,REC;接收数据

CLRRI

MOVA,SBUF

MOV@R0,A

INCR0

JMPREC

FS:

CLRTR0;关定时器0

;********************************

CALLFUN;解码并控制继电器

SETBES;开串行口中断

POPPSW

POPACC

RETI;中断子程序返回

;****************************************

;解码并控制继电器

;下面的程序可以更简洁,但为了方便,展开来编制

;****************************************

FUN:

MOVA,#0AH;判断第1字节即同步位

CJNEA,30H,ERR

MOVA,#0DH;判断第4字节即结束位

CJNEA,33H,ERR

;****************************************

;第2字节即数据位1,代表继电器J1-8

;第3字节即数据位2,代表继电器J9-16

;****************************************

MOVA,31H

MOVP0,A

MOVA,32H

MOVP2,A

RET

;**************************************

;数据错误处理

;**************************************

ERR:

MOV30H,#00;同步位

MOV31H,#00;数据1

MOV32H,#00;数据2

MOV33H,#00;结束位

RET

END;程序结束

;--------------------------------------------------

;--------------------------------------------------

单片机源代码(asm格式)+电路图下载:

 下载信息

点击浏览该文件:

电路图说明:

  这个电路非常典型,串行口(也称RS232)接口集成电路MAX232与单片机AT89S51引脚P3.0(RXD)\P3.1(TXD)连接,构成与主机的通讯接口电路。

AT89S51引脚P0、P2口连接达林顿管阵列驱动ICuln2803,通过它控制继电器动作。

相关基础知识简要说明:

1、串行口(也称RS232接口)是用途最广的一种通讯接口,一般电脑主机上都有这个接口,缺点是传输距离短,市场上也有很多USB-RS232转换接口卖。

**常用的通讯接口还有RS485、RS422、LPT打印接口、CAN总线接口、网卡接口等等,与RS232比较接近的通讯接口是RS485,它的通讯距离较远,广泛用于工业控制。

2、串行口(也称RS232)接口集成电路MAX232,接口芯片种类繁多,MAX232只是其中的一种,可以说是串行接口集成电路的代表型号,图纸上一般都标MAX232,但实际使用时,可以选用更多兼容的芯片,其中一个理由,兼容芯片更便宜。

3、达林顿管阵列驱动ICuln2803,TTL输入(0-5v),可以同时驱动8个继电器,内部不仅封装了达林顿管阵列,并且含有钳位二极管,连接继电器时,不需要再连接保护二极管,使用非常方便,因而用途广泛。

相同功能的芯片有ULN2003,只是它只有7个输出口。

内部电路如图所示:

此主题相关图片如下:

接口ICULN2083内部有反相缓冲器(参见技术手册),简单来说,输入高电平,输出为低电平;输入低电平,则输出高电平。

如图所示:

此主题相关图片如下:

ULN2803数据手册下载:

 下载信息

点击浏览该文件:

注:

一般单片机输入、输出电流有限,无法驱动继电器等大电流外围部件,因此需要有驱动电路,常用的是三极管驱动(如2SD8050)和IC驱动(如ULN2803)。

上拉电阻的问题:

1、51单片机的P0口内部没有上拉电阻,其他P1、P2、P3口内部也只是弱上拉,为了在高电平输出时得到较高的输出电流,提高驱动能力,有必要在P0口与+5v间连接上拉电阻(通常取值在1k-4.7k左右)。

见AT89C51数据手册第4页。

此主题相关图片如下:

AT89C51数据手册下载:

 下载信息

点击浏览该文件:

51源程序详解:

  源程序主要分三个部分:

初始化程序、串口中断程序、协议解析或叫解码程序。

初始化程序:

  初始化是单片机通电后首先执行的一部分程序,主要是对单片机中的寄存器做一些必要的设置(即写入值):

  1、设置串口波特率为9600 串行口设置MODE1,SM1=0,REN=1,SMOD=1

  2、由于电路上晶振采用11.0592M(最常用),定时器1设置初值为0FDH

;常用串口波特率对应初值(11.0592M晶振)

;FD9600

;FA4800

;F42400

;E81200

3、启动定时器1、允许串口中断、允许总中断

相关代码:

MOVSCON,#50H

MOVTMOD,#00100001B;TIM1在模式2TIM0在模式1

MOVTH1,#0F4H;设置定时时间

SETBTR1;启动定时器1

SETBES;允许串口中断

SETBEA;允许总中断

需要注意:

1、波特率越高,通讯速度越快,但也更容易出错,一般来说,通讯距离短时,可以用较高的波特率,通讯距离长时,选用较低的波特率可使通讯更为可靠。

2、硬件电路采用不同的晶振,波特率设置时初值是不同的,初值可由公式()取得,通过计算你会发现有些晶振(如10M、12M)计算结果有余数,实质上就是波特率有误差,最终结果就是用了这个晶振的电路,在通讯时会出现无法通讯、数据错乱、时好时坏、误动作等等情况。

(很多朋友都是这个问题)。

我不多写了,这里相关参考:

出自:

明皓

因此,一般我们在用到串口的单片机电路中,如无特殊需要,一般晶振选用11.0592M、22.1184等。

而在没有用到串口的电路中,一般晶振选用6M、12M、24M等,因为计算定时更简单,如6M时钟,周期=2us;12M时钟,周期=1us;24M时钟,周期=0.5us。

3、提高波特率的方法有二种:

将SM1设为1;或是换一个频率更高的晶振。

由于接口ICULN2083输入输出的反相特性,即输入为高电平,输出为低电平;输入为低电平,则输出为高电平。

同时51单片机上电复位后,其引脚为高电平,这样会引起连接在P0、P2口的继电器全部得电吸合的情况,应此,初始化程序中应对端口作如下设置:

相关代码:

MOVP0,#0;P0、P2输出低电平

MOVP2,#0

由于本例中单片机在初始化后没有其它事情做,我们就让它没事歇着。

相关代码:

JMP$;自循环(等待状态)

串口中断程序:

串口接收数据流程图

此主题相关图片如下:

串口接收定长或不定长数据的原理:

(很多朋友没理解的)

接收定长或不定长数据关键是要知道数据什么时候发送完毕。

我们知道串口中传送数据是以位(BIT)来传送,通常串口设置为MODE1状态,MODE1状态收发数据是10个位,一个起始位,8个数据位(我们要传送的一个字节数据),1个停止位。

如果波特率9600,请注意单位是BIT/S,也就是速度1秒钟9600位,换算一下,发送或接收10位需要1MS毫秒多一点。

那么OK,对于不定长度数据,我们在每接收完1个字节数据后,开始设定时值如2MS,并开启定时器,如果后面还有数据,则重新设定时值如2MS,并开启定时器;如果后面没有数据了,超过2MS,即表示数据接收完毕了,下面可以对收到的数据处理了。

对于指定长度的数据,我们可以设定全部数据接收完需要多长时间,在引起串口中断后(即准备接收第1个字节),开始设定时值如2MS,并开启定时器,循环接收字节数据,如果超时,即表示数据接收完毕了,下面可以对收到的数据处理了。

在本例中我们接收的是4个字节的定长数据,相关代码如下:

MOVTH0,#HIGH(65536-65536)

MOVTL0,#LOW(65536-65536)

SETBTR0;开定时器0

MOV30H,#00;同步字节

MOV31H,#00;数据1

MOV32H,#00;数据2

MOV33H,#00;结束字节

MOVR0,#30H

REC:

jbctf0,FS;接收时间是否超时?

是则执行FS

JNBRI,REC;接收数据

CLRRI

MOVA,SBUF

MOV@R0,A

INCR0

JMPREC

FS:

CLRTR0;关定时器0

;********************************

CALLFUN;解码并控制继电器

如何定义通讯协议:

通讯协议就是通讯各方的约定,没有固定的格式方法,由开发商自行定义。

我们来看一个最简单的通讯协议:

接收字节数据功能

00继电器1开

01继电器1关

02继电器2开

03继电器2关

这个协议说明,单片机接收到1个数据如果是00H,则继电器1打开,依次类推。

在实际使用时,由于各种干扰因素,往往会发生误动作的情况,因此通讯协议必须能抵挡各种干扰因素。

为了得到可靠的通讯协议,我们常常在要发送的数据前加同步位,发送的数据后加结束位,以及加入校验字节等等方法。

本例中我们确定如下的通讯协议:

1、数据为4个字节,第1字节表示同步位,第2字节表示数据1,第3字节表示数据2,第4字节表示结束位。

2、第1字节表示同步位,固定为0AH;第4字节表示结束位,固定为0DH。

3、第2字节即数据1,8个位依次代表继电器1-8,位=1则继电器开,位=0则继电器关。

4、第3字节即数据2,8个位依次代表继电器9-16,位=1则继电器开,位=0则继电器关。

因此如果接收到数据0A01020D,首先判断第1字节是否=0AH,再判断第4字节是否=0DH,如果不同,则发生了错误,反之正确。

第2字节=01H,表示继电器器1开,继电器2-8关;第3字节=02H,表示继电器10开,继电器9、11-16关。

协议解析(解码)程序

FUN:

MOVA,#0AH;判断第1字节即同步位

CJNEA,30H,ERR

MOVA,#0DH;判断第4字节即结束位

CJNEA,33H,ERR

;****************************************

;第2字节即数据位1,代表继电器J1-8

;第3字节即数据位2,代表继电器J9-16

;****************************************

MOVA,31H

MOVP0,A

MOVA,32H

MOVP2,A

RET

 

2、PC程序部分

串行口控制继电器的例子-PC源程序(整个项目文档)下载:

 下载信息

点击浏览该文件:

由于论坛限制发送大于500K的压缩包,源代码中的临时文档删除了,大家打开文档重新编译一下,开发环境会自动生成。

开发环境:

此主题相关图片如下:

MicrosoftVisualStudio2005

MicrosoftVisualStudio2005是基于NET的开发环境,你可以通过网络找到它,全部文件包括MSDN联机文档大概3.18G,MicrosoftVisualStudio2005其实包括了VB.NET\C#\J#\ASP等开发语言,我们用VB。

NET。

很多朋友提到VB,要说的是VB与VB。

NET是不同的。

几个理由:

1、操作系统不断升级,越来越多的新特性需要。

NET支持。

2、VB。

NET编程更简单,功能更强大。

3、执行速度,以往大家总拿C与VB比较,认为C快,vb慢,NET平台下,C与vb仅是描述语言不同,下层执行代码完全统一,没有速度区别。

所以我建议使用。

MicrosoftVisualStudio2005安装过程我不说了。

使用MicrosoftVisualStudio2005简单说一下:

启动MicrosoftVisualStudio2005后,选VISUALBASIC,点击新建项目,选WINDOWS应用程序,输入项目名称,确定。

此主题相关图片如下:

在窗口中添加你需要的各种组件,完成后如图:

此主题相关图片如下:

添加代码

简单说一下,具体请参考相关书籍。

如果你了解请跳过此段。

要添加代码,我们首先要了解组件的属性、事件、方法。

打个比方吧,我们买部汽车,一定要挑挑颜色吧,轮胎多宽,发动机排量等,这是汽车的属性;要让汽车跑起来,我们要踩油门,很显然,发生踩油门的事件时,汽车执行了开动的方法。

PC串口发送数据

通过串口发送数据的方式分文本和二进制。

通常在自动化控制中用二进制发送方式。

很多朋友搞不明白,其实很简单:

1、文本方式

DimsendAsByte()

AxMSComm1.CommPort=1'"1"'参数设置设端口号

AxMSComm1.Settings="9600,n,8,1"'设波特率

AxMSComm1.PortOpen=True'打开端口

AxMSComm1.Output=SEND

AxMSComm1.PortOpen=False'关闭端口

2、二进制方式

DimsendAsSTRING

AxMSComm1.CommPort=1'"1"'参数设置设端口号

AxMSComm1.Settings="9600,n,8,1"'设波特率

AxMSComm1.PortOpen=True'打开端口

AxMSComm1.Output=SEND

AxMSComm1.PortOpen=False'关闭端口

可以看到除了要发送的数据定义不同,其他完全相同。

在本例中,我们要发送的数据包含起始、数据1、数据2、结尾共4个字节,如下:

1、首先组合数据

buff="0A"+DATA1+DATA2+"0D"

2、文本转换为二进制数组

DimXAsInteger=1

DimYAsInteger=Len(buff)

DimzAsInteger=0

'DimSENDAsByte()

ReDimSEND(Y/2-1)

WhileX

SEND(z)=Val("&H"+(Mid(buff,X,2)))

z+=1

X+=2

EndWhile

3、通过串口发送二进制数据

Try

AxMSComm1.CommPort=1'"1"'参数设置设端口号

AxMSComm1.Settings="9600,n,8,1"'设波特率

AxMSComm1.PortOpen=True'打开端口

AxMSComm1.Output=SEND

AxMSComm1.PortOpen=False'关闭端口

ToolStripStatusLabel1.Text=("发送成功!

"+"端口"+Str(AxMSComm1.CommPort)+""+"设置"+AxMSComm1.Settings)'显示状态

CatchexAsException

MsgBox("发送失败!

端口可能被占用或是无效的端口!

")

EndTry

其它代码:

表述二进制的文本,转换为十进制:

 y=0

'temp="10010010"

Forx=1To8

z=Mid(temp,x,1)

Ifz=1Then

SelectCasex

Case1

y+=1

Case2

y+=2

Case3

y+=4

Case4

y+=8

Case5

y+=16

Case6

y+=32

Case7

y+=64

Case8

y+=128

EndSelect

EndIf

Next

TextBox5.Text=y

表述为十进制的文本,转换为十六进制:

 IfLen(Hex(y))<2Then

TextBox6.Text="0"+Hex(y)

Else

TextBox6.Text=Hex(y)

EndIf

默认情况下,程序编译后可执行文件在桌面-我的文档-VisualStudio2005-Projects-“你的项目”-bin-Release。

你会发现在你的机器上可以打开执行,但无法在其它机器上使用,原因如下:

1、开发环境中已包含并安装微软Microsoft.NETFramework2,但其它机器上可能并没有安装,你可以通过网络搜索到Microsoft.NETFramework2并下载它,大小约22M,目前的版本是2.0.50727.42。

发送图片到手机,此主题相关图片如下:

常见错误的错误有:

没有安装Microsoft.NETFramework2-chs的情况

需要完整安装2000或XP或升级至XPSP2的情况

 

此主题相关图片如下:

此主题相关图片如下:

此主题相关图片如下:

 

有必要补充一个话题(个人观点,仅供参考):

看到很多朋友特别是初学者,学单片机用汇编还是C?

好像一夜之间,学习单片机就要学习C,有人这样比较:

汇编难懂C容易理解

汇编要对硬件、寄存器充分理解C不必完全理解寄存器

其它等等。

总而言之,C容易学,汇编难学。

然而,我的观点是学习单片机,先学汇编,再学C。

远的不说了,眼前论坛中,看看很多学习C的朋友,提出这样那样的各种问题,很多问题都是关于单片机硬件、寄存器的,试想连单片机硬件、寄存器都没有搞清,C当然学不好。

汇编其实非常简单,常用的指令就那么几个,碰到复杂的查查指令表,就OK了。

可以说,理解掌握了汇编语言,也就理解了寄存器、理解了硬件,搞个项目不会再有问题。

学习汇编要注意的是一定多写注释,详细记录程序流程,汇编语言代码多时,时间一长,会变得不易理解(也是有人建议不学汇编学C的理由之一),编写时尽量结构化。

汇编语言特别能满足对时序要求严格的控制系统。

在学好汇编的基础上,再学C语言,会非常快上手,C语言最大特点是非常容易移植到其它单片机上,也就是代码可以充分复用。

学习单片机要哪些准备?

单就51而言,我想你应该投入2、3千元,包括书籍、仿真器、实验板等。

其中仿真器非常重要,特别是对于初学者,一个好的仿真器可以使学习进度加快,更轻松。

好多网站在销售简易仿真器,个人觉得是对初学者的诱导,因为简易仿真器并不能完全仿真51单片机,有各种各样的限制,不适合初学者,更适用于有一定基础的朋友。

我一直推荐使用专业的仿真器,你可以更快的发现程序中的错误,因为看到更多的数据值,调试系统非常方便。

常用的有万利、伟福等等,价格低廉的很多,如如万利SE52,价格6百多点。

对于实验板,很多网站上销售的产品各有特色,都不错,你应该挑选价廉物美,功能较好的产品,一般都能满足要求的。

如果你很喜欢动手,那么自己做一个实验板也不失为一个好主意,在自制

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1