当前位置:文档之家› 河南理工大学微机原理与单片机实验报告、课程设计 流水灯

河南理工大学微机原理与单片机实验报告、课程设计 流水灯

实验一流水灯实验一、实验目的
⑴简单I/O引脚的输出
⑵掌握软件延时编程方法
⑶简单按键输入捕获判断
二、实验实现的功能
⑴开机是点亮12发光二极管,闪烁三下
⑵按照顺时针循环依次点亮发光二极管
⑶通过任意按键将发光二极管的显示改为顺逆时针方式
三、系统硬件设计
四、系统软件设计
#include<reg51.h>
sbit L1=P0^5;
sbit L2=P0^6;
sbit L3=P0^7;
void Delay(void)
{
unsigned char i,j,k;
for(i=10;i>0;i--)
for(j=132;j>0;j--)
for(k=150;k>0;k--);
}
Scan_Key()
{
unsigned char FLAG=0;
unsigned char n;
n=(L1==0)||(L2==0)||(L3==0);
if(n)
{ FLAG=1;}
return FLAG;
}
main()
{
unsigned char y,n,s=0,b=1,m=0;
unsigned char c=1;
unsigned char a[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char h[]={0xff,0x38,0x34,0x2f,0x1f};
n=Scan_Key();
for(y=0;y<3;y++) //闪烁三次
{
P2=0;
P3=0;
Delay();
Delay();
Delay();
P2=0xff;
P3=0xff;
Delay();
Delay();
Delay();
}
while(1)
{
while(1)
{
m=m+n;
P3=0x3f;
while(1) //顺时针
{
for(;b<9;b++)
{ n=Scan_Key();
m=m+n;
if((P3==0x3f)&&(m%2==0))
{P2=a[b];Delay();}
else
{ P2=0xff;break; }
if(m%2==0)
c=1;
P2=0xff;
}
for(;c<5;c++)
{n=Scan_Key();
m=m+n;
if((P2==0xff)&&(m%2==0))
{ P3=h[c];Delay();}
else
{ P3=0x3f;break;}
}
if(m%2==0)
b=1;
break;
}
if(m%2==1)
break;
}
while(1) //逆时针 {
for(;b>0;b--)
{n=Scan_Key();
m=m+n;
if((P3==0x3f)&&(m%2==1))
{P2=a[b];Delay(); }
else
{P2=0xff;break;}
P2=0xff;
}
if(m%2==1)
c=4;
for(;c>0;c--)
{
n=Scan_Key();
m=m+n;
if((P2==0xff)&&(m%2==1))
{ P3=h[c]; Delay();}
else
{ P3=0x3f;break;}
P3=0x3f;
}
if(m%2==0)
break;
if(m%2==1)
b=8;
}
}
}
五、实验过程中遇到的问题及解决方法
1、用for循环执行顺逆时针循环按下开关后无法原地返回。

解决:在程序开始处为循环变量赋初值,不在for循环之中赋值。

2、检测按键的方式有:H1、H2置0,检测L1、L2、L3;L1、L2、L3置0,检测H1、H2。

哪种方式更好?
解决:H1、H2置0更好,因为P3口其他端口用于控制流水灯发光,处于输出状态,若要H1、H2做按键扫描端,容易引起混淆。

3、按键按一下就松手,有时扫描不到。

解决:由于程序每执行一次for循环对按键扫描一次,而执行for循环需要一定时间,故按键时间大于执行一次for循环的时间即可,或者缩短每个灯亮的时间。

4、12个灯分别有P2、P3口控制,如何能实现灯的不间断依次点亮?
解决:以顺时针时为例,当P2口的8个灯亮过后,为其赋值0xff使其全部熄灭,同时将其作为条件使P3口开始点亮二极管。

5、keil不能识别端口名称。

解决:没有包含reg51.h头文件。

6、在main函数中间定义的变量无法识别。

解决:在main函数开头定义即可。

指导老师签字:
日期:。

相关主题