单片机编程有两个led灯,想让第一个闪烁五次后再让另一个亮,以此循环...

单片机编程有两个led灯,想让第一个闪烁五次后再让另一个亮,以此循环...,第1张

sdf()

{

delay(30) ;

p2_0=~p2_0;

if(++k!=10) //改为 if(++k==10)

return; // {

p0_0=0; // p00=0;

}

不用返回值 呵呵

}

  这个也求?用按键点亮LED灯这个是51入门最基础的东西,真心想学的话,买块51的开发板,都带有例程,很快就可以入门的。建议你还是多看看资料把基础的东西学好。推荐你看一下《十天学会单片机和C语言编程》的视频教程对入门还是不错的。

  三路抢答器提供你编程思路(按键扫描方式)参考,程序还是要根据你的硬件电路自己编写。

  端口配置:

  1、选择4个端口作为输入端口连接按键(独立按键,按键一端接单片机端口,另一端接地)。 三路为抢答的按键KEY1、KEY2、KEY3,一路为抢答后复位按键KEY0。

  2、选择3个端口作为输出端口连接LED灯(高电平点亮还是低电平点亮要看你电路设计)对应为LED1、LED2、LED3。

  编程思路:

  1、初始设置一个抢答键按下与否的位标志变量:bit flag = 0;(没有抢答按键按下flag = 0,有抢答按键按下flag = 1)。

  2、主程序按键扫描循环。

  3、按键按下程序KEY1、KEY2、KEY3基本相同。以KEY1为列:

  首先判断是否有抢答键按下(KEY1==0),如有抢答按键按下,延时10ms(消抖),再判断是否KEY1==0,如果KEY1==0说明KEY1抢答按键已经按下,然后再判断是否flag = =0,如果flag = =0,则点亮LED1(其他按键按下的话点亮相应的LED灯)、按键按下标志置“1”(flag = 1)。

  4、复位按键程序判断KEY0按下并且flag = =1时,关闭所有LED灯、按键按下标志复位置“0”(flag = 0)。

#include <MsTimer2h>

// 定义LED的引脚

#define LED_PIN_A 1

#define LED_PIN_B 2

// 时间定义宏

#define TM_MS(n) (n)

static uint16_t timerCntA;

static uint16_t timerCntB;

void TimerCbk (void);

void setup()

{

    pinMode(LED_PIN_A , OUTPUT);

    pinMode(LED_PIN_B , OUTPUT);

    // 设置为每1ms调用一次TimerCbk函数。

    MsTimer2::set(1, TimerCbk);

    MsTimer2::start();

}

void loop()

{

    if (timerCntA >= TM_MS(1000))

    {

        digitalWrite(LED_PIN_A, !digitalRead(LED_PIN_A));

        timerCntA = 0;

    }

    if (timerCntB >= TM_MS(3000))

    {

        digitalWrite(LED_PIN_B, !digitalRead(LED_PIN_B));

        timerCntB = 0;

    }

}

void TimerCbk (void)

{

    (timerCntA < UINT16_MAX)  (timerCntA++) : (timerCntA = 0);

    (timerCntB < UINT16_MAX)  (timerCntB++) : (timerCntB = 0);

}

检测LED闪烁周期是什么意思,就是LED自由闪烁,单片机不控制LED,仅用单片机检测它的周期吗?如果这样应该需要用到相对的器件吧,检测光的,记录LED两次发光,间隔时间就是它的周期了,如果可以,还可以检测LED电压变化,检测LED电压变化,检测电压变化的周期也就是LED闪烁的周期。我简单写一个检测LED电压的程序吧,检测光源还涉及到光敏器件,比较复杂。

#include<reg52h>

sbit led_in=P3^4; //利用计数器记录电压变化次数

usigned int num;

usigned T_led; //周期

void init()

{

TMOD=0X25; //T0方式一计数,T1方式2定时

TL1=55;

TH1=55; //定时200-55us=200us,中断一次

num=5000; //200us5000=1s

TR0=1;

TR1=1;

EA=1;

}

void test_led()

{

T_led=1/(TH0256+TL0); //定时1S,LED闪烁次数TH0256+TL0

}

void main()

{

init();

while(1);

}

void T1_p()interrupt 3

{

num--;

if(num<=0)

{

num=5000;

TR0=0;//关计数器,开始计算LED周期

test_led();

}

}

由于没有在板子上测试,程序应该还是有问题的,不过大概框架是这样了,这也只是其中一种方案,其实这样的东西方案会比较多的,你可以选一种简单的方案。

那要用到单片机咯···

#include<reg51h>

#define uint unsigned int

#define uchar unsigned char

void delay(uint );

void main()

{

while(1)

{

P1=0x7f;

delay(1000000);

P1=0xff;

delay(1000000);

}

}

void delay(uint z)

{

uint x,y;

for (x=1000000;x>0;x--)

for (y=z;y>0;y--);

}

时间自己调吧,一小时(也就是3600s)太长了,不好调试。。。

if(!KEY2)//假设按键低电平有效

{

DelayMs(5);//延时2~10ms,按键消抖

if(!KEY2);//按键仍被按下,说明不是抖动

{

LED=~LED;//自己定义一下LED到对应IO

BUZZER=~BUZZER;//定义蜂鸣器到对应IO

}

}

欢迎分享,转载请注明来源:表白网

原文地址:https://h5.hunlipic.com/biaobai/221000.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-06-29
下一篇2023-06-29

发表评论

登录后才能评论

评论列表(0条)

    保存