找回密码
 注册
关于网站域名变更的通知
查看: 451|回复: 4
打印 上一主题 下一主题

PLC单片机和AVR单片机IO的操作方法解析

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-9-15 10:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 unix155 于 2021-9-15 11:16 编辑 4 n  k- Q# v0 n+ Q5 X4 n

% f2 v5 \7 Y3 _( A) d
3 c! g/ N, [7 m! G6 o/ z6 k对于pic单片机的学习,很多朋友总是能充满激情,不断利用闲余时间研究pic单片机的各类技术。而谈及pic单片机,必须牵扯至51、AVR单片机。因此本文中,将探讨pic单片机以及51、AVR单片机对于IO口的操作。对于本文,希望大家认真研读,以在pic单片机的学习之路上更为精进。
+ L( q6 }+ }/ @- I! `' k2 Z  q+ ]$ Q7 Y
- D- O3 }% q- t" t, y
PIC单片机以及51和AVR单片机的IO口操作方法解析
. V, M* W% E6 L% B" f5 w4 m$ m6 h8 T
, y5 Q( Q* L' @$ m, Y: h0 N" L0 B6 t) f/ \' W
一.51单片机IO口的操作
3 M4 O0 I1 }" q# U3 Y- y6 O3 r
51单片机IO口的结构比较简单,每个IO口只有一个IO口寄存器Px,而且这个寄存器可以位寻址,操作起来是所有单片机里最简单的,可以直接进行总线操作也可以直接进行位操作,这也是51单片机之所以成为经典的原因之一。下例的运行坏境为Keil软件,器件为AT89S52。
8 h' g: N  S( H9 D4 U. z
( ^8 V1 t4 N1 Z, D; I#i nclude
) s, o9 x" p+ R& V- Q7 u; w  h1 x, r( m9 m
sbit bv=P2^0;//定义位变量,关联P2.0管脚。sbit是C51编译器特有的数据类型
* s$ h8 d, N2 K1 p
; _+ |; ^) d* Z" p; m' }6 _' r4 Vint main(void); C9 V1 f  u3 H5 S$ S9 j, z' W

8 D7 x3 w, v4 J4 R{: ?2 f( @+ n' N% [( v: v$ T
  h& [9 _" Z, H# T  C
unsigned char pv;
% {" W% a8 M* ], }, z6 i
; m6 M) A. Q7 N" s, W7 R  M$ k//位操作,以P2口的第0位为例:2 [" T3 p3 I2 M2 x' H! w0 y: B5 Z6 S
1 D3 p2 m$ R% L" H! c* W. d
bv=0;//直接对P2口的第0位管脚输出低电平
) Y) g7 A, j6 J$ A2 j4 M" h3 m: G  Y6 Y2 |  j- D
bv=1;// 直接对P2口的第0位管脚输出高电平
' r9 W* [" ]5 R) |" t
, O$ I# ]7 O" k8 C9 Q: S& n//总线操作输出数据,以P2口为例:
! E/ p% j1 L4 d; W* ~$ b) W& }0 [7 h5 n! {, o& a0 K
P2=0xaa;//直接赋值,P2口输出数据0xaa
9 z6 [& |. w$ t! Q. t( A6 x
3 m( y; @( Q# M/ ]; E4 n- _2 Y//总线操作读取数据,以P2口为例:: g! {$ x  ^2 G$ ^9 s
( R1 m& \' G/ p( C
pv=P2;//直接读取P2口的数据放到pv变量
" A" V' n- ^$ H7 e$ x5 O! E% @* U* \: K0 ]0 A
return 0;
- x& A8 ~* o) m8 u5 r! X
/ L! ^' B4 C  W( ?0 m}; r( w2 `3 |- v% m. {7 r) ~. P

