流水灯控制实验报告及程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

流水灯控制实验报告及

程序

Company Document number:WUUT-WUUY-WBBGB-BWYTT-1982GT

实验三流水灯控制实验

姓名专业通信工程学号成绩

一、实验目的

1.掌握Keil C51 软件与protues软件联合仿真调试的方法;

2.掌握如何使用程序与查表等方法实现流水效果;

3.掌握按键去抖原理及处理方法。

二、实验仪器与设备

1. 微机1台

2. Keil C51集成开发环境

3. Proteus仿真软件

三、实验内容

1.用Proteus设计一流水灯控制电路。利用P1口控制8个发光二级管L1—L8。口

接一按键K1。参考电路如下图所示。其中74LS240为八反响三态缓冲器/线驱动器。

2.用中断或查询方式编写程序,每按动一次K1键,演示不同的流水效果。若用KEY

表示按键的次数,则其对应的流水效果如下:

① KEY=0: L1-L8全亮;

② KEY=1: L1-L8先全灭,然后自右向左单管点亮,如此循环;

③ KEY=2: L1-L8先全灭,然后自右向左依次点亮,如此循环;

④ KEY=3: L1-L8先全亮,然后自左向右依次熄灭,如此循环;

⑤ KEY=4: L1-L8先全灭,然后整体闪烁,如此循环;

⑥ KEY=5:自行设计效果。

以上移位及闪烁时间间隔均设置为秒,按动5次按键后,再按键时,流水效果从头开始循环。

四、实验原理

1.按键去抖原理:通常按键所用的开关为机械弹性开关,当机械触点断开、闭合

时,电压信号波形如下图所示。由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动。抖动时间的长短由按键的机械特性决定,一般为5~10ms。按键抖动会引起一次按键被误读多次。为了确保CPU对键的一次闭合仅做一次处理,必须去除按键抖动。在键闭合稳定时,读取键的状态,并且必须判别;在键释放稳定后,再作处理。按键的抖动,可用硬件或软件两种方法消除。常用软件方法去抖动,即检测到按键闭合后执行一个5~10ms延时程序;让前沿抖动消失后,再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有按键按下。当检测到按键释放后,也要给5~10ms的延时,待后延抖动消失后,才能转入该键的处理程序。

2.74LS240:八反相三态缓冲器/线驱动器

引脚排列图:

3.中断原理:当某种内部或外部事件发生时,单片机的中断系统将迫使CPU暂停正

在执行的程序,转而去进行中断事件的处理,中断处理完毕后,又返回被中断的程序处,继续执行下去。每次按键是一次外部中断,按下按键后,CPU利用switch case语句跳转到相应语句执行。

五、实验步骤

1. 用Proteus设计流水灯控制电路;

2. 在Keil C51中编写流水灯控制程序,编译通过后,与Proteus联合调试;

3. 按动K1键,观察是否达到演示效果;

4. 试用中断和查询两种方式编写程序,比较二者区别。

六、电路设计及调试

1. 实验电路

2.程序设计与调试

#include<>

#define uchar unsigned char

#define uint unsigned int

uchar i=0,j,k,m,n;

uchar code table1[]={0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//自右向左单个点亮二极管的代码

uchar code table2[]={0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};//自右向左依次点亮二极管的代码

uchar code table3[]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};//自左向右依次熄灭二极管的代码

uchar code table4[]={0x00,0x03,0x06,0x0c,0x18,0x30,0x60,0xc0};//双灯循环右移

void delay(uint a);

void INT_1() interrupt 2

{

EX1=0;

delay(20);

EX1=1;

i++;

if(i==6)

i=0;

}

void main()

{

EA=1; //打开总中断

EX1=1; //打开外部中断1

IT1=1; //设置中断触发方式为下降沿触发方式

while(1)

{

switch(i)

{

case 0:P1=0xff;

break;

case 1:P1=table1[j];delay(500);j++; if(j==10) j=0;

break;

case 2:P1=table2[k];delay(500);k++; if(k==10) k=0;

break;

case 3:P1=table3[m];delay(500);m++; if(m==10) m=0;

break;

case 4:P1=0x00;delay(300);P1=~P1;delay(300);

break;

case 5:P1=table4[n];delay(500);n++; if(n==10) n=0;

break;

default:break;

}

}

相关文档
最新文档