以下是基于8051单片机的流水灯轮流发光程序,通过P1口控制LED灯的亮灭,同时通过外部中断改变流水灯的状态:

#include <reg52.h>

sbit button = P3^2; // 定义按键接口
sbit led1 = P1^0; // 定义LED1接口
sbit led2 = P1^1; // 定义LED2接口
sbit led3 = P1^2; // 定义LED3接口
sbit led4 = P1^3; // 定义LED4接口
sbit led5 = P1^4; // 定义LED5接口
sbit led6 = P1^5; // 定义LED6接口
sbit led7 = P1^6; // 定义LED7接口
sbit led8 = P1^7; // 定义LED8接口

unsigned char led_state = 0x01; // 初始化LED状态

void delay(unsigned int t) // 延时函数
{
    unsigned int i, j;
    for(i=0; i<t; i++)
        for(j=0; j<120; j++);
}

void ISR_button() interrupt 0 // 中断服务函数
{
    delay(10); // 延时去抖动
    if(button == 0) // 判断按键是否按下
    {
        led_state <<= 1; // 改变LED状态
        if(led_state == 0x00) // 如果LED状态变为0,重新开始
            led_state = 0x01;
    }
}

void main()
{
    EA = 1; // 全局中断使能
    EX0 = 1; // 外部中断0使能
    IT0 = 1; // 边沿触发
    while(1)
    {
        led1 = (led_state & 0x01) ? 0 : 1; // 控制LED1亮灭
        led2 = (led_state & 0x02) ? 0 : 1; // 控制LED2亮灭
        led3 = (led_state & 0x04) ? 0 : 1; // 控制LED3亮灭
        led4 = (led_state & 0x08) ? 0 : 1; // 控制LED4亮灭
        led5 = (led_state & 0x10) ? 0 : 1; // 控制LED5亮灭
        led6 = (led_state & 0x20) ? 0 : 1; // 控制LED6亮灭
        led7 = (led_state & 0x40) ? 0 : 1; // 控制LED7亮灭
        led8 = (led_state & 0x80) ? 0 : 1; // 控制LED8亮灭
        delay(500); // 延时0.5秒
    }
}

上述程序中,我们首先定义了8个LED灯的接口和一个按键的接口,并初始化了LED状态为1。然后在主函数中,我们通过控制P1口的输出来控制LED灯的亮灭,并延时0.5秒。在中断服务函数中,我们通过按键输入外部脉冲产生外部中断改变LED的状态。具体来说,当按键按下时,我们将LED状态左移一位,如果LED状态变为0,重新开始。最后,我们使能外部中断0并设置为边沿触发,实现了通过按键控制LED流水灯的轮流发光


原文地址: http://www.cveoy.top/t/topic/fd9z 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录