51单片机通过键盘输入数值,控制流水灯的方向和速度。

1、功能描述

通过键盘输入数值,控制流水灯的方向和速度

2、实验原理

键盘输入原理: 键盘通常通过矩阵形式连接到单片机的I/O端口。当用户按下某个按键时,会改变键盘矩阵中对应行和列的电平,单片机通过检测这些变化来确定哪个按键被按下。通过编程,单片机可以根据检测到的按键信号执行相应的操作,如改变流水灯的方向或调整速度。

控制流水灯方向:中断机制的应用,中断是单片机处理异步事件的一种机制。在流水灯实验中,可以利用外部中断或定时器中断来响应键盘输入事件。当检测到按键输入时,单片机会暂停当前的流水灯程序执行,转而执行中断服务程序来处理按键事件,如改变流水灯的方向或调整速度,处理完毕后再返回到主程序继续执行。根据键盘输入的数值,C51单片机可以判断用户希望流水灯的方向是向左还是向右。例如,当输入数值1时,表示流水灯向左移动;当输入数值2时,表示流水灯向右移动。

控制流水灯速度:C51单片机内部集成了定时器/计数器,可以用来产生精确的时间延迟或者计算时间间隔。在流水灯实验中,通过设置定时器的初值和模式,可以控制每次切换LED灯状态的时间间隔,从而控制流水灯的速度。根据键盘输入的数值,C51单片机可以判断用户希望流水灯的速度是快还是慢。例如,当用户输入数值3时,表示流水灯以较快的速度移动;当用户输入数值4时,表示流水灯以较慢的速度移动。

控制流水灯的实现:流水灯是由多个LED灯组成的,它们可以按照一定的顺序依次点亮和熄灭,从而形成流水的效果。单片机通过控制每个LED灯所连接的I/O端口的高低电平,来控制LED灯的亮灭状态。通过改变控制顺序和延时时间,可以实现不同方向和速度的流水效果。

3、编程思路

·  实现了一个延时函数delay10ms,用于控制流水灯的速度。

·  实现了一个流水灯控制函数Ledrun,根据传入的参数控制流水灯的方向和速度。

·  实现了一个键盘检测函数keydown,用于检测按键输入并根据按键值设置流水灯的控制参数。

·  在main函数中,不断调用keydown函数检测按键,根据按键值keyvalue控制流水灯的方向、是否运行以及速度,并调用Ledrun函数实现流水灯效果。

4、代码

#include "reg52.h"
#include <intrins.h>

typedef unsigned char u8;
typedef unsigned int u16;
unsigned char ledlight[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 keyvalue=0;
int i=0,x=0,y=0;
unsigned char LED=0xFE;
#define GPIO_KEY P1
void delay10ms(u8 i)
{
    unsigned char a,b,c;
    for(;i>0;i--){
        for(c=1;c>0;c--)
        for(b=38;b>0;b--)
        for(a=130;a>0;a--);
    }
}
void Ledrun(int b,int c){
    if(b==0){
        P2=ledlight[i];
        
        delay10ms(c*20);
        P2=0xff;
        i++;
        if(i>7)i=0;
    }
    if(b==1){
        P2=ledlight[i];
        
        delay10ms(c*20);
        P2=0xff;
        i--;
        if(i<0)i=7;       
    }
}
void keydown()
{
  u8 a=0;       
  GPIO_KEY=0x0f;//0000 1111
  if(GPIO_KEY!=0x0f)
    {
       delay10ms(1);
       if(GPIO_KEY!=0x0f)
        {

           switch(GPIO_KEY)
              {
                 case(0x07):keyvalue=0;break;
                 case(0x0b):keyvalue=1;break;
                 case(0x0d):keyvalue=2;break;
                 case(0x0e):keyvalue=3;break;
                }
                 GPIO_KEY=0xf0;
                 switch(GPIO_KEY)
                   {
                     case(0x70):keyvalue=keyvalue;break;
                     case(0xb0):keyvalue=keyvalue+4 ;break;
                     case(0xd0):keyvalue=keyvalue+8;break;
                     case(0xe0):keyvalue=keyvalue+12;break;
                    }
                           
                    }
              while(a<30&&GPIO_KEY!=0xf0)
                 {
                    delay10ms(1);
                    a++;
                   }
                }
            }        
void main()
{    
    while(1)
    {
    
        keydown();
    if(keyvalue==1){
                x=!x;
        }
    if(keyvalue==2){
                if(y==1)y=0;
                else y=1;
        }
    if(keyvalue==3){
    if(y!=2)y=2;               
        }
        keyvalue=0;
    Ledrun(x,y*3+1);
               
        }       
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值