上机五C51单片机一维数组和二维数组的应用循环结构练习.docx
《上机五C51单片机一维数组和二维数组的应用循环结构练习.docx》由会员分享,可在线阅读,更多相关《上机五C51单片机一维数组和二维数组的应用循环结构练习.docx(11页珍藏版)》请在冰豆网上搜索。
上机五C51单片机一维数组和二维数组的应用循环结构练习
任务1:
控制LED小灯亮灭
1.流程图如下:
2.程序如下:
#include
#defineuintunsignedint
#defineucharunsignedchar
voidmain()//主函数
{
while
(1)//while死循环
{
if((P3&0x10)==0)//判断P3口上的八位与00010000相与后是否等于0,若是,则P3.4口为低电平,也就是接在P3.4口上的开关按上了。
P1=0xfe;//当P3.4口上的开关按上了,那么就由用户使接在P1.0口上的灯亮。
elseif((P3&0x20)==0)//和上面的一样,判断P3.5口上的开关是否按上了。
P1=0Xfd;//当P3.5口上的开关按上了,点亮接在P1.1口上的灯。
elseif((P3&0x40)==0)//判断P3.6口的开关是否按上了。
P1=0xfb;//当P3.6口上的开关按上了,点亮接在P1.2口上的灯。
elseif((P3&0x80)==0)//判断P3.7口的开关是否按上了。
P1=0xf7;//当P3.7口上的开关按上了,点亮接在P1.3口上的灯。
elseP1=0xff;//当没有按键按下时,P1口上的全部灯都不亮。
}
}
3.仿真结果如下:
4.仿真结果分析:
从仿真图以及程序可以看出,当P3.4口上的开关按下时,不管其它三个开关有没有按下,只有受P3.4口开关控制的那个灯(p1.0口上的灯)才亮,以此类推,当只有P3.7口上的开关按下时,P1.3口上的灯才亮,而其它灯不亮,因为控制其它灯的按键没有按下,接在其它灯的IO口处于高电平状态。
任务二:
循环点亮led小灯
1.流程图如下:
2.程序如下:
#include
#defineuintunsignedint
#defineucharunsignedchar
voidDelayMs(uinti)//延时子程序
{
uintj;
for(;i!
=0;i--)
{
for(j=100;j!
=0;j--);
}
}
voidLedlight(uchari)
{
switch(i)
{
case1:
P1=0xfe;break;//当i的值为1时,点亮P1.0口上的灯
case2:
P1=0xfd;break;//当i的值为2时,点亮P1.1口上的灯
case3:
P1=0xfb;break;//当i的值为3时,点亮P1.2口上的灯
case4:
P1=0xf7;break;//当i的值为4时,点亮P1.3口上的灯
case5:
P1=0xef;break;//当i的值为5时,点亮P1.4口上的灯
case6:
P1=0xdf;break;//当i的值为6时,点亮P1.5口上的灯
case7:
P1=0xbf;break;//当i的值为7时,点亮P1.6口上的灯
case8:
P1=0x7f;break;//当i的值为8时,点亮P1.7口上的灯
default:
break;
}
}
voidmain()
{
uchari;
while
(1)
{
for(i=8;i>0;i--)
{
Ledlight(i);
DelayMs(100);
}
}
}
3.仿真结果如下:
4.仿真结果分析:
由程序可知,利用开关分支语句实现小灯循环点亮,P1口一共接8个灯所以设置8个分支,当参数i=8时,选择第八个分支“case8”即点亮P1.7口上的灯,然后判断i是否仍然大于0,是的话i自减1,再选择相应的分支点亮相对应的小灯实现循环点亮。
任务三:
用3种循环实现输出1~10的平方
第一种(for循环):
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
voidserial_init(void);
voidmain()
{
uinti,c;
serial_init();
while
(1)
{
for(i=1;i<11;i++)
{
c=i*i;
printf("%d\n",c);
}
}
}
voidserial_init(void)//串口初始化函数
{
TMOD=0x20;//T1工作方式1,用于设定波特率
TH1=0xF3;//波特率4800Bps,12MHz晶振
TL1=0xF3;
PCON|=0x80;//SMOD=1,波特率加倍
SCON=0x50;//允许发送接收
ES=0;//禁止串口中断
TI=1;
TR1=1;
}
分析:
先给i赋值1,把i*i的值赋给c,再printf("%d\n",c)输出1的平方,然后判断i是否大于11,不是的话i自加1,变成2,再把c=2*2,输出2的平方“4”,以此类推······
第二种(while循环):
#include
#include
#defineuintunsignedint
voidserial_init(void)//串口初始化函数
{
TMOD=0x20;//T1工作方式1,用于设定波特率
TH1=0xF3;//波特率4800Bps,12MHz晶振
TL1=0xF3;
PCON|=0x80;//SMOD=1,波特率加倍
SCON=0x50;//允许发送接收
ES=0;//禁止串口中断
TI=1;
TR1=1;
}
voidmain()
{
uinti,c;
i=0;
serial_init();
while(i++<10)
{
c=i*i;
printf("%d\n",c);
}
}
分析:
while循环结构的最大特点在于,其循环条件测试处于循环体的开头,即while(i++<10),先判断循环条件i自加1后是否小于10,当小于10,则为真,执行循环体,为假则退出循环体。
第三种(dowhile循环):
#include
#include
#defineuintunsignedint
voidserial_init(void)//串口初始化函数
{
TMOD=0x20;//T1工作方式1,用于设定波特率
TH1=0xF3;//波特率4800Bps,12MHz晶振
TL1=0xF3;
PCON|=0x80;//SMOD=1,波特率加倍
SCON=0x50;//允许发送接收
ES=0;//禁止串口中断
TI=1;
TR1=1;
}
voidmain()
{
uinti,c;
i=1;
serial_init();
do
{
c=i*i;
printf("%d\n",c);
}
while(i++<10);
}
分析:
dowhile循环语句的执行过程是先执行循环体语句“do{循环语句}”,然后执行后面“while()”圆括号中的表达式,如果表达式的结果为真,则循环继续,并再一次执行循环语句。
只有当表达式为假(0)时,循环才会终止。