|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 unix155 于 2021-9-15 11:16 编辑
3 ?9 A* C% W) v3 `
6 h0 K. r$ Q8 |* R: [/ A s1 n# I A7 g& c5 R
对于pic单片机的学习,很多朋友总是能充满激情,不断利用闲余时间研究pic单片机的各类技术。而谈及pic单片机,必须牵扯至51、AVR单片机。因此本文中,将探讨pic单片机以及51、AVR单片机对于IO口的操作。对于本文,希望大家认真研读,以在pic单片机的学习之路上更为精进。0 p. [) N" s5 w9 X1 ]& [
: }1 L) O% H/ t0 x
PIC单片机以及51和AVR单片机的IO口操作方法解析) {- B8 N$ M* _$ G H
1 j% t- s( a/ S# D% Z
2 D9 z7 i' K& h9 {- r
一.51单片机IO口的操作2 _6 \: D$ O# x E1 C- R
8 w" d9 @' M' T/ n5 ?" j7 \" M
51单片机IO口的结构比较简单,每个IO口只有一个IO口寄存器Px,而且这个寄存器可以位寻址,操作起来是所有单片机里最简单的,可以直接进行总线操作也可以直接进行位操作,这也是51单片机之所以成为经典的原因之一。下例的运行坏境为Keil软件,器件为AT89S52。/ B8 U$ `0 w1 ?& u8 X) H7 b
8 I; X! {; l. ?' D0 X9 ?! M
#i nclude
1 _8 r! ]; X6 [3 n
, P6 _; n ^7 X4 U; x, m7 r. @sbit bv=P2^0;//定义位变量,关联P2.0管脚。sbit是C51编译器特有的数据类型
3 I8 Q; ^( b3 x9 [3 Q! _/ u& U, e* T1 X" c0 C c7 m @: A
int main(void)
4 {0 V. t+ \( r' M4 v" P' x
. S" g2 `, p& y) V0 o{ a0 I. O& Y- W2 W2 x
9 J4 g& F# f+ M% ]1 e, Y% p
unsigned char pv;1 g8 ]( {+ {) F+ c
. Q q9 F! o- c1 ^+ {1 U//位操作,以P2口的第0位为例:
, j, o& n$ p0 u8 }) ~2 D; I C, v/ w; v$ l
bv=0;//直接对P2口的第0位管脚输出低电平
/ k9 C# j" P# {4 t; }# f) n2 x
2 l* M2 J- U+ Z- lbv=1;// 直接对P2口的第0位管脚输出高电平1 ]' I* A4 q% b0 c( h) D9 W
- n; I. |# s% e& K: A* u7 J e
//总线操作输出数据,以P2口为例:
) j1 u& c2 z8 g: e: Y1 B
) W: r$ P7 A. a2 u i/ {8 |: C$ Q# QP2=0xaa;//直接赋值,P2口输出数据0xaa' v3 P7 q$ t7 P; Y& z( j3 z
; q" n Q" n1 ?! X
//总线操作读取数据,以P2口为例: \: C" |3 `6 G0 }; t G
4 i; p w9 W& jpv=P2;//直接读取P2口的数据放到pv变量/ o* y! h1 k5 Q
9 [0 g9 S+ \# J! z0 X
return 0;
# w, E& t8 b+ h r
) V, d1 L Z8 {0 I, J}9 s! a' r( o3 Q/ G; w+ }
2 o- N" E3 Q% d) w/ c. ZPIC单片机以及51和AVR单片机的IO口操作方法解析
$ j6 M( D7 \* P. m; B( h6 _4 ?( [+ x/ w
二.AVR单片机IO口的操作
6 `8 E) C" A/ B, T1 F" w1 ~0 D6 b' I; F8 o2 M- y; q$ s5 i
AVR单片机IO口的结构比较复杂,每个IO由三个寄存器组成:IO口数据寄存器POTx、IO口方向寄存器DDRx和IO口输入引脚寄存器PINx。AVR单片机IO口操作相当麻烦,需要设置IO口的方向,而且只能进行总线操作,如果进行位操作还需要掌握编程技巧---通过逻辑运算来实现位操作。下例的运行坏境为ICCAVR软件,器件为ATMEGA16。9 C: c1 g# i1 {) |7 k0 o i' c
, A7 }) M. ?' u( y- S: u#i nclude
( x. ~7 c. p$ B: |: Y' U
1 D6 Z& r; k1 y* Y3 Kint main(void)) _$ B* ^+ c% h, H! E: i
6 h* ]: n/ T( Q- d( q5 `{. V) S8 n5 V8 `. G9 [8 [1 l
. _7 {4 C$ W9 b5 u2 J8 S2 o* G
unsigned char pv;
$ _6 A- w' [8 z6 W, q0 Q( `7 [' y2 j
//总线操作输出数据,以D口为例:
2 p; V, f9 D2 j+ ^3 p" w2 W P0 J) q* ]5 Z
DDRD=0xff;//先设置D口的方向为输出方式(相应位设0为输入,设1为输出)( G* m/ ?& C$ W( }% i
5 _0 [4 v, R0 C# H3 l4 b/ t5 }
PORTD=0xaa;//赋值,D口输出数据0xaa
0 t* X. g, z/ S# I6 c' i5 w+ |0 ^6 E6 F! s8 E# x
//总线操作读取数据,以D口为例:7 Q4 V; x* |" y$ H
2 h" s; h! p P
DDRD=0x00//先设置D口的方向为输入方式(相应位设0为输入,设1为输出)8 H. r0 g+ j0 l* H8 _4 p8 v
0 V y7 _% q; ^8 x' `3 c6 kPORTD=0xff;//再设置D口为带上拉电阻(相应位设0为无上拉,设1为有上拉),才能准确读取数据' k, ]( @$ X" p: }8 m
( q' U. ~: b, l" cpv=PIND;//读取D口的PIND寄存器的数据放到pv变量
4 g8 E/ v6 }, V/ n1 P- \ }$ \/ t8 d8 c
//位操作,以D口的第0位为例:7 d* f T+ h$ b/ v7 B4 ^
0 ]# ~" d; @: v6 `6 o* p" n& IDDRD|=0x01;//先设置D口第0位的方向为输出方式,其他位的方向不变# g) p# V1 \: g+ A9 [
J! c5 x0 n. ]: a u7 P
PORTD|=0x01;//D口的第0位输出高电平,技巧:使用位或运算,其他位不变
( _5 _6 L; `& O" ~+ R5 X5 q+ W1 W0 F* m Y' F3 f8 Q4 U
PORTD&=~0x01;//D口的第0位输出低电平,技巧:使用取反位与运算,其他位不变
6 u! i$ x9 z2 m- F. M6 @9 t
$ r1 i" Y- B+ w `' s( r7 H3 \return 0;
5 S5 Y" F3 o6 W& k; b% X( m# W' @4 Y1 g9 D5 s8 _
}
1 \. ]% m. ^. g# y$ B1 o0 _- n/ ]" K4 V5 A: O
三.PIC单片机IO口的操作
F& \2 |6 Z" ?$ U9 g- V0 @- M! A* x0 q( W8 s
PIC单片机IO口的结构也比较复杂,每个IO由两个寄存器组成:IO口数据寄存器PORTx、和IO口方向寄存器TRISx。操作起来比AVR单片机简单一些,同样需要设置IO的方向,可以进行总线操作也可以进行位操作。下例的运行坏境为MPLAB IDE软件,器件为PIC16F877。8 R' D. ]- K9 T/ ^( m) N
' K! C, n& {* r7 ]; v#i nclude7 e4 }% f; n' y9 h+ s7 f4 ^- O. R
: R4 ?( y: b$ R8 w. ]3 A- z__CONFIG(0x3B32);
0 Q; U& e6 s. D, ~) v2 w, O
5 W; J3 }5 e( D: K8 f% A3 nint main(void)2 O, o; l9 Q \% A: l- ?
3 W1 p- g2 U h
{
$ l! `$ N V: Y) d5 b/ C
- a2 u- ?3 R7 Y/ `# L" S3 M% aunsigned char pv;2 p; ^. b% o1 M2 f4 a" y7 Q( n2 n+ \0 U! c
, e7 x& T \* O) }. y' W
//总线操作输出数据,以B口为例:
+ x+ S! J% R! G7 {- W2 p& E" w% I
1 [9 B$ W3 x2 _9 u; [; ~( u# rTRISB=0x00;//先设置B口的方向为输出方式(相应位设0为输出,设1为输入)
: T# ]; n' e7 y. ~( s# C- N! w
' q7 A {7 F# P9 O. Y/ aPORTB=0xaa;//赋值,B口输出数据0xaa
3 |2 P* Q* {( c8 g5 G. n j1 }% A( E9 A- I: j. W
//总线操作读取数据,以B口为例:
9 `! J C" z0 c' X" I: g, B* x$ U/ n* P# u
TRISB=0xff;//先设置B口的方向为输入方式(相应位设0为输出,设1为输入)8 F3 h. M, ^, a/ M. y; e( z
; E# s7 a% d8 T9 \' q
pv=PORTB;//读取B口的数据放到pv变量
# r, R9 o" P7 Q5 a" b4 c
1 r# @; n3 ]" P5 f, \* f//位操作,以B口的第0位为例:
9 S# Q" R u" w3 s
( q* F& P6 y) @+ M- dTRISB=0xfe;//先设置B口的第0位(RB0)的方向为输出方式(相应位设0为输出,设1为输入)
C2 w1 ^8 I1 V7 P! z; m) y( \/ {- m0 U
RB0=1;//B口的第0位输出高电平 Z! B* O( ?; f3 K( k1 d6 o5 r
5 r8 b( J, Y- T8 d! [/ G2 m& c# z
RB0=0;//B口的第0位输出低电平
9 J4 N5 H+ }2 Y/ ~; a0 y
, H3 m# K$ |7 g7 X* `$ Qreturn 0;8 I5 X5 c! U9 b# D, c7 D$ e
: U: f x* @, Y% ^4 U/ N}
8 I8 f0 ]% V- _6 D7 ?. O4 `4 M. [5 a, o6 {9 U8 P0 E
经过比较这三种单片机IO口的操作,我们知道,51单片机IO口结构简单,操作简单,但没有高电平大电流驱动能力;AVR和PIC单片机IO 口结构复杂,操作麻烦,但具备高电平大电流驱动能力。换句话说,单片机的IO口的功能越强大结构越复杂操作越繁琐。 |
-
1.jpg
(41.33 KB, 下载次数: 1)
-
2.jpg
(34.3 KB, 下载次数: 1)
|