51单片机流水灯C语言小问题

下面的temp变量的作用是什么?我没弄明白!
#include <REG51.h> //51头文件#define DY_PORT P1 //设置LED连接的I/O组
/*********************************************************************************************
bit [自定义名] ; //定义一个位(位的值只能是0或1)例:bit LED
#define [代替名] [原名] //用代替名代替原名(可以方便修改常改或调试的值)例:#define LED P1
sbit [自定义名] = [系统位名] ; //自定义系统位名。例:sbit Add_Key = P3 ^ 1;
unsigned char [自定义名] ; //定义一个0~255的整数变量.例:unsigned char a;
unsigned int [自定义名] ; //定义一个0~65535的整数变量

/*********************************************************************************************/
void delay (unsigned int a){ // 1ms延时程序
unsigned int i;
while( --a != 0){
for(i = 0; i < 600; i++);//STC单片机在外部晶振为12MHz时i值上限为600
} //AT89C51单片机在外部晶振为12MHz时i值上限为125
}
/*********************************************************************************************/
void main(void){
int i;
int temp;
while(1){
temp=0x01;
for(i=0;i<8;i++){ //8个流水灯逐个闪动
DY_PORT=~temp;
delay(100); //调用延时函数
temp<<=1;
}
}
}
最新回答
五品带砖侍卫

2024-09-06 17:43:56

那个 temp就是个临时变量,暂时存放数据的一个变量.
举个例子,你的左手拿着一大瓶可乐,右手拿着一摞书,你旁边还有把椅子,现在,你想要把左手的可乐给右手,右手的书给左手,那么肯定是先把右手的书放在椅子上,然后可乐递到右手,然后左手从椅子上把书捡起来.
这个temp就相当于是在椅子的作用.
就是先把temp运算,然后把结果给IO口送去.
i = 0时,Temp =00000001; ~Temp =11111110
i = 1时,Temp =00000010; ~Temp =11111101
i = 2时,Temp =00000100; ~Temp =11111011
i = 3时,Temp =00001000; ~Temp =11110111
i = 4时,Temp =00010000; ~Temp =11101111
i = 5时,Temp =00100000; ~Temp =11011111
i = 6时,Temp =01000000; ~Temp =10111111
i = 7时,Temp =10000000; ~Temp =01111111
其实,不用Temp也完全可以做到:
for(i=0;i<8;i++)
{ //8个流水灯逐个闪动
DY_PORT=~(1<<i); //---这样就省了用Temp这个变量了
delay(100); //调用延时函数
}
性冷不矫情

2024-09-06 10:48:55

temp是一个随机变量,在这里就是代表LED的状态,所以这个地方你将temp换成LED更清楚一点。从程序看来当DY_PORT也就是P1的某一位为“0”时,该位的LED点亮,而temp初始值为0x01所以需要取反,至于为什么要设置初始值为0x01而不是0xfe,这与temp<<=1;有关,这句话移位后直接地位填0,所以很方便处理,如果为0xfe那么还需要将低位置1才行。
当temp=0x01时 temp<<=1;
当temp=0xfe时 temp<<=1;temp|=0x01;
小故事里的海

2024-09-06 20:31:20

0x01是16进制的数是两位数,换成二进制就是八位数 这个八位数每位代表一个IO,代表一个灯。数制跟位数是不同的概念
追问
嗯,明白了,那请问temp为什么取反值呢?
追答
这个是根据你板子上二极管的正负极接法定的,看是高电平亮还是低电平亮,看你这个程序应该是低电平二极管才两即与单片机IO口相连的是发光二极管的负极