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

2019-07-15 10:05发布

下面是51单片机的一个简单的电机程序,想问一下各位朋友,在中断函数void Interruped() interrupt 1里面为什么要将P1口的值暂存?看书上解释说,是为了使高四位不受到影响,但是如果我直接对P1操作也可以电机转起来的,即
    if(beat != 0)
    {   
        P1 = P1 & 0xF0;
        P1 = P1 | Beat[index];
        index ++;
        index = index & 0x07;
        beat--;
    }
请问有什么区别吗?新手入门不是很理解啊,求解答


#include<reg52.h>
unsigned long beat = 0;

void StartMotor(unsigned long angle);
void mian()
{
    EA = 1;
    TMOD = 0x01;
    TH0 = 0xF8;
    TL0 = 0xCD;
    ET0 = 1;
    TR0 = 1;
   
    StartMotor(360*2 + 180);
    while(1);
}

void StartMotor(unsigned long angle)
{
    EA = 0;
    beat = (angle*4076)/360;
    EA = 1;
}
void Interruped() interrupt 1
{
    unsigned char tmp;
    static unsigned char index = 0;
    unsigned char code Beat[8]={
        0x0E ,0x0C ,0x0D, 0x09, 0x0B, 0x03, 0x07, 0x06
    };
    TH0 = 0xF8;
    TL0 = 0xCD;

    if(beat != 0)
    {
        tmp = P1;                   //将P1口当前值暂存
        tmp = tmp & 0xF0;
        tmp = tmp | Beat[index];
        P1 = tmp;
        index ++;
        index = index & 0x07;
        beat--;
    }
    else
    {   
        P1 = P1 | 0x0F;
    }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
哭泣的眼泪
1楼-- · 2019-07-15 17:51
貌似也没有啥区别啊,,,范例中也是把p1的值赋给了一个临时变量,,然后又把临时变量的值赋给了p1

评分

参与人数 1积分 +2 收起 理由 _sam + 2

查看全部评分

_sam
2楼-- · 2019-07-15 21:24
哭泣的眼泪 发表于 2017-7-27 14:10
貌似也没有啥区别啊,,,范例中也是把p1的值赋给了一个临时变量,,然后又把临时变量的值赋给了p1

对啊,我也觉得没什么区别,,,然而范例这么写应该有一定道理吧,要不然多此一举了
_sam
3楼-- · 2019-07-16 00:25
 精彩回答 2  元偷偷看……
_sam
4楼-- · 2019-07-16 01:12
freedom100 发表于 2017-7-27 12:21
因为你的电路上 P1 口的高还有其它功能,采用这种逻辑操作是避免修改其它功能端口的状态。

谢谢解答
_sam
5楼-- · 2019-07-16 06:17
houjue 发表于 2017-7-27 10:13
一般I/O口可以直接赋值或逻辑运算赋值,你的程序里P1高四位还有其它用途,所以用&逻辑运算后不易出错,且容易理解;而直接赋值则需要很了解程序的人才知道,要是小白自己修改则会出错了。
      以上是我的看法,若觉得满意请采纳,谢谢! ...

与运算那里我是懂的。但是跟下面有一位朋友的想法一样,范例中把P1的值先赋给临时变量,然后又把临时变量的值赋给了P1,这跟直接用P1有啥区别,,,不是相当于直接赋值了吗,,,
Merciless友
6楼-- · 2019-07-16 07:47

一周热门 更多>