目录
不同类型数据的差异
unsigned char型的变量,最大值可以取到255
unsigned int型的变量,最大值可以取到65535
宏定义
#define uchar unsigned char //定义uchar 即unsigned char
#define add(a,b) a+b //带参数的宏定义
逻辑与或非和按位与或非之间的差别
char i=1,j=2; P1=i&j; //按位与,程序会将1与2均转换为二进制,对于每个位进行与运算,如果结果不为0,则为True //故此时,即为0000 0001&0000 0010=0000 0000, P1=i&&j; //逻辑与,只要i和j均不为0,则结果为真(1) P1=i|j; //按位或其中之一为1则为1 第一个和第二个灯灭 0000 0001&0000 0010=0000 0011
while与do...while的区别
前者是先比较判断后执行,后者是先执行再比较判断。
故后者的循环体至少会执行一次,而前者有可能一次也不执行。while(1) { if(S2) //S2未被按下时,将执行下面大括弧中的程序,但是,由于在刚开始进行的是判别 //操作,而3>4肯定为假,故不会执行P1=0xaa;操作。 //所以,此时,P1口相连的led不亮,P1各管脚的值还是刚开始赋的0xff。 { while(m>4) P1=0xaa; } else //当S2被按下后,执行该段程序,此时,虽然3>4仍然是假的,但是do...while //是先执行一次,然后再判断,故在比较判断之前,已经执行了P1=0xaa;故此时 //P1口各led会被交替点亮。 { do { P1=0x55; } while(m>4); } }
小数拆分
float xiaoshu=5.67; xiaoshu2=(unsigned int)(xiaoshu*100)%10; //注意(unsigned int)(xiaoshu*100)该部分,它的含义为对(xiaoshu*100)进行强制 //类型转换,因为虽然(xiaoshu*100)的运算结果表面上得到的是567,但实质上它在程序 //中的表现形式是567.0,即仍为float型数据,此时如果无类型转换,进行%取余运算时会 //导致错误出现。(unsigned int)(xiaoshu*100)即将float型强制转换为unsigned int型数据。 xiaoshu1=(unsigned int)(xiaoshu*100)%100/10;
数组的使用
unsigned char code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; char m; //每个变量在使用前,必须要加以声明。 while(1) //下面的代码无限循环,效果便是led一遍遍的闪烁。 { P1=table[m];//这就是数组的调用方法,m值为几,即调用数组第几个值(数组中数值的编号从0开始) m++;//改变此m值,便可调用到数组中不同的值。开始时m=0,调用到值0xfe。从而点亮第一个数码管。(QX-MCS51上,为低电平点亮LED,高电平熄灭LED) if(m==8)//由于led只有八位,而m是从0开始取值的,故当m=8时,0-7位已经亮完了应将其归零。 m=0; delay(); }
条件运算符:
类似于if()...else语句。
max=(a>b)?a:b;//条件运算符?:,若括弧中的a>b为真,则max结果为a,否则为b
循环移位与非循环移位
P1=m<<2;为非循环移位。
P1=_crol_(m,2);为循环移位。>>为非循环右移运算符。而_cror_(,)为循环右移函数。
其包含于intrins.h头文件中,该文件还包含有其他移位函数,P1=m<<2;//将左移运算结果送P1口,此运算符为不循环移动,即移出的数据将丢失,而后面的将补零 P1=_crol_(m,2);//这个为循环移位,即移出的那些位将被送入到低位。 //但是注意,调用这个_crol_(,)之前,要在头文件中包含intrins.h。
有返回值函数的使用
//该函数为带有两个参数m,n且带有返回值的求和函数,返回值的类型为unsigned char unsigned char jia(unsigned char m,unsigned char n) { unsigned char he; he=m+n; return he; //此即为返回的数据,执行此函数后,便会把此值返回给调用该子函数的位置处。 } void main() { unsigned i; i=jia(2,3);//此处调用的求和子函数,其中定义了参数值分别为2和3, //调用完求和函数后,i的值即为返回来的5。 P1=i; //将5送给P1口,二进制码为00000101,通过led亮灭显示出来 while(1); }
指针的用法
unsigned char m,n; //定义无符号字符型数据 unsigned char *j,*k;//定义无符号字符型指针变量 m=2; n=3; j=&m; //使指针变量指向m,对指针j初始化,&为对某个变量取地址的运算符。 k=&n; //使指针变量指向n,对指针k初始化 P1=*j+*k; //这样,对指针的操作其实就是对指针所指向对象的操作。 //*j+*k即相当与m+n,结果为5,然后送给P1口二进制值00000101
指针数组的应用方法
unsigned char code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char *p[ ]={&table[0],&table[1],&table[2],&table[3],&table[4], &table[5],&table[6],&table[7]}; //使指针数组中的每一个变量均指向数组table[]中的相应地址。 //指针变量存放的是地址。 unsigned char i; while(1) { for(i=0;i<8;i++) { P1=*p[i]; //i的变化,导致指针内容的变化,然后导致向P1传送的数值的变化。 delay(); } }
指针作为函数的参数
#include <reg52.h> void delay(void) //此延时函数无参数,无返回值。在其后面作了一个有参数的延时函数作为对比 { unsigned char m,n; for(m=0;m<200;m++) for(n=0;n<200;n++); } void led(unsigned char *p) //形参为无符号字符型指针 { unsigned char i; while(1) { i=0; //将i置为0,指向数组第一个元素 while(i!=16) { P1=*(p+i);// 取的指针所指变量(数组元素)的值,送P1口 delay(); //调用延时函数 i++; //指向下一个数组元素 } } } void main(void) { unsigned char code table[16]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F, 0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE}; //流水灯控制码 unsigned char *p; p=table; led(p); }