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;
}
}
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有啥区别,,,不是相当于直接赋值了吗,,,
嗯
受益匪浅