学习单片机//实例1:用单片机控制第一个灯亮#includereg51.h//包含51单片机寄存器定义的头文件voidmain(void){P1=0xfe;//P1=11111110B,即P1.0输出低电平}//实例2:用单片机控制一个灯闪烁:认识单片机的工作频率#includereg51.h//包含单片机寄存器的头文件/函数功能:延时一段时间/voiddelay(void)//两个void意思分别为无需返回值,没有参数传递{unsignedinti;//定义无符号整数,最大取值范围65535for(i=0;i20000;i++)//做20000次空循环;//什么也不做,等待一个机器周期}/函数功能:主函数(C语言规定必须有也只能有1个主函数)/voidmain(void){while(1)//无限循环{P1=0xfe;//P1=11111110B,P1.0输出低电平delay();//延时一段时间P1=0xff;//P1=11111111B,P1.0输出高电平delay();//延时一段时间}}//实例3:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能#includereg51.h//包含单片机寄存器的头文件/函数功能:主函数(C语言规定必须有也只能有1个主函数)/voidmain(void){while(1)//无限循环{P1=0xff;//P1=11111111B,熄灭LEDP0=P1;//将P1口状态送入P0口P2=P1;//将P1口状态送入P2口P3=P1;//将P1口状态送入P3口}}//实例4:使用P3口流水点亮8位LED#includereg51.h//包含单片机寄存器的头文件/函数功能:延时一段时间/voiddelay(void){unsignedchari,j;for(i=0;i250;i++)for(j=0;j250;j++);}/函数功能:主函数/voidmain(void){while(1){P3=0xfe;//第一个灯亮delay();//调用延时函数P3=0xfd;//第二个灯亮delay();//调用延时函数P3=0xfb;//第三个灯亮delay();//调用延时函数P3=0xf7;//第四个灯亮delay();//调用延时函数P3=0xef;//第五个灯亮delay();//调用延时函数P3=0xdf;//第六个灯亮delay();//调用延时函数P3=0xbf;//第七个灯亮delay();//调用延时函数P3=0x7f;//第八个灯亮delay();//调用延时函数}}//实例7:通过对P3口地址的操作流水点亮8位LED#includereg51.h//包含单片机寄存器的头文件sfrx=0xb0;//P3口在存储器中的地址是b0H,通过sfr可定义8051内核单片机//的所有内部8位特殊功能寄存器,对地址x的操作也就是对P1口的操作/函数功能:延时一段时间/voiddelay(void){unsignedchari,j;for(i=0;i250;i++)for(j=0;j250;j++);//利用循环等待若干机器周期,从而延时一段时间}/函数功能:主函数/voidmain(void){while(1){x=0xfe;//第一个灯亮delay();//调用延时函数x=0xfd;//第二个灯亮delay();//调用延时函数x=0xfb;//第三个灯亮delay();//调用延时函数x=0xf7;//第四个灯亮delay();//调用延时函数x=0xef;//第五个灯亮delay();//调用延时函数x=0xdf;//第六个灯亮delay();//调用延时函数x=0xbf;//第七个灯亮delay();//调用延时函数x=0x7f;//第八个灯亮delay();//调用延时函数}}//实例8:用不同数据类型控制灯闪烁时间#includereg51.h//包含单片机寄存器的头文件/函数功能:用整形数据延时一段时间/voidint_delay(void)//延时一段较长的时间{unsignedintm;//定义无符号整形变量,双字节数据,值域为0~65535for(m=0;m36000;m++);//空操作}/函数功能:用字符型数据延时一段时间/voidchar_delay(void)//延时一段较短的时间{unsignedchari,j;//定义无符号字符型变量,单字节数据,值域0~255for(i=0;i200;i++)for(j=0;j180;j++);//空操作}/函数功能:主函数/voidmain(void){unsignedchari;while(1){for(i=0;i3;i++){P1=0xfe;//P1.0口的灯点亮int_delay();//延时一段较长的时间P1=0xff;//熄灭int_delay();//延时一段较长的时间}for(i=0;i3;i++){P1=0xef;//P1.4口的灯点亮char_delay();//延时一段较长的时间P1=0xff;//熄灭char_delay();//延时一段较长的时间}}}//实例9:用P0口、P1口分别显示加法和减法运算结果#includereg51.hvoidmain(void){unsignedcharm,n;m=43;//即十进制数2x16+11=43n=60;//即十进制数3x16+12=60P1=m+n;//P1=103=01100111B,结果P1.3、P1.4、P1.7口的灯被点亮P0=n-m;//P0=17=00010001B,结果P0.0、P0.4的灯被熄灭}//实例10:用P0、P1口显示乘法运算结果#includereg51.h//包含单片机寄存器的头文件voidmain(void){unsignedcharm,n;unsignedints;m=64;n=71;s=mn;//s=6471=4544,需要16位二进制数表示,高8位送P1口,低8位送P0口//由于4544=17256+192=H3161616+H21616+H116+H0//两边同除以256,可得17+192/256=H316+H2+(H116+H0)/256//因此,高8位16进制数H316+H2必然等于17,即4544除以256的商//低8位16进制数H116+H0必然等于192,即4544除以256的余数P1=s/256;//高8位送P1口,P1=17=11H=00010001B,P1.0和P1.4口灭,其余亮P0=s%256;//低8位送P0口,P3=192=c0H=11000000B,P3.1,P3.6,P3.7口灭,其余亮}//实例11:用P1、P0口显示除法运算结果#includereg51.h//包含单片机寄存器的头文件voidmain(void){P1=36/5;//求整数P0=((36%5)10)/5;//求小数while(1);//无限循环防止程序“跑飞”}//实例12:用自增运算控制P0口8位LED流水花样#includereg51.h//包含单片机寄存器的头文件/函数功能:延时一段时间/voiddelay(void){unsignedinti;for(i=0;i20000;i++);}/函数功能/voidmain(void){unsignedchari;for(i=0;i255;i++)//注意i的值不能超过255{P0=i;//将i的值送P0口delay();//调用延时函数}}//实例13:用P0口显示逻辑与运算结果#includereg51.h//包含单片机寄存器的头文件voidmain(void){P0=(40)&&(90xab);//将逻辑运算结果送P0口while(1);//设置无限循环,防止程序“跑飞”}//实例14:用P0口显示条件运算结果#includereg51.h//包含单片机寄存器的头文件voidmain(void){P0=(84)?8:4;//将条件运算结果送P0口,P0=8=00001000Bwhile(1);//设置无限循环,防止程序“跑飞”}//实例15:用P0口显示按位异或运算结果#includereg51.h//包含单片机寄存器的头文件voidmain(void){P0=0xa2^0x3c;//将条件运算结果送P0口,P0=8=00001000Bwhile(1);//设置无限循环,防止程序“跑飞”}//实例16:用P0显示左移运算结果#includereg51.h//包含单片机寄存器的头文件voidmain(void){P0=0x3b2;//将左移运算结果送P0口,P0=11101100B=0xecwhile(1);//无限循环,防止程序“跑飞”}//实例17:万能逻辑电路实验#includereg51.h//包含单片机寄存器的头文件sbitF=P1^4;//将F位定义为P1.4sbitX=P1^5;//将X位定义为P1.5sbitY=P1^6;//将Y位定义为P1.6sbitZ=P1^7;//将Z位定义为P1.7voidmain(void){while(1){F=((~X)&Y)|Z;//将逻辑运算结果赋给F;}}//实例18:用右移运算流水点亮P1口8位LED#includereg51.h//包含单片机寄存器的头文件/函数功能:延时一段时间/voiddelay(void){unsignedintn;for(n=0;n30000;n++);}/函数功能:主函数/voidmain(void){unsignedchari;while(1){P1=0xff;delay();for(i=0;i8;i++)//设置循环次数为8{P1=P11;//每次循环P1的各二进位右移1位,高位补0delay();//调用延时函数}}}//实例19:用if语句控制P0口8位LED的流水方向#includereg51.h//包含单片机寄存器的头文件sbitS1=P1^4;//将S1位定义为P1.4sbitS2=P1^5;//将S2位定义为P1.5/函数功能:主函数/voidmain(void){while(1){if(S1==0)//如果按键S1按下P0=0x0f;//P0口高四位LED点亮if(S2==0)//如果按键S2按下P0=0xf0;//P0口低四位LED点亮}}//实例20:用swtich语句的控制P0口8位LED的点亮状态#includereg51.h//包含单片机寄存器的头文件sbitS1=P1^4;//将S1位定义为P1.4/函数功能:延时一段时间/voiddelay(void){unsignedintn;for(n=0;n10000;n++);}/函数功能:主函数/voidmain(void){unsignedchari;i=0;//将i初始化为0while(1){if(S1==0)//如果S1键按下{delay();//延时一段时间if(S1==0)//如果再次检测到S1键按下i++;//i自增1if(i==9)//如果i=9,重新将其置为1i=1;}switch(i)//使用多分支选择语句{case1:P0=0xfe;//第一个LED亮break;case2:P0=0xfd;//第二个LED亮break;case3:P0=0xfb;//第三个LED亮break;case4:P0=0xf7;//第四个LED亮break;case5:P0=0xef;//第五个LED亮break;case6:P0=0xdf;//第六个LED亮break;case7:P0=0xbf;//第七个LED亮break;case8:P0=0x7f;//第八个LED亮break;default://缺省值,关闭所有LEDP0=0xff;}}}//实例21:用for语句控制蜂鸣器鸣笛次数#includereg51.h//包含单片机寄存器的头文件sbitsound=