汇编语言实现串口通信(PC和单片机间)资料

合集下载

VB环境下实现PC机与单片机的串行通讯

VB环境下实现PC机与单片机的串行通讯

VB环境下实现PC机与单片机的串行通讯随着科技的不断发展,PC机和单片机的联系日益密切,特别是在嵌入式系统领域中,单片机已经成为了必不可少的重要组成部分。

而如何实现PC机和单片机之间的通讯,是一项必须要掌握的技能。

本篇文章主要介绍如何运用VB环境下的串口编程,实现PC机与单片机的串行通讯。

一、概述通讯技术日新月异,各种新的通讯技术层出不穷。

而在普通家庭却使用最为广泛的通讯技术,还是传统的串口通讯。

使用传统的串口通讯,可以实现PC机与单片机之间的数据交互,可靠性高,兼容性强,使用便捷。

要实现PC机与单片机之间的串行通讯,需要掌握两个技能:单片机串行通讯的编程和VB环境下串口编程。

二、单片机串行通讯的编程单片机串行通讯主要是通过寄存器和中断实现的。

单片机通过一个IO口与电脑之间建立一个简单的通讯接口,PC机通过该接口向单片机发送数据,单片机接收到数据,就可以通过该接口把数据返回给PC机。

单片机串口通讯编程的内容主要包括串口数据位、停止位、校验位、波特率等信息,这些信息需要设置在单片机的寄存器中。

同时,还要设置中断信息,以免程序在不接收数据时死等。

三、VB环境下串口编程VB环境下串口编程的关键是掌握控件的使用。

实际上,VB环境下的串口编程非常简单,只需要使用微软提供的MSComm控件就可以实现。

通过MSComm控件的事件和方法,可以轻松地实现数据的读取、发送、接收等功能。

需要注意的是,MSComm控件的BaudRate属性需要与单片机编写的程序的波特率一致,不然可能会出现通讯故障。

四、如何实现串口通讯首先需要硬件上建立好通讯接口。

通常情况下,USB串口转换器和单片机板子都会配套出售,只需要把两者插在一起即可。

其次需要编写单片机的串口通讯程序。

单片机数字口与串口的通讯,就是把串口接到单片机的数字口中,通过串口向外发送数据。

因此,编写单片机的串口通讯程序,需要设置停止位、数据位、奇偶校验位、波特率等参数。

单片机与PC的串行通讯 项目实现程序

单片机与PC的串行通讯 项目实现程序

实现单片机的串行通讯的汇编语言程序如下:ORG 0000AJMP MAINORG 0100HMAIN: MOV SP, #06HMOV SCON,#50H //8位UART(1 START ,8 DA TA ,1 STOP),允许接受MOV TMOD,#20H //T1工作方式2MOV TH1, #0FDHMOV TL1, #0FDHSETB TR1KEY: MOV A, #0FFHMOV P0, AMOV A, P0JNB ACC.0, KEY0JNB ACC.1, KEY1AJMP MAINKEY0: MOV P1, #0FFHK0: JB RI,KK //是否接收到数据,有则跳至KKSJMP K0KK: MOV A,SBUF //将接收到的数据保存到累加器MOV P1,A //输出至P1CLR RI //清除RISJMP K0RETKEY1: MOV P2, #0FFHK01: JB RI,KK1 //是否接收到数据,有则跳至KKSJMP K01KK1: MOV A,SBUF //将接收到的数据保存到累加器MOV P2,A //输出至P2CLR RI //清除RISJMP K0RETEND首先是PC机事件过程与程序Dim hand As Boolean'等待回应时间到标志位,为FALSE时时间没有到,TRUE时时间到Private Sub cancel_Click ()Unload MeEndEnd SubPrivate Sub send_Click ()'变量定义Dim strsend$, strbit$Dim intsend% '发送的字符长度Dim writebuff As V ariant '写输出缓冲区Dim readbuff$ '读输入缓冲区数据strsend = txtsend.Textintsend = Len(strsend)If intsend = 0 ThenMsgBox "请输入数字字符!", , "错误"Exit SubEnd If'数据完整性验证For i = 1 To intsend Step 1strbit = Mid(strsend, i, 1)Select Case strbitCase Is < "0", Is > "9"MsgBox "输入的数据中存在非数字字符!" & vbCrLf & "请重新输入!", vbRetryCancel, "错误"txtsend.Text = ""Exit SubEnd SelectNext iOn Error GoTo comrserror'串行通信口参数设置mPort = 1 '使用Com1做为串行通信口MSComm.Settings = "9600,n,8,1" '串口属性设置MSComm.InputLen = 1 '每次从接收缓冲区读取一个字符MSComm.InputMode = comInputModeText '以字符形式从缓冲区中接受字符MSComm.InBufferCount = 0 '清除输入缓冲区MSComm.OutBufferCount = 0 '清除输出缓冲区MSComm.PortOpen = True '打开通行端口txtport.Text = "COM" & mPorttxtmsg.Text = "串口COM" & mPort & "打开成功!波特率=9600bps"'发送握手信号handle:hand = False '开始发送握手信号时回应标志位为FALSEwritebuff = Chr$(&HFF) '准备握手信号&HffhMSComm.Output = writebuff '发送握手信号Timer.Enabled = True '启动应答定时器DoDoEventsIf hand ThenGoTo handle '定时时间到未收到回应信号重发握手信号End IfLoop Until MSComm.InBufferCount '等待回应'收到对方的回应Timer.Enabled = False'读取并判断是否为规定的联络信号readbuff = MSComm.InputIf Asc(readbuff) = 255 Thenwritebuff = Chr$(intsend)MSComm.Output = writebuff '收到正确的回应,发送字符个数和数据writebuff = strsendMSComm.Output = writebuffMSComm.PortOpen = False '发送完数据关闭端口Exit SubElseGoTo handleEnd Ifcomrserror:End SubPrivate Sub Timer_Timer()Timer.Enabled = Falsehand = True '定时间到关闭定时器,设置标志位End SubPrivate Sub txtsend_Click()txtsend.Text = ""End Sub然后是单片机的源程序datanum equ 20h ;存放接收到的数据个数dataadd equ 30h ;接收到的数据存放的地址org 0000hljmp mainorg 000bhljmp t0_intorg 0100h;主程序main: mov sp,#0fh ;从0fh开始设置堆栈mov tmod,#22h ;T0、T1工作于自动重装载方式mov th1,#0fdhmov tl1,#0fdhsetb tr1 ;晶振频率11.059Mhz,波特率设置为9600mov scon,#50h ;设置串行口工作于方式一mov 50h,#40mov 51h,#100mov th0,#6mov tl0,#6 ;1s定时初始化setb tr0 ;开定时器T0setb et0 ;开定时器T0中断setb ea ;开总中断mov datanum,#0 ;初始时接收数据的个数为0 display: mov r7,#6mov r0,#40hcl_next: mov @r0,#0inc r0djnz r7,cl_next ;数据显示区初始化display0: mov r0,#45h ;r0执行待输出的数据地址处mov r7,#6 ;扫描次数mov r6,#0feh ;r6存放数码管的位码,显示初始化display1: mov p0,r6 ;P0口输出位码mov p2,@r0 ;P2口输出段码dec r0 ;r0指向下一个待输出的段码mov a,r6rl a ;位码左移mov r6,ajbc ri,handle ;display_jmp: djnz r7,display1 ;显示未结束继续本次显示sjmp display0handle: mov r5,sbuf ;接收握手信号cjne r5,#0ffh,display_jmp ;非规定的握手信号mov sbuf,#0ffh ;应答握手信号jnb ti,$ ;等待发送结束clr tijnb ri,$ ;等待接受串行传输的字符个数clr rimov a,sbuf ;接收字符个数jz display_jmp ;没有收到数据mov datanum,a ;保存新数据的个数data_ti: setb f0mov r1,#dataadddata_get: jnb ri,$clr rimov @r1,sbuf ;将数据存入数据区inc r1djnz acc,data_get ;接收下一个字符lcall asctoduan ;调用Ascii码转段码程序ljmp display;Ascii码转换成段码子程序asctoduan: mov r1,#dataadd ;r1指向待转换的数据mov r2,datanum ;r2放转换个数mov dptr,#duanma ;dptr指向段码表loop: mov a,@r1 ;取转换数据clr c ;清除借位位subb a,#48movc a,@a+dptr ;取数据的段码mov @r1,ainc r1djnz r2,loop ;数据未转换完,继续setb rs0 ;选用寄存器组一mov r0,#dataaddmov r2,datanum;setb f0 ;新数据送入显示缓冲区clr rs0 ;ret;定时器T0中断子程序,实现数据动态显示t0_int: djnz 51h,intout ;内层循环未结束退出中断程序djnz 50h,intout0 ;外层循环未结束退出中断程序;定时1s时间到执行移位显示操作setb rs0 ;选用工作寄存器组一mov 0fh,40h ;40h单元暂存mov 40h,41hmov 41h,42hmov 42h,43hmov 43h,44hmov 44h,45h ;显示缓冲区数据左移一位jb f0,datamove ;f0=1允许移动数据,否则不允许mov 45h,0fh ;原40h单元数据放入45h中sjmp intout1 ;退出中断程序,为下次左移做准备;将数据区中的数据移动到显示缓冲区的45h单元datamove: mov 45h,@r0 ;将R0指向的数据区中的数据传送到显示缓冲区inc r0 ;r0指向下一个待移动的数据djnz r2,intout1 ;没有全部移入,退出为下次移动做准备mov r3,datanumcjne r3,#6,datamove0 ;不等于6时判定大于还是小于6 datamove1: clr f0 ;等于6时不允许sjmp intout1datamove0: jc datamove1 ;小于6不允许mov r0,#dataadd ;大于6时允许再移mov r2,datanumintout1: clr rs0 ;选用工作寄存器组0mov 50h,#40intout0: mov 51h,#100intout: reti;段码表duanma: db 3fh,06h,5bh,4fh,66h,6dh ;0,1,2,3,4,5db 7dh,07h,7fh,6fh,77h,7ch ;6,7,8,9,A,Bdb 58h,5eh,7bh,71h,00h,40h ;C,D,E,F,(空格),-end最后是6.2中提到的测试程序:mov 30h,#3fhmov 31h,#06hmov 32h,#5bhmov 33h,#4fhmov 34h,#66hmov 35h,#6dhmov 36h,#7dhmov 37h,#07hmov 38h,#7fhmov 39h,#6fhmov 3ah,#77hmov 3bh,#7chmov 3ch,#58hmov 3dh,#5ehmov 3eh,#7bhmov 3fh,#71hmov 08h,#dataaddmov datanum,#3mov 0ah,datanum setb f0。

