资源描述:
《实验三 流水灯制作实验》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验三流水灯制作实验一实验目的:通过实验进一步掌握I/O口作为输入和输出方式时,CPU对I/O口的操作和控制,以及时间延迟和消除按键抖动的方法。二实验原理:流水灯实验中综合运用了I/O口的输入输出功能。实验二已介绍其作为输出口的功能,作为输入口用时,有两种工作方式,即读端口和读引脚。读端口时是把端口锁存器中的内容读入到内部总线,经过某种运算和变换后再写回到端口锁存器,对端口的内容取反即属于此类操作指令。而读引脚时才是把外部的数据读入到内部总线。CPU可根据不同的指令分别发出读端口或是读引脚的信号来完成不同的读操作。读者可以尝试做这样一个小实验来验证二者得相异之处。小实验1:先将P2
2、.0口接地,而在软件中将P2.0赋值为1,此时将P2.0口的值再赋给其他的引脚如P1.0,可以看到P1.0脚仍为低电平,这种情况则是读引脚;小实验2:先将P2.0口接地,而在软件中将P2.0赋值为1,接下来如果我们执行一条P2.0取反的指令CPLP2.0,去掉P2.0口接地线,结果P2.0口也还是为低,那么这个CPL指令便是读端口锁存器。三实验内容:实验中,P1的8根I/O口上分别接一个发光二极管和一个限流电阻,P2.0管脚上接上一个开关,编写程序控制发光二极管的点亮顺序,使8个发光二极管从L1开始,点亮约0.5秒后熄灭,接着L2点亮0.5秒,这样从右向左运行依次循环至L8,同样的
3、方式从左向右运行,即L8到L1依次点亮。如此循环往复,形成流水灯。流水灯的运行与否由开关来控制,即开关按下后,流水灯开始运行。四实验电路图:4五实验方法:1.根据如上电路图连接好实验电路,注意发光二级管的正负极。实验板中将P1的八个引脚分别与右上方的八个LED相连,P2.0的管脚与J10的任一根脚相接。这样实验板中的AUXkey即为上图中的S1。2.发光二极管可以选用3mm的小型高亮管,限流电阻选用560欧姆,其他元件的参数可以参考上一个实验。3.按照实验要求编写实验程序,建立新工程,保存为LIUSHUI。在编写程序时应注意循环左移或右移指令的使用。在汇编语言中,循环指令RL和RR
4、只能用于累加器A,而对寄存器Rn不能使用。在C语言中,要注意的是,位左移与右移运算符<<,>>在移位后都是在空白位补零,而溢出的位舍弃。但是实验中要求灯是依次点亮的,所以单一的移位是不对的,正确的做法是对其进行循环移位,在编程时要特别注意这一点。4.调试程序,软件延时的时间在这里通过调试时间来调整。5.将keilC51产生的liushui.hex文件通过在线下载ISP或商用编程器写到芯片中。六参考程序:1.汇编源程序ORG0000HSTART:MOVA,#0FFHMOVP1,A;P1口初始化MOVP2,A;P2口初始化MOVR2,#0FEHMOVR3,#0HNEXT:MOVA,P2
5、CJNEA,#0FFH,DELAY0;判断按键是否按下LJMPNEXT4DELAY0:MOVR1,#0FFH;消除键抖动DJNZR1,$MOVA,P2CJNEA,#0FFH,DISPLYLJMPNEXTDISPLY:MOVP1,R2;运行流水灯CJNER3,#1H,LEFT;判断流水灯运行方向RIGHT:MOVA,R2RRAMOVR2,A;向右移动CJNER2,#0FEH,CHGLACALLDELYLJMPDISPLYLEFT:MOVA,R2RLAMOVR2,A;向左移动CJNER2,#07FH,CHGRACALLDELYLJMPDISPLYCHGL:MOVR3,#1H;改变移动方
6、向,向左移动ACALLDELYLJMPDISPLYCHGR:MOVR3,#0H;改变移动方向,向右移动ACALLDELYLJMPDISPLYDELY:MOVR4,#0FFH;延时子程序,延时约0.5SD1:MOVR5,#0FFHD2:MOVR6,#6HDJNZR6,$DJNZR5,D2DJNZR4,D1RETEND1.C语言源程序/***************************************************文件名:liushui.c*描述:P1口输出,P2口输入,按键按下,流水灯开始运行***********************************
7、***************/#includesbitSWITCH=P2^0;voidmain(void){inti,j=0;unsignedchara=0xfe,b,c;4P1=0xff;//P1口初始化SWITCH=1;while(1){if(!SWITCH)//判断按键是否按下for(i=0;i<=1000;i++);if(!SWITCH)break;}while(1)//流水灯运行{P1=a;if(!j)//向左运行{if(a==0xbf)