51单片机 C语言编程笔记

目录

不同类型数据的差异

宏定义

逻辑与或非和按位与或非之间的差别

while与do...while的区别     

小数拆分

数组的使用

条件运算符:

循环移位与非循环移位

有返回值函数的使用

指针的用法

指针数组的应用方法

指针作为函数的参数


不同类型数据的差异

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);
  
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值