node.js jsp 主从复制 extjs drupal threejs linktosql swiftui NEJ vue router vue动态绑定class ios视频教程 jmeter性能测试视频 jquery循环 oracle重命名表名 python学习 python3教程 python中文手册 python文件操作 python入门指南 python做界面 python安装模块 java正则匹配 java例子 javase教程 java搭建 randomjava java集成开发环境 怎么安装linux系统 linux系统安装教程图解 超级煎蛋卷 matlab2016a安装教程 gtx1030 主板排名天梯图 vnc客户端 深入浅出通信原理 html特殊符号 dnf刷什么图赚钱 给视频加字幕的软件 文章查重软件
当前位置: 首页 > 学习教程  > 编程语言

基于c51的节日彩灯控制器的设计

2021/2/13 17:13:30 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

基于c51的节日彩灯控制器的设计 学完c51(其实是c52,功能上没多大区别),找些课程设计题目做做,看看有无大佬有更好的方法来讨论讨论。一、设计要求 制作一个节日彩灯控制器,通过按下不同的按键来控制LED发光…

基于c51的节日彩灯控制器的设计

学完c51(其实是c52,功能上没多大区别),找些课程设计题目做做,看看有无大佬有更好的方法来讨论讨论。

一、设计要求

	制作一个节日彩灯控制器,通过按下不同的按键来控制LED发光二极管(由上到下排列)的点亮规律,在P1.0~P1.3引脚上接有4个按键k0~k3,各按键功能如下;
	(1)k0:开始,按此键彩灯开始由上向下流动显示。
	(2)k1:停止,按此键彩灯停止流动显示,所有灯为暗。
	(3)k2:由上向下,按此键则彩灯由上向下流动显示。
	(4)k3:由下向上,按此键则彩灯由下向上流动显示。
	彩灯运行的初始状态是彩灯由上向下流动显示。

二、代码

头文件 fesitival.h

#ifndef _FESTIVALLED_H
#define _FESTIVALLED_H

#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint
#define uint unsigned int
#endif

#include "reg52.h"
#define GPIO_PORT_LED P2 //定义led输出引脚

extern uchar value;  //用来保存按键状态

sbit key0 = P3^1;
sbit key1 = P3^0;
sbit key2 = P3^2;
sbit key3 = P3^3; //定义按键引脚,用的板子,4个按键的引脚和题目不一样,但问题不大

void delay(uint i);
void keyscan();

#endif

主要功能文件

#include "festivalled.h"

uchar value;

void delay(uint i)
{
	while(i--);
}

void keyscan()//保存按键状态
{
	if((key0==0)|(key1==0)|(key2==0)|(key3==0))
	{
		 delay(500); //消抖
		 if((key0==0)|(key1==0)|(key2==0)|(key3==0))
		{
			 if(key0==0)
				 value=0;
			 else if(key1==0)
				 value=1;
			 else if(key2==0)
				 value=2;
			 else if(key3==0)
				 value=3;
		}
	}
}

main函数

#include "reg52.h"
#include "festivalled.h"
#include "intrins.h"

uint mark=0; //重置判断标记

void main()
{
	while(1)
	{
		keyscan();
		if(value==0)
		{
			if(mark==0)//当按下key1,所有灯熄灭后,再按下key0时,彩灯运行状态重置
			{
				GPIO_PORT_LED=0xfe; //1111 1110
				mark=1;
				delay(50000);
			}
			else 
			{
				GPIO_PORT_LED=_crol_(GPIO_PORT_LED,1);
				delay(50000);
			}
		}
		else if(value==1)
		{
			P2=0xff;
			mark=0; //重置标记置零,下一次按key0时重置
		}
		else if(value==2)
		{
			GPIO_PORT_LED=_crol_(GPIO_PORT_LED,1);
			delay(50000);
		}
		else if(value==3)
		{
			GPIO_PORT_LED=_cror_(GPIO_PORT_LED,1);
			delay(50000);
		}
	}
}

三、说明

(1)这个代码最大的问题是:按键不能及时响应。在led闪烁的延时期间,按下按键,不会立刻响应,所以可能需要稍稍长按按键才会切换状态。
(2)上述的问题感觉可以用外部中断来解决,但是c51只有两个外部中断引脚,所以就没有采用。
(3)欢迎大佬在评论区分享更好的方法

本文链接: http://www.dtmao.cc/news_show_700093.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?