51单片机实现用按键控制led的闪与不闪

51单片机实现用按键控制led的闪与不闪,第1张

while(1)

{

if(num>=20)

//num==20最好改成 >=20 防止由于按銉延时而错过num==20的机会而使程序出现长时的混乱

{

num=0;

led1=~led1;

led2=~led2;

}

if (KEY==0)//按键是否按下

延时10-20MS;

while(KEY==0);//按键是否抬起

if (TR0==1)TR0=0:

else TR0=1:

}

}

也可以用开关中断来实现

如果按键不听使唤,在if (KEY==0)后大括号里的延时语句后再加一次if (KEY==0)判断

按键控制LED闪烁,状态机就是检测按键,如果没有按下就不闪烁,如果按下就开始闪烁。楼主提的问题就是一个问题。你到底是想问状态机还是想问程序?

“用单片机C语言怎么写用状态机,实现按键控制LED灯闪烁,这个程序”

“用单片机C语言怎么写,用状态机实现,按键控制LED灯闪烁这个程序”

???

#include<reg51h>

unsigned char n = 0;

sbit key = P3^4;

sbit led = P1^0;

void delay()

{

unsigned int i, j;

for(i = 0; i < 100; i++) for(j = 0; j < 500; j++);

}

void readkey(void)

{

unsigned char i, j;

if(!key) {

for(i = 0; i < 10; i++)

for(j = 0; j < 120; j++); //延时消抖

if(!key) {

while(!key); //等待按键释放

n++;

n %= 4; //n = 0~3

}

}

}

main()

{

while(1) {

switch(n) {

case 0: led = 1; readkey(); break; //熄灭

case 1: delay(); readkey(); //慢速闪烁

case 2: delay(); readkey(); //中速闪烁

case 3: delay(); readkey(); led = ~led; //快速闪烁

}

}

}

你这个程序死循环了,我一点一点给你纠正:

1 你有个不好的习惯,希望你改正:

定义变量的时候,请明确的指明变量的类型:unsigned char i,或者unsigned int i

而不要是unsigned i,这是不好的习惯。

2 你的这个地方是个死循环:

for(j=7;j>=0;j--)

{

led=(temp>>=1);

yanshi(50);

}

因为你的j定义的是unsigned 类型,所以,j永远都会是非负数,所以,你的for循环会一直进行,修改如下:

for(j=7;j>0;j--)

{

led=(temp>>=1);

yanshi(50);

}

3 看你的while(1)循环里:

while(1) {

if(kaiguan==0) yanshi(20);

if(kaiguan==0)

{

kaideng();

}

if(kaiguan!=1)

{led=0xff;}

}

你这样写,我问你 if(kaiguan==0)和if(kaiguan!=1)有什么区别吗?

LED BIT P10

KEY BIT P11

ORG 0000H

LJMP MAIN

ORG 0030H

MAIN:

    CLR 00H

MAIN1:

    JB KEY,LOOP

    JNB KEY,$

    CPL 00H

LOOP:

    JNB 00H,LOOP1

    CPL LED

    LCALL DELAY

    SJMP MAIN1

LOOP1:

    SETB LED

    SJMP MAIN1

DELAY:

    MOV R2,#200

DLY:

    MOV R3,#250

    DJNZ R3,$

    DJNZ R2,DLY

    RET

    END

C语言实现LED灯闪烁控制配套51单片机开发板。

#include    //包含单片机寄存器的头文件

/

函数功能:延时一段时间

/

void delay(void)        //两个void意思分别为无需返回值,没有参数传递。

{

unsigned int i;       //定义无符号整数,最大取值范围65535。

for(i=0;i<20000;i++)  //做20000次空循环。

;               //什么也不做,等待一个机器周期。

}

/

函数功能:主函数 (C语言规定必须有也只能有1个主函数)。

/

void main(void)

{

while(1)      //无限循环。

{

P0=0xfe;   //P1=1111 1110B, P00输出低电平。

delay();   //延时一段时间。

P0=0xff;   //P1=1111 1111B, P00输出高电平。

delay();  //延时一段时间。

}

}

单片机驱动LED灯的源程序:

#include<reg52h> //头文件。

#define uint unsigned int

#define uchar unsigned char

sbit LED1=P1^7; //位定义。

void delay_ms(uint);//mS级带参数延时函数。

void main()

{

while(1)

{

LED1=0;

delay_ms(1000);

LED1=1;

delay_ms(1000);

}

}

void delay_ms(uint z) //延时子程序

{

uint x,y;

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

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

}

扩展资料:

单片机应用分类:

通用型:

这是按单片机(Microcontrollers)适用范围来区分的。例如,80C51式通用型单片机,它不是为某种专门用途设计的;专用型单片机是针对一类产品甚至某一个产品设计生产的,例如为了满足电子体温计的要求,在片内集成ADC接口等功能的温度测量控制电路。

总线型:

这是按单片机(Microcontrollers)是否提供并行总线来区分的。总线型单片机普遍设置有并行地址总线、 数据总线、控制总线,这些引脚用以扩展并行外围器件都可通过串行口与单片机连接。

另外,许多单片机已把所需要的外围器件及外设接口集成一片内,因此在许多情况下可以不要并行扩展总线,大大减省封装成本和芯片体积,这类单片机称为非总线型单片机。

控制型:

这是按照单片机(Microcontrollers)大致应用的领域进行区分的。一般而言,工控型寻址范围大,运算能力强;用于家电的单片机多为专用型。

通常是小封装、低价格,外围器件和外设接口集成度高。 显然,上述分类并不是惟一的和严格的。例如,80C51类单片机既是通用型又是总线型,还可以作工控用。

参考资料来源:百度百科-单片机

以上就是关于51单片机实现用按键控制led的闪与不闪全部的内容,包括:51单片机实现用按键控制led的闪与不闪、用单片机C语言怎么写用状态机实现按键控制LED灯闪烁这个程序、51单片机一键控制一个LED,每按一下按键LED闪烁一种频率,共闪烁三种频率.有好的答案加等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10206055.html

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

发表评论

登录后才能评论

评论列表(0条)

保存