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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
51单片机入门 程序理解问题
1 t6 n0 n5 z9 u; |
. {; ]& }4 N$ I! J
- h! p4 F* `  k: D
下面是51单片机的一个简单的电机程序,想问一下各位朋友,在中断函数void Interruped() interrupt 1里面为什么要将P1口的值暂存?看书上解释说,是为了使高四位不受到影响,但是如果我直接对P1操作也可以电机转起来的,即) [$ w1 u! b  l5 W9 R' {; i0 E2 Z
    if(beat != 0)7 _: z+ t  |5 z4 Q  c3 V* L
    {   
9 b9 c8 Z& H5 x3 r        P1 = P1 & 0xF0;
) B4 I1 o% Q* R; j2 y8 s0 R/ r% q: ]        P1 = P1 | Beat[index];& C% l/ Y& Y; O, z
        index ++;# U* _( Y: y) g
        index = index & 0x07;5 h+ a( A0 f) P8 p9 x$ _/ w7 Z
        beat--;
; Z# M$ S4 B4 P3 }    }
0 r0 s: C1 [0 Q6 Q' o+ A# ^请问有什么区别吗?新手入门不是很理解啊,求解答2 H6 d4 x( {% N& }% n; t- K

; Y% p: m4 X6 d! @1 n  G
4 R7 {/ t, \, o$ ?+ a#include<reg52.h>
/ C0 d8 R8 r+ U; v' w! J, runsigned long beat = 0;! E' Q- [" \6 F, z: i2 Y6 S( o
' K* w! R) K* D- g- `7 E0 I
void StartMotor(unsigned long angle);
8 f. n! W6 n+ }, j2 O8 h; svoid mian()% x( w. D5 a$ B- J6 F7 I. b
{
  `9 [7 E1 t" h  N- U1 E    EA = 1;, N" B: f5 e0 X9 f) E) o; e  v
    TMOD = 0x01;/ ~6 @: n4 N9 A' w+ l7 N. ~* ], E
    TH0 = 0xF8;
& j& n! _( `4 a* H    TL0 = 0xCD;
' X1 n7 T4 [# y    ET0 = 1;" q  r7 h. M  ?, A/ k4 q' v
    TR0 = 1;/ ]0 g& X0 a4 e, x  J
    9 R5 w4 z$ o# A: U5 ~. i4 @/ i
    StartMotor(360*2 + 180);- X5 L* ]* A  M2 i# ~% K
    while(1);
' }  N' Y/ `" n: ?  P6 L* S+ p}. i* A4 o0 X( A$ j

7 D: F2 e, b( i! i' a, b" }void StartMotor(unsigned long angle)0 W% E1 Q  i: Q
{
, {- N# K1 k' C/ ~4 v( a( U" |( d    EA = 0;
/ ^# H) _' ]" `5 g' c, b    beat = (angle*4076)/360;9 x$ _, t# A+ H
    EA = 1;
0 N, n' K, C: p+ W% N$ \}2 i$ E0 ~9 J# k$ U
void Interruped() interrupt 1
* c" x+ P% o8 i0 @+ U, R0 X0 q{
9 P& [, t# w& U5 X    unsigned char tmp;
- P# Q. u& _* b* @+ w) G: h9 w    static unsigned char index = 0;8 Y$ ]9 C  }' z. R) l3 L
    unsigned char code Beat[8]={
' @3 F- t$ A% a+ B/ s! h        0x0E ,0x0C ,0x0D, 0x09, 0x0B, 0x03, 0x07, 0x06% t7 j) ^& D; o1 d
    };" W! J" x' z$ |4 P1 @
    TH0 = 0xF8;
, r2 K! U# N9 H( j. v) K' i0 R    TL0 = 0xCD;0 `% u4 X) ^5 h
+ f2 Z& }1 h7 ~7 ]' k
    if(beat != 0)
0 |8 ^  L3 _0 O1 u( @; g5 }9 K6 H    {
$ B* R7 h. S  v9 b$ f        tmp = P1;                   //将P1口当前值暂存" D, j( S8 r! E- R* Y* d' B
        tmp = tmp & 0xF0;
8 X" L, H. Q! r# p0 \) _& N        tmp = tmp | Beat[index];
+ |; ?% _. F) q4 N3 B0 h. O& C        P1 = tmp;' F; H, D) t1 c, |: `* `4 ?
        index ++;0 `3 x% i, b/ N% L
        index = index & 0x07;4 L! F; q. l7 Q3 Z- e7 O9 o
        beat--;7 H+ t7 k: \3 M; D& U4 u4 q
    }
2 b; G/ ?% C+ l1 J8 ~; T' I: Z    else
4 T- s$ ?7 D  q  m    {    3 e6 c/ m/ {+ M
        P1 = P1 | 0x0F;
, [' g4 ?3 l/ S. Z2 h    }
/ m$ Y; o/ B/ o" L) M}

+ ^2 _) G% U& ~- q+ d, C

该用户从未签到

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/ ~3 Y/ F& y4 Z8 s
貌似也没有啥区别啊,,,范例中也是把p1的值赋给了一个临时变量,,然后又把临时变量的值赋给了p1
% l4 p2 x! y5 m, S3 T
对啊,我也觉得没什么区别,,,然而范例这么写应该有一定道理吧,要不然多此一举了# Q* ?3 z& B! _1 c3 d9 t

该用户从未签到

5#
 楼主| 发表于 2019-4-3 10:15 | 只看该作者
helendcany 发表于 2019-4-3 09:48& i3 y  [. ~; F9 F1 H( \7 Q
因为你的电路上 P1 口的高还有其它功能,采用这种逻辑操作是避免修改其它功能端口的状态。
) G9 ]  a3 @( b7 {
谢谢解答- u6 M  k! Z9 P6 r, M. q7 a

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-24 22:17 , Processed in 0.078125 second(s), 28 queries , Gzip On.

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

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

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