您的当前位置:首页正文

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

2022-10-03 来源:二三四教育网
实验一 流水灯实验

一、实验目的

⑴ 简单I/O引脚的输出 ⑵ 掌握软件延时编程方法 ⑶ 简单按键输入捕获判断 二、实验实现的功能

⑴ 开机是点亮12发光二极管,闪烁三下 ⑵ 按照顺时针循环依次点亮发光二极管

⑶ 通过任意按键将发光二极管的显示改为顺逆时针方式

三、系统硬件设计

四、系统软件设计

#include 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函数开头定义即可。

指导老师签字: 日期:

因篇幅问题不能全部显示,请点此查看更多更全内容