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
}
}
欢迎分享,转载请注明来源:表白网
评论列表(0条)