流水灯程序简单又详细
51单片机流水灯程序
1.第一个发光管以间隔200ms闪烁。
2.8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms。
3.8个发光管来回流动,第个管亮100ms。
4。
用8个发光管演示出8位二进制数累加过程。
5。
8个发光管间隔200ms由上至下,再由下至上,再重复一次,然后全部熄灭再以300ms间隔全部闪烁5次。
重复此过程。
6.间隔300ms第一次一个管亮流动一次,第二次两个管亮流动,依次到8个管亮,然后重复整个过程。
7。
间隔300ms先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;8个全部闪烁3次;关闭发光管,程序停止。
1#include<reg52。
h〉#define uint unsigned intsbit led1=P1^0;void delay();void main(){while(1){led1=0;delay();led1=1;delay();}}void delay(){uint x,y;for(x=200;x>0;x—-)for(y=100;y〉0;y-—);}2#include<reg52。
h>#include〈intrins。
h〉#define uint unsigned intuchar a;void delay();void main(){a=0xfe;P1=a;while(1){a=_crol_(a,1);delay();P1=a;delay();}}void delay(){uint b;for(b=55000;b>0;b—-);}3#include<reg52。
h〉#include <intrins。
h>#define uint unsigned int #define uchar unsigned char void delay(){uint x,y;for(x=100;x〉0;x--)for(y=110;y>0;y—-);}void main(){uchar a,i;while(1){a=0xfe;for(i=0;i〈8;i++){P1=a;delay(100);a=_crol_(a,1);for(i=0;i〈8;i++){P1=a;delay(100);a=_cror_(a,1);}}}4#include<reg52.h>#include 〈intrins。
流水灯程序
图1流水灯硬件原理图从原理图中可以看出,假如要让接在PLO 口的LEDI 亮起来,那么只要把 P1.0口的电平变为低电平就可以了;相反,假如要接在PLO 口的LEDl 熄灭,就 要把PLO 口的电平变为高电平洞理,接在P1.1~PL7 口的其他7个LED 的点 亮和熄灭的方法同LED1。
因此,要实现流水灯功能,我们只要将发光二极管 LED1-LED8依次点亮、熄灭,8只LED 灯便会一亮一暗的做流水灯了。
在此 我们还应留意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很 短,我们在掌握二极管亮灭的时候应当延时一段时间,否则我们就看不到“流水” 效果了。
3.软件编程单片机的应用系统由硬件和软件组成,上述硬件原理图搭建完成上电之后, 我们还不能看到流水灯循环点亮的现象,我们还需要告知单片机怎么来进行工PlO POO Pll POl PlJ POi PlJ P03 Pl* PO* P15 PO 5 Pl 3PO 4 P17 λ!SS>C51POT am PJO nττoPnP22 Il pn IO P” P25 I∑∖T> PY P27Xl X :XXD!XD KD ALEP TlPSHT∖n47Kx8VCCLEDl-M —LED)W LED)LED1 W * LEDS人KLEDj WLED7W-44LEDS-M作,即编写程序掌握单片机管脚电平的凹凸变化,来实现发光二极管的一亮一灭。
软件编程是单片机应用系统中的一个重要的组成部分,是单片机学习的重点和难点。
下面我们以最简洁的流水灯掌握功能即实现8个LED灯的循环点亮,来介绍实现流水灯掌握的几种软件编程方法。
3.1位控法这是一种比较笨但又最易理解的方法,采纳挨次程序结构,用位指令掌握Pl 口的每一个位输出凹凸电平,从而来掌握相应LED灯的亮灭。
程序如下:ORG OOOOH ;单片机上电后从0000H地址执行AJMPSTART ;跳转到主程序存放地址处ORG 0030H ;设置主程序开头地址START : MOV SP , #60H ;设置堆栈起始地址为60HCLRPl.0;PLO输出低电平,使LEDl点亮ACALL DELAY ;调用延时子程序SETB P1.0;P1.0输出高电平,使LEDl熄灭CLR Pl.l ;P1.1输出低电平,使LED2点亮ACALL DELAY ;调用延时子程序SETB Pl.l ;P1.1输出高电平,使LED2熄灭CLR P1.2;P1.2输出低电平,使LED3点亮ACALL DELAY ;调用延时子程序SETB P1.2;P1.2输出高电平,使LED3熄灭CLR P1.3 ;P1.3输出低电平,使LED4点亮ACALL DELAY ;调用延时子程序SETB P1.3;P1.3输出高电平,使LED4熄灭CLR Pl.4 ;P1.4输出低电平,使LED5点亮ACALL DELAY ;调用延时子程序SETB P1.4;P1.4输出高电平,使LED5熄灭CLR P1.5;P1.5输出低电平,使LED6点亮ACALL DELAY ;调用延时子程序SETB P1.5;P1.5输出高电平,使LED6熄灭CLR P1.6 ;P1.6输出低电平,使LED7点亮ACALL DELAY ;调用延时子程序CLR P1.7 ;P1.7输出低电平,使LED8点亮ACALL DELAY ;调用延时子程序SETB P1.7pl.7输出高电平,使LED8熄灭ACALL DELAY ;调用延时子程序START ;8个LED流了一遍后返回到标号START处再循环AJMPDELAY :;延时子程序MOV RO , #255 ;延时一段时间Dl : MOV Rl , #255DJNZRl , $DJNZ RO , DlRET ;子程序返回END ;程序结束3.2循环移位法在上个程序中我们是逐个掌握Pl端口的每个位来实现的,因此程序显得有点简单,下面我们采用循环移位指令,采纳循环程序结构进行编程。
多种方法写出的51单片机流水灯C语言程序
多种方法写出的51单片机流水灯C语言程序流水灯最原始下面是一个最基本的流水灯程序,使用了51单片机的寄存器编程方法。
include "reg51.h"sbit p0=P1^0;sbit p1=P1^1;sbit p2=P1^2;sbit p3=P1^3;sbit p4=P1^4;sbit p5=P1^5;sbit p6=P1^6;sbit p7=P1^7;void mdelay(unsigned int t){unsigned char n;for(;t>0;t--)for(n=0;n<125;n++)void main()while(1)P1=0;p0=1;mdelay(1000);p0=0;p1=1;mdelay(1000);p1=0;p2=1;流水灯位左移在流水灯的基础上,我们可以通过左移位的方式来实现流水灯的效果。
void main()unsigned char led = 0x01.// 初始化led为xxxxxxxxwhile(1)P1 = ~led。
// 取反输出,因为我们的电路是低电平亮灯mdelay(1000);led <<= 1.// 左移一位if(led == 0) // 如果led变为0了,说明已经左移到最后一位了,需要重新开始led = 0x01;流水灯移位函数为了方便实现流水灯的位移,我们可以封装一个移位函数。
void shift_left(unsigned char *led。
unsigned char n)for(unsigned char i=0.i<n。
i++)led <<= 1;if(*led == 0)led = 0x01;void main()unsigned char led = 0x01;while(1)P1 = ~led;mdelay(1000);shift_left(&led。
流水灯控制流程图
流水灯控制流程图
由于没有更加具体的信息提供,因此以下是一个较为简单的流水灯控制流程图,供参考:
1. 开始
2. 初始化控制器和流水灯
3. 设置流水灯状态,可以是正向或反向移动
4. 等待一段时间,以控制流水灯移动速度
5. 修改流水灯状态,让灯珠进行位移
6. 判断流水灯是否到达边界
1. 是:改变流水灯移动方向
2. 否:继续移动
7. 返回步骤4
8. 结束
注意事项:
- 步骤3和5需要根据具体要求进行修改,例如流水灯的颜色、数量、灯珠个数等。
- 步骤4的等待时间需要根据具体控制器和流水灯的响应时间进行调整。
- 步骤6的判断条件需要考虑边界对应的灯珠位置和移动方向。
单片机-流水灯的程序
unsigned char _crol_( unsigned char a, unsigned char b ) unsigned char:这种函数叫做有返回值,带参数的函数。也就是说程序
执行完这个函数后,通过它内部的某些运算而得出一个新值,该函数 最终将新值返回给调用它的语句。
a= _crol_(a,1);他的意思就是讲a循环向左移动一位。
#define uchar unsigned char
uint i,j; uchar Led;
void main()
{ Led = 0xfe;
while(1)
{ P2 = Led;
for(i=1;i<800;i++) for(j=1;j<800;j++);
Led = Led << 1; if(P2 == 0x00 ) {Led =
led4=0; delay(120);
led5=0 ; delay(120);
led6=0; delay(120);
led7=0;
delay(120); led8=0;
第六页,共18页。
delay(120); led1=1; led2=1; led3=1; led4=1; led5=1; led6=1; led7=1; led8=1; }
0xfe; } }
}
第十四页,共18页。
方法四:利用移位操作实现流水灯(8位二极管循环点亮)
相关知识
一、C51中库函数-crol-的应用 “_crol_”是一个函数名,是51单片机自带的一个内部函数,
包含在C51头文件“intrins.h”中。也就是说如果在程序中要用到这个
流水灯C语言程序
流水灯C语言程序流水灯是一种常见的电子显示效果,通常用于展示灯光的流动效果。
在C语言中,我们可以通过控制单片机的IO口来实现流水灯的效果。
以下是一个标准格式的C语言程序,用于实现流水灯效果。
```c#include <stdio.h>#include <stdlib.h>#include <unistd.h>#define LED_COUNT 8 // 流水灯的数量#define DELAY_MS 500 // 每一个灯亮起的延迟时间(毫秒)int main() {int leds[LED_COUNT] = {0}; // 存储每一个灯的状态,0表示灭,1表示亮 int i, j;while (1) {// 灯往右挪移for (i = LED_COUNT - 1; i > 0; i--) {leds[i] = leds[i - 1];}leds[0] = 1;// 输出灯的状态for (i = 0; i < LED_COUNT; i++) {if (leds[i]) {printf("*"); // 亮的灯用*表示} else {printf(" "); // 灭的灯用空格表示}}printf("\n");// 延迟一段时间usleep(DELAY_MS * 1000);// 清空屏幕system("clear");}return 0;}```上述程序使用了C语言的基本语法和系统函数,实现了一个简单的流水灯效果。
程序中的`LED_COUNT`表示流水灯的数量,可以根据实际需求进行调整。
`DELAY_MS`表示每一个灯亮起的延迟时间,单位为毫秒。
在程序的主循环中,通过不断改变灯的状态和输出屏幕,实现了流水灯的效果。
首先,灯往右挪移,即将前一个灯的状态赋值给后一个灯,最后一个灯的状态设置为亮。
几种流水灯程序
几种流水灯程序1. 基础流水灯程序:用来控制1个led灯,使其呈现流水灯的效果,代码如下: int led = 13; // 让led连接到电路的13号引脚void setup(){pinMode(led, OUTPUT); // 设置13号引脚的模式为输出}void loop(){digitalWrite(led, HIGH); // 让led灯亮起来delay(1000); // 等待1秒digitalWrite(led, LOW); // 让led灯熄灭int led1 = 13;int led2 = 12;int led3= 11;int led4 = 10;void setup (){pinMode (led1, OUTPUT);pinMode (led2, OUTPUT);pinMode (led3, OUTPUT);pinMode (led4, OUTPUT);}void loop (){digitalWrite (led1, HIGH);delay (500);digitalWrite (led1, LOW);digitalWrite (led2, HIGH);delay (500);digitalWrite (led2, LOW);digitalWrite (led3, HIGH);delay (500);digitalWrite (led3, LOW);digitalWrite (led4, HIGH);delay (500);digitalWrite (led4, LOW);delay (1000);}3.调节速度的流水灯程序:将第一个流水灯程序增加一个模拟变量,使得可以即时调节灯泡亮度以及闪烁速度,以及可以控制单个led灯或多个led灯,其代码如下:4.设置模式的流水灯程序:将流水灯程序改进,使得应用于不同的场景,可以调节闪烁模式,如快速,慢速,长亮等,其代码如下:。
第2讲(二)流水灯程序设计
的第 0 为赋值 0,其他位赋值 1,即 1111 1110,也就是 0xfe 了。它实现了点亮第一个 LED
灯。
上面的方法虽然容易想到,但是程序也太长了吧,有没有好一点的方法呢?有的,下面我们 用 C51 即单片机 C 语言提供的一个函数来实现流水灯。
步骤四:其他方法实现流水灯。
我们先直接改写程序,然后再进行解释。 #include<reg52.h> #include<intrins.h> //循环移位函数定义在该头文件中,要想使用该函数必须先包含此头文件
第 3 页,共 7 页
为单片机知识普及而努力!
邢台学院嵌入式系统实验室
到这里你是不是觉得上面那么多位定义很麻烦,其实还有一种对 P0 口整体赋值的方法,被
称为总线方法。例如上面的程序可以改写为: #include<reg52.h> void main() {
P0 = 0xaa; //利用总线方法给端口赋值 } 其中,语句“P0 = 0xaa;”中的 0xaa 是十六进制数,C 语言中十六进制数都以 0x 开头。十 六进制中用 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f 来表示十进制中的 0 到 15, 其中 a 表示 10,即二进制的 1010,那么 0xaa 就表示 1010 1010,这八位数从右到左分别对 应 P0 口的 0 到 7 位,如下图:
//进行空循环,来消耗 CPU 周期,达到延时的效果
led1 = 1; for(i=1000;i>0;i--)
for(j=100;j>0;j--); }
可以看出,是我们加入了循环函数来让 CPU 进行其他操作的,这样便实现了一个 LED 灯的
闪烁效果。但是同样的双重 for 循环语句我们却写了两遍,显得很臃肿,我们可以将 for 循
基本操作与流水灯
基本操作与流水灯基本操作是指对于特定设备或系统所需的最常见、必要的操作步骤。
在该主题下,我将以流水灯为例,详细介绍流水灯的基本操作。
流水灯是一种常见的电子实验器材,它通过一系列的LED灯组成,能够实现灯光顺序逐个闪烁的效果。
下面是使用流水灯的基本操作步骤:1.准备工作:首先,确保你已经了解并准备好所需的材料和工具。
通常,这包括流水灯电路板、LED灯、电阻、导线、电池等。
另外,你还需要一副焊接工具和计算机等设备。
2.接线:将流水灯电路板与其他组件连接起来。
首先,插入相应的LED灯和电阻到电路板上。
然后,使用导线将这些组件连接起来,在电路板上形成电路网络。
确保每个连接都牢固可靠,避免短路。
3.焊接:利用焊接工具将连接的导线和组件进行固定。
通过焊接,可以防止连接松动或接触不良的情况发生。
在焊接过程中,确保焊接点光洁且没有冷焊现象。
4.供电:将电池或其他电源连接到电路板上,为流水灯提供供电。
确保电路板上的电源接头正确连接,并在连接之前检查电源的电压和电流是否适配。
5.调试:在连接好电源后,观察流水灯是否正常工作。
如果发现灯不亮、亮度不均或灯光顺序错乱等问题,需要检查和调试整个电路。
可通过测量电流和电压、调整电阻、更换不良的灯等方法解决问题。
6.控制:如果你想对流水灯的闪烁方式进行调整,你可以添加一些控制电路。
例如,可以通过加入可调电阻或集成电路等方式来改变流水灯的亮度、频率或顺序等。
7.扩展:流水灯的操作可以进一步扩展,比如添加更多的灯、使用更复杂的编程控制、设计个性化的灯光效果等。
这需要一些专业的电子知识和技能,可以根据个人需求和能力进行扩展。
最后,使用流水灯时要注意安全。
避免触摸裸露的导线和元器件,以免触电或烧毁电路。
在操作过程中,确保周围环境通风良好,避免因长时间工作产生过热导致损坏。
严禁在高压下操作或使用不符合要求的电源。
总之,流水灯的基本操作包括准备工作、接线、焊接、供电、调试、控制和扩展等步骤。
stc89c51单片机流水灯程序
stc89c51单片机流水灯程序51单片机流水灯程序程序一(用C语言编的最基础的程序)#include<reg52.h>#include<stdio.h>sbit D0=P1^0;//位定义,把P1口的第一个管脚定义为D0sbit D1=P1^1;// 位定义,把P1口的第二个管脚定义为D1sbit D2=P1^2;// 位定义,把P1口的第3个管脚定义为D2sbit D3=P1^3;// 位定义,把P1口的第4个管脚定义为D3sbit D4=P1^4;// 位定义,把P1口的第5个管脚定义为D4sbit D5=P1^5;// 位定义,把P1口的第6个管脚定义为D5sbit D6=P1^6;// 位定义,把P1口的第7个管脚定义为D6sbit D7=P1^7;// 位定义,把P1口的第8个管脚定义为D7void main(){sbit d8=P1^7;void main(){unsigned int i=1,a,b; while(1)//大循环{for(i=1;i<15;i++){for(a=0;a<80;a++)//延时。
for(b=0;b<200;b++);switch(i){case 1:d2=1,d1=0,d8=1;break;case 2:d1=1,d2=0;break;case 3:d2=1,d3=0;break;case 4:d3=1,d4=0; break; case 5:d4=1,d5=0; break; case 6:d5=1,d6=0; break; case 7:d6=1,d7=0; break; case 8:d7=1,d8=0; break; case 9:d8=1,d7=0; break; case 10:d7=1,d6=0; break; case 11:d6=1,d5=0;break;case 12:d5=1,d4=0;break;case 13:d4=1,d3=0;break;case 14:d3=1,d2=0;break;}};}}程序三(最简洁的):#include<reg52.h>#include<intrins.h>//_crol_和_cror_的头文件。
单片机-流水灯的程序
#include<reg51.h> sbit led1=P2^0; sbit led2=P2^1; sbit led3=P2^2; sbit led4=P2^3; sbit led5=P2^4; sbit led6=P2^5; sbit led7=P2^6; sbit led8=P2^7; void delay (unsigned char x);
其中void表示这 个函数执行完后 不返回任何数据。 ()内无任何东西, 所以这是个无参 数的函数。 Delayms是函数名。
1
2
3
4
5
6
2)带参数函数的用位定义实现流水灯(8位二极管循环点亮)
编程思路: a) 先点亮第一盏灯,延时点亮第二盏, 依次延时8盏灯全部点亮。 b) 当8盏灯全部点亮时,熄灭8盏灯。 c) 进入循环。
循环移动
循环左移 最高位移入最低位,其它依次向左移动一位。C语言中 没有专门的指令,通过移位指令和简单逻辑运算来实现循环左移,或直接利用C51库中自带的函数-crol-实现。
循环右移 最低位移入最高位,其它位依次向右移一位,C语言中没有专门的指令,通过移位指令与简单的逻辑运算可以实现循环右移,或专门利用C51库中自带函数-cror-实现
方法二:利用总线控制实现流水灯(8位二极管循环点亮)
相关知识 二进制和十六进制之间的相互转换
二进制
十六进制
二进制
十六进制
0000
0
0100
4
0001
1
0101
5
0010
2
0110
6
0011
3
0111
7
二进制
十六进制
二进制
流水灯说明
“流水灯”说明
(一)设计思路和方法
“流水灯”是控制一组发光二极管依次循环亮灭来实现流水效果。
(二)发光二极管电路原理图(右边部分)
(三)电路工作原理
P0口的8位输出分别控制8个发光二极管L0~L7的阳极;而P2.3经反相器U4C控制8个发光管阴极E3;电阻R15~R22为限流电阻。
当阳极为高、阴极为低时,对应的二极管将会发光。
(四)程序总框图设计流程
初始化硬件
给P0口赋值
延时
修改P0值
(五)相关寄存器配置
P0(8位)和P2.3需要设置成推挽输出,以驱动电路正常发光。
涉及寄存器及配置值如下:
P2M1=0x00;
P2M0=0xff;
P0M1=0x00;
P0M0=0xff;
(六)案例代码见“流水灯工程”
(七)测试方法
1.用STC ISP默认设置,打开工程中的HEX并下载
2.下载后观察现象为:8个发光二极管从右至左依次流动点亮
3.本案例无需辅助操作。
51流水灯程序,
1.第一个发光管以间隔200ms闪烁2.8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去。
3.8个发光管来回流动,第个管亮100ms,流动时让蜂鸣器发出“滴滴”声。
4.用8个发光管演示出8位二进制数累加过程。
5.8个发光管间隔200ms由上至下,再由下至上,再重复一次,然后全部熄灭再以300ms间隔全部闪烁5次。
重复此过程。
6.间隔300ms第一次一个管亮流动一次,第二次两个管亮流动,依次到8个管亮,然后重复整个过程。
7.间隔300ms先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;8个全部闪烁3次;关闭发光管,程序停止。
#include<>#include<>#define uchar unsigned char#define uint unsigned intuchar temp,a;uint i,j;sbit beep=P2^3;void delay(int);void main(){while(1){for(i=0;i<10;i++){P1=0xfe;delay(150);P1=0xff;delay(150);}temp=0xfe;for(i=0;i<16;i++){P1=temp;beep=0;delay(380);P1=0xff;temp=_crol_(temp,1);beep=1;delay(380);}for(j=0;j<2;j++){temp=0xfe;for(i=0;i<8;i++){P1=temp;beep=0;delay(80);temp=_crol_(temp,1);P1=0xff;beep=1;delay(80);}temp=0xbf;for(i=0;i<7;i++){P1=temp;beep=0;delay(80);temp=_cror_(temp,1);P1=0xff;beep=1;delay(80);}}a=0x00;for(i=0;i<256;i++){P1=~a;a++;delay(500);}for(i=0;i<2;i++){temp=0xfe;for(i=0;i<8;i++){P1=temp;delay(150);temp=_crol_(temp,1);P1=0xff;delay(150);}temp=0xbf;for(i=0;i<7;i++){P1=temp;delay(150);temp=_cror_(temp,1);P1=0xff;delay(150);}}P1=0xff;for(i=0;i<10;i++){P1=~P1;delay(170);}temp=0xfe;j=0;for(i=0;i<8;i++){j++;P1=temp;delay(150);temp=_crol_(temp,a);P1=0xff;delay(150);}temp=0xfe; //赋初值for(j=0;j<8;j++){for(i=0;i<8-j;i++) //左移{P1=temp; //点亮小灯delay(150); //延时200毫秒temp=_crol_(temp,1); //将a变量循环左移一位}temp=_crol_(temp,j); //补齐,方便下面的左移一位P1=0xff; //全部关闭temp=temp<<1; //左移一位让多一个灯点亮}for(i=0;i<3;i++){P1=0xaa; //delay(150);P1=~P1;delay(150);}for(j=0;j<3;j++){temp=0xfe;for(i=0;i<8;i++){P1=temp;delay(100);temp=_crol_(temp,1);}temp=0xbf;for(i=0;i<7;i++){P1=temp;delay(100);temp=_cror_(temp,1);}}for(j=0;j<3;j++){temp=0xfe;a=0x7f;for(i=0;i<5;i++){P1=temp&a;delay(100);temp=_crol_(temp,1);a=_cror_(a,1);}}for(j=0;j<3;j++){temp=0xef;a=0xf7;for(i=0;i<5;i++){P1=temp&a;delay(100);temp=_crol_(temp,1);a=_cror_(a,1);}}for(j=0;j<3;j++){P1=0x00;delay(380);P1=0xff;delay(380);}}}void delay(int z){int x,y;for(x=100;x>0;x--)for(y=z;y>0;y--);}。
流水灯汇编语言程序设计
根据如图所示的电路图实现流水灯汇编语言程序设计,要求系统完成如下功能:
设计程序一、、实现流水灯显示控制,流水灯显示方式可自行选择,如由P0口输出状态,依次点亮LED灯D1-D8,无限循环。
设计程序二、用按键K1,K2控制流水灯流动方向,左移或右移。
程序可采用中断或查询方式完成
设计程序三、用按键K1,K2控制流水灯流水速度,K1,K2分别为加速,减速控制(提示:流水速度由定时器控制,通过改变定时器初值实现流水速度控制)
程序编写要求在下周二之前独立完成,程序要在电子实训课上完成调试。
Keil。
流水灯程序介绍
一、位定义流水灯程序:#include<reg51.h> //51系列单片机定义文件sbit led0=P1^0;sbit led1=P1^1;sbit led2=P1^2;sbit led3=P1^3;sbit led4=P1^4;sbit led5=P1^5;sbit led6=P1^6;sbit led7=P1^7;//位定义各个I/O口,即把各个灯相应到单片机P1的八个口。
void delay(void) //声明延时函数(延时的时间可以自己设定,改变a,b的范围){unsigned char a,b;for(a=0;a<255;a++)for(b=0;b<255;b++);}void main()//主函数{while(1)//循环函数(使程序一直循环){led0=0;delay();led0=1;delay();//点亮第一盏灯led1=0;delay();led1=1;delay();//点亮第二盏灯led2=0;delay();led2=1;delay();//点亮第三盏灯led3=0;delay();led3=1;delay();//点亮第四盏灯led4=0;delay();led4=1;delay();//点亮第五盏灯led5=0;delay();led5=1;delay();//点亮第六盏灯led6=0;delay();led6=1;delay();//点亮第七盏灯led7=0;delay();led7=1; //点亮第八盏灯}}二、总线流水灯程序:#include<reg51.h> //51系列单片机定义文件#define uchar unsigned char#define uint unsigned int //自定义函数uchar code table[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//用数组方法定义各个灯(去了解一下十六进制,0、1、2、3、4、5、6、7、8、9、A(10)、B(11)、C(12)、D(13)、E(14)、F(15)如:0xfe即:11111110点亮第一盏灯)void delay(uint z) //声明延时函数(延时的时间可以自己设定,改变a,b的范围){ uint a,b;for(a=z;a>0;a--)for(b=110;b>0;b--);}void main()//主函数{while(1) //循环函数(使程序一直循环){unsigned char i;for(i=0;i<8;i++)//for循环(了解它的运行过程){delay(300);P1=table[i];delay(300);} //该命令即把每个数组里头的值赋给P1口。
单片机学习编程之流水灯篇OK
第一章单片机的基础学习第一个实验 LED发光二极管的左移右移(D1到D8依次)点亮二极管点亮的原理图如下。
实际上是接在P1口。
原理图说明:发光二极管阴极接单片机,让电流流入单片机,因为单片机输出电流小,点不亮发光二极管。
发光二极管点亮电流为5 mA至20mA。
编程说明:(1)做一个LED的左移右移,有硬件电路可知,输出“0”才能使LED亮。
开始时P1.0亮,——P1.1亮——P1.2亮….——P1.7亮——P1.0亮,重复循环点亮LED。
(2)延时时间的设计:石英晶体为12MHz,1个机器周期为1微秒,采用单片机每走一步指令需要的时间来延时。
✧延时时间子程序(10.002毫秒)Delay: MOV R4,#20 ;2个机器周期,2微秒D1: MOV R5,#248 ;2个机器周期,2微秒DJNZ R5,$ ;2个机器周期,2*248微秒DJNZ R4,D1 ;2个机器周期,2*20微秒RET这个延时子程序:20*(498+2)+2=10002个机器周期=10.002毫秒。
✧延时时间子程序(200毫秒)Delay: MOV R3,#20 ; 200微秒D1:MOV R4,#20 ;10微秒D2: MOV R5,#248DJNZ R5,$DJNZ R4,D2DJNZ R3,D1RET(3)汇编程序源代码注意:向电脑上编辑程序时注意标点符号要在英文的格式下输入。
ORG 00HMAIN: MOV A,#0FFHCLR CMOV R2,#08H;左移点亮发光二极管LOOP: RLC A ;带进位左移一位MOV P1,A;点亮LED发光二极管CALL DELAY;调用延时子程序DJNZ R2,LOOP;左移、轮流点亮发;光二极管;左移点亮发光二极管后,再右移点亮发光二极管MOV R2,#07HLOOP1: RRC A ;带进位右移一位MOV P1,A;点亮LED发光二极管CALL DELAY;调用延时子程序DJNZ R2,LOOP1JMP MAIN; 返回到初始位置;设置延时时间DELAY: MOV R3,#20D1: MOV R4,#20D2: MOV R5,#248DJNZ R5,$DJNZ R4,D2DJNZ R3,D1RETEND(4)C程序源代码#include <reg51.h>void Delay()//延时子程序{ int i,j;for(i=0;i<=255;i++)for(j=0;j<=255;j++);}void main(){unsigned int i;unsigned int temp;P1=0xff;while(1){temp=0x01;for(i=0;i<8;i++){P1=~temp;逐位取反Delay();temp=temp<<1;}}}(4)实验结果图(注意学习板上的JJ_P1连接器连上)第二个实验采用定时器来设置延时时间(方式0)说明:(1)开始时p1.0亮,延时0.2秒后左移至p1.1亮,如此左移7次后至,再延时0.2秒右移至p1.6亮,如此右移7次后至p1.0亮;(2)延时时间0.2秒,使用定时器0在方式0下工作;采用查询的方式(3)程序源代码ORG 00HMOV TMOD,#00H /***设置定时器的工作方式***/START: CLR CMOV A,#0FFHMOV R2,#08 /***设置循环次数***/LOOP: RLC A /***带进位左循环累加器,点亮发光二极管***/ MOV P1,A /***设置定时器定时时间***/MOV R3,#100CALL DELAYDJNZ R2,LOOP /***点亮了八个发光二极管吗,没有继续***/MOV R2,#07LOOP1: RRC AMOV P2,AMOV R3,#100CALL DELAYDJNZ R2,LOOP1JMP START/***通过单片机内部的定时器设置定时时间***/DELAY: SETB TR0 /***启动定时器***/AGAIN: MOV TL0,#(8192-2000) MOD 32MOV TH0,#(8192-2000) / 32LOOP2: JBC TF0,LOOP3 ;通过查询的方式来判断时间定时器的计时JMP LOOP2LOOP3: DJNZ R3,AGAINCLR TR0RET;非中断END(4)实验结果图第三个实验采用定时器来设置延时时间(方式1)(1)开始时p1.0亮,延时0.2秒后左移至p2.1亮,如此左移7次后至,再延时0.2秒右移至p1.7亮,如此右移7次后至p1.0亮;(2)延时时间0.2秒,使用定时器0在方式1下工作;采用查询的方式(3)源程序代码ORG 00HMOV TMOD,#01HSTART: CLR CMOV A,#0FFHMOV R2,#08LOOP: RLC AMOV P1,AMOV R3,#20CALL DELAYDJNZ R2,LOOPMOV R2,#07LOOP1: RRC AMOV P1,AMOV R3,#20CALL DELAYDJNZ R2,LOOP1JMP STARTDELAY: SETB TR0AGAIN: MOV TL0,#0F0HMOV TH0,#0D8HLOOP2: JBC TF0,LOOP3JMP LOOP2LOOP3: DJNZ R3,AGAINCLR TR0RETEND附录资料:红外发射器的原理图AT89S52下载器的原理图。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
流水灯原理图
流水灯程序
其实流水灯程序就是你只要搞懂端口的高低电平是怎么一回事,置为1 即将该点即为高电平,置0即为低电平,低电平一般是0.3V,同时要知道发光二极管在满足一定电压的同时正常发光电流为10~15mA左右,低于该电流二极管发光亮度会很暗。
比如用一个5V 的电源驱动以个发光二极管其亮度会很亮,当串联一个300欧的电阻时,二极管两端的电压大概为2.3V, 此时电阻两端的电压为5.0-2.2=2.8V;电路中的电流为2.8V/300=9.3ma,接近于正常情况下的发光电流,当串联1K电阻时,则基本就不会光。
下图即为分别串联电阻为R=300,100,500.欧姆的情况下个发光二极管的亮度。