单片机与PC机串行通信

单片机与PC机串行通信
1.4.1
小键盘选择功能:首先设置定时器及波特率,然后在设计键盘扫描函数和按键检测函数,使之能实现小键盘的选择功能。输入不同的数实现调用不同的函数,从而实现不同的功能。
1.4.2
功能1:设计PC发送函数,此功能还需要有串行口中断函数。目的是实现单片机可以接收PC机发送的数据,并且将其发送给PC机。设置一个返回键,让按键1实现返回小键盘选择功能,可以重新选择功能1还是功能2。
若选择“2”,即要实现功能2,须调用小键盘扫描函数,将数据显示到数码管上,同时然后将该数据转化成acsii码的形式通过串行口发送到PC机上。当从小键盘按键NEXT时,返回初始状态,可以进行功能1和2的重新选择。
2
本课设主要分3个模块,第一个模块是主程序中的键盘扫描,通过键盘扫描程序来获取从小键盘输入的键值,此次课设里面用到的键盘的按键主要有三个,一个是‘0’,一个是‘1’,另一个是‘2’。当输入‘0’时,结束。当输入的是‘1’时,进入第二个功能模块,由PC机发送数据,将数据发送给单片机,然互在传给PC机。当输入数值‘2’时,进入第二个模块,将数据由单片机小键盘输入,发送给PC机。模块调用图如下页图2.1所示
这样就可以通过输出的列码和读取的行码来判断按下的是哪个该模块中键盘扫描的电路图和键盘扫描电路如图32和33所示沈阳航空航天大学课程设计报告32键盘电路图开始初始化地址参数输出列扫描信号列扫描信号移位读入行信号该列有键输入6列扫描完按照行列计算键值查表得键码等待按键释放33键盘扫描流程图沈阳航空航天大学课程设计报告主函数模块首先设置定时器及波特率的选择根据标志位k1的值选择是pc模式发送数据还是小键盘模式发送数据并根据功能选择模块中对各模式的信息的进行相应的初始设置
(2)课程设计要求:
①认真完成课程设计任务;

单片机与pc串口通信(二)2024

单片机与pc串口通信(二)2024

单片机与pc串口通信(二)引言概述:本文将继续介绍关于单片机与PC串口通信的知识,本文主要探讨了在单片机通信程序中如何处理接收和发送数据。

在前一篇文章中,我们已经介绍了单片机与PC之间串口通信的基本原理和通信流程。

接下来,我们将进一步深入探讨如何通过单片机实现数据的接收和发送。

正文内容:1. 数据接收1.1 设定串口参数:设置波特率、数据位数、停止位等参数。

1.2 串口接收中断:使用中断机制来处理接收到的数据,避免阻塞主程序。

1.3 缓存空间:使用缓存空间来存储接收到的数据,以便后续处理。

1.4 数据处理:对接收到的数据进行处理,例如解析数据帧、提取需要的信息等。

1.5 错误处理:处理接收数据时可能出现的错误,例如校验错误、帧格式错误等。

2. 数据发送2.1 设定串口参数:设置波特率、数据位数、停止位等参数。

2.2 数据缓存:使用缓存空间来存储待发送的数据。

2.3 串口发送中断:使用中断机制来处理发送数据,避免阻塞主程序。

2.4 发送数据处理:对发送的数据进行处理,例如封装成数据帧、添加校验码等。

2.5 错误处理:处理发送数据时可能出现的错误,例如发送缓冲溢出等。

3. 常见问题与解决方法3.1 数据丢失:如何防止数据在传输过程中丢失。

3.2 数据粘包与分包:解决因数据传输速度不同而导致的数据粘连或分散问题。

3.3 数据校验:如何使用校验码来验证数据的完整性。

3.4 超时处理:处理接收或发送数据时可能出现的超时情况,避免死锁等问题。

3.5 应用实例:通过实际案例来展示单片机与PC串口通信的应用。

4. 调试与测试技巧4.1 使用调试工具:介绍常用的串口调试工具,用于验证通信是否正常。

4.2 日志记录:使用日志记录调试信息,以便分析问题。

4.3 基础问题排查:介绍常见问题的排查方式,例如检查硬件连接、确认代码逻辑等。

4.4 问题定位与修复:介绍如何定位并修复通信问题。

5. 总结本文从数据接收和发送两个方面详细介绍了单片机与PC串口通信的实现方法。

采用MA232实现MCS51单片机与PC机的通信

采用MA232实现MCS51单片机与PC机的通信

采用MA232实现MCS51单片机与PC机的通信一、本文概述随着微处理器技术的飞速发展,单片机作为一种集成度高、功能强大的微控制器,在工业自动化、智能仪表、嵌入式系统等领域得到了广泛应用。

MCS51单片机作为其中的佼佼者,以其稳定的性能和广泛的适应性受到了工程师们的青睐。

然而,单片机与PC机之间的通信一直是困扰工程师们的难题之一。

本文旨在探讨采用MA232串口通信模块实现MCS51单片机与PC机之间通信的方法,为工程师们提供一种可靠的解决方案。

本文将首先介绍MCS51单片机的特点及其在嵌入式系统中的应用,然后详细阐述MA232串口通信模块的工作原理及其与MCS51单片机的接口方法。

在此基础上,本文将重点分析采用MA232实现MCS51单片机与PC机通信的硬件电路设计和软件编程实现。

通过实例演示和测试结果分析,验证采用MA232实现MCS51单片机与PC机通信的可行性和可靠性,为工程师们在实际项目中应用提供参考和借鉴。

通过本文的学习,读者可以深入了解MCS51单片机与PC机通信的原理和实现方法,掌握采用MA232串口通信模块实现通信的关键技术,为实际应用提供有力的技术支持。

二、MCS51单片机简介MCS51单片机,又称为Intel 8051微控制器,是Intel公司在1980年代初推出的一款8位CISC(复杂指令集计算机)单片机。

自推出以来,由于其出色的性能、合理的价格和广泛的应用场景,MCS51单片机在全球范围内得到了广泛的使用,成为了嵌入式系统领域的经典之作。

MCS51单片机采用了典型的微处理器结构,包括中央处理器(CPU)、内部数据存储器(RAM)、外部数据存储器(外部RAM)、各种I/O 接口电路以及时钟电路等。

其中,CPU是单片机的核心部分,负责执行程序中的指令,进行数据的运算和处理。

内部数据存储器用于存放程序和数据,而外部数据存储器则提供了更大的存储空间,用于存放更多的数据或程序。

MCS51单片机还提供了丰富的I/O接口电路,包括并行I/O口、串行通信口、定时/计数器、中断系统等,使得单片机可以与外部设备进行通信和控制。

实验6 单片机与PC机间的串行通信

实验6  单片机与PC机间的串行通信

实验6 单片机与PC机间的串行通信一、实验目的1、掌握电平转换器件RS-232的使用方法;2、掌握Proteus VSM虚拟终端(VITUAL TERMINAL)的使用;3、掌握单片机与PC机间的串行通信软硬件设计方法。

二、实验内容实现利用虚拟终端仿真单片机与PC机间的串行通信。

PC机先发送从键盘输入的数据,单片机接收后回发给PC机。

