单片机应用,一个键多次按下,能够依次控制红黄蓝绿四个灯控制第一次按下亮红灯然后绿灯依次四下

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单片机应用,一个键多次按下,能够依次控制红黄蓝绿四个灯控制第一次按下亮红灯然后绿灯依次四下相关的知识,希望对你有一定的参考价值。

单片机应用,一个键多次按下,能够依次控制红黄蓝绿四个灯控制第一次按下亮红灯然后绿灯依次四下再第五次按下交替闪烁,松开够都熄灭

参考技术A #include<reg52.h>
typedef unsigned char uint8_t; //定义数据类型
sbit key0 = P3^2;//按键对应的引脚,根据实际情况修改。
sbit led0 = P1^0;//LED 对应的引脚,根据实际情况修改。
sbit led1 = P1^1;
sbit led2 = P1^2;
sbit led3 = P1^3;
#define LED_ON 0 //低电平亮灯,根据实际情况修改。
#define LED_OFF (!LED_ON)
bit changeByKey; //换灯标志位
uint8_t cnt;//亮灯状态寄存器
void delay()//短延时函数

uint8_t i = 200;
while(-- i);

main()

key0 = 1;
changeByKey = 0;
led0 = LED_ON;
led1 = LED_OFF;
led2 = LED_OFF;
led3 = LED_OFF;
while(1)

delay();
if(key0)//如果按键松开

changeByKey = 1;//按键控制换灯
led0 = LED_OFF; //全部熄灭
led1 = LED_OFF;
led2 = LED_OFF;
led3 = LED_OFF;

else//按下

if(changeByKey)//松开下次按下才能再次生效

changeByKey = 0;
cnt ++;
switch(cnt & 3)

case 0:
led0 = LED_ON; //亮灯
break;
case 1:
led1 = LED_ON;
break;
case 2:
led2 = LED_ON;
break;
case 3:
led3 = LED_ON;
break;




参考技术B 一个键多次按下,能够依次控制红黄蓝绿四个灯控制。
第一次按下亮红灯
然后绿灯
依次四下
再第五次按下交替闪烁,松开够都熄灭。

单片机原理及其应用——单片机控制按键依次点亮8只发光二极管

一、实验要求

【实验目的】
1、了解独立按键的机械原理;
2、掌握独立按键的程序识别方法。
【实验内容】
通过按键依次点亮8只发光二极管,实现按下按键时第一只发光二极管点亮,依次至第八只发光二极管点亮。

二、Proteus仿真软件画原理图

原理图和之前八只单片机控制8只发光二极管交替闪烁的电路差不多,对之前的电路图修改,只不过加了按键以及更换了单片机输入/输出口,电路图如下:

其中R3电阻的电阻值为10k,其作用是作为上拉电阻,当按键没有按下时,将不确定的输入信号通过一个电阻钳位在高电平,同时它也起到限流的作用,避免流入单片机接口的电流过大,其一般取值为4.7-10k欧姆。
若要将按键置于P0口,则需在单片机P0.0口处外接上拉电阻,因为P0口内部没有上拉电阻。

三、Keil编程软件编写程序

之前的实验并未说明实物现象的结果与仿真图是相反的,所以我们反着写程序这样更便于观察现象,也就是单片机控制按键依次点亮8只发光二极管反过来就是单片机控制按键依次熄灭8只发光二极管,原来是要通过一个数组使数组内的元素,数组内存储各端口输出高低电平状态组成的十六进制数据,转换为二进制就对应每个灯的点亮和熄灭,即unsigned char LED[]=0x01,0x02,0x04,0x08,0x10, 0x20,0x40,0x80改为unsigned char LED[]=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,然后我们的延时函数设置10ms,即delay(10),之前的实验有说明这里不再详述。

写了两套程序,都是可以运行的,第一套程序是通过数组每次a++进而取数组中的元素,从而实现按键对8只发光二极管操作,程序代码如下:

#include<reg51.h>
sbit Button=P2^0;
unsigned char LED[]=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;
unsigned char a;
void delay(unsigned int x)

	unsigned int i,j;
	for(i=0;i<x;i++)
		for(j=0;j<125;j++);

void main()

	P1=0xff;
	a=0;
	while(1)
	
		if(Button==0)
		
			delay(10);
			while(Button==0)
				P1=LED[a];
			a++;
		
			if(a==9)
			break;
	

第二套程序是通过switch语句,也是通过num++,按键按下实现按键对8只发光二极管操作,程序代码如下:

#include<reg51.h>
sbit Button=P2^0;
void delay()

	unsigned int i,j;
	for(i=0;i<100;i++)
		for(j=0;j<125;j++);

void main()
 
	char num;
	while(1)
	
		if(Button==0)
 		
 			delay();
 			if(Button==0)
 			while(!Button);
 			num++;
 			if(num>8)
				num=0;
		
		switch(num)
		
			case 1:P1=0xfe;break;
			case 2:P1=0xfd;break;
			case 3:P1=0xfb;break;
			case 4:P1=0xf7;break;
			case 5:P1=0xef;break;
			case 6:P1=0xdf;break;
			case 7:P1=0xbf;break;
			case 8:P1=0x7f;break;
		
	

四、实验结果

(一)仿真结果

仿真结果和实际结果是相反的,所以仿真结果一开始所有灯是点亮的:

按下按键,第一只发光二极管熄灭:

……依次,按下按键,到第八只发光二极管熄灭:

(二)连接电路

将单片机P2.0口与独立按键模块K1按键连接以及单片机P1.0-P.1.7口与LED&交通灯模块排线连接在一起(注意不要接反),连接图如下:

(三)烧录并观察实验现象

烧录之后一开始所有灯是熄灭的,当按下按键时,第一只发光二极管点亮,如图:

再点一次,第一只发光二极管熄灭,第二只发光二极管点亮,如图:

再点一次,第二只发光二极管熄灭,第三只发光二极管点亮,如图:

……依次到第八只发光二极管点亮,如图:

结语

感谢您的阅读和支持,若程序代码和其它方面有不当之处,当指出!您的指出和建议能给作者带来很大的动力!!!

以上是关于单片机应用,一个键多次按下,能够依次控制红黄蓝绿四个灯控制第一次按下亮红灯然后绿灯依次四下的主要内容,如果未能解决你的问题,请参考以下文章

基于单片机的彩灯控制器系统设计-多模式彩灯-毕设课设资料

用单片机设计简易计算器

python中红绿黄蓝的顺序

单片机原理及其应用——单片机定时器中断实验(八段数码管依次显示0~9数字)

OpenCV简易手势识别

Android:图解四种启动模式 及 实际应用场景讲解