ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:77.29KB ,
资源ID:7172643      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7172643.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(项目管理c单片机的串行通信模块.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

项目管理c单片机的串行通信模块.docx

1、项目管理c单片机的串行通信模块工程5基于C51单片机的“串行通信”模块1任务任务一:应用通用异步收发器(UART)实现串行通信;任务二:应用通用I/O口“模拟串口”实现串行通信;2要求(1)能够在串口调试工具窗口中正确显示轮式教育机器人的状态信息;(2)能够实现轮式教育机器人与PC机的全双工串行通信;5.1 功能描述本案例模块的主要内容是:利用单片机的通用异步收发器(UART)或通用I/O口“模拟串口”实现点对点的双机通信,使轮式教育机器人能够与PC机(上位机)进行异步通信,在PC 机上显示轮式教育机器人的状态信息,通过该工程的学习与实践,可以让读者获得如下知识和技能:矚慫润厲钐瘗睞枥庑赖。掌

2、握单片机通用异步收发器(UART)的基本原理和应用方法; 掌握超点对点的异步通信协议和通用I/O口“模拟串口”编程应用技能;5.2 必备知识5.2.1 串口通信协议简介通信协议是对数据传送方式的规定,包括数据格式定义和数据位定义等,通信双方必须遵守统一的通信协议,串行通信协议包括同步协议和异步协议两种,本章只介绍异步串行通信协议和异步串行协议规定的数据传送格式。聞創沟燴鐺險爱氇谴净。1)起始位:通信线上没有数据被传送时处于逻辑1状态,当发送设备要发送一个字符数据时,首先发出一个逻辑0信号,这个逻辑低电平就是起始位。起始位通过通信线传向接收设备,接收设备检测到这个逻辑低电平后,就开始准备接收数据

3、位信号。起始位起的作用就设备同步,通信双方必须在传送数据位前协调同步。残骛楼諍锩瀨濟溆塹籟。2)数据位当接收设备收到起始位后,紧接着就会收到数据位。数据位的位数可以是5、6、7或8位,.IBM-PC中经常采用7位或者8位数据传送,80C51串行口采用8位或9位数据传送。这些数据位被接受到移位寄存器中,构成传送数据字符。在字符数据传送过程中,数据位从最低有效位开始发送,依次顺序在接受设备中被转换为并行数据。酽锕极額閉镇桧猪訣锥。3)奇偶校验位数据位发送完之后,可以发送奇偶校验位。奇偶校验用于有限差错检测,通过双方须约定一致的奇偶校验方式。如果选择偶校验,那么组成数据位和奇偶位的逻辑1的个数必须是

4、偶数;如果选择是奇校验,那么逻辑1的个数必须是奇数。彈贸摄尔霁毙攬砖卤庑。4)停止位在奇偶位或数据位(当无奇偶校验时)之后发送的是停止位。停止位是一个字符数据的结束标志,可以是1位、位或2位的高电平。接收设备收到停止位之后,通信线路上便恢复逻辑1状态,直至下一个字符数据的起始位到来。謀荞抟箧飆鐸怼类蒋薔。5) 波特率设置通信线上传输的所有为信号都保持一致的信号持续时间,每一位的信号持续时间都由数据传送速度确定,而传送速度是以每秒多少个二进制位来衡量的,这个速度叫波特率。如果数据以每秒9600个二进制在通信线上传送,那么传送速度为9600波特,通常记9600b/s,通信双方必须设置相同的波特率。

5、厦礴恳蹒骈時盡继價骚。图5-1异步串行通信数据格式5.2.2RS232电平与TTL电平转换在单片机与PC机通信时,接口电路必须要进行电平转换,因为PC机采用的是RS232标准,而单片机采用的是TTL标准,这是其一。第二是单片机与单片机之间的串行通信如果采用直接传输信息,其传输距离一般不超过1.5m,若要实现更远距离的通信,则接口电路也必须要进行电平转换。茕桢广鳓鯡选块网羈泪。RS232标准是1969年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的逻辑“1”电平是-5V-15V,逻辑“0”电平是+5V+15V。TTL(Tansist

6、or-Transistor Logic),是指三极管三极管逻辑电路。它规定:逻辑“0”:0.4V;逻辑“1”:+3 V+5 V 。鹅娅尽損鹌惨歷茏鴛賴。 因此,RS-232不能和TTL电平直接相连,使用时必须进行电平转换,否则将使TTL电路烧坏,为了让单片机与PC机能相互通信,必须让这两种电平相互转换。籟丛妈羥为贍偾蛏练淨。6.3 设计案例5.3.1 系统设计方案电平转换可以由分立的三极管电路来完成也可以是采用专用转换芯片来完成。本设计案例采用MAX232电平转换芯片构成电平转换电路,相对于分立元件构成的电平转换电路来说,它具有电路简单,稳定可靠等优点。PC机与单片机串行通信框图如图5-2所示

