建材秒知道
登录
建材号 > 设计 > 正文

如何用单片机简单制作一个流水灯

积极的星星
爱笑的红酒
2023-02-16 17:44:46

如何用单片机简单制作一个流水灯

最佳答案
威武的鲜花
个性的柜子
2026-05-05 10:50:01

工具:STC系列51单片机、串口转换器(USB转TTL 或232转TTL)

材料:实验板一块(可以买现成的,也可以买面包板自己搭建),电阻、LED灯 若干,5V电源等。

以下程序可以直接用Keil C 直接编译执行。

//可以通过左移函数_crol_()和右移函数_cror_()来实现LED等的来回流动。

//具体实现方法可以参考如下程序:

 

#include <reg51.h>

#include <intrins.h>

#define uint unsigned int

#define uchar unsigned char

void delay(uint a)

void main()

{

P1=0xfe

while(1)

{

// 向左循环点亮LED

for(i=0 i<7 i++)

{

P1=_crol_(P1,1)  // 左移一位,点亮下一位LED

delay(55)

}

// 向右循环点亮LED

for(i=0 i<7 i++)

{

P1=_cror_(P1,1) // 右移一位,,点亮上一位LED

delay(55)

}

}

}

// 延时函数,延时a毫秒

void delay(uint a)

{

uint x,y

for(x=ax>0x--)

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

}

最新回答
甜甜的香菇
英勇的巨人
2026-05-05 10:50:01

单片机流水灯C语言程序的源代码如下:

#include //51系列单片机定义文件

#define uchar unsigned char //定义无符号字符

#define uint unsigned int //定义无符号整数

void delay(uint)//声明延时函数

void main(void)

