导航:首页 > 操作系统 > 单片机流水灯实验

单片机流水灯实验

发布时间:2022-04-21 15:51:30

单片机:16个发光二极管组成的流水灯实验

电路图注意:1、P0口里应加上排阻,图里我没画出来。

2、单片机最小系统所需的晶振、复位电路我也没画。

临时帮你做的图,写的程序,细节就不是很完善啦,凑合着看吧!!

下面是程序,_crol_()函数是让temp的值左移一位的即执行一次该函数,temp的值由11111110到11111101,再执行一次是11111011……

_cror_()是右移。

#include<reg51.h>

#include<intrins.h>//包含对_crol_(),_cror_()函数的说明的头文件

unsignedchartemp,i;

voiddelay(unsignedintz)//延时子程序,晶振11.0592M时延时大概1毫秒

{

unsignedintx,y;

for(x=z;x>0;x--)

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

}

voidmain()

{

while(1)

{

temp=0xfe;

for(i=0;i<8;i++)//流水灯从P0^0口到P0^7口

{

P0=temp;

temp=_crol_(temp,1);

delay(5);

}

i=0;

temp=0xfe;

for(i=0;i<8;i++)//流水灯从P1^0口到P1^7口

{

P1=temp;

temp=_crol_(temp,1);

delay(5);

}

i=0;

temp=0x7f;

for(i=0;i<8;i++)//流水灯从P1^7口到P1^0口

{

P1=temp;

temp=_cror_(temp,1);

delay(5);

}

i=0;

temp=0x7f;

for(i=0;i<8;i++)//流水灯从P0^7口到P0^0口

{

P0=temp;

temp=_cror_(temp,1);

delay(5);

}

i=0;

}

}

㈡ 如何用单片机做流水灯

因为电路用单片机控制,所以电路非常简洁。其电路原理图见下图,印制板图如下图所示。

电路的核心部分是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行

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

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

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

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

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


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


#include<reg51.h>

#include<intrins.h>

#defineuintunsignedint

#defineucharunsignedchar

voiddelay(uinta);

voidmain()

{

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毫秒

voiddelay(uinta)

{

uintx,y;

for(x=a;x>0;x--)

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

}

㈣ 单片机流水灯试验

#include<AT89X51.H>//预处理文件里面定义了特殊寄存器的名称如P1口定义为P1

voidmain(void)

{

//定义数据

constunsignedchardesign[32]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,

0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,

0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x0,

0xE7,0xDB,0xBD,0x7E,0xFF};

unsignedinta;//定义循环用的变量

unsignedcharb;//在C51编程中因内存有限尽可能注意变量类型的使用

//

do{

for(b=0;b<32;b++)

{

for(a=0;a<30000;a++);//延时一段时间

P1=design[b];//读已定义的花样数据并写花样数据到P1口

}

}while(1);

}

C语言写的流水灯,而且用查表程序。

刚试了一下通过,

电路图如附图,

想要你的分还真不容易呀!呵呵

㈤ 单片机led流水灯实验步骤

一个小的程序是不需要专门绘制流程图的。其实在初学阶段,画好流程图能帮助我们整理好程序设计的脉络,让程序变得有条理。在编程的时候,流程图像一个指路明灯引领着程序的走向,所以应该养成良好的习惯,在编写程序之前,绘制一份流程图。

流程图的绘制方法很简单,一些编程类书籍有过专门的介绍,在本书就不再讲述了。怎样才能达到我们演示的流水灯的效果,就是让P1端口在间隔一段时间后,输出不同的值?假设我们想要的效果是某一时刻,只有一个LED小灯亮,而间隔的时间是一秒,当I/O端口输出高电平的时候,LED小灯是不亮的,当I/O端口输出低电平的时候,LED小灯才亮。如图所示,P1的值用十六进制可以表示为FEH,因为四位二进制数可以表示一位十六进制数。我们得出在不同LED小灯被点亮的时候,P1端口输出的状态程序流程图还是比较简单的,P1口在间隔一段时间之后,输出不同的值,然后返回到程序执行的起点,重新开始执行,这样就会循环往复不断地出现流水的效果。

