找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7315|回复: 0
收起左侧

51单片机流水灯实验

[复制链接]
ID:851466 发表于 2020-11-30 08:42 | 显示全部楼层 |阅读模式

一、实验目的

  • 熟悉单片机系统相关硬件电路,程序下载方法;
  • 掌握采用汇编语言与C语言开发单片机系统的程序结构;
  • 掌握51系列单片机通用I/O口的使用
二、实验前准备
  • 搭建实验平台熟练应用keil5,程序烧写器
  • 根据实验内容编写好相关程序,并进行Proteus仿真。
三、实验内容

1、基本的流水灯。

根据图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.1所示。
电路原理图如图1.1,AT89S52的P0.0~P0.7作为输出连接8个发光二极管,输出低电平0时对应发光二极管发光;由于发光二极管的导通电压为1.7V,所以HNIST-2型实验装置在电源与二极管之间加一个阻值为1K限流电阻保护二极管。
AT89S52的P2.0、P2.1作为输入连接2个按键K1、K2,若检测到P2.0=0,则说明K1键按下。

图1.1  跑马灯实验电路原理图


图1.2Proteus仿真图
  • 软件设计思想
1、基本的流水灯
设置延时函数使led灯依次有间隔的亮起
软件延时采用程序delay( j ),可调整延时时间。
2、简单键控的流水灯。
实现思路:由于是按下键不松手,键值一直保留,所以判断if(K1==0),即是按下K1,
采用if(K1==0)或if(K1==1),后接while(1)循环的模式。
3、键控的流水灯
由于是按一下键后马上松手,所以要设置一个变量b保留按键键值,要在延时程序中检测是否按键,当按键后立即设置b的值。
  • 具体程序
基本的流水灯:
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
void delay(j) //延时函数
data uint j;
{ data uint i;
  while(j--)
  for(i=0;i<250;i++);
}
void main()
{ data uchar a;
      a=1;
                while(1)
                {   P0=~a;
                    a=a<<1;
                              if(a==0)a=1;
                              delay(250);}
}




简单的键控流水灯:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uint i){
    uchar t;
    while(i--){
        for(t=0;t<120;t++);
    }
}
void main(){  
        data uchar a;
        a=1;
        while(P2==0xff){   
        P0=~a;
        a=a<<1;
        if(a==0)  
        a=1;   
        delay(250);  
}

while(P2==0xfe)  
{   P0=~a;
        a=a>>1;   
        if(a==0)  
        a=128;   
        delay(250);  
}  
}

键控的流水灯:
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char

void delay(uint i)
{
              uchar t;
              data uchar b=0xfb;
              while(i--)
              {
                            if(P2==0xfe) b=0xfe;
                            if(P2==0xfd) b=0xfd;
                            if(P2==0xfb) b=0xfb;
                            for(t=0;t<120;t++);
              }
}            
void main()
{
              data uchar a;
              a=1;
              while(P2==0xfe)
              {
                            P0=~a;
                            a=a<<1;
                            if(a==0)
                                          a=1;
                            delay(250);
                            while(P2==0xff)
                            {
                                          P0=~a;
                                          a=a<<1;
                                          if(a==0)
                                          a=1;
                                          delay(250);
                            }
              }
              a=128;
              while(P2==0xfd)
              {
                            P0=~a;
                            a=a>>1;
                            if(a==0)a=128;
                            delay(250);
                            while(P2==0xff)
                            {
                                          P0=~a;
                                          a=a>>1;
                                          if(a==0)a=128;
                                          delay(250);
                            }
              }
              while(P2==0xfb)
              {P0=0xff;}
}
  • 实验截图
图1.3基本的流水灯
图2.1简单的键控流水灯
图3.1键控流水灯(1)
图3.2键控流水灯(2)
  • 实验思考
  • 采用I/O口作为输出口时要考虑哪些因素?为什么实验装置中LED要串联一个电阻
答:电压的大小(包括它能感知的最小电压作为高电平),电流的驱动能力例如
51的p0口若作为io口使用就要加上拉电阻,不然的话高电平是高阻态的形式。
还有就是io口默认是不是作为io口,有的io口有第二功能的。LED属于发光
二极管,本身的电阻非常的小,但要接入电路时,要注意进行保护,因而要串联
一个电阻进行保护它。
  • 采用I/O口作为输口时要注意什么?键控的流水灯时为什么要在延时程序中检测是否按键?
答:当作为输出口时候就是单片机向外发出数据,或者再产生拉电流,单片机的拉电流一般要比灌电流小,基本上就能点亮2,3个LED,功率很有限,所以一般时候必须用驱动芯片来驱动单片机的外围器件!放在主程序里,每个延时周期内,只能检测按键一次,反应比较慢。放在延时程序里,检测时间间隔比较短,反应快
3、为什么延时程序要做一个函数?
答:为了提高程序的可执行度,使延时更加精确
九、实验总结
1、在C51中进行精确的延时子程序设计时,尽量不要或少在延时子程序中定义局部变量,所有的延时子程序中变量通过有参函数传递。
2、在延时子程序设计时,采用do…while,结构做循环体要比for结构做循环体好。
3、在延时子程序设计时,要进行循环体嵌套时,采用先内循环,再减减比先减减,再内循环要好

以上的Word格式文档51黑下载地址:
实验51hei流水灯.docx (390.05 KB, 下载次数: 17)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表