51单片机小项目01:动态流水灯控制

要求:通过按键按下改变流水灯的方向,按下时从左到右闪烁,抬起时从右到左闪烁,任意取一个按键即可。

P2.5、P2.6、P2.7分别控制LED3、LED2、LED1,所以需要一个函数来控制灯的亮灭

void open_led(unsigned int num)
{
    P2 = 0xFF & ~(1 << num);//控制P2口特定的LED灯亮起
}

同时还要对LED以进行引脚定义

sbit LED1 = P2^7
sbit LED2 = P2^6
sbit LED3 = P2^5

需要设计一个时延(ms)

void delay_ms(unsigned int xms) //@12MHz
  {
    unsigned int i, j;
    for(i = xms; i > 0; i--)
    {
      for(j = 124; j > 0; j--)
      {}
    }
  }

接下来给按键进行引脚定义,按键所对应的引脚为P4.3,由于配置的芯片是AT89C52,<reg52.h>的头文件中没有P4引脚,于是在烧录软件中寻找额外的寄存器,此时定义引脚不会报错

​
sfr P4    = 0xe8;                   //for 89C5xRC/RD+ series and 90C5xRc/RD+, location at 0E8H
//sfr P4   = 0xc0;                  //for 90C5xAD series, location at 0C0H
sbit INT2 = P4^3;
sbit INT3 = P4^2;

sfr XICON = 0xc0;                   //for 89C5xRC/RD+ series and 90C5xRc/RD+, location at 0C0H
//sfr XICON = 0xe8;                 //for 90C5xAD series, location at 0E8H
sbit PX3  = XICON^7;
sbit EX3  = XICON^6;
sbit IE3  = XICON^5;
sbit IT3  = XICON^4;
sbit PX2  = XICON^3;
sbit EX2  = XICON^2;
sbit IE2  = XICON^1;
sbit IT2  = XICON^0;

sbit key = P4^3;

​

接下来是中断,由于接的是P4.3所以使用外部中断2,如果接的是P3.3则用外部中断1,如果接的是P3.2则用外部中断0

void exit2() interrupt 6
{
    if(key == 0){
        led_flag = LEFT;
        delay_ms(10);
    }
}

主程序

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

#define RIGHT -1
#define LEFT 1

unsigned int led_num = 5;
int led_flag = RIGHT;



void main()
{
    IT2 = 1;
    EX2 = 1;
    EA = 1;
    while(1){

        //先使小灯亮起并从右往左闪烁
        open_led(led_num);
        delay_ms(1000);
        
        //在按下时灯是从右往左闪烁的状态
        if(key == 1 && led_flag == LEFT){
            //改变闪烁方向为从左往右
            led_flag = RIGHT;
        }

        //使小灯轮流闪烁
        led_num += led_flag;

        //限制led_num在5~7之间
        if(led_num < 5)
            led_num = 7;
        else if(led_num > 7)
            led_num = 5;

    }
}

新手学习单片机,记录自己成长过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值