{

uint i

uchar temp

while(1)

{

temp=0x01

for(i=0i<8i++) //8个流水灯逐个闪动

{

P1=~temp

delay(100)//调用延时函数

temp<<=1

}

temp=0x80

for(i=0i<8i++) //8个流水灯反向逐个闪动

{

P1=~temp

delay(100)//调用延时函数

temp>>=1

}

temp=0xFE

for(i=0i<8i++) //8个流水灯依次全部点亮

{

P1=temp

delay(100)//调用延时函数

temp<<=1

}

temp=0x7F

for(i=0i<8i++) //8个流水灯依次反向全部点亮

{

P1=temp

delay(100)//调用延时函数

temp>>=1

}

void delay(uint t) //定义延时函数

{

register uint bt

for(tt--)

for(bt=0bt<255bt++)

}

扩展资料

51单片机流水灯的源代码如下

#include<reg51.h>

#include<intrins.h>

void delay(int a)

{

int i

while(a--)for(i=0i<110i++)

}

main()

{

int i

while(1)

{

P0=0xfe

for(i=0i<8i++)

{

P0=_crol_(P0,1)

delay(500)

}

}

}

整齐的荷花
忧伤的豆芽
2026-05-05 10:50:01
因为电路用单片机控制,所以电路非常简洁。其电路原理图见下图,印制板图如下图所示。

电路的核心部分是AT89C2051单片机,前面提到它有Pl和P3两组I/O口,我们这里只用到Pl口,共8个引脚。图中Cl、R9组成典型的上电复位(即在加电时单片机复位)电路,XTAL、C2、C3与AT89C2051片内振荡电路组成时钟振荡器。值得注意的是,C2、C3的容量不能与图中数值偏差太大,否则可能引起不起振或振荡不稳定。XTAL的频率可以在4-20MHz之间,不过,频率的变化会导致程序运行速度的变化,这样就需要调整延时子函数的参数。事实上,不调整参数亦可,只是此时延迟时间不再是1秒,其延迟时间会随着XTAL频率的降低而增加。

二、软件部分

本程序包含两个函数,一个是主函数,另一个是延时子函数。源程序如下(为了便于讲解,我们为每行程序加上了编号):

程序各行作用如下:

00行:把AT89C2051的头文件“AT89x051.H”包含进来。

01行:声明Delay()延时子函数,该函数有一个无符号整型参数k,同时函数前面的void表明函数不返回函数值。

02行:延时子函数的开始,同时声明两个无符号整型变量i和j。

不过请注意,这里没有象上期的程序一样,把表示函数开始的“{”单独成行,而是把下一行写在一起了。事实上,写C程序的时候,可以把多行写作一行,C编译器只要遇到分号就认为是一行语句的结束。

当然,我们不能因为C程序有这个特点,就随意把多行合作一行书写,实际书写C程序的时候,还是要养成良好的程序书写习惯,按照约定俗成的原则来书写。

03行:声明for()循环。这个循环的初始条件是i=0,终止条件是i<k,循环计数是每循环一次,用手计数的变量i加1。因此,这个循环的循环次数就是k次。这样,只要改变k的值(即改变Delay()延时子函数的参数k的值),就可以很容易地控制循环次数,从而获得不同的延时时间。

04行:声明嵌套在03循环中的一个新的for()循环,这个循环与上一个循环相似,其循环次数是120次。本循环与上一个循环嵌套后,使得总的循环次数达120×k次。

05行:第一个分号,表示L条空语句,占用一个机器时间,以实现延时的目的。后面的两个“}”中,第一个“}”是04行for()循环的结束标志,程序遇到它时,将自动返回04行,使用于循环计数的变量j加1,同时判断j是否小于120,如果否,则转入05行;第二个是03行for()循环的结束标志,程序遇到它则会返回03行

细腻的自行车
含糊的火龙果
2026-05-05 10:50:01
// 功能 :p0口八个灯作3路跑马灯

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

#define led_data P0 //数据口定义

//延时程序

void delay(uint a)

{

uint i,j

for(i=ai>0i--)

{

for(j=4000j>0j--)

}

}

//主程序

void main()

{

while(1)

{

led_data=0xdb

delay(5) //延时一段

led_data=0x6d

delay(5)//延时一段

led_data=0xb6

delay(5) //延时一段

}

}

功能 :p0口八个灯作3路跑马灯

LED_DATA EQU P0 数据口定义

ORG 0000H

LJMP MAIN

ORG 030H

MAIN: MOV LED_DATA,#0DBH 11011011--零为亮

ACALL DELAY 延时一段

MOV LED_DATA,#06DH 01101101

ACALL DELAY 延时一段

MOV LED_DATA,#0B6H 10110110

ACALL DELAY 延时一段

AJMP MAIN 跳转回主程序

DELAY: MOV R7,#255 延时子程序

D1: MOV R6,#255

D2: DJNZ R6,D2

DJNZ R7,D1

RETEND

玩命的蜗牛
完美的夕阳
2026-05-05 10:50:01
很简单啊

你没有说是用C语言编写还是用汇编啊

(汇编我还没学)

=======================

电路可以这样设计,

①P3口接4*4矩阵键盘或是直接接8个按键。

②P0口、P2口 合起来共16个I/O口,直接接16个发光二级管。

注意I/O口接三极管的负极,三极管正极串上一个1K的保护电阻,然后接+5V。

别忘了P2口的上拉电阻,用10*8的排阻就行(排阻公共端接+5V)

其他的就是复位电路、晶振、电源、程序下载口了,都比较简单,而且都是固定模式。

指示灯直接用发光二级管串分压电阻接到电源就行了。

电源可以用7805稳压(输入电压>5V时),或者直接用5V电就行了。

=====================================================================

写程序方面:

数量比较多,流水灯设计宜用位操作,

①流水灯

for(i=0i<7i++)

{

P2=~pow(2,i)delay(500)

}

这样就是8位流水灯了

剩下的8个一样。

delay是一个延时函数,就是让单片机空转消耗时间,可以这样

delay(int time)

{int x=0,y=0

for(x=0x<timex++)

for(y=0y<100y++)

}

②16灯逐个点亮。

P2=0xff(开始8个灯都灭)

for(i=0i<7i++)

{

P2=P2--(每次点亮一盏灯)

delay(500)

}

这样就可以8位的流水灯

另外8个接下来一样的方法点亮,

这样就是16灯逐个点亮。

============

③逐渐点亮一个灯

用延时长短来控制

sbit P20=P2^0

int m=500

for(i=0i<500i++)

{

P20=1delay(m)(灭P2.0口的灯)

P20=0delay(500-m)(亮P2.0口的灯)

m--

}

这样就可以500级渐亮一个灯了。

渐灭类似。

④ A-D-A

循环可以用for()来实现

或者直接来有条件跳转。

goto就行了

=========================

说的比较零碎,自己整合一下就OK;

土豪的蜡烛
从容的绿草
2026-05-05 10:50:01
void T0_time() interrupt 1

{

TH0=(65536-45872)/256 //50ms中断一次

TL0=(65536-45872)%256

pp++

}

威武的镜子
谦让的大门
2026-05-05 10:50:01

程序如下:

#include <reg52.h>

sbit led1 = P2^0

sbit led2 = P2^1

sbit led3 = P2^2

sbit led4 = P2^3。

让电子信息技术与单片机技术相融合,有效提高了单片机应用效果。作为计算机技术中的一个分支,单片机技术在电子产品领域的应用,丰富了电子产品的功能,也为智能化电子设备的开发和应用提供了新的出路,实现了智能化电子设备的创新与发展。

从二十世纪九十年代开始,单片机技术就已经发展起来,随着时代的进步与科技的发展,目前该技术的实践应用日渐成熟,单片机被广泛应用于各个领域。现如今,人们越来越重视单片机在智能电子技术方面的开发和应用,单片机的发展进入到新的时期。

无论是自动测量还是智能仪表的实践,都能看到单片机技术的身影。当前工业发展进程中,电子行业属于新兴产业,工业生产中人们将电子信息技术成功运用。

务实的大雁
明亮的往事
2026-05-05 10:50:01
ORG 0000H

LJMP MAIN

ORG 000BH

LJMP T0ISR

ORG 0030H

MAIN:

MOV TMOD,#01H

MOV TH0,#HIGH(65536-50000)

MOV TL0,#LOW(65536-50000)

SETB TR0

SETB ET0

SETB EA

MOV R2,#10

MOV A,#0FFH

MOV P1,A

SJMP $

T0ISR:

CLR TR0

MOV TH0,#HIGH(65536-50000)

MOV TL0,#LOW(65536-50000)

SETB TR0

DJNZ R2,T0E

MOV R2,#10

CLR C

RLC A

MOV P1,A

JNZ T0E

MOV A,#0FFH

T0E:

RETI

END

怡然的帽子
酷炫的夕阳
2026-05-05 10:50:01
1、首先要设计电路图,利用proteus软件进行电路图的设计。所需元器件:AT89C51单片机1个。LED-RED8个。电源VCC1个。

2、使用keil4软件进行流水灯程序的编辑。

3、方法一编写程序采用的是左移函数(_crol_(a,b))和右移函数(_cror_(a,b))的方法,需在前加上头文件#include。方法二是一个比较笨的方法,需要计算出每个灯亮的位编码。

4、总结:单片机流水灯的设计分为两个步骤,第一步是原理图的绘制;第二步是keil4流水灯控制程序的编写。在写程序的时候最好使用第一种方法,采用位移函数来进行流水灯的设计。