单片机同时将收到的30~39H间的数据转换成0~9的数字显示,其他字符的数据直接显示为其ASCII码。

单片机和PC机进行通信时,要求使用的波特率、传送的位数等相同。

要能够进行数据传送也必须首先测试双方是否可以可靠通信。

可在PC机和单片机上各编制非常短小的程序,具体可分成PC机串行口发送接收程序、单片机串行口发送程序和单片机串行口发送接收程序。

这三个程序能运行通过,即可证明串行口工作正常。

PC机串行口发送接收程序设置串行口为波特率9600、8位数据、1位停止位、无奇偶校验的简单设置。

从键盘接收的字符可从串行口发送出去,从串行口接收的字符在屏幕上显示。

通过让串行口发送线和接收线短接可测试微机串行口,通过让串行口和单片机系统相接,使用此程序可进一步测试单片机的串行通信状况。

具体程序用BASIC编制,简单易懂。

直接输入即可运行。

程序RS232.三、实验电路原理图图7-1 单片机与PC机间电路原理图四、实验步骤1、在PROTEUS中画好电路原理图。

2、串口模型属性设置串口模型属性设置为:波特率―4800;数据位―8;奇偶校验―无;停止位-1,如图7-2所示。

图7-2 串口模型属性设置3、虚拟终端属性设置PCT代表计算机发送数据,PCR用来监视PC接收到的数据,它们的属性设置完全一样,如图7-3所示。

SCMT和SCMR分别是单片机的数据发送和接收终端,用来监视单片机发送和接收的数据,它们的属性设置也完全一样,如图7-4所示。

单片机和PC机双方的波特率、数据位、停止位和检验位等要确保和串口模型的设置一样,并且同单片机程序中串口的设置一致。

PC机与单片机之间的串行通讯、数据的发送和接收

PC机与单片机之间的串行通讯、数据的发送和接收

PC机与单片机之间的串行通讯、数据的发送和接收【摘要】本文以MCS-51单片机为例,详细介绍了PC机与单片机之间的串行通讯、数据的发送和接收。

在Windows98下利用VB的串行通讯控件可实现PC机与单片机之间的通讯。

其数据的发送和接收采用红外线通信方式,其优点是:省去了有线通信信号线的直接连接,使用简单,移动方便,微机与单片机无直接连接,属完全隔离状态,两者间不会因为电平的不同而造成数据传输的失误,抗干扰能力强。

本设计主要应用AT89C51作为控制核心,并与LED数码显示管、双向可控硅、红外发射与接收相结合的系统,充分发挥了单片机的性能。

其优点硬件电路简单,软件功能完善,控制系统可靠,性价比较高等特点,具有一定的使用和参考价值。

【关键字】MSC-51(单片机),红外,RS-232,电平转换器,串行通信半双工【Abstract】This text take one-chip computer MCS-51 for example , introduce a serial communication, data’s sending and receiving . Under the Windows98 we make use of a communication control of VB to achieve the communication of the machine of PC and one-chip computer. Its data’s sending and receiving adopts the method of the infrared ray communication, its advantage is that it exclude the direct link of signal line of with-wired communication ,and usage are simple, and move is convenience etc. The tiny machine have no direct conjunction with single a machine, belonging to the complete insulation appearance, can't result in the error that data deliver both because give or get an electric shock even and different, the antijam ability is strong.This design is a system that it applies AT89C51 as control core and combine the LED figures manifestation tube, MAX232CPE level changer, infrared’s sending and receiving. The system completely exerts the function of one-chip computer. Its advantage is that the hardware circuit is simple; the software function is perfect; the control system is dependable; the rate of price and function is high etc. So the system has certainly consult value.【Keyword】MSC-51(One-chip computer), infrared, RS-232, Level changer, serial communication,half duplex目录前言3第一章系统分析4 1.1 系统功能的概述 5 1.2 系统要求及主要内容 5 1.3 系统技术指标 5第二章系统总体设计6 2.1硬件设计思路 6 2.2软件设计思路 7第三章硬件电路设计7 3.1 单片机模块设计 8 3.2 红外通信(发射与接收)电路的设计 14 3.3 PC机模块的设计 17第四章串行口通信技术20 4.1 单片机串行口通信 21 4.2 PC机串口通信 24第五章软件设计25 5.1 单片机通信程序设计 25 5.2 PC机通信程序设计 29第六章系统调试30 6.1 硬件调试 30 6.2 软件调试 31 6.3 综合调试 33 6.4 故障分析及解决方案 33 6.5 结论与经验 34结束语35附录36 附录1 电路原理图 36 附录2程序流程图 38 附录3程序清单 41 附录4元器件清单 44 附录5 英文资料 45 附录6 中文翻译 52参考文献56前言单片机的英文名称是Micro Controller unit,缩写为MCU,又称为微控制器,它是一种面向控制的大规模集成电路芯片。

Basic实现PC与89C51单片机之间的串行通信

Basic实现PC与89C51单片机之间的串行通信

运用Visual Basic实现PC与89C51单片机之间的串行通信作者:沈飙夏海燕摘要在Visual Basic开发环境下,运用VB提供的通信控件,实现PC机与89C51单片机之间的串行通信。

关键词Visual Basic89C51单片机串行通信A/D D/A转换Serial Communication between PCand 89C51 with Visual BasicAbstract:Serial communication between PC and 89C51 single-chip-computer by MSCOMM control box of Visual Basic is introduced.Key Words:Visual Basic89C51Serial communication A/D D/A1系统简介在中科院等离子体物理研究所受控核聚变物理实验装置控制系统中,我们开发设计了以计算机控制为基础的各种信号予置系统,系统原理如图1所示。

图1系统原理图系统上位机由一台(PC586)微机构成,软件采用Visual Basic编程,作出十分直观的人机界面,并通过串行口将所需的各种予置信号(数字信号)传给单片机系统,再由单片机系统产生实际的模拟信号经线性光电隔离器送到现场。

予置数值可以分别显示在PC机软件窗口和单片机系统的予置数字表头上。

同时,现场实测信号经过线性光电隔离器,也可以实时显示在本系统的检测数字表头上和PC机的界面上。

如此设计界面直观,而且利于对现场信号进行实时监测。

因此,采用本系统,大大提高了现场信号予置精度,对实验操作人员来说人机界面良好,简单易懂。

我们将分硬件和软件两方面分别介绍该系统的情况。

2硬件介绍从系统原理图上可见,本系统关键的硬件部分是单片机系统的设计,上位机PC机则直接利用它的RS232串行口即可。

系统硬件原理如图2所示。

图2系统硬件原理图本系统采用CPU为89C51的单片微机,89C51本身带有2K的内存储器,可以在编程器上实现闪烁式的电擦写达几万次以上,比以往惯用的8031CPU外加EPROM为核心的单片机系统在硬件上具有更加简单、方便等优点,而且完全兼容MCS 51系列单片机的所有功能。

RS-232实现单片机与PC间的串行通信

RS-232实现单片机与PC间的串行通信

RS-232实现单片机与PC间的串行通信串行通信是计算机与外设之间数据传输的一种方式。

RS-232是一种经典的串行通信标准,它被广泛应用于单片机与PC之间的通信。

什么是RS-232协议RS-232是一种串行通信接口标准,它定义了单片机与外设之间信号的电气特性、传输协议和机械连接方式。

RS-232标准的发展可以追溯到20世纪60年代,在数十年的时间里,它成为了计算机与外设之间最常见的传输方式之一。

RS-232标准规定了单片机与PC之间使用的物理连接、数据传输的时序和控制信号等方面的细节。

它定义了一组信号电平和电气特性,用于在两个设备之间传输数据。

RS-232标准的物理层使用了DB-9或DB-25连接器,其中DB-9连接器是最常见的。

在RS-232协议中,数据被分割成小的数据包进行传输。

每个数据包由一个起始位、数据位、奇偶校验位和一个或多个停止位组成。

这些位用于将数据解释为字符并将其传输到目的地设备。

如何使用RS-232实现单片机与PC间的串行通信要使用RS-232实现单片机与PC间的串行通信,需要实现以下几个方面:1.物理连接:使用RS-232标准定义的连接器,将单片机和PC连接起来。

2.电气特性:保证单片机和PC之间的电气特性匹配。

3.传输协议:使用RS-232标准定义的数据传输协议,将数据从单片机发送到PC,或者从PC发送到单片机。

4.数据编码:将数据编码为RS-232标准定义的数据格式。

以上所有方面都需要实现正确,才能使单片机与PC间的串行通信正常进行。

RS-232实现单片机与PC间的串行通信的优缺点RS-232协议是单片机与PC间串行通信的经典标准,它具有以下优缺点:优点:1.稳定性高:RS-232协议信号电平的质量非常高,能够保证数据传输的稳定性和可靠性。

2.延迟低:RS-232协议传输速度相对较慢,但延迟非常低,能够及时传输数据。

