利用单片机外部中断实现 LED 流水灯轮流发光。通过按键输入外部脉冲产生外部中断改变流水灯的状态。有八个led灯若干个470欧姆的电阻和按键p1口进行输出帮我输出相关代码
以下是基于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 著作权归作者所有。请勿转载和采集!