|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 unix155 于 2021-9-15 11:16 编辑
1 K+ t1 N# j# g9 {/ `; ]+ \5 D5 K* {& I
+ F6 ], Z- U4 |+ X% m对于pic单片机的学习,很多朋友总是能充满激情,不断利用闲余时间研究pic单片机的各类技术。而谈及pic单片机,必须牵扯至51、AVR单片机。因此本文中,将探讨pic单片机以及51、AVR单片机对于IO口的操作。对于本文,希望大家认真研读,以在pic单片机的学习之路上更为精进。, o4 c1 y; w0 T$ @' g! S; @# \0 r
1 [+ D0 k8 L h. v
PIC单片机以及51和AVR单片机的IO口操作方法解析
" f8 L7 p+ |2 A, F( b: A6 _; l9 \4 g8 E3 n
- p5 ~7 M% M1 ] S* g0 P1 u' |& s一.51单片机IO口的操作
8 Y1 L6 W$ ~, \; b, W6 t/ m6 g! ~( U0 ~, o% V$ |2 Q& O
51单片机IO口的结构比较简单,每个IO口只有一个IO口寄存器Px,而且这个寄存器可以位寻址,操作起来是所有单片机里最简单的,可以直接进行总线操作也可以直接进行位操作,这也是51单片机之所以成为经典的原因之一。下例的运行坏境为Keil软件,器件为AT89S52。9 F1 b; L1 J: ]. J$ g ^1 N. W
' `# {( j4 V- U1 B
#i nclude
/ N& s3 p' x" U+ @6 U/ W6 J! M- {- a* M* p9 R: n' x9 k: M& X1 V
sbit bv=P2^0;//定义位变量,关联P2.0管脚。sbit是C51编译器特有的数据类型6 M! K, w4 c$ q
1 v+ |4 T( q9 f4 q' W2 i7 [int main(void)0 i* Y H# [; N. U+ I/ I
/ I+ _2 o; _8 w; Q{
4 A3 u4 z& K! {0 ?2 e, e, X
. X% l$ K8 K6 S; m) {7 qunsigned char pv;
4 c) d$ P9 X9 G9 T# l+ I6 [$ r! \1 g$ p' O0 U3 K' I% Q
//位操作,以P2口的第0位为例:6 ~+ @" { N& ^. m3 o
7 T' B1 L' g1 b9 v5 w0 `: ebv=0;//直接对P2口的第0位管脚输出低电平
7 r+ r7 H" J. W6 i4 S5 `7 S/ Y x+ t
bv=1;// 直接对P2口的第0位管脚输出高电平2 X* {0 w6 X# F; r/ b, z
6 N9 M% Z4 @ C% a3 R3 K//总线操作输出数据,以P2口为例:& ~$ c& ?3 o6 {
/ M2 q' T1 G/ \3 a( [( f" F& ^
P2=0xaa;//直接赋值,P2口输出数据0xaa
- `" e+ L( M9 B# y1 r( P/ i ~3 D
- E: R2 G# E5 {: s. B# o' I8 \7 T M//总线操作读取数据,以P2口为例:0 x* e9 ~, [+ H S4 z
0 l2 t! g, O( l! l+ Q1 Mpv=P2;//直接读取P2口的数据放到pv变量. L0 z2 e. `; ]# r/ z( T; Q
2 v( s5 G3 q) u3 B6 dreturn 0;2 \7 q: ~: g3 F. W, {
% |" ^4 n3 H0 J: Z2 ~}; L1 W: d: [6 ~7 ^
4 r/ S2 T8 J: n. i* o- R7 b
PIC单片机以及51和AVR单片机的IO口操作方法解析( @; u1 ? e. ^( u/ n ?4 w, E
+ x% w6 B. x \7 V3 r# @
二.AVR单片机IO口的操作
+ l" b% m. ^6 r# V- o
& M- o% X* J' z7 _- F" |AVR单片机IO口的结构比较复杂,每个IO由三个寄存器组成:IO口数据寄存器POTx、IO口方向寄存器DDRx和IO口输入引脚寄存器PINx。AVR单片机IO口操作相当麻烦,需要设置IO口的方向,而且只能进行总线操作,如果进行位操作还需要掌握编程技巧---通过逻辑运算来实现位操作。下例的运行坏境为ICCAVR软件,器件为ATMEGA16。$ ~, e9 i- ?2 o/ P4 K/ O
% p1 z% s: t5 Y$ t! |
#i nclude" L, M' ~ B- \+ ~- `9 T
$ d, Z4 n1 D, ^5 Z0 a
int main(void)8 v7 m2 E9 J5 `2 q3 p- C
7 i3 x- v1 V+ q/ J p5 P
{: _$ g+ [) K, K1 ~
2 @- r: q) _# P Q' h( o# A1 Bunsigned char pv;
7 D' r6 v* e1 B1 ~% p+ U' H. C! u/ t; `$ m8 j9 l) @
//总线操作输出数据,以D口为例:& v+ R7 r X0 H6 x
1 H3 y- |) F3 m& {DDRD=0xff;//先设置D口的方向为输出方式(相应位设0为输入,设1为输出)
. L: h v' p% c" i/ d! d( j7 V, p7 }' v- P- `; S! O) @4 o$ k. ~
PORTD=0xaa;//赋值,D口输出数据0xaa
* }. \1 }4 r7 b: ^4 r5 _3 q' R* F7 \) u( b/ z7 r" x1 }( s! N
//总线操作读取数据,以D口为例:
4 J! k) D( [3 l/ |; {1 r5 i' ^- J5 `% _0 U. z3 v) u
DDRD=0x00//先设置D口的方向为输入方式(相应位设0为输入,设1为输出)
- Y0 J2 z' ]% b; ^0 X( a( x9 ^* p W9 z5 ]" h0 q
PORTD=0xff;//再设置D口为带上拉电阻(相应位设0为无上拉,设1为有上拉),才能准确读取数据
4 |& ]- i4 @3 D
8 Y2 a9 }/ M0 mpv=PIND;//读取D口的PIND寄存器的数据放到pv变量
1 `) P2 r" s$ u) l, ^" M: T/ z- A2 l% L0 e v0 f+ m
//位操作,以D口的第0位为例:
6 y! s% O' q) S0 h, S$ s+ ?( {% K) ?* \( D
DDRD|=0x01;//先设置D口第0位的方向为输出方式,其他位的方向不变
7 l& z8 x) k; y! u$ K3 H. R! l7 \
3 t4 \ g- J$ G. }PORTD|=0x01;//D口的第0位输出高电平,技巧:使用位或运算,其他位不变/ i& _3 H3 E9 \4 Z- U3 n6 n4 B/ F* L, r& {
6 G+ K! W# |# @ Z: i1 w( K4 Y; Y
PORTD&=~0x01;//D口的第0位输出低电平,技巧:使用取反位与运算,其他位不变# _% q6 N, T( ?; ~# T7 f
3 H( \/ a7 d; W, r1 l3 M% Mreturn 0;
8 O# o" g7 d' y2 ?
7 _* X' z% \& w% F( V* A. T" Z1 |( Q}
! ^7 [6 H% @" z9 V7 S/ U' u0 L% q( E Q# M/ U8 ~
三.PIC单片机IO口的操作
: l2 i! G7 M0 I/ y, k7 c
* F# b i8 G7 b$ jPIC单片机IO口的结构也比较复杂,每个IO由两个寄存器组成:IO口数据寄存器PORTx、和IO口方向寄存器TRISx。操作起来比AVR单片机简单一些,同样需要设置IO的方向,可以进行总线操作也可以进行位操作。下例的运行坏境为MPLAB IDE软件,器件为PIC16F877。5 @' d' {# L3 N3 u! Q( r2 v
; ?: H; y& k7 Q! Q
#i nclude, @- X5 D, Q+ T
0 [ Y2 ]. ~* R+ R2 H
__CONFIG(0x3B32);4 ^' T. h7 r) ~5 b+ y
* ^$ b. I$ X: G) {int main(void)
! p9 q9 Q/ q! b% O! R% @/ n/ G5 p/ q/ o; L0 s
{
5 q: S8 r+ n: p3 r5 [( D2 F: Y# S" Y$ y6 `4 j4 z* _3 i+ T
unsigned char pv;
# J$ G; {3 W0 }& ]* Z! u: _5 S w9 E- l6 H8 K" b. K" @' R6 Q
//总线操作输出数据,以B口为例:
, Q3 V8 w! ^3 E; {" b$ x
0 g. y. N3 T. w! ITRISB=0x00;//先设置B口的方向为输出方式(相应位设0为输出,设1为输入)
1 h% c j( u/ s
( n1 ^2 X9 Z* t2 T. D( L! vPORTB=0xaa;//赋值,B口输出数据0xaa
4 r; ]6 _" `! g" X* k; a- @- S2 o! O! M% `9 H/ ]/ G$ o
//总线操作读取数据,以B口为例:, ^5 W# g1 _0 m+ `5 x
& A$ h* |6 E( m* [4 Q6 p
TRISB=0xff;//先设置B口的方向为输入方式(相应位设0为输出,设1为输入)
& D! Q9 V' J$ d S, o# r& x
8 a+ p {7 L2 g: ypv=PORTB;//读取B口的数据放到pv变量
4 v. C! w8 w2 t0 o0 V8 d( j7 m' @8 z
. Y# i6 @ R6 s0 i- T9 j" |; Z//位操作,以B口的第0位为例:
/ C6 z: T4 N, O9 _# ^7 w/ D6 d6 B* I) @0 F& Y w
TRISB=0xfe;//先设置B口的第0位(RB0)的方向为输出方式(相应位设0为输出,设1为输入)
) V: r5 x; h* Q" [2 R$ S" b9 P% A" M$ c2 u- \8 P7 ?, ?$ {
RB0=1;//B口的第0位输出高电平
, c) A1 p8 y3 _
7 r; ~- m' m* D1 vRB0=0;//B口的第0位输出低电平
7 b: r4 ^+ l) |6 R
" J9 }9 l0 u5 s# F4 L+ D7 {% K6 yreturn 0;" `' S/ t9 `' O6 w1 d1 K
8 d/ z' F* A6 o3 o9 b. c}) u9 K4 H$ w% m" R) S/ X9 F
. a% F' ?, Q" r2 r9 z% i" a; U经过比较这三种单片机IO口的操作,我们知道,51单片机IO口结构简单,操作简单,但没有高电平大电流驱动能力;AVR和PIC单片机IO 口结构复杂,操作麻烦,但具备高电平大电流驱动能力。换句话说,单片机的IO口的功能越强大结构越复杂操作越繁琐。 |
-
1.jpg
(41.33 KB, 下载次数: 1)
-
2.jpg
(34.3 KB, 下载次数: 1)
|