3.成本低:RS-232协议使用简单、成本低廉,适合开发者在项目中广泛使用。

单片机汇编 串口通信实验

单片机汇编  串口通信实验

一、实验项目名称串口通信实验二、实验内容现有两台单片机应用系统。

甲机发送内存中以TR_BUF为首地址的10个数据串,乙机把接收到的数据存入以RC_BUF为首地址的内存单元中。

设甲、乙两机的振荡频率为12MHz,串行口均工作在方式1下。

要求甲机用查询方式编程,乙机用中断方式编程。

三、实验原理图(纯软件部分实验报告可不要本部分)四、编程思路及算法分析流程图:五、程序清单甲机发送内存中以TR_BUF为首地址的10个数据串. org 0000hmov r2,#10mov r1,#tr_bufmov a,#0fehlp1: mov @r1,arl ainc r1djnz r2,lp1mov TMOD,#20Hmov th1,#0fdhmov tl1,#0fdhsetb tr1mov scon,#40hmov r0,#tr_bufmov r7,#100acall dy1slp: mov sbuf,@r0jnb ti,$clr tiinc r0djnz r7,lpsjmp $dy1s: mov r6,#200m1: mov r5,#0fahdjnz r5,$djnz R6,m1retEnd乙机把接收到的数据存入以RC_BUF为首地址的内存单元中org 0000hajmp mainorg 0023hajmp s20fworg 0030hmain: mov TMOD,#20Hmov th1,#0fdhmov tl1,#0fdhsetb tr1setb essetb eamov scon,#50hmov r0,#rc_bufmov r2,#10sjmp $s20fw: clr rimov @r0,sbufinc r0djnz r2,fanmov r3,#10mov r1,#rc_buflp1: mov a,@r1mov p1,aacall dy1sinc r1djnz r3,lp1fan: retidy1s: mov r6,#200m1: mov r5,#0fahdjnz r5,$djnz R6,m1retend六、实验仿真结果要有适当的图文解释。

汇编语言实现串口通信(PC和单片机间)

汇编语言实现串口通信(PC和单片机间)

8.用C语言或汇编语言实现串口通信(PC和单片机间)上位机和下位机的主从工作方式为工业控制及自动控制系统所采用。

由于PC 机分析能力强、处理速度更快及单片机使用灵活方便等特点,所以一般都将PC 机作为上位机,单片机作为下位机,二者通过RS-232或者RS-485接收、发送数据和传送指令。

单片机可单独处理数据和控制任务,同时也将数据传送给PC机,由PC机对这些数据进行处理或显示1 硬件电路的设计MCS-51单片机有一个全双工的串行通讯口UART,利用其RXD和TXD与外界进行通信,其内部有2个物理上完全独立的接收、发送缓冲器SBUF,可同时发送和接收数据。

所以单片机和PC机之间可以方便地进行串口通讯。

单片机串口有3条引线:TXD(发送数据),RXD(接收数据)和GND(信号地)。

因此在通信距离较短时可采用零MODEM方式,简单三连线结构。

IBM-PC机有两个标准的RS-232串行口,其电平采用的是EIA电平,而MCS-51单片机的串行通信是由TXD(发送数据)和RXD(接收数据)来进行全双工通信的,它们的电平是TTL电平;为了PC机与MCS-51机之间能可靠地进行串行通信,需要用电平转换芯片,可以采用MAXIM公司生产的专用芯片MAX232进行转换。

电路如图1所示。

硬件连接时,可从MAX232中的2路发送器和接收器中任选一路,只要注意发送与接收的引脚对应关系即可。

接口电路如图3.5所示。

总体设计按照整体设计思路方案绘制原理图如下所示:2 系统软件设计软件设计分上位机软件设计和下位机软件设计。

这两部分虽然在不同的机器上编写和运行,但它们要做的工作是对应的:一个发送,另一个接收。

为了保证数据通信的可靠性,要制定通信协议,然后各自根据协议分别编制程序。

现约定通信协议如下:PC机和单片机都可以发送和接收。

上位机和下位机均采用查询方式发送控字符和数据、中断方式接收控制字符和数据。

采用RS-232串口异步通信,1上位PC机与下位单片机异步串行通信的通信协议其中,单片机号代表现场第几台单片机,占用1个字节,发送两次的目的是为了防止干扰;命令码则代表上位机向下位机发布的工作命令,它也占用1个字节,发送两次的目的也是为了防止干扰。

浅谈PC机与单片机间串行通信的实现

浅谈PC机与单片机间串行通信的实现
( 4)数 据 交换 缓 冲 区
据 时 ,数 据交 换子程序从R TB f r / uf 中将所接 收的上位 e 机数据读 出并存人Wr eB f r ;在 发送数 据时 ,数 i uf 中 t e
据交换子程序把准备 向上位机发送 的数据从R a u e edB f r 中读 出存 入R T ufr ,由串 口中断程序发送 给上位 /B f 中 e
信息系统工程 I 0 1 . 1.2 2 50
9 9
为接收电平转换电路。从 P 机引出的R ̄ C (X ) T D ,经过
低 位字节与发送 的第三个字节异 或 ,得 出的8 字节为 位
下一次C C R 校验 三字节序列的第二个字节。这两个 字节 与发送 的第 四个字节再构成一个三字节序 列 ,利用递推 循环 ,完成多字节的正确校验 。
18 与单片机接收端fX ) 49 R D 相连 。由于18为两态输出不 48 能直接连在一起 ,故通过二极管组成线或 电路后接 到P C 机 的接收端( ) ,二极管的型号均为44 。 I D E 18
三 、上 下 位 机 串行 通 信 协 议 的 设 计 基 本 思路
( 1)下位 机 工作 方 式
二 、软件 设 置

下位 机采用半 双工工作 方式 ,分三步骤 执行 : 先 首
接 收命令 ,此时不向上 位机发送数据 ;接收完命令后处 理该 命令 ,这期 间不接 收也 不发送 ;最 后给上 位机 回
其他应用程序使用 。

五 、结语
P 机 与单片机 间 串联通 信 的实现是需 要有软 件和 C
MCS 5 单 片机 的 串 口中断 子程 序 的入 口地址 为 .1
0 2 H。其基本思路是 :响应 中断后 ,将接收和发送分 03 为两段处理 。在接收段中 ,若是第一次接收则判断是否

51单片机与PC串口通信程序及硬件电路图

51单片机与PC串口通信程序及硬件电路图

51单片机与PC串口通信程序及硬件电路图#include <reg51.h>#define BUFFERLEGTH 10//----------------------------------------------------------------- void UART_init(); //串口初始化函数void COM_send(void); //串口发送函数char str[20];char j;//-------------------------------------------------------------------void main(void){unsigned char i;UART_init();j=0; //初始化串口for(i = 0;i < 10 ;i++){COM_send(); //首先发送一次数据作为测试用};while(1);}//-------------------------------------------------------------//--------------------------------------------------------------------------------------------------// 函数名称: UART_init()串口初始化函数// 函数功能:在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s// 串口接收中断允许,发送中断禁止//--------------------------------------------------------------------------------------------------void UART_init(){//初始化串行口和波特率发生器SCON =0x50; //选择串口工作方式1,打开接收允许TMOD =0x20; //定时器1工作在方式2,定时器0工作在方式1 TH1 =0xfA; //实现波特率9600(系统时钟11.0592MHZ)PCON = 0x80;TR1 =1; //启动定时器T1ET1 =0;ES=1; //允许串行口中断PS=1; //设计串行口中断优先级EA =1; //单片机中断允许}//------------------------------------------------------------void COM_send(void){unsigned char point = 0;for(point=0;str[point]!='\0';point++) //连续发送二十位数据 //把缓存区的数据都发送到串口 {SBUF=str[point];while(!TI);TI=0;//str[point]='\0';}}//--------------------------------------------------------------//--------------------------------------------------------------------------------------------------// 函数名称: com_interrup()串口接收中断处理函数// 函数功能:接收包括起始位'S'在内的十位数据到数据缓冲区//--------------------------------------------------------------------------------------------------void com_interrupt(void) interrupt 4 using 3{unsigned char RECEIVR_buffer;bit flag=1;if(RI) //处理接收中断{RI=0; //清除中断标志位RECEIVR_buffer=SBUF; //接收串口数据str[j]=SBUF;if (RECEIVR_buffer == '$'){ ES=0;str[j]='\0';SCON =0x40; //接收不允许COM_send(); //发送数据ES=1;j=0;flag=0;SCON=0x50; //接收允许}if(flag)j++;}}。

单片机双机串行通信多数据传输汇编语言编程实现

单片机双机串行通信多数据传输汇编语言编程实现

• 178•串口是单片机与其他单片机或计算机系统进行异步串行通信的标准I/O 接口,在系统设计中应用非常广泛。

以教学中使用的CPU 字长是8位的51单片机为例,实现双机间多数据串行传输,在多数据发送时为每个数据增加特征值,接收的时候通过特征值判断接收的数据,此方法最多可以实现双机间16个数据的传送,适用于5-8个通道的数据采集系统。

