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

求助:51单片机入门 程序理解问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-4-3 09:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
51单片机入门 程序理解问题
# _- i% n: G) D" x6 I0 \7 d
" b4 Y' m5 k$ ^/ {' s1 p7 R
; m2 f$ {( ?2 ~& C! C" f4 ?( Z
下面是51单片机的一个简单的电机程序,想问一下各位朋友,在中断函数void Interruped() interrupt 1里面为什么要将P1口的值暂存?看书上解释说,是为了使高四位不受到影响,但是如果我直接对P1操作也可以电机转起来的,即! a  e# I+ Z2 x: o/ ^
    if(beat != 0)
/ }  U# H2 B" a    {   
2 }7 u) E" _7 I6 Z3 n        P1 = P1 & 0xF0;7 k& _( s3 O% `5 ]2 ?
        P1 = P1 | Beat[index];
' M9 Y, ?. Z) P- r. u2 M0 ^        index ++;' a8 t' F* u) V3 _- ^7 Z
        index = index & 0x07;
& J1 ^2 Y# g3 s6 n- K3 n        beat--;1 m. Z/ e5 U2 a( A/ ~
    }3 s$ X! D4 S. p5 n% D0 h: |' u
请问有什么区别吗?新手入门不是很理解啊,求解答  U2 {/ n, I1 p  L
+ M; E) B) T; n9 a' @! X' D& g0 E

5 b: B$ w0 d; O#include<reg52.h>3 f; V0 Y: Y6 R
unsigned long beat = 0;
% H; a  g( A# N( Z' p- ]1 P# `; G5 C) p+ ^& P. u6 J
void StartMotor(unsigned long angle);' n- G1 a2 Z1 N8 [3 S% h
void mian()# Z, T! W' C8 ~. e- m# x# g" c% S" }
{  G' g- K: Q3 J) x1 H1 V: e! s$ m
    EA = 1;1 f4 R. P( d  {5 k5 b9 c
    TMOD = 0x01;2 \( H' ]' M" n8 L
    TH0 = 0xF8;
8 a6 _" C$ v! X( w4 x+ J    TL0 = 0xCD;8 a8 a% @& g$ C! ^  T; s  H
    ET0 = 1;! A4 Q! K+ b7 y" e+ ?/ L& q, ]
    TR0 = 1;
% S! {0 s- T+ \      ]) t( `7 a' N$ P" _
    StartMotor(360*2 + 180);
# n4 C0 h0 J" H# w" }0 a8 I. q    while(1);# z- W# z4 D/ u0 v
}
0 |% m/ {; ^, j' z1 T& ?0 N' C: ~7 C# W- P
& e& {& ]; @7 X0 w) Y! k9 R! t4 L: rvoid StartMotor(unsigned long angle)# L* ^5 u6 m! b# J: _
{  w% t' L, _) i+ F3 u+ w7 b0 f- N( m
    EA = 0;
1 [' T8 b* W$ D5 `1 p0 q0 E    beat = (angle*4076)/360;
! @" l/ u  S, d& d    EA = 1; + {8 H- a: W$ m; B5 e% A- Z: C
}/ p/ t! G2 H% d0 E4 o- c
void Interruped() interrupt 1
  {, X+ `# j( C& R  O3 Q, P{# _7 U9 B, g: I% y3 k; H0 F7 k+ ]
    unsigned char tmp;4 U- e. e- j9 C
    static unsigned char index = 0;5 l9 \: A+ ^5 f! i! U7 M, G
    unsigned char code Beat[8]={: J* L- v# O8 e2 j5 a+ A
        0x0E ,0x0C ,0x0D, 0x09, 0x0B, 0x03, 0x07, 0x06- c+ l) P: s: m, T. f; j$ {: a% d
    };' @  ~0 ?- Q( s4 [% ?0 i
    TH0 = 0xF8;
$ e+ q- c/ C0 Q: ~7 [    TL0 = 0xCD;9 D4 j: w' L3 T( g

, r( w* N2 Q" P# e6 h    if(beat != 0)1 [0 t5 Q- |9 e5 F( y5 g
    {
' p6 b* x2 j" c1 ]0 _" Q' Q        tmp = P1;                   //将P1口当前值暂存$ ?- B* e9 f- B9 e, J- u- W: J
        tmp = tmp & 0xF0;3 ?6 E, \8 s5 \! X  E7 G
        tmp = tmp | Beat[index];
: Y( K! Z6 x6 U; \% b# L4 ^1 i        P1 = tmp;6 l9 O9 a+ X7 B* l& P2 z
        index ++;- T) ]. k$ a& J7 c
        index = index & 0x07;
9 _7 l& J$ @* \! V$ S/ C7 `6 ^9 S        beat--;
5 c4 H6 F; T/ P3 l  S6 x/ B# X- z    }9 {; Q+ ^1 Z1 L: ~6 C* W
    else/ l% A/ @- |0 H) B& o5 T
    {   
' b4 _4 j$ i, U9 e        P1 = P1 | 0x0F;
" v& a+ X/ j& P, }- x& A/ c    }
4 e* a$ T8 S% P. K/ q: i}

9 e1 q( I6 A/ O. Q2 N% F

该用户从未签到

2#
发表于 2019-4-3 09:48 | 只看该作者
因为你的电路上 P1 口的高还有其它功能,采用这种逻辑操作是避免修改其它功能端口的状态。

点评

谢谢解答  详情 回复 发表于 2019-4-3 10:15

该用户从未签到

3#
发表于 2019-4-3 09:59 | 只看该作者
貌似也没有啥区别啊,,,范例中也是把p1的值赋给了一个临时变量,,然后又把临时变量的值赋给了p1

点评

对啊,我也觉得没什么区别,,,然而范例这么写应该有一定道理吧,要不然多此一举了  详情 回复 发表于 2019-4-3 10:14

该用户从未签到

4#
 楼主| 发表于 2019-4-3 10:14 | 只看该作者
gaoxings 发表于 2019-4-3 09:59: G/ t1 `# m. c3 P6 g
貌似也没有啥区别啊,,,范例中也是把p1的值赋给了一个临时变量,,然后又把临时变量的值赋给了p1

2 A; o2 Z" k' s! D; O对啊,我也觉得没什么区别,,,然而范例这么写应该有一定道理吧,要不然多此一举了
. M- X# }  U$ t9 T( B

该用户从未签到

5#
 楼主| 发表于 2019-4-3 10:15 | 只看该作者
helendcany 发表于 2019-4-3 09:48
8 i9 _8 u! B1 u6 l6 z) @因为你的电路上 P1 口的高还有其它功能,采用这种逻辑操作是避免修改其它功能端口的状态。
( ^2 s+ o0 w7 K7 y9 W; A) x
谢谢解答
3 ]* Z" @! L! S3 k7 q0 G

该用户从未签到

6#
发表于 2019-4-3 10:22 | 只看该作者
     一般I/O口可以直接赋值或逻辑运算赋值,你的程序里P1高四位还有其它用途,所以用&逻辑运算后不易出错,且容易理解;而直接赋值则需要很了解程序的人才知道,要是小白自己修改则会出错了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-25 09:15 , Processed in 0.093750 second(s), 24 queries , Gzip On.

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

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

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