|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
多自由度人形双足舞蹈机器人 ——疯壳·机器人开发系列 串口控制舵机 0 t: G* F( }" V! j
1 }0 E$ P& O8 G, ], |- @
% g8 R& m" @1 X$ V- Z6 q# y; o
0 I1 x' @& x" h% Q
5 E8 t( r, G7 P8 Z7 Z* Q8 k1 ]1 串口简介
. F j8 _1 q* x6 f. I) v1 t" K: r" V" N( K; L
本章将使用 IAP15W4K61S4 单片机的串口通信来控制舵机的转动。
* [+ q# S' e; n1 Y) `: h+ T8 w0 |9 i# Q% s
IAP15W4K61S4 单 片 机 有 4 个 采 用 UART ( Universal Asychronous Receiver/Transmitter)工作方式的全双工异步串行通行接口。每一个串口都有 2 个数据缓冲器、一个移位寄存器、一个串行控制寄存器和一个波特率发生器组成。而每一个串行口的数据缓冲器由 2 个相互独立的接收、发送缓冲器构成,可以同时发送和接收数据。发送缓冲器只能写入而不能读出,接收缓冲器只能读出而不能写入,因而两个缓冲器可以共用一个地址码。; \* s3 g x1 [4 C
IAP15W4K61S4 单片机的串口 1 有 4 种工作方式,其中两种方式的波特率是可变的,另两种是固定的。而串口 2、3、4 都只有两种工作方式,这两种工作方式的波特率都是可变的。1 I1 l k4 N d, i( E. D
用户可以用软件设置不同的波特率和选择不同的工作方式。主机可通过查询或中断方式对接收/发送进行程序处理,使用十分灵活。
8 u# @ } p3 j+ S) A; Z, d$ W. i IAP15W4K61S4 单片机的串口对应的硬件部分分别为:TXD 和 RXD、TXD2 和RXD2、TXD3 和 RXD3、TXD4 和 RXD4,可以在几组引脚之间进行切换。4 w6 y, C9 X) p, X
& E# j& x2 d6 z- B/ [5 Y1 p9 E0 B# H$ C
2 硬件设计
& x: ?5 `0 W- Q" ?( ?- z* ]# O" ], Y% q! p' L, X. i& \
由于绝大多数笔记本已经没有串口了,所以我们这里使用了 CH340 这个芯片,3 M2 X8 @* y- G3 J
成功实现 USB 通信协议和标准 UART 串行通信协议的转换。另外,DEBUG_RX 与DEBUG_TX 连接到 IAP15W4K51S4 单片机的 P3.0 和 P3.1。
0 A/ T2 {; @' _; y* K5 [% W% _- ?; Y/ {7 L. k2 H( { h
1 J+ p( I+ f" P3 _( {图 15 B1 J+ I) h$ n
8 n/ R7 r- f2 P0 k/ a
1 e N% m3 J! f3软件设计& H; F& y4 Z2 B2 U) g
' l) e- J7 T9 n' n6 w) `( z; q% S8 G
在使用串口之前,我们首先介绍几个与串口 1 相关的主要寄存器,其他串口的寄存器可以查看数据手册。
$ ^0 M9 l7 T& E8 H& _(1)串行控制寄存器 SCON; G. a7 T9 l# v$ X
# F t: t% [6 \- J. C串行控制寄存器 SCON 用于选择串行通信的工作方式和某些控制功能。, K$ B# R* X4 F# Z0 D! w2 Z* F
3 n7 ^% E/ G4 H1 ^
; G- V, R9 \+ {6 ]" X3 W$ C
图 29 m2 `, _* Q# Y9 r$ l
SM0/FE:当 PCON 寄存器中的 SMOD0/PCON.6 位为 1 时,该位用于帧错误检测。当检测到 一个无效停止位时,通过 UART 接收设置该位。它必须由软件清零。当 PCON 寄存器中 的 SMOD0/PCON.0 时,该位和 SM1 一起指定串行通信的工作方式,如下表所示:
- ]7 \ X( ?0 m/ ]0 z
4 N! i' Q8 c# N1 d$ x8 v1 U5 Q
# G8 W) h( o) c1 u* T2 u图 3" i1 n# l( K# E
SM2:允许方式 2 或方式 3 多级通信控制位。
0 K2 D. a6 i5 F- z8 `
( i: R" R2 {* r2 p {* o* S5 q. h REN:允许/禁止串口接收控制位。由软件置 REN 位 1 为允许串行接收状态, 可启动串口接收器 RXD,开始接收信息。软件复位 REN,即 REN=0,则禁止接收。8 M; b. I' R" |
TB8:在方式 2 或方式 3,它为要发送的第 9 位数据,按需要由软件置位或者清零。在方式0 和方式 1 中,该位不可用。& `* x5 ?/ k! `0 d1 X& W
0 C/ F" e1 f& p+ k5 |7 ^* [" B9 y
RB8:在方式 2 或方式 3,它为要接收到的第 9 位数据,作为奇偶效验位或者地址帧/数据帧 的标志位。方式 0 中不用 RB8(置 SM2=0)。方式 1 中也不用 RB8(置 SM2=0,RB8 是 接收到的停止位)。+ e2 p, l8 r. v9 G
TI:发送中断请求标志位。在方式 0,当串行发送数据第 8 位结束时,由内部硬件自动置位TI=1,向主机请求中断,响应中断 TI 必须用软件清零,即 TI=0。在其他方式中,则在停 止位开始发送时由硬件置位,即 TI=1,响应中断后 TI 必须用软件清零。
$ s9 T/ n! E4 {- O& r/ [$ S! P RI:接收中断请求标志位。在方式 0,当串行接收到第 8 位结束时,由内部硬件自动置位RI=1,向主机请求中断,响应中断 RI 必须用软件清零,即 RI=0。在其他方式中,串行 接收到停止位的中间时刻由硬件置位,即 RI=1,向 CPU 发中断申请,响应中断后 RI 必 须用软件清零。
) n' A9 L+ C' F u S) a2 h(2)数据缓冲寄存器 SBUF ^/ B) F& E/ c! W/ v. b$ z( |
8 }& p4 T3 r8 M1 R8 |
串口 1 的数据缓冲寄存器(SBUF)的地址是 99H,实际是 2 个缓冲器,写 SBUF 的操作完成待发送数据的加载,读SBUF 的操作可获得已收到的数据。两个操作分别对应两个不同的寄存器,写寄存器和读寄存器。
0 P0 |& @5 ], {3 S" W! P; e(3)串口 1 切换寄存器 AUXR1(P_SW1)# n; f: h5 T( h$ P7 u% _4 c" i
: y5 o2 O9 h g5 P3 @
& t# U9 ?# g% Y6 y
图 4
" M: b0 ]( J2 ~, d; p' R 要是用串口通信,首先就是就要对串口进行初始化。
% m4 `7 M0 C- ~# V+ x* ~" E$ N; i. {% C! Q8 j9 b; l
|. ?3 b9 K$ D! t' i代码1
' E& M* b" ~- X; j# D
5 q" o, Q1 s. {; [ 对串口初始化完成之后,我们就开始写串口中断函数uart_int(void) interrupt 4using 1,每当接收到数据,CPU 就会产生中断,从而进入串口中断函数。5 X- o& n' G: ~
在串口中断函数中,我们设置了一个数据缓冲区,将串口接收到的一个一个字节的数据存储在 receive_data 中。7 A4 ]6 p; }% u* \5 A# o
$ [5 G/ D5 w' ?3 G7 H6 c% {: d8 l% u, b6 D) E2 k
代码2& n, {6 H+ f" J2 [" s+ w% P
$ V7 P/ ^6 ~# Q4 {: c8 |" N
每次将 6 个字节的数据接存储到 receive_data 中,当第一个字节为 0x05,并且最后一个字节为 0x77 时,那么中间的第 2、3、4、5 字节分别表示P 值的千、百、十、个位。% u/ q! }/ P; e1 t3 E2 ~
/ ?5 n- d2 w) \. q9 ^$ r# _. y
2 A! T& D0 K; V! p+ @4实验现象" b ?) }7 W# K8 q) t3 `" X
" W6 Z4 h1 w7 `: I' b% z0 K2 H 首先打开下载软件 STC-ISP。$ m4 |: x0 E: J: {0 j, W3 }
G5 X8 D, |6 v
$ g, G- [3 e# o& k9 K图 5
/ x$ H! k% H! e3 k- Z6 {. E$ | (1)点击 Keil 仿真设置,添加 STC 相关的头文件。STC 的相关头文件路径是我们之前安装 Keil C51 的路径,如果之前采用的默认路径,那么选择 C 盘 Keil 文件夹。
6 h, _( D c5 `$ G
- c* \" ~9 L* }: k# E$ p. G3 {: c
: K# g# y9 x) }8 ?7 I F' M$ p3 j
图 6) D0 Y$ [6 m' a0 l5 o3 y K F/ U
(2)添加完 STC 相关的头文件,点击弹窗中的确定。
; {* F( q% `1 D2 a! y" h6 B7 l& C" }- e' `- @3 a% M0 ~
- Z% h- Y6 m7 P( X+ ^0 e% o# j6 C图 7/ c1 ]1 ]3 ?1 P' B0 n7 S8 I3 W
(3)设置单片机的型号、最低波特率、最高波特率如下图所示,硬件选项等选项默认即可。串口号根据实际情况选择。$ c. X, H% @9 l0 W
" D' U: Y* y- n( b o3 G, c0 Q$ o
4 X# o. K$ X" I" M5 w+ C* e/ C图 8
/ }( w& N$ D4 U% d. V( j (4)点击打开程序文件,选择我们例程中的.hex 文件。
% E* l5 z9 ~- I5 P% ^& N7 S) F1 w1 l6 u! g8 q5 }# c
! k0 J. d5 p/ b8 d
图 9
* O9 [. H! b, m& Z n (5)点击下载/编程,下载代码。
k0 \# q& r( q8 N: a+ I8 v
0 t, ~. X9 g$ M% V& g4 ^1 }
9 R5 y# [" O c5 k8 M图 10" v5 E1 V: y$ S$ w5 I
(6)按一下电路板上面的 RST 按键,完成下载。% L: R) b0 |, [# D8 c- S
) a; o# {4 f- v- ~( J; s$ v
( E: g t. t2 G/ ~. ^' U
图 11( X: |$ {+ L* ^- y2 B( ?" d
代码下载完成之后,打开机器人电源,运行代码,打开串口调试助手。
1 S3 } r* @$ Y# A) B H8 o2 {3 M5 P0 ], s1 k6 B# z v
(1)选择串口号,我们图中是 COM1,这个根据实际情况选择。& @) Q) j, n4 u' F
% b& c N% S7 ~# s' U
(2)配置串口参数,波特率为 9600,数据位 8,停止位 1,没有校验位和控制流,与下图一致。3 ~! }9 n4 B; D0 S
(3)点击打开串口。
& m9 V# t4 a5 U# Q
% z; n: p/ P4 d0 ]9 \% j) V: ^ C ?+ n$ k/ u. h0 Z4 p
' j& O1 `' {, ^& {9 e9 v+ j% B. `
图 12
8 |, v# l& s y8 P' e. q 打开串口之后,我们在字符串输入框中输入 05 01 02 02 02 77,然后点击发送,将机器人头部舵机的高电平时间改为 1222,同时会看到我们机器人的头转动到一个位置,继续发送其他值,机器人的头会转向其它位置。
6 c2 D" A2 y- O8 f7 @
9 C; m0 \ @1 [( ]: Z" e+ d/ _, O. t7 I1 z5 \$ m
$ x2 R$ ~7 p# n; c图 13
3 P/ ^$ D" l* l- K
" z: \9 e: P1 l, K q( _) _
3 P3 `" Y8 m6 }+ E由于图片文件上传数量有限,部分图片无法继续上传,有兴趣的伙伴请关注下一篇同系列帖子末端的原文件 
8 Y! g- Y/ F6 Z$ A1 f+ k. d) l8 F
- K+ X4 |/ X2 w |
|