单片机流水灯程序
- 格式:docx
- 大小:13.66 KB
- 文档页数:5
五种编程方式实现流水灯的单片机C程序流水灯是一种常见的灯光效果,常用于装饰和展示。
实现流水灯的程序可以使用多种不同的编程方式,包括传统的顺序编程、状态机编程、中断编程、调度器编程和面向对象编程。
下面分别介绍这五种方式实现流水灯的程序。
1.顺序编程方式:顺序编程是最常见的编程方式,也是最直接的方式。
下面是使用顺序编程方式实现流水灯的C程序:```c#include <reg52.h>void delay(unsigned int t)while(t--)for(int i=0; i<50; i++);}void mainunsigned char led = 0x80; // 初始灯光状态while(1)P0 = led; // 输出灯光状态delay(500); // 延时一段时间led >>= 1; // 右移一位,实现流水灯效果if(led == 0) // 到达最右边后重新开始led = 0x80;}}```2.状态机编程方式:状态机编程是一种基于状态的编程方式,通过定义不同的状态和状态转换来实现流水灯效果。
下面是使用状态机编程方式实现流水灯的C程序:```c#include <reg52.h>typedef enumState1,State2,State3,State4,State5} State;void delay(unsigned int t)while(t--)for(int i=0; i<50; i++);}void mainState state = State1; // 初始状态为State1 while(1)switch(state)case State1:P0=0x80;delay(500);state = State2;break;case State2:P0=0x40;delay(500);state = State3;break;case State3:P0=0x20;delay(500);state = State4;break;case State4:P0=0x10;delay(500);state = State5;break;case State5:P0=0x08;delay(500);state = State1;break;}}```3.中断编程方式:中断编程方式是一种基于中断事件的编程方式,通过在特定的中断事件触发时改变灯光状态来实现流水灯效果。
目录流水灯最原始 (1)流水灯位左移 (3)流水灯移位函数 (4)流水灯数组 (5)流水灯精确定时器 (6)流水灯最原始#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;voidmdelay(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;mdelay(1000);p2=0;p3=1;mdelay(1000);p3=0;p4=1;mdelay(1000);p4=0;p5=1;mdelay(1000);p5=0;p6=1;mdelay(1000);p6=0;p7=1;mdelay(1000);p7=0;}}流水灯位左移#include "reg51.h"voidmdelay(unsigned int t){unsigned char n;for(;t>0;t--)for(n=0;n<125;n++){;}}void main(){unsigned char i;unsignedint led;while(1){led=0xfe;for(i=0;i<8;i++){P1=led;mdelay(1000);led=led<<1;led=led|0x01;}}}流水灯移位函数#include "reg51.h"#include "intrins.h"voidmdelay(unsigned int t){unsigned char n;for(;t>0;t--)for(n=0;n<125;n++){;}}void main(){unsigned char led;led=0x01;while(1){P1=led;led=_crol_(led,1);mdelay(1000);}}流水灯数组#include "reg51.h"unsigned char table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; voidmdelay(unsigned int t){unsigned char n;for(;t>0;t--)for(n=0;n<125;n++){;}}void main(){unsigned char i;while(1){for(i=0;i<8;i++){P1=table[i];mdelay(1000);}}}流水灯精确定时器#include "reg51.h"#include "intrins.h"unsignedint count=0,led;void main(){P1=0x00;led=0x01;EA=1;ET0=1;TMOD=0x01;TH0=0x3c;TL0=0xb0;TR0=1;for(;;){;}}voidbiao() interrupt 1{count++;if(count==20){count=0;P1=led;led=_crol_(led,1);}TH0=0x3c;TL0=0xb0;}。
基于51单片机的C语言流水灯程序#include //51系列单片机定义文件#define uchar unsigned char //定义无符号字符#define uint unsigned int //定义无符号整数void delay(uint); //声明延时函数void main(){uint i;uchar temp;while(1){temp=0x01;for(i=0;i<8;i++) //8个流水灯逐个闪动{P2=~temp;delay(500); //调用延时函数temp<<=1;}temp=0x80;for(i=0;i<8;i++) //8个流水灯反向逐个闪动{P2=~temp;delay(500); //调用延时函数temp>>=1;}temp=0xFE;for(i=0;i<8;i++) //8个流水灯依次全部点亮{P2=temp;delay(500); //调用延时函数temp<<=1;}temp=0x7F;for(i=0;i<8;i++) //8个流水灯依次反向全部点亮{P2=temp;delay(500); //调用延时函数temp>>=1;}}}void delay(uint a) //延时函数,毫秒级别{uint i;while(--a!=0) //执行空操作循环,其中a为形参,由调用该函数的函数语句提供值{for(i=0;i<125;i++);//执行当0加到125时,大约会用掉1ms 的时间}}。
单片机控制流水灯程序汇编语言随着科技的发展和微电子技术的迅猛进步,单片机逐渐成为智能系统与设备中不可或缺的组成部分。
而流水灯作为最基础的应用之一,不仅在学习过程中具有重要意义,同时也在实际工程中发挥着重要作用。
本文将介绍如何使用汇编语言编写单片机控制流水灯程序,并详细讲解其运行原理和实现方法。
一、流水灯原理流水灯是一种由多个LED组成的灯条或灯链,在按照一定次序依次点亮和熄灭的灯光效果。
其原理基于单片机通过控制输出口的电平高低来控制LED的亮灭状态,实现灯光的变化和移动效果。
二、程序设计方法1. 初始化设置在编写流水灯程序之前,我们首先要了解单片机的相应接口和寄存器的使用方法。
在程序开始时,需要进行相应的初始化设置,包括将数据方向寄存器和端口寄存器设置为输出,并将初始值赋予输出口电平。
例如,对于51单片机,可以使用以下汇编语言代码进行初始化设置:MOV P1, #00H ;将P1端口的输出电平置为低电平MOV P1M1, #FFH ;将P1端口的数据方向设置为输出MOV P1M0, #00H2. 主程序在流水灯程序中,需要编写主程序来实现流水灯的效果。
主程序中使用循环结构控制LED的亮灭状态和移动效果。
例如,以下是一个简单的汇编语言代码,实现了由4个LED组成的流水灯的效果:MOV R0, #F0H ;初始亮灭状态MOV R1, #00H ;初始LED位置LOOP: ;循环MOV P1, R0 ;将亮灭状态赋予P1端口的输出电平ACALL DELAY ;延时,形成流水灯效果MOV A, R1SUBB A, #01H ;将LED位置减一MOV R1, AJZ CHANGE ;当LED位置为零时,改变亮灭状态MOV R0, R0SJMP LOOP ;继续循环CHANGE: ;改变亮灭状态CPL R0 ;对亮灭状态进行取反操作SJMP LOOP ;继续循环3. 延时函数为了实现流水灯的移动效果,需要设置一个合适的延时时间来控制LED的亮灭速度。
51单片机流火灯步调之阳早格格创做步调一(用C谈话编的最前提的步调)#include<reg52.h>#include<stdio.h>sbit D0=P1^0;//位定义,把P1心的第一个管足定义为D0 sbit D1=P1^1;// 位定义,把P1心的第二个管足定义为D1 sbit D2=P1^2;// 位定义,把P1心的第3个管足定义为D2 sbit D3=P1^3;// 位定义,把P1心的第4个管足定义为D3 sbit D4=P1^4;// 位定义,把P1心的第5个管足定义为D4 sbit D5=P1^5;// 位定义,把P1心的第6个管足定义为D5 sbit D6=P1^6;// 位定义,把P1心的第7个管足定义为D6 sbit D7=P1^7;// 位定义,把P1心的第8个管足定义为D7 void main(){while(1)//修坐大的死循环.{unsigned int i,j;D0=0,D7=1;//明灯1,闭灯8for(i=50;i>0;i)for(j=200;j>0;j);//二个FOR组成的延时D0=1,D1=0;// 明灯2,闭灯1for(i=50;i>0;i)for(j=200;j>0;j);D1=1,D2=0;for(i=50;i>0;i)for(j=200;j>0;j);D2=1,D3=0;for(i=50;i>0;i)for(j=200;j>0;j);D3=1,D4=0;for(i=50;i>0;i)for(j=200;j>0;j);D4=1,D5=0;for(i=50;i>0;i)for(j=200;j>0;j);D5=1,D6=0;for(i=50;i>0;i)for(j=200;j>0;j);D6=1,D7=0;for(i=50;i>0;i)for(j=200;j>0;j);}}步调二(用swich case语句编的)#include<reg52.h>//51单片机的头文献. sbit d1=P1^0;//sbit d2=P1^1;sbit d3=P1^2;sbit d4=P1^3;sbit d5=P1^4;sbit d6=P1^5;sbit d7=P1^6;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_的头文献. void delay(unsigned int z)//修坐延时子函数. {unsigned int i,j;for(i=0;i<z;i++)for(j=0;j<200;j++);}void main(){unsigned char d;d=0xfe;while(1)//{for(;d>0x7f;){P1=d;delay(100);//调用延时子函数延时.d=_crol_(d,1);//循环左移.}for(;d<0xfe;){P1=d;delay(100);d=_cror_(d,1);//循环左移,让灯倒回来.}}}数码管流火灯:#include<reg52.h>#include<intrins.h>void delay(unsigned int a){unsigned int b;b=a;while(b>0)b;}void main(){unsigned int i,j;unsigned code A[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0x3f:为0,即数码管明“0”.P2=0;//挨开数码管的第一个,P0=j;//对于数码管举止赋值while(1){i=0;for(j=0;j<16;j++){P2=i;P0=A[j];delay(50000);i++;}}}数码管步调二:#include<intrins.h>void delay(unsigned int a){unsigned int b;b=a;while(b>0)b;}void main(){int i,j;unsigned code A[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};P2=0;P0=j;while(1){j=0;for(i=0;i<8;i++){P2=i;P0=A[j];delay(50000);j++;}for(i=7;i>=0;i){P2=i;P0=A[j];delay(50000);j++;}}}中断步调一#include<reg52.h>#include<intrins.h>void delay(unsigned int a){unsigned int b;b=a;while(b>0)b;}void main(){int i,j;unsigned code A[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};EA=1;//挨开总中断EX0=1;//挨开中部中断0.IT0=0;//采用其为矮电仄灵验灵验.当CPU检测到P3.3引足上出现灵验的中断旗号时,中断标记IE1(TCON.3)置1,背CPU申请中断.P2=0;P0=j;P1=0xfe;while(1){j=0;for(i=0;i<8;i++){P2=i;P0=A[j];delay(50000);j++;}for(i=7;i>=0;i){P2=i;P0=A[j];delay(50000);j++;}}}void exist() interrupt 0//中断子步调,其中“0”为中部中断的序号{P1=_crol_(P1,1);delay(50000);}定时步调;include<reg52.h>unsigned int i=0,j=0,t;unsigned code a[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void main(){TMOD=0x01;//对于TMOD赋值,以决定T0战T1的处事办法.TH0=(6553650000)/256;TL0=(6553650000)%256;//定时/计数器的真量是加1计数器(16位),由下8位战矮8位二个寄存器组成.对于下8位战矮8位赋值.EA=1;//开总中断ET0=1;//则对于IE赋值,开搁中断TR0=1;//使TR0或者TR1置位,开用定时/计数器定时. while(1){if(t==20){t=0;if(j==8)j=0;if(i==16)i=0;P2=j;P0=a[i];i++;j++;}}}void time() interrupt 1//定时子步调,其中“1”为定时/计数器序号{TH0=(6553650000)/256;TL0=(6553650000)%256;t++;}。
单片机流水灯汇编程序设计开发板上的8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。
程序A:;用最直接的方式实现流水灯ORG 0000HSTART:MOV P1,#B ;最下面的LED点亮LCALL DELAY;延时1秒MOV P1,#B ;最下面第二个的LED点亮LCALL DELAY;延时1秒MOV P1,#B ;最下面第三个的LED点亮(以下省略)LCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#BLCALL DELAYMOV P1,#B ;完成第一次循环点亮,延时约0.25秒AJMP START ;反复循环;延时子程序,12M晶振延时约250毫秒DELAY:MOV R4,#2L3: MOV R2 ,#250L1: MOV R3 ,#250L2: DJNZ R3 ,L2DJNZ R2 ,L1DJNZ R4 ,L3RETEND程序B:;用移位方式实现流水灯ajmp main ;跳转到主程序org 0030h ;主程序起始地址main:mov a,#0feh ;给A赋值成loop:mov p1,a ;将A送到P1口,发光二极管低电平点亮lcall delay ;调用延时子程序rl a ;累加器A循环左移一位ajmp loop ;重新送P1显示delay:mov r3,#20 ;最外层循环二十次d1:mov r4,#80 ;次外层循环八十次d2:mov r5,#250 ;最内层循环250次djnz r5,$ ;总共延时2us*250*80*20=0.8Sdjnz r4,d2djnz r3,d1retend51单片机经典流水灯程序,在51单片机的P2口接上8个发光二极管,产生流水灯的移动效果。
ORG 0;程序从0地址开始START: MOV A,#0FEH ;让ACC的内容为LOOP: MOV P2,A ;让P2口输出ACC的内容RR A;让ACC的内容左移CALL DELAY ;调用延时子程序LJMP LOOP ;跳到LOOP处执行;0.1秒延时子程序(12MHz晶振)===================DELAY: MOV R7,#200 ;R7寄存器加载200次数D1: MOV R6,#250 ;R6寄存器加载250次数DJNZ R6,$ ;本行执RET;返回主程序END;结束程序开关控制的单片机流水灯汇编在单片机控制下,用一个拨动开关K1,控制8个发光二极管L1-L8,发光的时间间隔为0.5秒。
流水灯实习报告一、实验原理单片机通过P0口连接锁存器74ls273,P0同时作为低八位地址,实验板内P2口连接74ls138,任意一个输出连接74ls273片选,再将74ls273接八个LED灯,通过软件控制对74ls273送入显示数据就可以按要求显示了。
二、硬件原理图三、实验程序ORG 0000HAJMP STARTORG 001BHAJMP INTORG 0100H START:MOV SP,#60H MOV TMOD,#10H MOV TL1,#00H MOV TH1,#4CH MOV R0,#00HMOV R1,#20SETB TR1SETB ET1SETB EASJMP $INT:PUSH ACC PUSH PSWPUSH DPLPUSH DPHCLR TR1MOV TL1,#B0H MOV TH1,#3CH SETB TR1DJNZ R1,EXITMOV R1,#20MOV DPTR,#DATAMOV A,R0MOVC A,@A+DPTRMOV DPTR,#8000HMovx @DPTR,AINC R0ANL 00,#07HEXIT:POP DPHPOP DPLPOP PSWPOP ACCRETIDATA:DB 05H,0AH,50H,0A0H,55H,0AAH,0FFH,0HEND四、实验功能以实验机上74LS273做输出口,接八只发光二极管,编写程序,使开机后第一秒钟L1,L3亮,第二秒钟L2,L4亮,第三秒钟L5,L7亮,第四秒钟L6,L8亮,第五秒钟L1,L3,L5,L7亮,第六秒钟L2,L4,L6,L8亮,第七秒钟八个二极管全亮,第八秒钟全灭,以后又从头开始,L1,L3亮,然后L2,L4亮……一直循环下去.五、实验总结在做本次实验时,首先要注意实验要求是用74LS273做输出口,所以不要用P1口作输出口。
在引入中断前,要注意保护现场。
单片机编程入门:单片机流水灯程序今日就来教教大家怎么玩玩51单片机,当然了,首先有一个必要的条件就是你必需要会c语言,目前高校里面有开的关于微机原理的课的,上课的时候,老师还说:“你们要多学学汇编语言,对你们以后学习单片机有用”,而事实上后来才发觉c语言才是最重要的。
要想玩单片机,就必需要知道最重要的是什么,对于一块51单片机的开发板来说,最重要的就是要认仔细真的看它的原理图,原理图才是最重要的。
今日先说说最基本的,就是怎么玩流水灯,老样子,先看看原理图:可以看到,总共是八个LED灯,都是由单片机的P1口掌握的,并且可以知道当端口为低电平常,灯就会亮,大家肯定要留意这一点,目前市场上51的开发板还是有特别多的,你必需要知道你的板子上LED灯是高电平使能还是低电平使能。
像我这块就是低电平使能,写程序的话,我们可以用十六进制的代码写,任意一个十六进制的数都可以拆分成八位的二进制数,而计算机只识别二进制,这样我们可以直接掌握LED灯。
比如我现在写一个代码P1 = 0xfe,那么把它变为二进制后就是1111 1110 这样的话,正好对应八个LED灯,最终一位是零,那么也就是最终一个LED灯亮了,其余的则是全灭状态。
现在我们可以玩玩流水灯,看一下这个程序:看主函数main 里面的代码,P1 = 0xff 说明最开头是全灭状态,定义一个for循环,以八位为一个循环,当然也可以看到,最重要的便是P1 = P1》1这个代码,相当于说是把1111 1111 这个代码整体向右移位,比如说移位一次,那么就会变成0111 1111,那么就会有一个灯亮,移位两次,就会变成0011 1111,就会有两个灯亮,以此类推下去,等就会渐渐亮起来。
也就是流水灯咯。
大家可以自己随便修改,看看各种亮灯方式。
单片机流水灯程序
流水灯是一种简单而常见的电子技术实验项目,也是学习
掌握单片机编程的基本操作之一。
本文将介绍如何使用C语
言编写单片机流水灯程序,并通过Markdown文本格式输出。
硬件准备
在开始编写流水灯程序之前,我们需要准备以下硬件设备:
1.单片机开发板(如:Arduino、STM32等)
2.LED灯(可根据自己的需求选择,一般使用红色、
黄色、绿色等常见颜色的LED灯即可)
3.杜邦线(用于连接单片机和LED灯)
程序编写
引入头文件
首先,我们需要引入相应的头文件,以便使用单片机相关
的功能库和定义常量。
#include <Arduino.h>
定义引脚
接下来,我们需要定义引脚,将LED灯的接口与开发板的引脚连接起来。
#define LED_PIN_1 2
#define LED_PIN_2 3
#define LED_PIN_3 4
#define DELAY_TIME 500
在这个例子中,我们使用了3个LED灯,分别连接到开发板的2、3、4号引脚。
DELAY_TIME用于控制每个灯亮起的时间间隔,单位是毫秒。
初始化引脚
在进入主程序之前,我们需要对引脚进行初始化,设置引脚的输出模式。
void setup() {
pinMode(LED_PIN_1, OUTPUT);
pinMode(LED_PIN_2, OUTPUT);
pinMode(LED_PIN_3, OUTPUT);
}
主程序
接下来就是我们的主程序部分,我们可以使用循环语句来实现LED灯的流水效果。
void loop() {
digitalWrite(LED_PIN_1, HIGH);
delay(DELAY_TIME);
digitalWrite(LED_PIN_1, LOW);
digitalWrite(LED_PIN_2, HIGH);
delay(DELAY_TIME);
digitalWrite(LED_PIN_2, LOW);
digitalWrite(LED_PIN_3, HIGH);
delay(DELAY_TIME);
digitalWrite(LED_PIN_3, LOW);
}
在这个例子中,我们依次点亮每个LED灯,并延迟一定的时间后熄灭,然后依次点亮下一个LED灯,以此循环。
完整代码
下面是完整的单片机流水灯程序代码:
#include <Arduino.h>
#define LED_PIN_1 2
#define LED_PIN_2 3
#define LED_PIN_3 4
#define DELAY_TIME 500
void setup() {
pinMode(LED_PIN_1, OUTPUT);
pinMode(LED_PIN_2, OUTPUT);
pinMode(LED_PIN_3, OUTPUT);
}
void loop() {
digitalWrite(LED_PIN_1, HIGH);
delay(DELAY_TIME);
digitalWrite(LED_PIN_1, LOW);
digitalWrite(LED_PIN_2, HIGH);
delay(DELAY_TIME);
digitalWrite(LED_PIN_2, LOW);
digitalWrite(LED_PIN_3, HIGH);
delay(DELAY_TIME);
digitalWrite(LED_PIN_3, LOW);
}
程序烧录
完成代码编写后,我们将代码烧录到单片机开发板上。
具体的烧录操作可以参考开发板的使用手册,一般包括连接开发板、选择开发工具、下载编译好的程序等步骤。
运行效果
当完成烧录后,我们便可以看到LED灯按照预定的流水灯程序进行亮灭。
每个LED灯亮起的时间间隔可以通过DELAY_TIME常量进行调整。
总结
本文介绍了如何使用C语言编写单片机流水灯程序,并通过Markdown文本格式输出。
通过这个简单的实例,我们可以学习如何使用单片机控制LED灯的亮灭,掌握基本的单片机编程概念和操作。
希望本文对你理解单片机流水灯程序有所帮助!。