将此设计思想应用在0-999s 的秒表系统设计中,系统运行稳定,实现预期效果。

单片机串口是异步串行通信,发送方发送数据并不考虑接收方什么时候接收,如果是传送1个数据比较好处理,串口无论工作在查询方式下还是中断方式下,接收方的CPU 只要检测RI =1,就可以接收数据。

如果发送方发送的是多个数据,接收方接收的是发送方发送的多个数据的哪一个?发送方发送的多个数据是动态变化的,尽管发送方发送多个数据的顺序在编程中是固定不变的,但是串口通信是异步的,接收方接收时,无法知道此次接收的数据是发送方发送的哪一个数据,所以接收方必须有能力判断接收到的是哪一个数据才能真正实现异步串行通信多数据的正确传送。

1 发送数据的加密原理及编程实现要想让接收方有能力判断接收的数据是哪一个数据,可以对要发送的数据做加密处理,数据加密技术是网络中最基本的安全技术,主要是通过对网络中传输的信息进行数据加密来保障其安全性。

本设计借用数据加密的思想,对要发送的数据采用增加特征值的加密处理方法,乙机接收数据后,通过解密获取特征值,就可以知道接收的是哪一个数据了。

特征值的选取要视发送数据的范围,本文以发送压缩BCD 码说明数据加密的原理及编程实现。

1.1 发送数据的加密原理压缩BCD 码是用4位二进制表示1位十进制,由于设计中使用的单片机CPU 的字长是8位的,所以一次可以处理1个字节数据,用字节表示1位BCD 码的时候,高4位一定是“0”,低4位是”0-9”中的1个数字,这样用高4位的“0”就可以实现对数据加密处理。

C51单片机和电脑串口通信电路图与源码

C51单片机和电脑串口通信电路图与源码

C51单片机和电脑串口通信电路图与源码51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。

进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。

我们采用了三线制连接串口,也就是说和电脑的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。

这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。

串口通讯的硬件电路如上图所示在制作电路前我们先来看看要用的MAX232,这里我们不去具体讨论它,只要知道它是TTL和RS232电平相互转换的芯片和基本的引脚接线功能就行了。

通常我会用两个小功率晶体管加少量的电路去替换MAX232,可以省一点,效果也不错,下图就是MAX232的基本接线图。

按图7-3加上MAX232就可以了。

这大热天的拿烙铁焊焊,还真的是热气迫人来呀:P串口座用DB9的母头,这样就可以用买来的PC串口延长线进行和电脑相连接,也可以直接接到电脑com口上。

为了能够在电脑端看到单片机发出的数据,我们必须借助一个WINDOWS软件进行观察,这里我们利用一个免费的电脑串口调试软件。

本串口软件在本网站可以找到软件界面如上图,我们先要设置一下串口通讯的参数,将波特率调整为4800,勾选十六进制显示。

串口选择为COM1,当然将网站提供的51单片机实验板的串口也要和电脑的COM1连接,将烧写有以下程序的单片机插入单片机实验板的万能插座中,并接通51单片机实验板的电源。

串口实验的源程序如下所示:;这是一个S51单片机实验开发板向PC机的串口单向发送数据AF的演示程序;采用MAX232专用芯片作RS232/TTL电平转换.;通讯波特率为4800KBPS,只要按下一次K1(就是P3.6引脚变成低电平);就发送一个16进制的AF字符ORG 0000HMOV SCON,#50H;设置成串口1方式MOV TMOD,#20H;波特率发生器T1工作在模式2上MOV PCON,#80H;波特率翻倍为2400x2=4800BPSMOV TH1,#0F3H;预置初值(按照波特率2400BPS预置初值)MOV TL1,#0F3H;预置初值(按照波特率2400BPS预置初值)SETB TR1;启动定时器T1;以上完成通讯初始化设置WRIT:JB P3.6,$;判断K1是否按下,如果没有按下就等待ACALL DELAY10;延时10毫秒消触点抖动JB P3.6,WRIT;去除干扰信号JNB P3.6,$;等待按键松开MOV A,#0AFH;将16进制的字符AF发送到串口去MOV SBUF,A;将AF通过串口发送出去AJMP WRIT;10毫秒延时子程序DELAY10:MOV R4,#20D2:MOV R5,#248DJNZ R5,$DJNZ R4,D2RETEND;=============两机串口通讯程序(主机)===================== ; 功能: 使用串行中断,接收数据并显示; 硬件环境: 自制单片机实验板; 软件环境: 伟福 V3.20; Create date: 2004_07_26; First Modify: 2004_07_26; second Modify:; Last Modify: 2004_07_26; Author: Sujiande;;===========预定义===================LED0 EQU 40H ;预定义数码管LED1 EQU 41H ;预定义数码管LED2 EQU 42H ;预定义数码管LED3 EQU 43H ;预定义数码管LED4 EQU 44H ;预定义数码管LED5 EQU 45H ;预定义数码管LED6 EQU 46H ;预定义数码管LED7 EQU 47H ;预定义数码管SDA BIT P0.1 ; 定义数据线引脚定义SCL BIT P0.0 ; 定义时钟线引脚定义;---------------------------ORG 0000H ;主程序入口AJMP MAIN ;跳转到主程序ORG 0100H ;主程序在ROM中存放位置;===============主程序=====================MAIN:MOV LED0,#00H ;赋初值MOV LED1,#00HMOV LED2,#16 ;赋初值为16, 数码管显示代码为: 灭MOV LED3,#16MOV LED4,#16MOV LED5,#16MOV LED6,#16MOV LED7,#16;--------------------;MOV DPTR,#TABLE ; 赋显示代码首地址MOV R1,#00H ; 给R1赋初值00HACALL DISPLAY ; 调显示子程序MOV SP, #30H ; 给堆栈指针赋初值;--------------------------; 使用定时器1,作为波特率发生器,设定波特率=9600,; 定时器初值为:FAH; 串行控制器设置:SM0=0,SM1=1,SM2=0,REN=1,TB8=0,; RB8=0,TI=0,RI=0 即0101 0000B; 波特率加倍;-----------------------------MOV TMOD,#20H ;设置定时器1,工作方式2MOV TH1,#0FAh ;赋初值: FAMOV TL1,#0FAh ;赋初值: FAMOV SCON, #50h ;设置串行口控制寄存器MOV PCON, #80h ;设置电源控制寄存器, 让波特率加倍(2X) SETB TR1 ;启动定时;*****************主程序结束************************ LP8: MOV A,R1 ;将1的数据装到A中;-----------------------MOV SBUF,A ;将A的数据送到缓冲区JNB TI,$ ;等待数据发送完毕CLR TI ;清发送中断标志;-----------------------INC R1CJNE R1,#99,LP3MOV R1,#00HLP3: ACALL SEPERATE ;调拆分程序ACALL DISPLAY ;调显示子程序ACALL DELAY_1S ;调延时子程序AJMP LP8;=================拆分程序===================== SEPERATE: ANL A,#0Fh ;与操作得到个位数据MOV LED0,A ;个位送LED0MOV A,R1ANL A,#0F0H ;与操作得到十位数据SWAP AMOV LED1,A ;十位送LED1RET;===============显示子程序===================== DISPLAY:MOV DPTR,#TABLE ; 赋显示代码首地址MOV A,LED0 ;查表数据送AMOVC A,@A+DPTR ;查表,得到显示代码ACALL SHIFT ;调移位子程序MOV A,LED1MOVC A,@A+DPTRACALL SHIFTMOV A,LED2MOVC A,@A+DPTRACALL SHIFTMOV A,LED3MOVC A,@A+DPTRACALL SHIFTMOV A,LED4MOVC A,@A+DPTRACALL SHIFTMOV A,LED5MOVC A,@A+DPTRACALL SHIFTMOV A,LED6MOVC A,@A+DPTRACALL SHIFTMOV A,LED7MOVC A,@A+DPTRACALL SHIFTRET;---------显示代码表---------TABLE: DB 11H,0D7H,32H,92H,0D4H,98H,18H,0D3H,10H,90H ;0,1,2,3,4,5,6,7,8,9, DB 50H,1CH,39H,16H,38H,78H, 0FFH,0FEH,0EFH ;10,11,12,13,14,15,灭,-;================移位子程序============================SHIFT: PUSH A ; 进栈暂存A值MOV R0,#8 ; 循环8次CLR C ;清进位标志CLR SCL ;时钟线,先钳位为0LP2: RLC AMOV SDA,CNOPNOPSETB SCLNOPNOPCLR SCLNOPNOPDJNZ R0,LP2POP A ; 出栈恢复A值RET;=============延时子程序===============DELAY_1S:MOV R7,#0ffHLOOP7: MOV R6,#0ffHLOOP6: NOPNOPNOPNOPNOPNOPDJNZ R6,LOOP6DJNZ R7,LOOP7RET;------------------------------END;=============两机串口通讯程序(从机)===================== ; 功能: 使用串行中断,接收数据并显示; 硬件环境: 自制单片机实验板; 软件环境: 伟福 V3.20; Create date: 2004_07_26; First Modify: 2004_07_26; second Modify:; Last Modify: 2004_07_26; Author: Sujiande;===========预定义===================LED0 EQU 40H ;预定义数码管LED1 EQU 41H ;预定义数码管LED2 EQU 42H ;预定义数码管LED3 EQU 43H ;预定义数码管LED4 EQU 44H ;预定义数码管LED5 EQU 45H ;预定义数码管LED6 EQU 46H ;预定义数码管LED7 EQU 47H ;预定义数码管SDA BIT P0.1 ; 定义数据线引脚定义SCL BIT P0.0 ; 定义时钟线引脚定义;---------------------------ORG 0000H ;主程序入口AJMP MAIN ;跳转到主程序ORG 0023H ;中断入口地址AJMP S_INT ;跳转到中断程序ORG 0100H ;主程序在ROM中存放位置;==============主程序========================MAIN:MOV LED0,#00H ;赋初值MOV LED1,#00HMOV LED2,#16 ;赋初值为16, 数码管显示代码为: 灭MOV LED4,#16MOV LED5,#16MOV LED6,#16MOV LED7,#16;------------------------------MOV DPTR,#TABLE ; 赋显示代码首地址ACALL DISPLAY ; 调显示子程序MOV SP, #30H ; 给堆栈指针赋初值;--------------------------------------------; 使用定时器1,作为波特率发生器,设定波特率=9600,; 定时器初值为:FAH; 串行控制器设置:SM0=0,SM1=1,SM2=0,REN=1,TB8=0,; RB8=0,TI=0,RI=0 即0101 0000B; 波特率加倍;---------------------------------------------MOV TMOD,#20H ;设置定时器1,工作方式2MOV TH1,#0FAh ;赋初值: FAMOV TL1,#0FAh ;赋初值: FAMOV SCON, #50h ;设置串行口控制寄存器MOV PCON, #80h ;设置电源控制寄存器, 让波特率加倍(2X);---------------------------------------SETB EA ; 启动总中断SETB ES ; 启动串行中断SETB TR1 ;启动定时AJMP $ ; 等待中断;*****************主程序结束************************;===============中断服务程序============================= S_INT:MOV R1, SBUF ;将缓冲区的数据送到R1ACALL SEPERATE ;调拆分程序ACALL DISPLAY ;调显示子程序CLR RI ;清接收中断标志RETI ;中断返回;=================拆分程序===================== SEPERATE: MOV A,R1ANL A,#0Fh ;与操作得到个位数据MOV LED0,A ;个位送LED0MOV A,R1ANL A,#0F0H ;与操作得到十位数据SWAP A ;MOV LED1,A ;十位送LED1RET;===============显示子程序======================MOV A,LED0 ;查表数据送AMOVC A,@A+DPTR ;查表,得到显示代码ACALL SHIFT ;调移位子程序MOV A,LED1MOVC A,@A+DPTRACALL SHIFTMOV A,LED2MOVC A,@A+DPTRACALL SHIFTMOV A,LED3MOVC A,@A+DPTRACALL SHIFTMOV A,LED4MOVC A,@A+DPTRACALL SHIFTMOV A,LED5MOVC A,@A+DPTRACALL SHIFTMOV A,LED6MOVC A,@A+DPTRACALL SHIFTMOV A,LED7MOVC A,@A+DPTRACALL SHIFTRET;---------显示代码表---------TABLE: DB 11H,0D7H,32H,92H,0D4H,98H,18H,0D3H,10H,90H ;0,1,2,3,4,5,6,7,8,9, DB 50H,1CH,39H,16H,38H,78H, 0FFH,0FEH,0EFH ;10,11,12,13,14,15,灭,-;================移位子程序============================SHIFT: PUSH A ; 进栈暂存A值MOV R0,#8 ; 循环8次CLR C ;清进位标志CLR SCL ;时钟线,先钳位为0LP2: RLC AMOV SDA,CNOPNOPSETB SCLNOPNOPCLR SCLNOPNOPDJNZ R0,LP2POP A ; 出栈恢复A值RET;=============延时子程序=============== DELAY_1S:MOV R7,#0ffHLOOP7: MOV R6,#0ffHLOOP6: NOPNOPNOPNOPNOPNOPDJNZ R6,LOOP6DJNZ R7,LOOP7RET;------------------------------END。

