流水灯控制实验报告及
程序
文件编码(GHTU-UITID-GGBKT-POIU-WUUI-8968)
实验三 流水灯控制实
验
姓名 专业 通信工程 学号 成绩 一、实验目的
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. 实验电路
C1U133p19XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617X1CRYSTAL18C233p+5VXTAL2U2:BP1.011A0P1.113A1P1.215A2P1.317A319OE74LS240Y0Y1Y2Y39753C3922uFRSTR11k+5v293031PSENALEEAU2:AP1.42A0P1.54A1P1.66A2P1.78A31OE74LS240Y0Y1Y2Y318161412P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P1.0/T2P1.1/T2EXP1.2P1.3P1.4P1.5P1.6P1.7AT89C52NET=P1.13
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; } } }
void delay( uint a) {
uchar b;
for(a; a > 0; a--) //循环600*255次 机器在这里执行需要一段时间 也就达到了延时效果
for(b = 255; b > 0; b--); }
在“Options for target”的“debug”里选中“Proteus VSM Simulator”并选择输出“hex”文件进行联合调试。分别进行全速调试与单步调试,看是否出现编程所想要实现的效果。
3. 实验结果
按下不同的按键次数,执行不同的流水效果,自行设计效果为双灯循环右移。
七、实验总结及问题
通过本次流水灯控制实验,进一步掌握了Keil C51软件与proteus联合仿真调试的方法,逐步熟练了单步调试的方法。自己用中断方法完成了本次实验,也尝试用查询方法编写程序,知道中断方法是在有中断请求时CPU再去处理,之前可一直忙于其他事情,而查询方法需一直查询标志位,CPU不能做其他事情,中断方法效率要比查询方式高而且较简单。第一次用按键控制电路,学习了按键的去抖原理及使用方法。
在实验中,会出现未知效果,总体看来原因不明,只要进行单步调试就可找到问题所在。
思考:如果不进行去抖处理,CPU可能会误判,按下后认为按键松开,多次执行相应程序,得不到想要的控制效果。
因篇幅问题不能全部显示,请点此查看更多更全内容