❶ 如何用单片机做流水灯
因为电路用单片机控制,所以电路非常简洁。其电路原理图见下图,印制板图如下图所示。
电路的核心部分是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行
❷ 学习单片机流水灯的步骤
学习单片机的第一个程序就是流水灯实验学习单片机的第一个程序就是流水灯实验学习单片机的第一个程序就是流水灯实验学习单片机的第一个程序就是流水灯实验!!!!学习语言的输出学习语言的输出学习语言的输出学习语言的输出的第一个程序就是的第一个程序就是的第一个程序就是的第一个程序就是 hello word! 这都是一个过程这都是一个过程这都是一个过程这都是一个过程!!!! 我们知道单片机执行的机器语言我们知道单片机执行的机器语言我们知道单片机执行的机器语言我们知道单片机执行的机器语言!!!!汇编就是其执行的根本的语言汇编就是其执行的根本的语言汇编就是其执行的根本的语言汇编就是其执行的根本的语言,,,,任任任任何程序的编译最终还是要生成何程序的编译最终还是要生成何程序的编译最终还是要生成何程序的编译最终还是要生成HEX语言语言语言语言,,,,汇编语言汇编语言汇编语言汇编语言~~!!!! 来回显示来回显示来回显示来回显示,,,,并且显示时还会发出蜂咛声并且显示时还会发出蜂咛声并且显示时还会发出蜂咛声并且显示时还会发出蜂咛声!!!! P1口接八个发光二极管口接八个发光二极管口接八个发光二极管口接八个发光二极管,,,,P2.3接一个蜂咛器接一个蜂咛器接一个蜂咛器接一个蜂咛器!!!! 一一一一....汇编语言汇编语言汇编语言汇编语言 mov r7,#8 main:mov r0,#8 ;一个循环需要移动一个循环需要移动一个循环需要移动一个循环需要移动8位位位位 mov p1,#01111111b ;初始为初始为初始为初始为P0.7灯点亮灯点亮灯点亮灯点亮 loop: clr p2.3 acall ds1ms ;延时延时延时延时,,,,以便人眼可以观察到以便人眼可以观察到以便人眼可以观察到以便人眼可以观察到 setb p2.3 acall ds1ms mov a,p1 ;读读读读P0口当前显示的数据送到口当前显示的数据送到口当前显示的数据送到口当前显示的数据送到A rr a ;将将将将A中的数据循环右移中的数据循环右移中的数据循环右移中的数据循环右移1位位位位 mov p1,a ;再将再将再将再将A中右移过的数据送到中右移过的数据送到中右移过的数据送到中右移过的数据送到P0 djnz r0,loop djnz r7,main ;移动不够移动不够移动不够移动不够8位位位位,,,,跳到跳到跳到跳到LOOP处循环处循环处循环处循环, ljmp rel ;流动流动流动流动1遍跳转到遍跳转到遍跳转到遍跳转到MAIN处循环流处循环流处循环流处循环流。。。。 ;---显示延时显示延时显示延时显示延时---------- ds1ms: mov r1,#1 ds1lo: mov r2,#200 ds2lo: mov r3,#200 djnz r3,$ djnz r2,ds2lo djnz r1,ds1lo ret ;延时返回延时返回延时返回延时返回 rel:end 二二二二.C语言语言语言语言 #include<reg52.h> unsigned char i; unsigned char temp; unsigned char a,b; void delay(void) //延时子程序延时子程序延时子程序延时子程序 { unsigned char m,n,s; for(m=20;m>0;m--) for(n=20;n>0;n--) for(s=248;s>0;s--); } void main(void) //主程序主程序主程序主程序 { while(1) //循环条件永远为真循环条件永远为真循环条件永远为真循环条件永远为真,,,,以下程序一直执行下去以下程序一直执行下去以下程序一直执行下去以下程序一直执行下去。。。。 { temp=0xfe; P1=temp; //直接对直接对直接对直接对I/O口口口口P1赋值赋值赋值赋值,,,,使使使使P1.0输出低点平输出低点平输出低点平输出低点平。。。。 delay(); //延时延时延时延时 for(i=1;i<8;i++) //实现广告灯的移动实现广告灯的移动实现广告灯的移动实现广告灯的移动 { a=temp<<i; b=temp>>(8-i); P1=a|b; delay(); } for(i=1;i<8;i++) //实现广告灯的反方向移动实现广告灯的反方向移动实现广告灯的反方向移动实现广告灯的反方向移动 { a=temp>>i; b=temp<<(8-i); P1=a|b; delay(); } } } 实验很简单实验很简单实验很简单实验很简单!!!!懂的朋友完全可以在此基础上开发懂的朋友完全可以在此基础上开发懂的朋友完全可以在此基础上开发懂的朋友完全可以在此基础上开发!!!!比如一个爱心的流比如一个爱心的流比如一个爱心的流比如一个爱心的流水灯水灯水灯水灯。。。。如果你看懂了这两个程序如果你看懂了这两个程序如果你看懂了这两个程序如果你看懂了这两个程序!!!!恭喜你恭喜你恭喜你恭喜你,,,,你已经入门你已经入门你已经入门你已经入门!!!!
❸ 单片机实验流水灯
ProteUS仿真通过
要ProteUS文件的话,留言
; 四个按键控制八个LED灯,
; 按键接p1,灯接p0口,
; 要求按1号键八个灯循环亮,跟流水灯样的,
; 按下2号键灯先从左亮到右,然后从右亮到左,这样一次循环,
; 按下3号键,先两端两个灯亮,两端灭,然后次两端的亮,直到中间两个亮,
; 然后高低四位交替亮一次,再奇偶亮一次,一次循环;
; 按下4号键就各位棒棒忙想出一个方案。
; 头疼啊,谁能搞出来呀。。
ORG 00H
AJMP _INIT_SYS
_INIT_SYS:
MOV SP,#80H
_MAIN_LOOP:
_WAY0: ;{
MOV A,#0FEH
_WAY0_LOOP:
RR A
MOV P0,A
LCALL _DELAY500MS
AJMP _WAY0_LOOP ;}
_WAY1: ;{
CLR C
MOV A,#0FFH
_WAY1_LOOP0:
RRC A
_WAY1_LOOP:
RRC A
MOV P0,A
JNC _WAY1_LOOP11
LCALL _DELAY500MS
AJMP _WAY1_LOOP
_WAY1_LOOP11:
RLC A
_WAY1_LOOP1:
RLC A
MOV P0,A
JNC _WAY1_LOOP0
LCALL _DELAY500MS
AJMP _WAY1_LOOP1 ;}
_DELAY500MS: ;{
PUSH 0
PUSH 1
PUSH 2
MOV R0,#50
_DEL0:
MOV R1,#100
_DEL1:
MOV P1,#0FFH
JNB P1.0, _WAY0
JNB P1.1, _WAY1
JNB P1.2, _WAY2
JNB P1.3, _WAY3
MOV R2,#100
DJNZ R2,$
DJNZ R1, _DEL1
DJNZ R0, _DEL0
POP 2
POP 1
POP 0
RET
;}
_WAY2: ;{
MOV P0,#7EH
LCALL _DELAY500MS
MOV P0,#10111101B
LCALL _DELAY500MS
MOV P0,#11011011B
LCALL _DELAY500MS
MOV P0,#11100111B
LCALL _DELAY500MS
MOV P0,#0F0H
LCALL _DELAY500MS
MOV P0,#0FH
LCALL _DELAY500MS
MOV P0,#055H
LCALL _DELAY500MS
MOV P0,#0AAH
LCALL _DELAY500MS
AJMP _WAY2
;}
_WAY3: ;{
MOV P0,#0FFH
LCALL _DELAY500MS
MOV P0,#0FEH
LCALL _DELAY500MS
MOV P0,#0FCH
LCALL _DELAY500MS
MOV P0,#0F8H
LCALL _DELAY500MS
MOV P0,#0F0H
LCALL _DELAY500MS
MOV P0,#0E0H
LCALL _DELAY500MS
MOV P0,#0C0H
LCALL _DELAY500MS
MOV P0,#080H
LCALL _DELAY500MS
MOV P0,#000H
LCALL _DELAY500MS
AJMP _WAY3 ;}
END
❹ 单片机实验板流水灯
安装个控制器就是了。
❺ 单片机c语言流水灯的实验报告
这个怎么写??X个发光二极管连续依次闪烁,往复不断。能够成功正确地完成编写的程序。体现了单片机工作正常,语句使用得当,试验完美成功。
❻ 单片机流水灯实验原理
上一节我们介绍了什么是总线的方法,以及如何通过十六进制来控制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。
这个程序就是把第一个我们向左移位的函数,进行了更改,取消了赋初值,不用取或了,这样就可以对比着理解,各个语句的作用,如果不使用,会产生什么结果。如果我们的第一个函数不用取或这一步,那最终输出结果就和这个现象一样了。
所以,我们在写程序时,需要认真,仔细分析自己需要的结果,然后对照程序进行简单的演算。保证每一段都是可以输出想要的结果,不然累积到最终,几百行的代码,看起来就会头疼的,尤其是在没有标注释的情况下,有时就会忘记自己为什么要写这一句。
好的,这篇先说到这里,有问题或建议可以留言或私信给我。
想了解更多精彩内容,快来关注小亮谈电气
更多多内容,欢迎关注百家号:小亮谈电气。微信公众号:电气学苑。
❼ 单片机流水灯试验
#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语言写的流水灯,而且用查表程序。
刚试了一下通过,
电路图如附图,
想要你的分还真不容易呀!呵呵
❽ 单片机流水灯实验
ORG
OOOOH
LJMP
MAIN
ORG
1000H
MAIN:MOV
A,#OFEH
AGAIN:MOV
P1,A
RL
A
LCALL
DELAY
JNB
P1.7,TWO//这里判断P1.7是否为低电平,如果是就转到TWO
SJMP
AGAIN
TWO:MOV
A,#OFFH
MOV
P1,A
PP:MOV
A,#OFEH
MOV
P2,A
RL
A
LCALL
DELAY
JNB
P2.7,MAIN//同理判断P2.7
SJMP
PP
DELAY:MOV
R6,#OFFH
L1:
MOV
R7,#OFFH
DJNZ
R7,$
DJNZ
R6,L1
RET
END没有执行过,应该可行讲下思路,P1,P2是接16个LED就在P1最高位的灯亮时,这时转到TWO中执行,从P2的最低位开始,到最高位即P2.7为低电平时,等挻时完后又转回P1,如此循环(这里一开始P2端口不用都置1是因为单片机上电时P2端口都为高电平)
❾ 单片机led流水灯实验步骤
一个小的程序是不需要专门绘制流程图的。其实在初学阶段,画好流程图能帮助我们整理好程序设计的脉络,让程序变得有条理。在编程的时候,流程图像一个指路明灯引领着程序的走向,所以应该养成良好的习惯,在编写程序之前,绘制一份流程图。
流程图的绘制方法很简单,一些编程类书籍有过专门的介绍,在本书就不再讲述了。怎样才能达到我们演示的流水灯的效果,就是让P1端口在间隔一段时间后,输出不同的值?假设我们想要的效果是某一时刻,只有一个LED小灯亮,而间隔的时间是一秒,当I/O端口输出高电平的时候,LED小灯是不亮的,当I/O端口输出低电平的时候,LED小灯才亮。如图所示,P1的值用十六进制可以表示为FEH,因为四位二进制数可以表示一位十六进制数。我们得出在不同LED小灯被点亮的时候,P1端口输出的状态程序流程图还是比较简单的,P1口在间隔一段时间之后,输出不同的值,然后返回到程序执行的起点,重新开始执行,这样就会循环往复不断地出现流水的效果。
❿ 单片机原理流水灯实验
单片机流水的实质是单片机各引脚在规定的时间逐个上电,使LED灯能逐个亮起来但过了该引脚通电的时间后便灭灯的过程,实验中使用了单片机的P2端口, 对8个LED灯进行控制,要实现逐个亮灯即将P2的各端口逐一置零,中间使用时间间隔隔开各灯的亮灭。使用r1或rra实现位的转换。