7、。預頌圣鉉儐歲龈讶骅籴。图5-2 PC机与单片机串行通信框图5.3.2 硬件电路设计C51单片机与PC机通信的接口电路设计如图x-3所示。其中Max232是专用的电平转换芯片,与PC机接口一般采用三线制连接串口,也就是说和PC机的9针串口只用其中的3根线:分别是第5脚的GND、第2脚的RXD、第3脚的TXD,Max232的第9脚和第10脚分别连接到单片机的RXD和TXD引脚。渗釤呛俨匀谔鱉调硯錦。图5-3RS232与TTL电平转换电路5.3.3 软件设计任务一、应用UART实现单片机与PC机通信本任务是编程单片机内部的通用异步收发器(UART),使其发送和接收数据,实现与PC机(上位机)的异步

8、通信。铙誅卧泻噦圣骋贶頂廡。1、 源程序/*=擁締凤袜备訊顎轮烂蔷。程序名:uart.c功能:串口初始化程序、轮式教育机器人向PC机(上位机)发送数据(注:系统晶振频率为11.0592MHz,波特率设为9600bps)=*/贓熱俣阃歲匱阊邺镓騷。#include #include #define OLEN 8 /串行发送缓冲区大小 unsigned char ostart。 /发送缓冲区起始索引 unsigned char oend。 /发送缓冲区结束索引 char idata outbufOLEN。 /发送缓冲区存储数组#define ILEN 8 /串行接收缓冲区大小 unsigned c

9、har istart。 /接收缓冲区起始索引 unsigned char iend。 /接收缓冲区结束索引 char idata inbufILEN。 /接收缓冲区存储数组 bit bdata sendfull。 /发送缓冲区满标志 bit bdata sendactive。 /发送有效标志void uart_Init()。void main(void) uart_Init()。printf(Hello world!n)。while(1)。/*串行中断服务程序*/static void com_isr(void) interrupt 4 using 1 /-接收数据-char c。if(RI)

10、 /接收中断置位 c=SBUF。 /读字符RI=0。 /清接收中断标志if(istart+ILEN!=iend)inbufiend+&(ILEN-1)=c。 /缓冲区接收数据 /-发送数据-if(TI) TI=0。 /清发送中断标志if(ostart!=oend) SBUF=outbufostart+&(OLEN-1)。 /向发送缓冲区传送字符sendfull=0。 /设置缓冲区满标志位elsesendactive=0。 /设置发送无效/PUTBUF:写字符到SBUF或发送缓冲区void putbuf(char c)if(!sendfull) /如果缓冲区不满就发送if(!sendactive

11、) sendactive=1。 /直接发送一个字符SBUF=c。 /写到SBUF启动缓冲区else ES=0。 /暂时串行口关闭中断outbufoend+&(OLEN-1)=c。 /向发送缓冲区传送字符if(oendostart)&(OLEN-1)=0)sendfull=1。 /设置缓冲区满标志ES=1。 /打开串行口中断/替换标准库函数putchar程序/printf函数使用putchar输出一个字符char putchar (char c) if (c=n) /增加新的行while(sendfull)。 /等待发送缓冲区空putbuf(0x0D)。 /对新行在LF前发送CRwhile(se

12、ndfull)。putbuf(c)。return(c)。/替换标准库函数_getkey程序/getchar和gets函数使用_getkeychar _getkey(void) char c。while(iend=istart) /判断接收缓冲区起始索引是否等于接收缓冲区结束索引。ES=0。c=inbufistart+&(ILEN-1)。ES=1。return(c)。/*初始化串行口和UART波特率函数*/void com_initialize(void) TMOD |=0x20。 /设置定时器1工作在方式2,自动重载模式SCON=0x50。 /设置串行口工作方式1,即SM0=0,SM1=1,R