5 p5 h# H. K( ~- ?- y$ m" A4 e; hPIC单片机以及51和AVR单片机的IO口操作方法解析
# h7 b% k( q$ R' f) o
3 J. ~; F: k. t/ d
二.AVR单片机IO口的操作
8 a: S& k* c6 P: T6 v0 L% x" m  i+ I2 T$ D
AVR单片机IO口的结构比较复杂,每个IO由三个寄存器组成:IO口数据寄存器POTx、IO口方向寄存器DDRx和IO口输入引脚寄存器PINx。AVR单片机IO口操作相当麻烦,需要设置IO口的方向,而且只能进行总线操作,如果进行位操作还需要掌握编程技巧---通过逻辑运算来实现位操作。下例的运行坏境为ICCAVR软件,器件为ATMEGA16。+ A  v3 ~) v% K$ X" U) u

/ F* X, L# D& M$ K1 C0 g! I) [2 o# [; m#i nclude
/ }% B( r1 c4 h! a
! m# j( r8 h3 h* \int main(void)
. O# U! P8 E9 {3 t3 k# K% t( z! q" e* b6 L8 \9 h
{
/ ?+ Z; @* f' m- V' \# n, G# h8 J
unsigned char pv;/ Z* H4 Y+ {; a3 w* V: O

0 k& }7 l% m2 B/ x. k: r//总线操作输出数据,以D口为例:' O8 k" T+ f6 a% A
3 n6 Z& E- c& T$ C- c1 m. ^
DDRD=0xff;//先设置D口的方向为输出方式(相应位设0为输入,设1为输出)
6 U$ ~) C7 C- l% b. Q  k$ y, G: W3 f9 J5 x# l9 d2 @7 |
PORTD=0xaa;//赋值,D口输出数据0xaa7 }+ y5 x( C. t/ ~
5 _& X6 X( ]8 L% R' i- x' f) ^; Z
//总线操作读取数据,以D口为例:
; c2 l, J- n; m$ j7 |. q. P/ P9 G+ U( P* y! Z
DDRD=0x00//先设置D口的方向为输入方式(相应位设0为输入,设1为输出)$ M. ~8 n& _% a/ }3 Z
) X1 b/ V, p& J
PORTD=0xff;//再设置D口为带上拉电阻(相应位设0为无上拉,设1为有上拉),才能准确读取数据
* I2 ~; `5 a* H8 l* |+ n& {) |4 d# Z+ G9 H! B1 O- j% o' h
pv=PIND;//读取D口的PIND寄存器的数据放到pv变量" F+ g( E2 b$ I- l, d: j
* B3 H8 ]8 ]& q* W+ l% O( `
//位操作,以D口的第0位为例:
+ p/ G) |/ L6 ]1 e2 Y$ d0 O- E4 c
DDRD|=0x01;//先设置D口第0位的方向为输出方式,其他位的方向不变
( A/ O( ]: N7 j4 g; F* ~5 c
/ `: z' K$ |$ h: t) \) IPORTD|=0x01;//D口的第0位输出高电平,技巧:使用位或运算,其他位不变
5 D0 [) W. f: O: `! L% f6 }3 h- _! g
PORTD&=~0x01;//D口的第0位输出低电平,技巧:使用取反位与运算,其他位不变/ `0 s9 k9 O, [$ c