51单片机串口通信试验汇编程序

51单片机串口通信试验汇编程序

51单片机串口通信试验汇编程序(今天是硬生生的把它给抠出来了):PC 通过串口助手向单片机系统传递命令和数据:以A5开始,以5A结束;中间是数据,长度不一,要求把数据部分用led灯显示出来;并且要求循环显示;//This is my x_Ed program code//we use it as the pc communicated with the mcu//At the same time,we want to see the result by LCD;STFLAG BIT 00H //收到起始码标志,1为收到起始码EDFLAG BIT 01H //到结束码标志,1为收到结束码TMFLAG BIT 02H //定时时间到标志,1为定时时间到ORG 0000HSJMP Initialize//主程序入口(初始化程序)ORG 000BH //定时器0入口LJMP TIMER0 //定时器0中断ORG 0023H //串口中断程序的入口地址LJMP Transfer //跳转到接受中断入口///////////////////////////////////////////////////////////////ORG 0050HInitialize:MOV SP,#70H //设置堆栈MOV TMOD,#21H //T1工作方式2 T0工作MOV TH1,#0FDH //波特率9600MOV TL1,#0FDH //波特率9600 自动重装载MOV TH0,#3CH //定时50msMOV TL0,#0BH //定时50msMOV SCON,#50H //串口工作方式1MOV R6,#00H //定时次数计数器20一秒MOV R5,#00H //接收数据长度计数器MOV R4,#00H //控制输出控制寄存器MOV R0,#30H //数据存储地址MOV R1,#30H //控制输出的数据缓存CLR STFLAG //清起始标志位CLR EDFLAG //清结束标志位CLR TMFLAG //清时钟标志位SETB PS //提高串口中断的优先级SETB TR1 //打开定时器1;SETB ES //打开串口中断允许位SETB ET0 //定时器0中断允许位SETB EA //打开全局中断允许位/////////////////等待接受命令//////////////////////// Main: JB STFLAG,NODE3 //已经收到起始位SJMP Main //未起始继续等待NODE3: JB EDFLAG,NODE4 //已经收到结束位SJMP Main //未结束继续等待NODE4: SETB TR0 //打开定时器0;NODE5: JB TMFLAG,OUTPUTSJMP NODE5///////////////////等待上位机传送数据并记录//////// Transfer: CLR ESMOV A,SBUFCJNE A,#0A5H,NODE0 //检测到起始位SETB STFLAGSJMP JIEDIANNODE0: CJNE A,#05AH,NODE1 //检测到结束位SETB EDFLAGMOV DPH,R5MOV R4,DPHclr ES //打开串口中断允许位SJMP ret00NODE1: MOV @R0,A //既非起始码,又非结束码,则为数据INC R0INC R5MOV SBUF,#055HJIEDIAN: CLR TICLR RISETB ESret00: RETITIMER0: CLR TR0MOV TH0,#3CHMOV TL0,#0B0HINC R6CJNE R6,#20,RTNSETB TMFLAGMOV R6,#00HRTN: SETB TR0RETIOUTPUT: CLR TR0clr TMFLAGMOV A,@R1MOV P1,AINC R1DJNZ R4,NODE4MOV R1,#30HCLR TMFLAGMOV DPH,R5MOV R4,DPHSJMP NODE4RETIEND。

PC机单片机的串口通信

PC机单片机的串口通信

PC机单片机的串口通信课程设计背景及目的在当今科学发展的过程中,越越来多的产品涉及到通信的问题,特别是与PC机的通信这就会让人们的控制很方便也很直观化。

特别是对于单片机来说作为控制器件的主体来说与PC机的通信尤为重要了。

这可以很方便的让人们控制。

可以通过向PC 机界面输入要修改的数据从而可以达到要对控制器件控制的目的。

这也要求了单片机与PC机的串口通信地开发,在现实中通过通信可以达到各种各样的控制目的。

在这里主要研究一下PC机与单片机的通信模式即是用什么器件来实现的和单片机与上位机程序的通信的实现。

关键字:数据载波检测,RS-232C,异步通信,同步通信,溢出率,MSComm,事件驱动㈠:RS-232串行接口标准目前RS-232是PC机与通信工业中应用最广泛的一种串行接口。

RS-232被定义为一种在低速串行通信中增加通信距离的单端标准。

RS-232采取不平衡传输方式,即所谓单端通信。

收、发端数据信号相对于信号地。

可以分为9针串口和25针串口。

电平在+5V~+15V,负电平在-5V~-15V.当无数据传输时,线上为TTL,从开始传送数据到结束,线上电平从TTL电平到RS-232电平再返回TTL电平。

