实验三流水灯控制实验
姓名专业通信工程学号成绩
一、实验目(de)
1.掌握Keil C51 软件与protues软件联合仿真调试(de)方法;
2.掌握如何使用程序与查表等方法实现流水效果;
3.掌握按键去抖原理及处理方法.
二、实验仪器与设备
1.  微机1台
2.  Keil C51集成开发环境
3.  Proteus仿真软件
三、实验内容
1.用Proteus设计一流水灯控制电路.利用P1口控制8个发光二级管L1—L8.
口接一按键K1.参考电路如下图所示.其中74LS240为八反响三态缓冲器/
线驱动器.
2.用中断或查询方式编写程序,每按动一次K1键,演示不同(de)流水效果.若
用KEY表示按键(de)次数,则其对应(de)流水效果如下:
①  KEY=0: L1-L8全亮;
②  KEY=1: L1-L8先全灭,然后自右向左单管点亮,如此循环;
③  KEY=2: L1-L8先全灭,然后自右向左依次点亮,如此循环;
④  KEY=3: L1-L8先全亮,然后自左向右依次熄灭,如此循环;
⑤  KEY=4: L1-L8先全灭,然后整体闪烁,如此循环;
⑥  KEY=5:自行设计效果.
以上移位及闪烁时间间隔均设置为秒,按动5次按键后,再按键时,流水效果
从头开始循环.
四、实验原理
1.按键去抖原理:通常按键所用(de)开关为机械弹性开关,当机械触点断开、
闭合时,电压信号波形如下图所示.由于机械触点(de)弹性作用,一个按键开关在闭合时不会马上稳定(de)接通,在断开时也不会一下子断开.因而在闭合及断开(de)瞬间均伴随有一连串(de)抖动.抖动时间(de)长短由按键(de)机械特性决定,一般为5~10ms.按键抖动会引起一次按键被误读多次.为了确保CPU对键(de)一次闭合仅做一次处理,必须去除按键抖动.在键闭合稳定时,读取键(de)状态,并且必须判别;在键释放稳定后,再作处理.按键(de)抖动,可用硬件或软件两种方法消除.常用软件方法去抖动,即检测到按键闭合后执行一个5~10ms延时程序;让前沿抖动消失后,再一次检测键(de)状态,如果仍保持闭合状态电平,则确认为真正有按键按下.当检测到按键释放后,也要给5~10ms(de)延时,待后延抖动消失后,才能转入该键(de)处理程序.
2.74LS240:八反相三态缓冲器/线驱动器
引脚排列图:
3.中断原理:当某种内部或外部事件发生时,单片机(de)中断系统将迫使CPU
暂停正在执行(de)程序,转而去进行中断事件(de)处理,中断处理完毕后,又返回被中断(de)程序处,继续执行下去.每次按键是一次外部中断,按下
按键后,CPU利用switch case语句跳转到相应语句执行.
五、实验步骤
1. 用Proteus设计流水灯控制电路;
2. 在Keil C51中编写流水灯控制程序,编译通过后,与Proteus联合调试;
3. 按动K1键,观察是否达到演示效果;
4. 试用中断和查询两种方式编写程序,比较二者区别.
六、电路设计及调试
1.  实验电路
2.程序设计与调试
include<>
define uchar unsigned char
define uint unsigned int
debug灯uchar i=0,j,k,m,n;
uchar code table1[]={0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//自右向左单个点亮二极管(de)代码
uchar code table2[]={0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};//自右向左依次点亮二极管(de)代码
uchar code table3[]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};//自左向右依次熄灭二极管(de)代码
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;
}
}
}
void delay( uint a)
{
uchar b;
for(a; a > 0; a--)    //循环600255次机器在这里执行需要一段时间也就达到了延时效果
for(b = 255; b > 0; b--);
}
在“Options for target”(de)“debug”里选中“Proteus VSM Simulator”并选择输出“hex”文件进行联合调试.分别进行全速调试与单步调试,看是否出现编程所想要实现(de)效果.