㈥ 单片机原理流水灯实验

单片机流水的实质是单片机各引脚在规定的时间逐个上电,使LED灯能逐个亮起来但过了该引脚通电的时间后便灭灯的过程,实验中使用了单片机的P2端口, 对8个LED灯进行控制,要实现逐个亮灯即将P2的各端口逐一置零,中间使用时间间隔隔开各灯的亮灭。使用r1或rra实现位的转换。

㈦ 单片机流水灯+数码管实验

额,程序之前没仿真过,有点错误,现在可以了

#include<reg52.h>

#defineucharunsignedchar

#defineuintunsignedint

unsigneda=0,b=0,counter=0;

unsignedcharSEG1[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

unsignedcharSEG2[]={0x03,0x06,0x0C,0x18,0x30,0x60,0x0C,0x81};

unsignedcharSEG3[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};

unsignedcharSEG4[]={0x01,0x02,0x04,0x08,0x30,0x60,0x0C,0x81};

sbitP31=P3^1;

sbitP30=P3^0;

voidTimer0Init(void)interrupt3//定时器1

{

counter++;

if(counter==2000)//定时器定时250us,故4000次中断就表示1秒钟到达

{

counter=0;

a++;

b++;

if(a==8)a=0;

if(b==256)b=0;

EA=1;

}

}

voidinit()

{

TMOD=0x20;

EA=1;

TH1=6;

TL1=6;

TR1=1;

ET1=1;

}

voiddisp()

{

if(P30==0&&P31==0){P1=SEG1[a];}

if(P30==1&&P31==0){P1=SEG2[a];}

if(P30==0&&P31==1){P1=SEG3[a];}

if(P30==1&&P31==1){P1=SEG4[a];}

P2=b;

}

main()

{

init();

while(1)

{

disp();

}

}

㈧ 51单片机流水灯实验

for(i=1;i=10000;i++);这条语句我就很差异,根据C定义,第一个分号是初值,第二个是循环条件,最后分号为循环执行语句。显然 for(i=1;<10000;i++);这样才对。

再说 j=7; P0=~(1<<j++);j=7是2进制00000111,加1就是00001000,那么右移一位则00010000,然后又取反,则11101111,但是你 for(i=1;i=10000;i++);之后又写了j=0;加1则00000001取右移一位00000000,此时因为1被移出,取反后11111111,这时P0=11111111;

之后你写了 for(i=1;i=10000;i++)
{
if(j==8)
j=0;
}
由于你写了i=10000;所以语句不会执行循环,即使执行,由于之前j++只加了1,不会到8,而在整个while中又写了j=0;所以压根不会执行。

更改此程序中for(i=1;<10000;i++);之后仿真现象为P0.7闪烁,恰好印证了上述分析,由于整个程序不长,而且混乱,只好扔了从写。

于是乎在你这个病体的程序上做下处理之后程序变成了如下:
#include <reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit LED=P0^0;
sbit ENLED=P1^4;
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
main()
{
uint8 j;
uint16 i;
ENLED=0;
ADDR0=0;ADDR1=1;ADDR2=1;ADDR3=1;
while(1)
{

if(j==0)j=1;
else j=j<<1;

P0=j;
for(i=1;i<10000;i++);

}

}
这是单向闪烁的,如果想左右依次来回闪的话,可以参照我这个做下调整。问题说的很透,望加分。

㈨ 单片机流水闪烁灯的实验目的

学习基础知识。

㈩ 单片机流水灯实验原理

上一节我们介绍了什么是总线的方法,以及如何通过十六进制来控制IO口。并把我们的之前单点操作的流水灯进行了改进,成为了一个新的更加简洁的程序。这回,就再用总线方法,来实现流水灯的更加多样化的操作。

这次,我们要实现正向流水结束后再反过来流水,如此循环。然后再间隔闪烁。然后再累积流水,最后结束。

正向流水结束,再反过来。这个如何实现呢,我们需要使用到一些运算方法。

第一个是移位指令<<。

由于数字对比不强,看的不是很清晰,所以把数字给换成红色了。

<<这个标志符的意思是,向左移动一位,就像下边这样:

1111 1111》1111 111_

移动完成后,会发现,最低位空出来了,此时程序会自动去填补一个0。于是就成了:

1111 1111》1111 111_》1111 1110

第一次移位1111 1110,第二次在第一次基础上移位1111 1100,第三次在第二次基础上移位1111 1000,如此循环,就可以一直把所有位都变成0。

我们在看下一句"|",这个符号是或的意思,我们知道,逻辑中的或,是说只要有其一为一,结果就是一。所以,我们把1100|0001,结果就是头两个一和最后一个一留下来,第三位因为都是0,所以就是0.结果就是1101了。当再次移位后,数据就变成1010了,我们再次跟0001取或,最后一位就再次置1,结果就是1011,从结果上看,1110》1101》1011……就是0在不断的左移。

通过这个方法,可以让每一位都会单独置零。然后再给以一定时间的延时,就会看到流水灯了。

如果我们不赋初值0xfe会出现什么情况?

就会出现,移位产生一个0,在或运算时就会被重新置1,如此循环,就进入不到第二个LED,也就不会出现流水灯了。可以自己尝试下。

向右流水,效果是一样的,需要注意的是初值更改为左侧为0,就是0x7f,0111 1111,然后移位符号>>,还有取或的语句需要用0x80,1000 0000.

基本上是在左移位的基础上稍作修改即可。

接下来是闪烁的。

闪烁,我们用的是间隔LED的方法,就是隔一个亮一个,端口输出是1010 1010。翻译成十六进制就是0xaa。这次用到的是一个取反的运算,就是把每一位的0变成1,1变成0,然后延时一段时间,再次取反,循环几个周期,就看起来像是不断闪烁。取反的操作相对好理解一些,就是这一位,现在是1,那么取反后就是0,就是0和1的变换。

最后是一个累积点亮LED。

这个程序就是把第一个我们向左移位的函数,进行了更改,取消了赋初值,不用取或了,这样就可以对比着理解,各个语句的作用,如果不使用,会产生什么结果。如果我们的第一个函数不用取或这一步,那最终输出结果就和这个现象一样了。

所以,我们在写程序时,需要认真,仔细分析自己需要的结果,然后对照程序进行简单的演算。保证每一段都是可以输出想要的结果,不然累积到最终,几百行的代码,看起来就会头疼的,尤其是在没有标注释的情况下,有时就会忘记自己为什么要写这一句。

好的,这篇先说到这里,有问题或建议可以留言或私信给我。

想了解更多精彩内容,快来关注小亮谈电气

更多多内容,欢迎关注百家号:小亮谈电气。微信公众号:电气学苑。

阅读全文

与单片机流水灯实验相关的资料

热点内容
波形分析算法 浏览:526
php论坛实训报告 浏览:403
java日期字符串转换成日期 浏览:135
linuxsftp连接 浏览:934
光伏日发电量算法 浏览:125
小肚皮app怎么才有vip 浏览:616
php全角转换半角 浏览:927
java字符序列 浏览:539
杭州编译分布式存储区块链 浏览:575
材料压缩曲线 浏览:247
linux命令排序 浏览:151
手机热点加密为啥连接不上电脑 浏览:979
编译器合并计算 浏览:959
android音频曲线 浏览:343
linuxftp自动登录 浏览:802
运行编译后网页 浏览:70
阅读app怎么使用 浏览:319
centos防火墙命令 浏览:432
命令行变更 浏览:332
linux设备和驱动 浏览:207