下面的temp变量的作用是什么?我没弄明白!#include <REG51.h> //51头文件#define DY_PORT P1 //设置LED连接的I/O组/*********************************************************************************************bit [自定义名] ; //定义一个位(位的值只能是0或1)例:bit LED#define [代替名] [原名] //用代替名代替原名(可以方便修改常改或调试的值)例:#define LED P1sbit [自定义名] = [系统位名] ; //自定义系统位名。例: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; }}}
那个 temp就是个临时变量,暂时存放数据的一个变量.举个例子,你的左手拿着一大瓶可乐,右手拿着一摞书,你旁边还有把椅子,现在,你想要把左手的可乐给右手,右手的书给左手,那么肯定是先把右手的书放在椅子上,然后可乐递到右手,然后左手从椅子上把书捡起来.这个temp就相当于是在椅子的作用.就是先把temp运算,然后把结果给IO口送去.i = 0时,Temp =00000001; ~Temp =11111110i = 1时,Temp =00000010; ~Temp =11111101i = 2时,Temp =00000100; ~Temp =11111011i = 3时,Temp =00001000; ~Temp =11110111i = 4时,Temp =00010000; ~Temp =11101111i = 5时,Temp =00100000; ~Temp =11011111i = 6时,Temp =01000000; ~Temp =10111111i = 7时,Temp =10000000; ~Temp =01111111其实,不用Temp也完全可以做到:for(i=0;i<8;i++){ //8个流水灯逐个闪动 DY_PORT=~(1<<i); //---这样就省了用Temp这个变量了 delay(100); //调用延时函数}
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;
0x01是16进制的数是两位数,换成二进制就是八位数 这个八位数每位代表一个IO,代表一个灯。数制跟位数是不同的概念 追问 嗯,明白了,那请问temp为什么取反值呢? 追答 这个是根据你板子上二极管的正负极接法定的,看是高电平亮还是低电平亮,看你这个程序应该是低电平二极管才两即与单片机IO口相连的是发光二极管的负极