接收器典型电平是+3V~+12V和-3V~-12V。

由于发送电平与接收电平的差仅为2~3V左右,所以其共模抑制能力差,再加上双绞线上上为分布电容,其传送距离最大约15米最高速率为20kb/s。

RS-232是为只用一对收发﹑设备通信而设计的,其驱动器负载为3~7KΩ。

所以RS-232适合本地设备之间的通信。

RS-232C是用正负电压来表示逻辑状态,与TTL以高低电平表示逻辑状态的规定不同。

因此,为了能够同计算机接口或终端设备的TTL器件连接,必须在RS-232C与TTL电路之间进行电平和逻辑关系的变换。

MAX232芯片可完成TTL到EIA双向电平的转换。

三线制RS-232C串行通信接线方法首先,串口传输数据只要有接收数据针脚和发送针脚就能实现。

单片机原理与应用基于汇编C51及混合编程串行口通信.PPT

单片机原理与应用基于汇编C51及混合编程串行口通信.PPT

UART_M0x6:串行BSR口B1TRB1xT方1RR2S式::0独串的立行波口特1的率波发特生率器发计运生数行器控选制择位位。。 通信速度控制位。BSRB1TRBxT1RR2S==00时时,,独不选立允择波许定特独时率立/计发波数生特器器率T的发1作计生为数器串工
UART_M0x6=0,时方行作钟式口;源0的1为的波系波特统特时率钟发频生率器f;osc的12分频; 率为系统时钟频率B的SRB11T2RBx分T1RR2频S==;11,时时独,,允立选许波择独特独立率立波发波特生特率器率发的发生计生器数器工时作为 UART_M0x6=1,钟方串源式行为0的口系波1统的特时波钟特频率率发。生器
5
8.1 串行通信的发发概送送缓念缓冲冲器器SSB2UBFUF
地地址址::999HBH
STC12C5A60S2单片机具有2个UART工作方式的串行口
串串行行口口12
接接收收缓缓冲冲器器SS2BBUUFF
地地址址::999BHH
6
8.2 串行口1的相关寄存器
STC12C5A60S2单片机的串行口1 与8个特殊功能寄存器相关 串行控制寄存器SCON 电源控制寄存器PCON 辅助寄存器AUXR 独立波特率发生器寄存器BRT 唤醒控制寄存器WAKE_CLKO 中断寄存器IE、IP、IPH。
4
8.1 串行通信的概念
串行通信可分为单工、半双工和全双工3种方式 单工方式只有一根数据线,数据只能按照一个固定的方向传送
半双工方式的数据可以由甲向乙传送,也可以由乙向甲传 送,但是不能在两个方向上同时传送 全双工方式可以在同一时刻实现双向传送。 在串行通信中,用波特率衡量通信速度的快慢。波特率是指每 秒钟传送的二进制数的位数 单位:位/秒(bps) 字节/秒(Bps) 波特率(bps)=1个字符的二进制位数 × Bps
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

8.用C语言或汇编语言实现串口通信(PC和单片机间)上位机和下位机的主从工作方式为工业控制及自动控制系统所采用。

由于PC 机分析能力强、处理速度更快及单片机使用灵活方便等特点,所以一般都将PC 机作为上位机,单片机作为下位机,二者通过RS-232或者RS-485接收、发送数据和传送指令。

单片机可单独处理数据和控制任务,同时也将数据传送给PC机,由PC机对这些数据进行处理或显示1 硬件电路的设计MCS-51单片机有一个全双工的串行通讯口UART,利用其RXD和TXD与外界进行通信,其内部有2个物理上完全独立的接收、发送缓冲器SBUF,可同时发送和接收数据。

所以单片机和PC机之间可以方便地进行串口通讯。

单片机串口有3条引线:TXD(发送数据),RXD(接收数据)和GND(信号地)。

因此在通信距离较短时可采用零MODEM方式,简单三连线结构。

IBM-PC机有两个标准的RS-232串行口,其电平采用的是EIA电平,而MCS-51单片机的串行通信是由TXD(发送数据)和RXD(接收数据)来进行全双工通信的,它们的电平是TTL电平;为了PC机与MCS-51机之间能可靠地进行串行通信,需要用电平转换芯片,可以采用MAXIM公司生产的专用芯片MAX232进行转换。

电路如图1所示。

硬件连接时,可从MAX232中的2路发送器和接收器中任选一路,只要注意发送与接收的引脚对应关系即可。

接口电路如图3.5所示。

总体设计按照整体设计思路方案绘制原理图如下所示:2 系统软件设计软件设计分上位机软件设计和下位机软件设计。

这两部分虽然在不同的机器上编写和运行,但它们要做的工作是对应的:一个发送,另一个接收。

为了保证数据通信的可靠性,要制定通信协议,然后各自根据协议分别编制程序。

现约定通信协议如下:PC机和单片机都可以发送和接收。

上位机和下位机均采用查询方式发送控字符和数据、中断方式接收控制字符和数据。

采用RS-232串口异步通信,1上位PC机与下位单片机异步串行通信的通信协议其中,单片机号代表现场第几台单片机,占用1个字节,发送两次的目的是为了防止干扰;命令码则代表上位机向下位机发布的工作命令,它也占用1个字节,发送两次的目的也是为了防止干扰。

而停止标志则表明一次命令发送完毕。

使用时可依据该标志判断上位机该格式中,数据块为下位机上传到上位PC机的数据。

校验位则用于PC机对收到的数据进行奇偶校验(占1个字节)。

校验正确后,可将数据写入内存,否则发出数据传输错误信息,以要求单片机重新传输数据。

另外,作为一个完整的通信协议,只有上述约定还不够,还必须在发送和接收数据的时间间隔上加以限制。

否则,很可能由于某些原因而造成无限制的等待对方应答,使整个系统处于工作不正常状态,或者延误其它动作的处理。

具体时间限制可根据通信内容、CPU处理速度,再加上适当的余量来确定。

2 单片机通信程序设计单片机的数据通信由串行口完成,定时器T1 作为波特率发生器,其波特率要与PC 机一致。

数据的传送格式为1 位起始位、8 位数据位和1 位停止位。

采用中断方式发送和接收数据,定时器T1 设置为工作工作模式2,串行口设置为工作方式3,由第9位判断停止。

具体的程序流程图见下。

①单片机中断方式接收程序当PC 机不发送任何数据的时候,从机单片机始终处于等待状态(P.),直到PC 机发送数据过来。

由于PC 机在发送有效数据之前会加一个开始符(FFH),在有效数据之后会加一个开始符(7FH),所以单片机接收到主机发送来的FFH 之后,置RAM 存贮单元的初始地址30H 单元,用来放紧接着接收的数据,程序中还用了一个计数器COUNTER 来计接收到的数据位数,直到接收到7FH 为止。

单片机接收主程序MAIN 及中断服务程序STR 清单如下:COUNTER EQU 40HPOINT EQU 41HORG 0000HLJMP MAINORG 0023HLJMP SRTMAIN:MOV SP,#60HMOV TMOD,#20H ;定时器T1 的方式2MOV PCON,#00H ;串行口波特率控制位MOV TH1,#0F4H ;2400Kb/sMOV TL1,#0F4HMOV 30H,#15MOV COUNTER,#1MOV R0,#30H ;接收数据存放区MOV R1,#30HSETB TR1 ;开始计数CLR ET1 ;清定时中断MOV SCON,#50H ;串行口控制寄存器给值SETB EA ;开总中断SETB ES ;开串行口中断MOV IP,#10HMAIN1: ACALL DISPSJMP MAIN1SRT: PUSH ACCPUSH 01HJBC RI,GETSJMP EXITGET: MOV A,SBUFCJNE A,#0FFH,GET1 ;判断是否为开始字符,不是跳GET1 放数据存贮MOV R0,#30H ;是开始符就置存贮区首地址30H,计数器清0 并跳出中断MOV COUNTER,#0SJMP EXITGET1: CJNE A,#07FH,GET2 判断是否为结束符,不是跳GET2 放数据存贮区MOV R5,COUNTER ;是结束符,放发送缓存区开始字符INC R5MOV POINT,#30HMOV SBUF,#255SJMP EXITGET2: MOV @R0,AINC R0INC COUNTEREXIT: POP 01HPOP ACCRETI②单片机中断方式发送程序由于本次设计的系统要实现的功能是将PC 机送到单片机的数据回送到PC机,所以单片机要在接收完PC 机数据后立即将数据回送到PC 机。

也就是说要将RAM 存贮单元的初始地址30H 单元内数据逐一发送出去。

程序框图见下。

