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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
51单片机入门 程序理解问题
- w% |& }2 g. O. Z& P7 |5 q: j& L; s, Z9 B) V
, V" j0 s6 `4 J6 y: u9 w; G
下面是51单片机的一个简单的电机程序,想问一下各位朋友,在中断函数void Interruped() interrupt 1里面为什么要将P1口的值暂存?看书上解释说,是为了使高四位不受到影响,但是如果我直接对P1操作也可以电机转起来的,即
; q8 V. U0 n6 E( c5 `    if(beat != 0)
- Q" m; \. ?% U- J8 C& j7 w    {    : }5 H  ]! T$ h& a  z
        P1 = P1 & 0xF0;
9 F  ^- P; q: s- f9 M8 M+ ]$ o/ `        P1 = P1 | Beat[index];
2 x" q  S# `+ b* a9 _; ?* I# v/ |' O        index ++;
7 Y! ?; o' H$ s3 @; |" I! ]: [% r) c        index = index & 0x07;
9 x$ s8 s- g1 ^, I% e0 o. Y7 U        beat--;5 X6 y; n) U6 O& U+ I; K
    }% r$ V# E* o8 Y# X
请问有什么区别吗?新手入门不是很理解啊,求解答
8 t& T! C- [- }8 ^& Z' V+ J* g" ~5 s$ L5 O! p
; s: `7 `3 |* q! Y
#include<reg52.h>
9 \  w. \: o+ J# Eunsigned long beat = 0;8 b* j3 I; m* p
& k7 ^& J. W! k$ c
void StartMotor(unsigned long angle);
) L. r( Z, V% T' Y  M( `6 \void mian()
0 z1 ~. G" O+ X2 y{
+ X  E- e$ d4 W/ R2 n$ P! q    EA = 1;# R8 q% e. i  ]2 X5 L# {
    TMOD = 0x01;
, v/ n0 v% P$ {4 r    TH0 = 0xF8;
) v3 U' {  t" ?$ l. m9 y8 Q    TL0 = 0xCD;& R3 T7 @7 B* r$ q- ?0 X- E
    ET0 = 1;! p5 X' D/ D4 Q" o9 z# v; G# E
    TR0 = 1;! r6 l. g6 }, j9 o8 o. z4 c
   
2 d/ F  W* y& L1 B/ B! m3 T    StartMotor(360*2 + 180);
0 `" I/ H' l6 B: K4 J3 j    while(1);
5 ~* q. b" o" ?% v$ m}
' ^5 l+ l3 P0 m* b  F5 z7 C' ^, c$ n6 z. O5 |/ ~
void StartMotor(unsigned long angle)
- n" l7 Y9 e( o/ a6 e. ?* L{
- M7 @3 E3 h2 D# w$ r% k" G7 h    EA = 0;; Q8 A% f4 A9 D! M0 F6 z" y
    beat = (angle*4076)/360;
0 q! D+ }  |% C' W: f    EA = 1;
, I' O' u$ k: B; v. C}2 b+ }. m' T7 u
void Interruped() interrupt 1
) r0 S3 t; h* n{
- z  O0 Q$ c/ ]- I% I3 m% ^    unsigned char tmp;2 m& |9 J5 p2 x7 I) `* K
    static unsigned char index = 0;
* Q" b, H8 `. Z; z+ @; O    unsigned char code Beat[8]={+ J" `4 G8 ?, _- C) I+ a( Q" f
        0x0E ,0x0C ,0x0D, 0x09, 0x0B, 0x03, 0x07, 0x067 K1 F$ N0 p# H, n' O* ^
    };
) t0 @. k8 q) a+ O! L8 \    TH0 = 0xF8;
3 E" E& y* i9 Z7 A5 m1 ]    TL0 = 0xCD;
' Q7 W3 j1 l9 u% L, b- V1 z) |) T1 m  S# k  }6 D( ^
    if(beat != 0)! z  i' U! C% O2 ^
    {
' D1 L! k+ f/ f7 w        tmp = P1;                   //将P1口当前值暂存# `3 ]  R/ e, C$ ?
        tmp = tmp & 0xF0;
3 q# v+ V# B+ J- X7 J        tmp = tmp | Beat[index];  p: o3 c" r" k4 r. n6 d: u* {: ]
        P1 = tmp;
6 Z# |1 G" [2 w( X        index ++;# X" n; \1 }- r8 S
        index = index & 0x07;
8 V, g8 M3 S* A- n1 O2 s        beat--;
2 s% [8 w9 j# o& R' [    }
  R, m* l& f$ I6 o) D% r( y4 b( m    else
% ]2 C7 @0 |+ w' g7 c    {    & H; m# S. X: e4 X. O
        P1 = P1 | 0x0F;
; V1 {7 y4 s0 f% T5 s' Y0 x: j    }! s: C/ Q, l% q6 b
}
  A7 U. o6 k: q0 M: v

该用户从未签到

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:597 ?/ P. m: r$ o" f4 P3 z
貌似也没有啥区别啊,,,范例中也是把p1的值赋给了一个临时变量,,然后又把临时变量的值赋给了p1
+ q* P1 U( I, X$ p! }, }" D0 h
对啊,我也觉得没什么区别,,,然而范例这么写应该有一定道理吧,要不然多此一举了
/ b; y' ]" j/ [8 {5 @: P

该用户从未签到

5#
 楼主| 发表于 2019-4-3 10:15 | 只看该作者
helendcany 发表于 2019-4-3 09:48/ d/ f$ a( ~3 q) e3 ^
因为你的电路上 P1 口的高还有其它功能,采用这种逻辑操作是避免修改其它功能端口的状态。

1 i1 g3 q. _) K* D( x% a谢谢解答+ J$ N$ f' x& H5 S

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-24 01:26 , Processed in 0.125000 second(s), 28 queries , Gzip On.

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

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

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