微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机入门 程序理解问题

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

时间:10-02 整理:3721RD 点击:
下面是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;
    }
}

      一般I/O口可以直接赋值或逻辑运算赋值,你的程序里P1高四位还有其它用途,所以用&逻辑运算后不易出错,且容易理解;而直接赋值则需要很了解程序的人才知道,要是小白自己修改则会出错了。
      以上是我的看法,若觉得满意请采纳,谢谢!

因为你的电路上 P1 口的高还有其它功能,采用这种逻辑操作是避免修改其它功能端口的状态。

貌似也没有啥区别啊,,,范例中也是把p1的值赋给了一个临时变量,,然后又把临时变量的值赋给了p1

对啊,我也觉得没什么区别,,,然而范例这么写应该有一定道理吧,要不然多此一举了

谢谢解答

谢谢解答

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

受益匪浅

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top