实验一跑马灯实验Word文档下载推荐.docx
《实验一跑马灯实验Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《实验一跑马灯实验Word文档下载推荐.docx(11页珍藏版)》请在冰点文库上搜索。
2、根据实验内容编写好相关程序,并进行Proteus仿真。
三、实验内容
1、基本的流水灯。
根据图3.1电路,编写一段程序,使8个发光二极管D1、D2、D3、D4、D5、D6、D7、D8顺序(正序)点亮:
先点亮D1,再点亮D2、D3……D8、D1……,循环点亮。
每点亮一个LED,采用软件延时一段时间。
2、简单键控的流水灯。
不按键,按正序点亮流水灯;
按下K1不松手,按倒序点亮流水灯,即先点亮D8,再顺序点亮D7、D6……D1、D8……。
松手后,又按正序点亮流水灯。
3、键控的流水灯。
上电,不点亮LED,按一下K1键,按正序点亮流水灯。
按一下K2键,按倒序点亮流水灯,按一下K3键,全部关闭LED。
四、软件设计思想
1、基本的流水灯
软件延时采用程序voiddelay(unsignedintc),可调整延时时间。
由于是按下键不松手,键值一直保留,所以判断if(K1==0),即是按下K1,采用如例题所示的if(K1==0)或if(K1==1),后接while
(1)循环的模式。
3、键控的流水灯
由于是按一下键后马上松手,所以要设置一个变量K保留按键键值,由于单片机本身原理图所致,K17、K18、K19、K20四个键已经固定为K17=P2^0、K18=P2^1、K19=P2^2、K20=P2^3所以直接运用,利用如if(K1==0)的条件判断语句来判断是否按下K1、K2、K3按键,实现键控流水灯。
五、实验原理图
如图3.1所示。
图3.1跑马灯实验电路原理图
电路原理图如图3.1,AT89S52的P0.0~P0.7作为输出连接8个发光二极管,输出低电平0时对应发光二极管发光;
由于发光二极管的导通电压为1.7V,所以HNIST-2型实验装置在电源与二极管之间加一个阻值为1K限流电阻保护二极管。
AT89S52的P2.0、P2.1、P2.2、P2.3作为输入连接4个按键K1、K2、K3、K4,若检测到P2.0=0,则说明K1键按下,其他键同理。
六、源程序
1、简单流水灯
#include<
reg52.h>
intrins.h>
#defineuintunsignedint
#defineucharunsignedchar
voiddelay(unsignedintc);
sbitK1=P2^0;
//定义引脚
sbitK2=P2^1;
sbitK3=P2^2;
sbitD0=P0^0;
sbitD1=P0^1;
sbitD2=P0^2;
sbitD3=P0^3;
sbitD4=P0^4;
sbitD5=P0^5;
sbitD6=P0^6;
sbitD7=P0^7;
voiddelay(unsignedintc)//延时函数
{
unsignedchara,b;
for(;
c>
0;
c--)
{
for(b=50;
b>
b--)
{
for(a=100;
a>
a--);
}
}
}
voidmain()//主函数
unsignedcharLED;
LED=0xfe;
while
(1)
P0=LED;
//P0=11111110
delay(50);
LED=LED<
<
1;
if(P0==0x00)
LED=0xfe;
}
}
2、简单键控流水灯
voiddelay(unsignedintc)//延时函数
voidmain()//主函数
{
if(K1==0)
//P0=11111110
delay(50);
if(K1==1)//按下按键不松,跳出循环。
{
break;
if(K1==1)
LED=0x7F;
//P0=011111111
LED=LED>
>
LED=0x7F;
if(K1==0)//松开按键,跳出循环。
}
3、键控流水灯
unsignedchari;
LED=0x00;
//先全亮
if(K1==0)//按下K1,顺序熄灭。
while
(1)
{
LED=0x00;
delay(20);
for(i=0;
i<
9;
i++)
{
P0=LED;
delay(20);
LED=LED<
LED=LED|0x01;
if(K2==0)break;
if(K3==0)break;
}
}
if(K2==0)//按下K2,倒序熄灭。
while
(1)
{
{
delay(20);
LED=LED>
LED=LED|0x80;
if(K1==0)break;
if(K3==0)//按下K3,全灭。
P0=0x00;
if(K3==1)
P0=0xff;
七、实验思考题
1、采用I/O口作为输出口时要考虑哪些因素?
为什么实验装置中LED要串联一个电阻?
答:
当作为输出口时候就是单片机向外发出数据,或者再产生拉电流,单片机的拉电流一般要比灌电流小,基本上就能点亮2,3个LED,功率很有限所以单片机驱动外围器件一般需要驱动芯片。
防止LED过流烧坏。
2、采用I/O口作为输入口时要注意什么?
键控的流水灯时为什么要在延时程序中检测是否按键?
当作为输入口时候是单片机接收IC的数据信息,或者是灌电流,这时候要考虑电流的大小是否在单片机的承受范围内;
放在主程序里,每个延时周期内,只能检测按键一次,反应比较慢。
放在延时程序里,检测时间间隔比较短,反应快。
3、为什么延时程序要做一个函数?
单片机的运行速度是很快的,如果不进行延时,肉眼难以分辨流水灯;
将延时程序做成一个函数一是因为C51的特性,延时程序不必写入主程序,减少程序的繁琐性,增加美观;
二是因为延时函数只需写一次,然后调用即可,节省时间。