13、EN=1TH1=0xfd。 /波特率9600TL1=0xfd。TR1=1。 /启动定时器 ES=1。 /开串行口中断void uart_Init() com_initialize()。EA=1。 /开总中断2、程序运行按图2-5所示的连接电平转换硬件电路,用串口线连接轮式机器人和PC机的串口,编译以上程序,将产生的可执行文件烧写到单片机程序存储器,开机运行,在PC机上打开串口调试工具,可以看到在串口调试窗口显示“ Hello world!”坛摶乡囂忏蒌鍥铃氈淚。3、程序设计思路串口初始化函数及主函数的程序流程图如下图所示,它描述uart.c的基本设计思路。图5-4串口初始化流程图图5-5主函数

14、流程图下面主要通过分析printf( )函数及scanf( )的执行过程,来加深对串口工作的理解: C51库函数中包含有字符的I/O函数,他们通过单片机串口来工作,这些I/O函数都依赖于两个函数:putchar( )函数和_getkey( )函数。蜡變黲癟報伥铉锚鈰赘。你可以在“C:Program FilesKeilC51LIB”目录下找到这两个函数的定义。其中getkey( )函数前面加了下划线“_”,表示该函数并不是标准的C库函数。uart.h头文件修改了这两个函数用来满足自己的需求。買鲷鴯譖昙膚遙闫撷凄。例printf(“Hello,worldn”)。 printf( )函数调用putc

15、har( )函数将第一个字符(字符H)发送到寄存器SBUF中;SBUF满,TI置位,进入中断处理函数发送该字符;之后,字符H通过串口线到达PC机串口,串口调试窗口进行接收处理,并将字符H在接收区内显示。綾镝鯛駕櫬鹕踪韦辚糴。 如此往复,直到printf( )函数发送最后一个字符n回车命令,将光标置位在下一行,发送工作才结束。整个发射流程如示意图7-4。驅踬髏彦浃绥譎饴憂锦。图5-6串口发射流程示意例scanf(%d,&PulseDuration)。 当你在串口调试窗口“发送区”内写入整数1700并点击“发送”按钮时,调试窗口会将字符6(整数1700在十六进制的表示下为6A4,转换过程由调试窗口

16、程序完成)通过串口线发送到单片机的串口。猫虿驢绘燈鮒诛髅貺庑。scanf( )函数通过调用getkey( )函数从单片机串口处接收字符6,接收缓冲寄存器SBUF满,RI置位,进入中断处理函数,取出字符6;如此循环,直到全部数据接收完。锹籁饗迳琐筆襖鸥娅薔。最后,scanf( )函数再将接收到的数据,即1700赋给变量PulseDuration。串口接收流程如示意图7-5。图5-7 串口接收流程示意任务二、用I/O口“模拟串口”实现串行通信在具体应用中,有时串行口的RXD和TXD被占用,此时也可以用通用I/O口来“模拟”串口来完成通信,在本任务中,用轮式机器人(上位机)的P3_6来模拟串口中的T

17、XD向下位机发送控制指令,下位机是直流电机控制模块,它能够根据上位机发来的控制指令控制直流电机的旋转方向和速度,关于直流电机控制模块控制原理此处不作介绍,我们这里只要知道根据上下位机的通信协议,如何编程实现控制命令的发送就可以了。已知上下位机的通信双方约定如下:構氽頑黉碩饨荠龈话骛。1)采用9600bps,8位数据位、1位停止位、无校验位;2)控制命令字采用5字节,如下表所示:头部(0XAA)电机设定:command速度:Speed时间:Time尾部(0XBB)如发送指令“0xAA,0x38,0xff,0x1f,0xBB”,可以控制左右两个直流电机全速反转。1、源程序/*=輒峄陽檉簖疖網儂號泶

18、。Imitate.c功能:上位机程序,能利用通用I/O口作为串行通信口向下位机发送控制指令=*/尧侧閆繭絳闕绚勵蜆贅。#include #define uchar unsigned char#define uint unsigned intsbit bit_TXD = P36。 sbit bit_RXD = P37。 bit flag。 sbit ACC0 = ACC0。 sbit ACC1 = ACC1。sbit ACC2 = ACC2。sbit ACC3 = ACC3。sbit ACC4 = ACC4。sbit ACC5 = ACC5。sbit ACC6 = ACC6。sbit ACC7

