如何用AT89C51单片机实现八个灯两两亮,并可以用相关按钮控制,keil软件C语言程序。请帮助一下

img

img


#延时用中断程序,且要最基本的类似于学生写的。
#程序总体样式如黑板上所写的。

img

基于ChatGPT的回答:

#include<reg51.h>

sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;
sbit LED4=P1^3;
sbit LED5=P1^4;
sbit LED6=P1^5;
sbit LED7=P1^6;
sbit LED8=P1^7;

sbit START=P3^0;
sbit STOP=P3^1;
sbit PAUSE=P3^2;
sbit SWITCH=P3^3;
sbit RESET=P3^4;

void delay(int time){
    int i,j;
    for(i=0;i<time;i++){
        for(j=0;j<1275;j++);
    }
}

void main(){
    int flag=0; //标志位,用于控制灯的亮灭
    int state=0; //状态变量,用于记录系统状态
    START=1; //设置启动按钮为高电平
    STOP=1; //设置停止按钮为高电平
    PAUSE=1; //设置暂停按钮为高电平
    SWITCH=1; //设置切换按钮为高电平
    RESET=1; //设置复位按钮为高电平
    while(1){
        if(START==0){ //系统启动
            state=1; //设置系统状态为1,即启动状态
            flag=0; //初始化标志位
            LED1=LED2=LED3=LED4=LED5=LED6=LED7=LED8=0; //关闭所有灯
        }
        if(STOP==0){ //系统停止
            state=0; //设置系统状态为0,即停止状态
            flag=0; //初始化标志位
            LED1=LED2=LED3=LED4=LED5=LED6=LED7=LED8=0; //关闭所有灯
        }
        if(PAUSE==0){ //系统暂停
            state=2; //设置系统状态为2,即暂停状态
        }
        if(SWITCH==0){ //功能切换
            if(state==1){ //如果当前状态为启动状态
                flag=!flag; //标志位取反
            }
            while(SWITCH==0); //等待按钮松开
        }
        if(RESET==0){ //系统复位
            state=0; //设置系统状态为0,即停止状态
            flag=0; //初始化标志位
            LED1=LED2=LED3=LED4=LED5=LED6=LED7=LED8=0; //关闭所有灯
            while(RESET==0); //等待按钮松开
        }
        if(state==1){ //如果当前状态为启动状态
            if(flag==0){ //如果标志位为0
                LED1=LED3=LED5=LED7=1; //开启第1357个灯
                LED2=LED4=LED6=LED8=0; //关闭第2468个灯
            }
            else{ //如果标志位为1
                LED2=LED4=LED6=LED8=1; //开启第2468个灯
                LED1=LED3=LED5=LED7=0; //关闭第1357个灯
            }
        }
        delay(100); //延时
    }
}


以上程序实现了八个灯两两亮,并可以用相关按钮控制。其中,START、STOP、PAUSE、SWITCH、RESET分别为启动、停止、暂停、功能切换、复位按钮,用于控制系统状态。程序中使用了标志位和状态变量,通过判断当前状态和标志位的值,控制灯的亮灭。程序中还加入了延时函数,以控制灯的闪烁速度。

需要注意的是,以上程序只是实现了八个灯两两亮,并没有实现舞台艺术灯控制系统的具体功能,需要根据具体需求进一步完善。

以下内容部分参考ChatGPT模型:


首先,我们需要连接八个LED灯和两个按钮到单片机上。具体连接方式如下图所示:

其中,P1.0-P1.7口连接的是八个LED灯,P3.0和P3.1口连接的是两个按钮。

接下来,我们就可以编写程序了。由于需要用到延时,我们可以使用中断来实现。

首先,需要定义一些全局变量和函数:

#include <reg51.h>

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

sbit KEY1 = P3^0;   // 定义KEY1
sbit KEY2 = P3^1;   // 定义KEY2

void delay(unsigned int x);   // 延时函数
void init_interrupt(void);    // 初始化中断
void interrupt_func(void);    // 中断处理函数

然后,我们需要在主函数中初始化中断:

void main()
{
    init_interrupt();    // 初始化中断
    
    while(1)
    {
        // 等待中断发生
    }
}

接下来,我们编写延时函数和中断处理函数:

void delay(unsigned int x)
{
    unsigned int i, j;
    for(i = 0; i < x; i++)
    {
        for(j = 0; j < 114; j++);
    }
}

void init_interrupt(void)
{
    EA = 1;     // 开启总中断
    EX0 = 1;    // 开启外部中断0
    IT0 = 1;    // 设置外部中断0为下降沿触发
}

void interrupt_func(void) interrupt 0
{
    static unsigned char flag = 0;  // 定义标志位
    delay(1000);    // 延时1s,消除抖动
    
    if(KEY1 == 0)   // KEY1按下
    {
        flag = ~flag;   // 取反标志位
    }
    else if(KEY2 == 0)  // KEY2按下
    {
        flag = 0;   // 清零标志位
    }
    
    if(flag)    // 标志位为1
    {
        LED1 = LED2 = 1;
        delay(50000);
        LED1 = LED2 = 0;
        
        LED3 = LED4 = 1;
        delay(50000);
        LED3 = LED4 = 0;
        
        LED5 = LED6 = 1;
        delay(50000);
        LED5 = LED6 = 0;
        
        LED7 = LED8 = 1;
        delay(50000);
        LED7 = LED8 = 0;
    }
    else    // 标志位为0
    {
        LED1 = LED3 = LED5 = LED7 = 1;
        LED2 = LED4 = LED6 = LED8 = 0;
        delay(50000);
        
        LED2 = LED4 = LED6 = LED8 = 1;
        LED1 = LED3 = LED5 = LED7 = 0;
        delay(50000);
    }
}

最后,我们将程序烧录到单片机中,用按钮测试程序是否正常工作。


如果我的建议对您有帮助、请点击采纳、祝您生活愉快

简单问题,私我,包教会51单片机