单片机发送主程序MAIN 及中断服务程序SEND清单如下:COUNTER EQU 40HPOINT EQU 41HORG 0000HLJMP MAINORG 0023HLJMP SRTMAIN:MOV SP,#60HMOV TMOD,#20H ;定时器T1 的方式2MOV PCON,#00H ;串行口波特率控制位MOV TH1,#0F4H ;2400Kb/sMOV TL1,#0F4HMOV 30H,#15MOV COUNTER,#1MOV R0,#30H ;接收数据存放区MOV R1,#30HSETB TR1 ;开始计数CLR ET1 ;清定时中断MOV SCON,#50H ;串行口控制寄存器给值SETB EA ;开总中断SETB ES ;开串行口中断MOV IP,#10HMAIN1: ACALL DISPSJMP MAIN1SRT: PUSH ACCPUSH 01HJBC RI,GET ;判断是否为接收,是跳GET 接收程序,否执行发送程序CLR TIDJNZ R5,SEND1SJMP EXITSEND1: MOV R1,POINTMOV A,@R1MOV SBUF,AINC R1MOV POINT,R1SJMP EXITEXIT: POP 01HPOP ACCRETI③单片机显示程序单片机显示部分可以用来检测接收到的数据是否正确,单片机显示程序主要将接AT89C51 从串行口收到的数据显示出来。

在程序设计中,在AT89C51RAM 存贮器中的四个显示缓冲器单元30H-34H,分别存放着由PC 机方发送过来的数据,AT89C51 的P2 口扫描输出总是只有一位为高电平,即4 位显示器中仅有一位公共阴极为低电平,其它位为高电平,AT89C51 的P0 口相应位(阴极为低)的显示数据的段数据,使该位显示出一个字符,其它们为暗,依次地改变P2 口输出为高的位,P0 口输出对应的段数据,4 位显示器就显示出由缓冲器中显示数据所确定的字符。

程序框图见下:单片机显示子程序清单如下:DISP: PUSH ACCMOV DPTR,#TABMOV R1,#30HMOV A,COUNTERJZ DISP2 ;没有接收到数据,跳出DISP 继续显示P.等待状态MOV R2,AMOV R6,#08HDISP1:MOV A,@R1CPL AANL A,#0FHMOVC A,@A+DPTRMOV P0,A ;送字形码到P0 口MOV A,R6MOV P2,A ;送位控制到P2 口RR AMOV R6,ADJNZ R7,$INC R1DJNZ R2,DISP1 ;判断接收位数DISP2:MOV R1,#30HPOP ACCRETTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHDB 77H,7CH,39H,5EH,79H,0F3HEND3 PC机通信程序PC 通信程序采用Visual Basic 语言编程,VB 提供了串行端口控制Mscomm来为应用程序提供串行通讯。

该控件屏蔽了通信过程中的底层操作,我们可以设置、监视Mscomm 控件的属性和事件,结合Timer 控件即可完成对串行口的初始化和数据的输入输出工作。

主程序按照通信协议的要求,首先确定波特率和信息帧格式,然后调用发送子程序将键盘输入的数据发送出去,为了使主机能够对整个检测过程进行控制,须要在发送命令以后设定等待的时间,也可以通过条件判断下一步是发送还是接收命令。

对发送的命令,可能是文本方式或二进制代码。

在发送二进制代码时,应特别注意发送的格式。

PC 机通信程序清单:Private Sub Command1_Click()Dim outstring As StringDim i As IntegerDim de As Integeroutstring = Text1.TextMSComm1.RThreshold = Len(Text1.Text) + 2MSComm1.Output = Chr(255)For i = 1 To Len(outstring)MSComm1.Output = Chr(Asc(Mid(outstring, i, 1)) - 48)Next iMSComm1.Output = Chr(127)End SubPrivate Sub Command2_Click()Text2.Text = ""End SubPrivate Sub Command3_Click()If MSComm1.PortOpen = False ThenMSComm1.PortOpen = TrueCommand3.Caption = "关闭端口"ElseMSComm1.PortOpen = FalseCommand3.Caption = "打开端口"End IfEnd SubPrivate Sub Form_Load()mPort = 1 '定义用端口COM1MSComm1.Settings = "2400,n,8,1" '波特率,无奇偶校验,8 位数据,1 位停止位MSComm1.PortOpen = True '打开端口Command3.Caption = "关闭端口"End SubPrivate Sub MSComm1_OnComm()Dim lenth As Integer, i As Integerlenth = Len(Text1.Text) + 2ReDim instring(1 To lenth) As IntegerSelect Case mEventCase comEvReceiveFor i = 1 To lenthinstring(i) = MSComm1.Input(0)Next iEnd SelectText2.Text = ""For i = 1 To lenthIf instring(i) <> 255 And instring(i) <> 127ThenText2.Text = Text2.Text & instring(i)End IfNext iEnd SubPrivate Sub Timer1_Timer()Text3.Text = DateText4.Text = Time()End SubPrivate Sub Timer2_Timer()Text1 = Text1 + 1If Text1 > 9999 Then Text1 = 1000Command1_Click7End Sub单片机通信程序清单:COUNTER EQU 40HPOINT EQU 41HORG 0000HLJMP MAINORG 0023HLJMP SRTMAIN:MOV SP,#60HMOV TMOD,#20H ;定时器T1的方式2MOV PCON,#00H ;串行口波特率控制位MOV TH1,#0F4H ;2400Kb/sMOV TL1,#0F4HMOV 30H,#15MOV COUNTER,#1MOV R0,#30H ;接收数据存放区MOV R1,#30HSETB TR1 ;开始计数CLR ET1 ;清定时中断MOV SCON,#50H ;串行口控制寄存器给值SETB EA ;开总中断SETB ES ;开串行口中断MOV IP,#10HMAIN1:ACALL DISPSJMP MAIN1;********中断服务子程序**********SRT: PUSH ACCPUSH 01HJBC RI,GET ;判断是否为接收,是跳GET 接收程序,否执行发送程序CLR TIDJNZ R5,SEND1SJMP EXITSEND1: MOV R1,POINTMOV A,@R1MOV SBUF,AINC R1MOV POINT,R1SJMP EXITGET: MOV A,SBUFCJNE A,#0FFH,GET1;判断是否为开始字符,不是跳GET1 放数据存贮区MOV R0,#30H ;是开始符就置存贮区首地址30H,计数器清0 并跳出中断MOV COUNTER,#0SJMP EXITGET1: CJNE A,#07FH,GET2 ;判断是否为结束符,不是跳GET2 放数据存贮区MOV R5,COUNTER ;是结束符,放发送缓存区开始字符INC R5MOV POINT,#30HMOV SBUF,#255SJMP EXITGET2: MOV @R0,AINC R0INC COUNTEREXIT: POP 01HPOP ACCRETI;*********显示程序**********DISP: PUSH ACCMOV DPTR,#TABMOV R1,#30HMOV A,COUNTERJZ DISP2 ;没有接收到数据,跳出DISP 继续显示P.等待状态MOV R2,AMOV R6,#08HDISP1:MOV A,@R1ANL A,#0FHMOVC A,@A+DPTRMOV P0,A ;送字形码到P0 口MOV A,R6MOV P2,A ;送位控制到P2 口RR AMOV R6,ADJNZ R7,$INC R1DJNZ R2,DISP1 ;判断接收位数DISP2:MOV R1,#30HPOP ACCRETTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHDB 77H,7CH,39H,5EH,79H,0F3HENDPC 机通信程序清单:Private Sub Command1_Click()Dim outstring As StringDim i As IntegerDim de As Integeroutstring = Text1.TextMSComm1.RThreshold = Len(Text1.Text) + 2MSComm1.Output = Chr(255)For i = 1 To Len(outstring)MSComm1.Output = Chr(Asc(Mid(outstring, i, 1)) - 48)Next iMSComm1.Output = Chr(127)End SubPrivate Sub Command2_Click()Text2.Text = ""End SubPrivate Sub Command3_Click()If MSComm1.PortOpen = False ThenMSComm1.PortOpen = TrueCommand3.Caption = "关闭端口"ElseMSComm1.PortOpen = FalseCommand3.Caption = "打开端口"End IfEnd SubPrivate Sub Form_Load()mPort = 1 '定义用端口COM1MSComm1.Settings = "2400,n,8,1" '波特率,无奇偶校验,8 位数据,1 位停止位MSComm1.PortOpen = True '打开端口Command3.Caption = "关闭端口"End SubPrivate Sub MSComm1_OnComm()Dim lenth As Integer, i As Integerlenth = Len(Text1.Text) + 2ReDim instring(1 To lenth) As IntegerSelect Case mEventCase comEvReceiveFor i = 1 To lenthinstring(i) = MSComm1.Input(0)Next iEnd SelectText2.Text = ""For i = 1 To lenthIf instring(i) <> 255 And instring(i) <> 127 ThenText2.Text = Text2.Text & instring(i)End IfNext iEnd SubPrivate Sub Timer1_Timer()Text3.Text = DateText4.Text = Time()End SubPrivate Sub Timer2_Timer()Text1 = Text1 + 1If Text1 > 9999 Then Text1 = 1000Command1_Click7End Sub。

相关文档
最新文档