19、= ACC7。void delay_ns(uint i) /延时:i=12 ,i的最小延时单12 us i=i/10。 while(-i)。 void delay_nms(uint n) /延时n ms n=n+1。 while(-n) delay_ns(900)。 /延时 1ms,同时进行补偿 void Int_Timer0() interrupt 1 using 1 /定时器0中断函数识饒鎂錕缢灩筧嚌俨淒。 flag = 1。void send_one_byt(char com_bit) ACC = com_bit。 flag = 0。 bit_TXD = 0。 TL0 = TH0。 TR

20、0 = 1。 while(!flag)。 bit_TXD = ACC0。 flag = 0。 while(!flag)。 bit_TXD = ACC1。 flag = 0。 while(!flag)。 bit_TXD = ACC2。 flag = 0。 while(!flag)。 bit_TXD = ACC3。 flag = 0。 while(!flag)。 bit_TXD = ACC4。 flag = 0。 while(!flag)。 bit_TXD = ACC5。 flag = 0。 while(!flag)。 bit_TXD = ACC6。 flag = 0。 while(!flag)。

21、 bit_TXD = ACC7。 flag = 0。 while(!flag)。 bit_TXD = 1。 flag = 0。 while(!flag)。 TR0 = 0。 void main() uchar t。 uchar command = 0xAA,0x38,0xff,0x1f,0xBB 。TMOD |= 0x22。 TR0 = 0。 TF0 = 0。 TL0 = (255-96)。 TH0 = TL0。 ET0 = 1。 EA = 1。 for(t=0。t5。t+)send_one_byt(commandt)。while(1)。 2、程序运行连接轮式机器人控制板(上位机)单片机的P3

22、_6引脚和直流电机控制模块(下位机)的RXD端,编译以上程序,将产生的可执行文件烧写到上位机单片机程序存储器(下位机已经准备就绪),开机运行,可见连接直流电机控制模块的两个直流电机开始全速反转。凍鈹鋨劳臘锴痫婦胫籴。3、程序设计思路下面简要分析以上程序中用通用I/O口模拟串口的基本思路,主函数及发送子函数的程序流程图如下:图5-8 主函数流程图图5-9 发送子函数流程图因为设计定波特率为9600bps,即每秒传送9600位(bit)数据,则每传送1位数据所需的时间为1s/9600=104.167us,因此,要用P3_6引脚模拟TXD,关键要保证每隔104.167us往P3_6引脚传送1位数据,

23、程序中采用定时中断完成104.167us延时,定时器是对机器周期进行计数,而机器周期T=12/fosc=12/11.0592MHz,为延时104.167us,设定时器需计数X个机器周期,则有:T*X=104.167usX=104.167*11.0592/12=96,所以,定时器初值应设为255-96。恥諤銪灭萦欢煬鞏鹜錦。5.4 相关知识通过上述案例学习和实践,在对单片机通用异步收发器(UART)的编程应用有了直观认识之后,我们下面再来介绍有关单片机UART更详细的内容。鯊腎鑰诎褳鉀沩懼統庫。6.4.1 AT89C51单片机串行口结构AT89C51单片机UART内部结构框图如下图所示。图5-1

24、0 通用异步收发器内部框图5.4.2与串行通信有关的特殊功能寄存器1 数据缓冲器SBUF串行口缓冲器SBUF是可直接寻址的特殊功能寄存器, 其内部RAM字节地址是99H。在物理上, 它对应着两个独立的寄存器, 一个发送寄存器, 一个接收寄存器。硕癘鄴颃诌攆檸攜驤蔹。发送时:CPU执行一条写SBUF指令便启动了串行口发送,数据从TXD(P3.1)输出。在指令执行期间,CPU送来“写SBUF”信号,将并行数据送入SBUF,并启动发送控制器。从TXD端逐位输出一帧信息。一帧信息发送完毕后,发送控制器硬件置中断标志TI=1,向CPU申请中断,通知CPU可以发送下一个数据。阌擻輳嬪諫迁择楨秘騖。接收时:

