51单片机流水灯电路以及C代码「建议收藏」

51单片机流水灯电路以及C代码「建议收藏」流水灯是51单片机的入门级实验,以下是其电路图以及C代码流水灯proteus电路图此图发光二极管采用共阳极式连接流水灯C代码#include<reg51.h>voiddelay1s(unsignedcharn);voidMovinglight(){ unsignedcharcodeMovinglightA

大家好,又见面了,我是你们的朋友全栈君。

流水灯是51单片机的入门级实验,以下是其电路图以及C代码

流水灯proteus电路图

在这里插入图片描述

此图发光二极管采用 共阳极式连接

流水灯C代码

#include<reg51.h>
#define TIME 1
//宏定义秒数,方便更改间隔时间
void delaySec(unsigned char n);
void Movinglight();
unsigned char code MovinglightArray[] = { 
   0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char i,n = 1;
int main()
{ 
   
	Movinglight();
	return 0;
}
void Movinglight()
{ 
   
	while(1)
	{ 
   
		for(i = 0;i < 8;i++)
			P1 = MovinglightArray[i];
			delaySec(TIME);
	}
}
void delaySec(unsigned char n)
{ 
   
	unsigned int i,j,l;
	for(l = 0;l < n;l++)
		for(i = 0;i < 1000;i++)
			for(j = 0;j < 114;j++);
}/*当n为1时,误差约0.001s*/

授人以鱼不如授人以渔,在此,笔者觉得应该给大家简单剖析一下以上的代码,以方便初学者更加容易更改和理解代码。

我看代码习惯从主函数开始,相信大家大多都是这样的吧?
进入主函数:
1,调用Movinglight函数
进入Movinglight函数:
1,调用while函数,1代表死循环
2,for循环,依次给P1口赋值

初学者一般看不懂0x 加 数字,其实0x 加 数字的意思,0x就是表示后两位是16进制数。
但是单片机处理是按照二进制处理数据的。
所以我们把上述例子转化为字节(即八个二进制位)。
例如,0xfe = 1111 1110;0xfd = 1111 1101。
不要纠结0xfe或者0xfd的,对应单片机来说,P1口的值不重要,这个值包含的位才是控制单片机的关键所在,单片机只在意它所代表的二进制数的位是0还是1。

根据电路图,P1.7对应二进制数的最高位,P1.0对应二进制数的最低位。
拿0xfe举例大家就能更好地理解了。
0xfe = 1111 1110。
分解开来实际上是:
P1.0 = 0
P1.1 = 1
P1.2 = 1
P1.3 = 1
P1.4 = 1
P1.5 = 1
P1.6 = 1
P1.7 = 1

最低位为0,其余为均为1。

那么0和1有什么含义?
以本实验为例,在单片机通电的情况下:
P1.0 = 0 表示这个引脚处为低电平
其余引脚处则是高电平。

那什么是高低电平呢?
说白了就是高低电势。
其实我认为说成高低电势更容易为广大读者理解。
高低电平是相对的,比如5V相对于0V 是高电平,但是相对于10V 又是低电平。
但是圈子里的所有书都是说电平的。
一般情况下,单片机是5V和0V。
一端高电平,一端低电平才能形成电压,发光二极管才能点亮。两边都是高电平或者两边都是低电平发光二极管都不能被点亮。

通常情况下,通电情况下单片机引脚默认为高电平。

由于发光二极管正极连接公共正电压源,所以只有位为0时,灯才会亮。

以上内容如果有什么谬误,敬请指正。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/135184.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Vue router2.0

    Vue router2.0对于单页面来说路由是我们常用切换页面的一种方式,使用Vue安装npminstallvue-router–save路由的引入importrouterfrom’./router’/*eslint-disableno-new*/newVue({el:’#app’,store,router,components:{App},template:'<App/>’})路由的配置通过和也可以实现我们像a标签一样

    2022年7月11日
    16
  • java标识符可以$开头吗_JAVA标识符

    java标识符可以$开头吗_JAVA标识符JAVA标识符JAVA标识符简介Java语言中,对于变量,常量,函数,语句块也有名字,我们统统称之为Java标识符。也就是程序员在定义java程序时,自定义的一些名字,例如helloworld程序里关键字class后跟的Demo,就是我们定义的类名。类名就属于标识符的一种。标识符除了应用在类名上,还可以用在变量、函数名、包名上。(要求同学们先记住,以后会详细见到这些)。标识符命名规则1.标识符由…

    2022年7月26日
    14
  • java从入门到精通_Java 入门到精通的过程

    java从入门到精通_Java 入门到精通的过程有读者留言说:“希望能写写前期阶段程序员的发展经历。”收到这个问题后确实引发了我的一些回忆和思考,回想如果让我再重走一遍过来的路,在哪些方面还需要去改善呢?以前并没有提及如何去做才能更好更快的发展成长,所以本篇借用了一个大家耳熟能详的名称模式,从一个稍微高一层的抽象维度来回答How的问题。定位还记得当初为什么选择程序员这个职业么?如今程序员所在的行业处于发展上升期,薪酬待遇整体高于传统行业,…

    2022年7月8日
    21
  • MATLAB实现线性插值interp1的功能

    MATLAB实现线性插值interp1的功能1.关于插值插值,它根据已知的数据序列(也可以理解为坐标中一连串离散的点),找到其中的规律;然后根据找到的这个规律,来对其中尚未有数据记录的点进数值的估计。2.关于线性插值线性插值是一种针对一维数据的插值方法,它根据一维数据序列中需要插值的点的左右邻近两个数据点来进行数值的估计。当然了它不是求这两个点数据大小的平均值(当然也有求平均值的情况),而是根据到这两个点的距离来分配它们的比重的。而对于一些边缘处的点也需要使用到外插:即通过找出最近的两个点,通过建立该两点之间的一元一次线性方程通过带入x即可以得

    2022年5月20日
    29
  • 再见PowerDesigner,这款国人开源的数据库设计工具Chiner真香

    再见PowerDesigner,这款国人开源的数据库设计工具Chiner真香再见PowerDesigner,这款国人开源的数据库设计工具Chiner真香当我们在项目开发初期时,往往需要设计大量的表,此时使用数据库设计工具就会比较高效!今天给大家推荐一款国人开源的数据库设计工具chiner,界面漂亮,功能强大,希望对大家有所帮助!回顾PowerDesigner相信平时工作中,大家或多或少会使用PowerDesigner来设计数据库,感觉这款工具界面有点古老,界面看着就具年代感,有时候用起来也比较重,来看下之前使用它设计数据库的效果。最近体验了一把chiner,设计数据库

    2022年7月27日
    7
  • DHCP option82字段「建议收藏」

    DHCP option82字段「建议收藏」DHCPoption82字段的添加1.添加option82字段1.添加option82字段option82是dhcp报文中的中继代理信息选项(relayagentinformationoption),抓取上行的dhcp报文,根据目的端口为67的报文进行处理,解析报文,在原始报文的基础上添加option82字段,添加之后进行ip,udp的重新校验值的计算,然后发往PON口。温馨提示:以上文章描述如有不清晰之处,欢迎在评论区评论,如有时间,会第一时间回复,谢谢!…

    2022年10月16日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号