0 l! ]  g. I. R/ U7 |' ireturn 0;
8 f* _( U' w8 P3 B/ g6 f2 i0 G3 K" n. Y, {9 |4 ^
}
) W  v  m6 H6 Q2 L' P5 E# i$ ]8 K3 Y2 F) ?. C
三.PIC单片机IO口的操作
& e# H2 {+ q& ?" L; h4 ~* `5 R9 s6 J& c% `" C: D
PIC单片机IO口的结构也比较复杂,每个IO由两个寄存器组成:IO口数据寄存器PORTx、和IO口方向寄存器TRISx。操作起来比AVR单片机简单一些,同样需要设置IO的方向,可以进行总线操作也可以进行位操作。下例的运行坏境为MPLAB IDE软件,器件为PIC16F877。
+ l7 l; C( J! Z) e: j
: y: D) L9 Y$ f# V#i nclude! G: `, ?; M) I- c# f+ c* K
$ l& s" W. G( r: C) b: s* Q! O
__CONFIG(0x3B32);+ K; V; I+ f/ s. j
5 ^6 s+ A5 A5 A3 P! k5 M+ @
int main(void)
- L# M) q! x% q9 `
4 z7 x) T/ z0 z{+ L" A# ]3 p. f! ]

& o6 [+ n4 p  ?2 d- P( ~& punsigned char pv;
) ^0 M2 D8 m, C7 S- r: J1 V- D6 o: Y) o: ^' H7 v/ M3 [
//总线操作输出数据,以B口为例:, l% e. p: ^' E$ i( V

) a7 {& _( j( ?) o: \TRISB=0x00;//先设置B口的方向为输出方式(相应位设0为输出,设1为输入)
# @- Y9 D0 y- U4 \9 B. H: n- O; b( Q
( b* Z7 e8 y4 H2 [  QPORTB=0xaa;//赋值,B口输出数据0xaa6 ?+ }) w. E  _$ E4 O

! w0 x5 o7 K7 q4 {7 B6 E( G9 A//总线操作读取数据,以B口为例:$ _1 u7 t  z6 x6 N  G
+ f1 I# a0 y$ N# v" d* T
TRISB=0xff;//先设置B口的方向为输入方式(相应位设0为输出,设1为输入)
5 n0 g. J( r! U" V) r  _
' n% G8 s3 Q8 A$ npv=PORTB;//读取B口的数据放到pv变量. }: F& e* U4 F% ~9 o* I

3 d  K; [0 ]8 c3 f//位操作,以B口的第0位为例:
" F$ `/ a9 M5 y5 K# D# M9 u3 `/ l7 t
. S" j: O6 v3 a( u* OTRISB=0xfe;//先设置B口的第0位(RB0)的方向为输出方式(相应位设0为输出,设1为输入)6 O/ Q. o' u$ f9 t# a
& Y- K0 H' S/ V& M* W
RB0=1;//B口的第0位输出高电平
" _  L1 P, h- w& _5 f% ]- t- D- n+ t) C7 ^4 P1 I* q0 U
RB0=0;//B口的第0位输出低电平) I' S, K8 B, N& J6 f1 i% m

, Q6 Q9 W1 n+ v, `( P) ~$ d; g+ Nreturn 0;
0 R% W& V4 Z8 z4 G* P/ \$ h, q  C
}  X. }3 \  p" T: d4 u0 Y8 Q1 n; U
9 E& }' q4 n( x8 z! b; F
经过比较这三种单片机IO口的操作,我们知道,51单片机IO口结构简单,操作简单,但没有高电平大电流驱动能力;AVR和PIC单片机IO 口结构复杂,操作麻烦,但具备高电平大电流驱动能力。换句话说,单片机的IO口的功能越强大结构越复杂操作越繁琐。

1.jpg (41.33 KB, 下载次数: 1)

1.jpg

2.jpg (34.3 KB, 下载次数: 1)

2.jpg

该用户从未签到

2#
发表于 2021-9-15 11:18 | 只看该作者
51单片机IO口的结构比较简单,每个IO口只有一个IO口寄存器Px

该用户从未签到

3#
发表于 2021-9-15 13:07 | 只看该作者
AVR单片机IO口的结构比较复杂,每个IO由三个寄存器组成:IO口数据寄存器POTx、IO口方向寄存器DDRx和IO口输入引脚寄存器PINx

该用户从未签到

4#
发表于 2021-9-15 13:22 | 只看该作者
学习了   感谢分享

该用户从未签到

5#
发表于 2021-9-15 15:28 | 只看该作者
AVR单片机IO口操作相当麻烦,需要设置IO口的方向,而且只能进行总线操作
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-9 20:36 , Processed in 0.156250 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表