25、就是读取SBUF的过程, 外界数据通过RXD(P3.0)输入,输入数据先进入移位寄存器,再送入接收SBUF。在接收器中采用了双缓冲结构,以避免在接收到第二帧数据之前,CPU来不及响应前一帧中断请求,而造成两帧数据重叠的错误。氬嚕躑竄贸恳彈瀘颔澩。2 串行口控制寄存器SCONSCON可以位寻址。复位时,SCON所有位均清“0”。SM0、SM1:由软件置位或清零,用于选择串行口四种工作方式。表5-1串行口的工作方式SM0SM1工作方式功能波特率00方式0同步移位寄存器fosc/1201方式110位通用异步收发器由定时器控制10方式211位通用异步收发器fosc/32或fosc/6411方式311位

26、通用异步收发器由定时器控制SM2:多机通信控制位。REN:允许串行接收控制位。若REN = 0,则禁止接收;REN = 1,则允许接收,该位由软件置位或复位。釷鹆資贏車贖孙滅獅赘。TB8:发送数据D8位。在方式2和方式3时,TB8为所要发送的第9位数据。在多机通信中,以TB8位的状态表示主机发送的是地址还是数据:TB8 = 0为数据,TB8 = 1为地址;也可用作数据的奇偶校验位。该位由软件置位或复位。怂阐譜鯪迳導嘯畫長凉。RB8:接收数据D8位。在方式2和方式3时,接收到的第9位数据,可作为奇偶校验位或地址帧或数据帧的标志。方式1时,若SM2 = 0,则RB8是接收到的停止位。在方式0时,不

27、使用RB8位。谚辞調担鈧谄动禪泻類。TI:发送中断标志位。在方式0时,当发送数据第8位结束后,或在其它方式发送停止位后,由内部硬件使TI置位,向CPU请求中断。CPU在响应中断后,必须用软件清零。TI可供查询。嘰觐詿缧铴嗫偽純铪锩。RI:接收中断标志位。在方式0时,当接收数据的第8位结束后,或在其它方式接收到停止位后,由内部硬件使RI置位,向CPU请求中断。同样,在CPU响应中断后,也必须用软件清零。RI也可供查询。熒绐譏钲鏌觶鷹緇機库。3 电源控制寄存器PCON与串行口有关的位是:SMOD为波特率倍增位。当SMOD1时,波特率加倍6.4.2 串行口的工作方式1、方式0 在方式0下,串行口作同

28、步移位寄存器用,以8位数据为一帧,先发送或接收最低位,波特率为fosc12,即每个机器周期发送或接收一位,。串行数据由RXD(P3.0)端输入或输出。同步移位脉冲由TXD(P3.1)端送出。这种方式常用于扩展I/O口。鶼渍螻偉阅劍鲰腎邏蘞。发送时,当一个数据写入发送缓冲器SBUF(99H),串行口即把8位数以 fosc12的波特率从RXD端送出,发送完置中断标志TI为“1”。纣忧蔣氳頑莶驅藥悯骛。接收时,REN是允许接收控制位。REN0,禁止接收;REN1,允许接收。当软件置REN为“1”时,即开始从RXD端以fosc12的波特率输入数据,当接收到8位数据时,置中断标志RI为“1”。颖刍莖蛺饽亿顿裊赔泷。CPU响应TI或RI中断请求时,不会清除TI或RI标志,必须由用户用软件清“0”。方式0时,SM2位必须为0。濫驂膽閉驟羥闈詔寢賻。2、方式1在方式1下,串行口为10位通用异步接口。发送或接收一帧数据,包括1位起始位“0”、8位数据位和1位停止位“1”,传送波特率可调。銚銻縵哜鳗鸿锓謎諏涼。发送时,数据从引脚TXD(P3.1)端输出,当数据写入发送缓冲器SBUF时,就启动发送器发送。发送完一帧数据后,把TI标志置“1”,并申请中断,通知CPU可以发送下一个数据。挤貼綬电麥结鈺贖哓类

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

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