简易花式流水灯

先看看效果

在这里插入图片描述

具体思路

  实现流水灯的效果其实就是控制相应的I/O口,以P2为例,通过有规律的改变P2各I/O口的状态就可实现相应规律的流水灯效果,这其中需要用到与、或、异或、左移、右移等操作。
  流水灯向左闪烁点亮就是将P2最低位的1不断左移,每次左移其最低位都补0且延时一段时间,所以在初始时P2可赋值0x01
  流水灯向右闪烁点亮就是将P2最高位的1不断右移,每次右移其最高位都补0且延时一段时间,所以在初始时P2可赋值0x80
  流水灯逐个向左点亮是说在初始时,P2赋值为0x01,并将P2整体左移,每移动一次就将最低为置为1且延时一段时间。
  流水灯逐个向右点亮是说在初始时,P2赋值为0x80,并将P2整体右移,每移动一次就将最高为置为1且延时一段时间。
  流水灯两端向内点亮是结合了逐个向左和逐个向右点亮的思想,P2 低4位 逐个向左点亮, 高4位逐个向右点亮。
  流水灯由内向两端熄灭同样是结合了逐个向左和逐个向右点亮的思想,P2 低4位逐个向右熄灭,高4位逐个向左熄灭。
  流水灯以两个灯为主体向左移动点亮其本质也就是一个灯向左移动点亮。

程序

#include <reg51.h>#define Led	P2unsigned int time=0;	 //延时时长变量void InitTimer0(void)	 //10ms
{TMOD = 0x01;		 //定时器模式1//赋值TH0 = 0xDC;TL0 = 0x00;EA = 1;				 //开总中断ET0 = 1;			 //开定时器0中断
}void delay(unsigned int ms_10)		   //延时函数
{time=ms_10;					   //给time赋予具体延时时间的数值TR0 = 1;						   //打开定时器0while(time);					   //等待延时结束TR0 = 0;						   //关闭定时器0
}void light_water()					   //流水灯函数
{int i=0,Led_H=0,Led_L=0,temp=0x06,num=0;	 //Led_H存储P2高8位Led_L存储P2低8位Led=0x01;delay(10);//100msfor(;i < 7;i++)	  //单个左移{Led=Led<<1;							 //P2数值左移delay(10);//100ms	}for(i=0;i < 7;i++)	  //单个右移{Led=Led>>1;							 //P2数值右移delay(10);//100ms	}for(i=0;i < 7;i++)	  //依次向左点亮{Led=Led<<1|0x01;						 //P2数值左移并将最低位置为1delay(10);//100ms	}for(i=0;i < 7;i++)	  //依次向右点亮{Led=Led>>1;							 //P2数值右移,依次将位1清零delay(10);//100ms	}Led=0x00;for(i=0;i < 7;i++)	  //两端向内依次点亮{Led_L=Led<<1|0x01&0x0f;				 //取出P2的低4位,并将其左移最低位置1Led_H=((Led&0xf0)>>1)^0x80;			 //取出P2的高4位,并将其右移最高位置1Led=Led|Led_L;							 //将低4位赋予P2Led=Led|Led_H;							 //将高4位赋予P2delay(10);//100ms	}for(i=0;i < 7;i++)	  //由内向两端依次点亮{Led_L=(Led&0x0f)>>1;					 //取P2低4位并右移Led_H=(Led&0xf0)<<1;					 //取P2高4位并左移Led=Led&Led_L;							 //将低4位赋予P2Led=Led^Led_H;							 //将高4位赋予P2delay(10);//100ms	}Led=0x00;for(i=0;i < 10;i++)	  //依次向左点亮2个灯{num=Led<<1|0x01;						 //P2数值左移并最低位置1if(num>=0x06)						 //第2、3个灯亮后,以2个灯为主体向左移动{Led=num&temp;temp=temp<<1;	}else Led=num;delay(7);//100ms	}Led=0x00;temp=0xc0;for(i=0;i < 10;i++)	  //依次向右点亮2个灯{num=Led>>1|0x80;						//将P2数值右移并最高位置1if(num>=temp)					    	//第6、7个灯亮时以两个灯为整体向右移动{Led=num&temp;temp=temp>>1;}elseLed=num;delay(7);//100ms	}
}void main(void)
{InitTimer0();			 //定时器初始化while(1){light_water();}
}void Timer0Interrupt(void) interrupt 1
{TH0 = 0xDC;TL0 = 0x00;time--;if(time < 0){time = 0;			  //time为0时不在减}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32——直流电机PI调速

所需元件 STM32F103开发板、L298N一个、带编码器的直流电机一个&#xff08;如下图所示&#xff0c;淘宝上有很多&#xff09; 系统框图 通过系统框图&#xff0c;我们需要做两件事&#xff0c;一是要测速&#xff0c;二是要调节。测速目前流行的就是通过编码器测速&#xff…

JAVA设计模式--简单介绍

2019独角兽企业重金招聘Python工程师标准>>> &#xfeff;一、简介 Design pattern 是众多软件开发人员经过漫长的试验和错误总结出来的在软件开发过程中面临一般问题的解决方案&#xff0c;代表着最佳实践。使用设计模式是为了重用代码、让代码更容易被他人理解、保…

为什么是PID控制

在进入正式话题之前需要引入四个概念&#xff1a;稳态误差、终值定理、幅角条件和系统稳定的充要条件。 稳态误差&#xff1a;系统达到稳定状态后&#xff0c;系统的实际输出量与系统希望的输出量之间的偏差。 终值定理&#xff1a;设有连续函数f(t)f(t)f(t)&#xff0c;当t趋于…

卡尔曼滤波器推导

注&#xff1a;受控制领域大牛CAN博士启发&#xff0c;受益匪浅&#xff0c;作此文以为笔记。 简介 设 卡尔曼滤波器是从测量值ZZZk的平均数开始的。开始推导&#xff1a; 由上式可知   也就是说随着kkk的增大&#xff0c;测量结果Zk不在重要&#xff0c;因为已经获得了足…

cocos2dx3.2文件结构和代码结构

既然选定了cocos2dxlua的原生方式来开发&#xff0c;首先要确定的是使用哪个版本的cocos2dx&#xff0c;先看看github上的changelog和releasenote&#xff0c;然后在google里搜索一下&#xff0c;参考了jacky的博客http://zengrong.net/post/2100.htm&#xff0c;最终选择了coc…

改进的PID算法

位置式PID算法 位置式PIDPIDPID算法是一种比较直观的的PIDPIDPID算法&#xff0c;如系统框图中所示&#xff0c;ininin表示设定值&#xff0c;errorerrorerror表示差值&#xff0c;uuu表示控制器输出值&#xff0c;outoutout表示被控量。算法表达式如下&#xff1a; 增量式PI…

几种简单电路知识汇总

这篇文章用于记录平时设计电路或者在书中遇到的一些电路方面的知识&#xff0c;会不定期更新。就先从运算放大器开始&#xff0c;对此做个简单的介绍。 运算放大器 说到运算放大器就不得不说两个概念&#xff0c;虚短与虚断。 虚短&#xff1a; 在理想情况下&#xff0c;运算…

51单片机——交通灯

原理图 功能描述 1、基本功能就是如同红绿灯一般&#xff0c;不做赘述。   2、红灯时长和绿灯时长可通过按键设置&#xff0c;即按键列中的上面4个&#xff0c;当这4个按键有一个按下后便进入时长设置功能&#xff0c;设置完成后按最下面两个按键&#xff08;紧急控制按钮&am…

设置TextField内文字距左边框的距离

2019独角兽企业重金招聘Python工程师标准>>> //设置文本框左边的viewUITextField *textField [[UITextField alloc]init];textField.frame CGRectMake(10, 30, 300, 30);[self.view addSubview:textField];textField.leftView [[UIView alloc]initWithFrame:CGRe…

类的三大特性

类有三大特性&#xff1a;继承&#xff0c;封装&#xff0c;多态&#xff0c;这个也是介绍类的时候&#xff0c;必须提到的话题&#xff0c;那么今天就来看一下OC中类的三大特性&#xff1a; 一、封装 学习过Java中类的同学可能都知道了&#xff0c;封装就是对类中的一些字段&a…

操作系统抢占式优先级调度_操作系统中的优先级调度(非抢先)

操作系统抢占式优先级调度Priority scheduling is a type of scheduling algorithm used by the operating system to schedule the processes for execution. The priority scheduling has both the preemptive mode of scheduling and the non-preemptive mode of scheduling…

数据结构pta选择判断复习

第一章绪论 1-3数据的逻辑结构是指数据的各数据项之间的逻辑关系。 错 是数据元素之间的逻辑关系 2-4以下属于逻辑结构的是&#xff08; &#xff09;。 (2分) 顺序表 散列表 有序表 单链表 有序表 2-12以下关于数据结构的说法中正确的是____。 (2分) A数据结构的逻辑结构独立于…

粗略的看JFinal的基于AOP的拦截器的实现

2019独角兽企业重金招聘Python工程师标准>>> 简单的说一下AOP的实现&#xff0c;所谓AOP&#xff0c;即&#xff08;Aspect Oriented Programming&#xff09;的缩写&#xff0c;体现在程序中就是你可以通过配置在任意的代码块前后插入你想插入的执行代码。例如日志…

大二上数据结构复习

目录 第一章绪论练习 第二章线性表 第三章栈和队列 第四章串 第五章数组和广义表 第六章树和二叉树 第七章图 第九章查找 第十章排序 第一章绪论练习 1-8 数据结构的抽象操作的定义与具体实现有关。 (1分) T F 1-14 数据结构包括数据对象集以及它们的逻辑结构和物理结构&#…

大二上数据结构复习2

第二章线性表 综合 一、在什么情况下用顺序表比用链表好 表长度确定&#xff0c;很少进行插入删除操作且经常访问元素 二、2-4 顺序表的插入和删除要求仍然保持各个元素原来的次序。设在等概率情形下, 对有 127 个元素的顺序表进行插入, 平均需要移动多少个元素? 删除一个元素…

操作系统(王道笔记第二章)

目录第二章 2.1_1进程的定义、组成、组成形式、特征 2.1_2进程的状态与转换 2.1_3进程的控制 2.1_4进程通信 2.1_5线程概念和多线程模型 2.2_1处理机调度的概念层次 2.2_2处理机调度的时机、切换与过程、方式 2.2_3调度算法的评价指标 2.2_4FCFS、SJF、HRRN调度算法 2.2_5时间片…

C语言画图形(图形库graphics的使用)

目录 工具 c语言基本绘图 文字输出 c语言基本贴图 获取鼠标、键盘信息 工具 &#xff08;1&#xff09;环境&#xff1a;VC &#xff08;2&#xff09;库函数&#xff1a;graphics.h&#xff08;因为不是标准库函数&#xff0c;所以需下载EASYX&#xff09; &#xff08;3&am…

关于DDD中Domain的思考

2019独角兽企业重金招聘Python工程师标准>>> 本文既不推销UML&#xff0c;也不推广DDD&#xff0c;更不涉及各种论战。-- 作者 某天又一次打开关于DDD(领域驱动设计)的PDF文档时&#xff0c;自己有了个疑问&#xff1a;什么是领域(Domain)&#xff1f;译文中是这样描…

算法设计TSP问题动态规划

#include <iostream> #include <cmath> using namespace std; //集合虚拟化用000 、001 、010 、011 、100 、101 、110 、111分别表示{} 、{1}&#xff08;V[2^(1-1)]&#xff09; 、{2}&#xff08;V[2^(2-1)]&#xff09; 、{1,2}&#xff08;V[2^(1-1)2^(2-1)]…

字符串使用与内部实现原理

Redis 发展到现在已经有 9 种数据类型了&#xff0c;其中最基础、最常用的数据类型有 5 种&#xff0c;它们分别是&#xff1a;字符串类型、列表类型、哈希表类型、集合类型、有序集合类型&#xff0c;而在这 5 种数据类型中最常用的是字符串类型&#xff0c;所以本文我们先从字…