单片机流水灯奇偶循环的汇编程序

合集下载

五种编程方式实现流水灯的单片机C程序

五种编程方式实现流水灯的单片机C程序

五种编程方式实现流水灯的单片机C 程序//功能:采用顺序结构实现的流水灯控制程序/*此方式中采用的是字操作(也称为总线操作)*/#include<regvoiddelay(unsignedchari);//延时函数声明voidmain()//主函数{while(1){P1=Oxfe;//点亮第1 个发光二极管,delay(200);//延时P1=Oxfd;//点亮第2 个发光二极管,delay(200);//延时P1=Oxfb;//点亮第3 个发光二极管delay(200);//延时P1=0xf7;〃点亮第4 个发光二极管delay(200);//延时P1=Oxef;//点亮第5 个发光二极管delay(200);//延时P1=Oxdf;//点亮第6 个发光二极管delay(200);//延时P1=Oxbf;//点亮第7 个发光二极管delay(200);//延时P1=0x7f; 〃点亮第8 个发光二极管delay(200);//延时}}//函数名:delay//函数功能:实现软件延时//形式参数:unsignedchari;//i 控制空循环的外循环次数,共循环i*255 次//返回值:无voiddelay(unsignedchari)//延时函数,无符号字符型变量i 为形式参数{unsignedcharj,k;〃定义无符号字符型变量j 和kfor(k=0;k<i;k++) 〃双重for 循环语句实现软件延时for(j=0;j<255;j++);}//功能:采用循环结构实现的流水灯控制程序//此方式中采用的移位,按位取反等操作是位操作#include<reg包含头文件REGvoiddelay(unsignedchari); 〃延时函数声明voidmain()//主函数{unsignedchari,w;while(1){w=0x01;//信号灯显示字初值为01Hfor(i=0;i<8;i++){P1=~w;//显示字取反后,送P1 口delay(200);//延时w<<=1;//显示字左移一位}}}//函数名:delay//函数功能:实现软件延时//形式参数:unsignedchari;//i 控制空循环的外循环次数,共循环i*255 次//返回值:无voiddelay(unsignedchari)//延时函数,无符号字符型变量i 为形式参数{unsignedcharj,k;〃定义无符号字符型变量j 和kj++);}/******// 功能:for(k=0;k<i;k++) 〃双重for 循环语句实现软件延时for(j=0;j<255;***************************************************************采用位运算符编写的流水灯控制程序,显示效果为挨次熄灭信号灯//此方式也是典型的顺序结构#include<regvoiddelay(unsignedchari); 〃延时函数声明voidmain()//主函数{while(1){P1=OxOO;〃P1 口全部清0,即点亮8 个发光二极管delay(200);//延时P1=P1|0x01;//熄灭第1 个发光二极管delay(200);//延时P1=P1|0x03;//熄灭第1、个发光二极管delay (200);//延时P1=P1|0x07;//熄灭第1〜3 个发光二极管delay(200);//延时P1=P1|0x0f;//熄灭第1〜4 个发光二极管delay(200);//延时P1=P1|0x1f;//熄灭第1〜5 个发光二极管delay(200);//延时P1=P1|0x3f; 〃熄灭第1〜6 个发光二极管delay(200);//延时P1=P1|0x7f; 〃熄灭第1〜7 个发光二极管delay(200);//延时P1=P1|0x7f;//熄灭所有发光二极管delay(200);//延时}}//函数名:delay//函数功能:实现软件延时//形式参数:unsignedchari;//i 控制空循环的外循环次数,共循环i*255 次//返回值:无voiddelay(unsignedchari)//延时函数,无符号字符型变量i 为形式参数{unsignedcharj,k;〃定义无符号字符型变量j 和kfor(k=0;k<i;k++) 〃双重for 循环语句实现软件延时for(j=0;j<255;j++);}/**********************************************************///功能:采用数组实现的流水灯控制程序//此方式也是典型的循环结构#include<reg包含头文件REGvoiddelay(unsignedchari); 〃延时函数声明voidmain()//主函数{unsignedchari;unsignedchardisplay[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};while(1){for(i=0;i<8;i++){P1=display[i]; 〃显示字送P1 口delay(200);//延时}}}//函数名:delay//函数功能:实现软件延时//形式参数:unsignedchari;//i 控制空循环的外循环次数,共循环i*255 次//返回值:无voiddelay(unsignedchari)//延时函数,无符号字符型变量i 为形式参数{unsignedcharj,k;〃定义无符号字符型变量j 和kfor(k=0;k<i;k++) 〃双重for 循环语句实现软件延时for(j=0;j<255;j++);}#include<reg#include<intrins.h>#defineuintunsignedint#defineucharunsignedcharvoiddelay(uintz){uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}voidmain(){uchara,i,j;while(1){for(j=0;j<2;j++){a=0xfe;for(i=0;i<8;i++){P2=a; delay(200);a=_crol_(a,1);//11110}a=0x7f;for(i=0;i<8;i++){P2=a; delay(200);a=_cror_(a,1);}}P2=0xff;for(j=0;j<10;j++)}}{}delay(300);P2=~P2;。

51单片机经典流水灯汇编程序

51单片机经典流水灯汇编程序

51单片机经典流水灯汇编程序(共8页)单片机流水灯汇编程序设计流水灯汇编程序8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。

;用最直接的方式实现流水灯ORG 0000H START:MOV P1,#01111111B ;最下面的LED点亮 LCALL DELAY ;延时1秒 MOV P1,#B ;最下面第二个的L ED点亮 LCALL DELAY ;延时1秒 MOV P1,#B ;最下面第三个的LED点亮(以下省略) LCALL DELAY MOV P1,#B LC ALL DELAY MOV P1,#B LCALL DELAY MOV P1,#B LCALL DELAY MOV P1,#B LCALL DELAY MOV P1,#B LCALL DELA Y MOV P1,#B ;完成第一次循环点亮,延时约秒 AJMP START ;反复循环;延时子程序,12M晶振延时约250毫秒DELAY: ;大约值:2us*256*256*2=260ms,也可以认为为250msPUSH PSW ;现场保护指令(有时可以不加)MOV R4,#2 L3: MOV R2 ,#00HL1: MOV R3 ,#00HL2: DJNZ R3 ,L2 ;最内层循环:(256次)2个周期指令(R3减一,如果比1大,则转向L 2) DJNZ R2 ,L1 ; 中层循环:256次 DJNZ R4 ,L3 ;外层循环:2次 POP PSW RET END--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--51单片机汇编程序集(二)2008年12月12日星期五 10:27辛普生积分程序内部RAM数据排序程序(升序)外部RAM数据排序程序(升序)外部RAM浮点数排序程序(升序)BCD小数转换为二进制小数(2位)BCD小数转换为二进制小数(N位)BCD整数转换为二进制整数(1位)BCD 整数转换为二进制整数(2位)BCD整数转换为二进制整数(3位)BCD整数转换为二进制整数(N位)二进制小数(2位)转换为十进制小数(分离BCD码)二进制小数(M位)转换为十进制小数(分离BCD码)二进制整数(2位)转换为十进制整数(分离BCD码)二进制整数(2位)转换为十进制整数(组合BCD码)二进制整数(3位)转换为十进制整数(分离BCD码)二进制整数(3位)转换为十进制整数(组合BCD码)二进制整数(M位)转换为十进制整数(组合BCD码)三字节无符号除法程序(R2R3R4/R7)=(R2)R3R4 余数R7;二进制整数(2位)转换为十进制整数(分离BCD码);入口: R3,R4;占用资源: ACC,R2,NDIV31;堆栈需求: 5字节;出口: R0,NCNTIBTD21 : MOV NCNT,#00HMOV R2,#00HIBD211 : MOV R7,#0AHLCALL NDIV31MOV A,R7MOV@R0,AINC R0INC NCNTMOV A,R3ORL A,R4JNZ IBD211MOV A,R0CLR CSUBB A,NCNTMOV R0,ARET;二进制整数(2位)转换为十进制整数(组合BCD码);入口: R3,R4;占用资源: ACC,B,R7;堆栈需求: 3字节;出口: R0IBTD22 : MOV A,R0PUSH AMOV R7,#03HCLR AIBD221 : MOV @R0,AINC R0DJNZ R7,IBD221POP AMOVR0,AMOV R7,#10HIBD222 : PUSH ACLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOVB,#03HIBD223 : MOV A,@R0ADDC A,@R0DA AMOV @R0,AINC R0DJNZ B,IBD223POP AMOV R0,ADJNZR7,IBD222RET;二进制整数(3位)转换为十进制整数(分离BCD码);入口: R2,R3,R4;占用资源: ACC,R2,NDIV31;堆栈需求: 5字节;出口: R0,NCNTIBTD31 : CLR AMOV NCNT,AIBD311 : MOV R7,#0AHLCALL NDIV31MOV A,R7MOV @R0,AINCR0INC NCNTMOV A,R2ORL A,R3ORL A,R4JNZ IBD311MOV A,R0CLR CSUBB A,NCNTMOV R0,ARET;二进制整数(3位)转换为十进制整数(组合BCD码);入口: R2,R3,R4;占用资源: ACC,B,R7;堆栈需求: 3字节;出口: R0IBTD32 : MOV A,R0PUSH AMOV R7,#04HCLR AIBD321 : MOV @R0,AINC R0DJNZ R7,IBD321POP AMOVR0,AMOV R7,#18HIBD322 : PUSH ACLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AMOV B,#04HIBD323 : MOV A,@R0ADDC A,@R0DA AMOV @R0,AINC R0DJNZ B,IBD323POP AMOVR0,ADJNZ R7,IBD322RET第七个试验:流水灯数字显示综合练习----51单片机汇编语言试验教程收藏该程序运行结果为个位数码管轮流现实0,1,2,3,4,5,6,7,8然后十位数码管轮流现实0,1,2,3,4,5,6,7,8反复循环,, ,, ,, ,, 依次点亮然后轮流点亮小喇叭不停发出滴答声:注意该程序配套为我站的倚天版开发套件:如果是标准版:因他的数码管接法不同。

51单片机流水灯程序

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。

五种编程方式实现流水灯的单片机C程序

五种编程方式实现流水灯的单片机C程序

五种编程方式实现流水灯的单片机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.中断编程方式:中断编程方式是一种基于中断事件的编程方式,通过在特定的中断事件触发时改变灯光状态来实现流水灯效果。

单片机控制LED流水灯从中间向两边

单片机控制LED流水灯从中间向两边

单片机控制LED流水灯从中间向两边,从两边向中间这个就是把先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;不过这个程序实现的应该是这样的先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动;再从中间往两边流动;#include< reg52.h>#include< intrins.h>#define uint unsigned int#define uchar unsigned charvoid delay();void main(){ uchar temp,temp1,temp2,a,b;P3=0xff;while(1){ for(b=3;b>0;b--){ temp=0xaa;P1=temp;delay();temp=0x55;P1=temp;delay();}for(a=3;a>0;a--){ temp=0xfe;for(b=7;b>0;b--){ P1=temp;temp=_crol_(temp,1);delay();P1=temp;delay();}}temp1=0xfe;temp2=0x7f;for(a=8;a>0;a--){temp=temp1&temp2;P1=temp;delay();temp1=_crol_(temp1,1);temp2=_cror_(temp2,1);}}void delay(){ uint a,b;for(a=100;a>0;a--)for(b=600;b>0;b--);}程序实现的第2种方法:下面是 51hei单片机12群里的朋友木信大侠提出的,实现单片机led流水灯从中间向两边,从两边向中间的效果,下面的程序就是实现思路,这个是直接调用,应该明白吧,数组那其实也可以改一下,如采用一维数组,在多次调用;也可以采用二维数组。

最经典的51单片机经典流水灯汇编程序

最经典的51单片机经典流水灯汇编程序

单片机流水灯汇编程序设计开发板上的8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。

程序A:;用最直接的方式实现流水灯ORG 0000HSTART:MOV P1,#01111111B ;最下面的LED点亮LCALL DELAY;延时1秒MOV P1,#10111111B ;最下面第二个的LED点亮LCALL DELAY;延时1秒MOV P1,#11011111B ;最下面第三个的LED点亮(以下省略)LCALL DELAYMOV P1,#11101111BLCALL DELAYMOV P1,#11110111BLCALL DELAYMOV P1,#11111011BLCALL DELAYMOV P1,#11111101BLCALL DELAYMOV P1,#11111110BLCALL DELAYMOV P1,#11111111B ;完成第一次循环点亮,延时约0.25秒AJMP START ;反复循环;延时子程序,12M晶振延时约250毫秒DELAY:MOV R4,#2L3: MOV R2 ,#250L1: MOV R3 ,#250L2: DJNZ R3 ,L2DJNZ R2 ,L1DJNZ R4 ,L3RETEND程序B:;用移位方式实现流水灯org 00h ;程序上电从00h开始ajmp main ;跳转到主程序org 0030h ;主程序起始地址main:mov a,#0feh ;给A赋值成11111110loop: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个发光二极管,产生流水灯的移动效果。

单片机原理流水灯实验

单片机原理流水灯实验

单片机原理流水灯实验单片机原理流水灯实验是一种十分基础的单片机实验,在学习单片机的初级阶段非常重要。

流水灯可以通过多个灯依次亮起,再逐个熄灭,形成灯光流动的效果。

下面将详细介绍单片机原理流水灯实验的步骤和实现原理。

首先,我们需要准备的材料和工具有:1. 单片机主板:例如STC89C52RC型号。

2. LED灯:我们需要7个LED灯,可以选择不同颜色和尺寸的。

3. 面包板:用于连接电路。

4. 连接线:用于连接单片机主板和面包板以及连接LED灯。

接下来,我们开始进行单片机原理流水灯实验的步骤:第一步:连接电路1. 将7个LED灯连接到面包板上,按照流水灯的顺序连接,可以使用杜邦线连接。

2. 在面包板上连接7个电流限制电阻,以保护LED灯,限制电流的大小根据具体LED灯的要求确定。

3. 将面包板的VCC和GND引线分别连接到单片机主板的VCC和GND引脚上。

第二步:编写程序1. 打开Keil C51编译器,新建一个项目。

2. 编写C语言程序,实现流水灯的效果,代码如下:c#include <reg52.h>声明I/O口函数void delay(unsigned int t);void ledFlow(void);程序入口void main(void){主循环while (1){LED流水灯效果ledFlow();}}延时函数void delay(unsigned int t)unsigned int i, j;for (i = 0; i < t; i++)for (j = 0; j < 120; j++);}LED流水灯效果函数void ledFlow(void){unsigned int i;unsigned char flowData = 0x01;for (i = 0; i < 8; i++){P0 = flowData; 将数据输出到P0口delay(500); 延时500msflowData <<= 1; 左移一位}delay(500); 延时500msflowData = 0x80; 数据复位for (i = 0; i < 8; i++){P0 = flowData; 将数据输出到P0口delay(500); 延时500msflowData >>= 1; 右移一位}delay(500); 延时500ms}第三步:烧录程序1. 将单片机主板连接到电脑上,并打开STC-ISP烧录软件。

单片机控制流水灯—位操作指令

单片机控制流水灯—位操作指令

2 知识准备
四、取反指令
C语言中取反运算符是“~” ,用来对一个二进制整数按位取反,即将0变1,将1变0。
1.“~”运算符可以对整型常量直接操作,比如: int a=~0;则a的值为1。
2.“~”运算符也可以操作变量 unsigned char a=0xaa; unsigned char b=~a; 则b=~a=0x55; 因为“~”运算是一元运算符,所以没有复合赋值运算。
2 知识准备
三、循环位移
_crol_, _cror_指令:将char型变量循环向左(右)移动指定位数后返回,区别 于一般移位的是移位时没有数位的丢失。循环左移时,用从左边移出的位填 充字的右端,而循环右移时,用从右边移出的位填充字的左侧。这种情况在 系统程序中时有使用,在一些控制程序中用得也不少。
3 搭建硬件电路
1.关闭单片机开发板电源开关; 2.单片机P1.0~P1.7端口对应连 接VD31~VD24。
4
编写程序
{ unsigned char a, t;
//定义无符号字符型变
#include< reg51.h >

void delay(unsigned int ys) P1=0xff;
8
课后任务
•复习位操作指令,理解其含义及用法。
单片机技术及应用
}
}产生Hex二进制文件,下载到STC89C58芯片中,验证流水灯程序功能。
6
成果展示及评价
•学生进行作品展示
6
成果展示及评价
评价内容 1.安全用电
自评
小组评价 教师评价
优☆ 良△ 中√ 差×
职业素养
2.设备及器材的安全 3.记录整理完整准确
•学生进41..符流行合水6灯作S管工理品作理原展念理 示

流水灯汇编程序 (4)

流水灯汇编程序 (4)

流水灯汇编程序介绍流水灯是一种常见的电子显示装置,通过多个灯泡(或LED)按照一定的节奏依次亮起和熄灭,形成一个像水流一样流动的效果。

本文档介绍了一种汇编语言编写的流水灯程序。

硬件环境本程序使用单片机作为控制设备,需要以下硬件环境:•单片机开发板•LED灯泡(或LED灯带)•连接线软件环境本程序使用汇编语言编写,需要以下软件环境:•汇编语言开发环境(如Keil等)•单片机烧录工具(如ST-Link等)程序功能该流水灯程序通过控制不同IO口的电平,实现了多个LED 灯按照一定的节奏依次点亮和熄灭的效果。

具体的实现逻辑如下:1.初始化IO口:将用于连接LED的IO口配置为输出模式,并初始化电平为低电平。

2.循环控制:进入一个无限循环,以持续驱动流水灯的效果。

3.逐个点亮:依次将每个LED对应的IO口电平设置为高电平,达到点亮效果。

4.延时控制:通过延时操作,控制每个LED点亮的持续时间。

5.逐个熄灭:依次将每个LED对应的IO口电平设置为低电平,达到熄灭效果。

6.延时控制:通过延时操作,控制每个LED熄灭的间隔时间。

通过不断的逐个点亮和熄灭操作,就能够实现流水灯的效果。

根据实际需要,可以调整延时时间,来改变流水灯的速度和亮暗程度。

汇编代码ORG 0x00 ; 程序入口地址; 定义IO口对应的物理地址LED_BASE EQU 0x50000000 ; LED基地址LED0_OFF EQU 0 ; LED0关闭偏移量LED1_OFF EQU 4 ; LED1关闭偏移量LED2_OFF EQU 8 ; LED2关闭偏移量LED3_OFF EQU 12 ; LED3关闭偏移量; 定义延时函数DelayLDR R1, =1000000 ; 设置延时时间,根据实际需要调整DelayLoopSUBS R1, R1, #1 ; 计数器减1BNE DelayLoop ; 若计数器不为0,则跳转继续延时BX LR ; 延时结束,返回; 主程序入口Main; 初始化IO口LDR R0, =LED_BASE ; 加载IO口基地址STR R0, [R0, #LED0_OFF] ; 设置LED0为输出模式 STR R0, [R0, #LED1_OFF] ; 设置LED1为输出模式 STR R0, [R0, #LED2_OFF] ; 设置LED2为输出模式 STR R0, [R0, #LED3_OFF] ; 设置LED3为输出模式; 循环控制Loop; 逐个点亮STR R0, [R0, #LED0_OFF] ; LED0点亮BL Delay ; 延时一段时间STR R0, [R0, #LED1_OFF] ; LED1点亮BL Delay ; 延时一段时间STR R0, [R0, #LED2_OFF] ; LED2点亮BL Delay ; 延时一段时间STR R0, [R0, #LED3_OFF] ; LED3点亮BL Delay ; 延时一段时间; 逐个熄灭STR R0, [R0, #LED0_OFF] ; LED0熄灭BL Delay ; 延时一段时间STR R0, [R0, #LED1_OFF] ; LED1熄灭BL Delay ; 延时一段时间STR R0, [R0, #LED2_OFF] ; LED2熄灭BL Delay ; 延时一段时间STR R0, [R0, #LED3_OFF] ; LED3熄灭BL Delay ; 延时一段时间B Loop ; 跳转到循环开始的位置END ; 程序结束使用方法1.将上述汇编代码保存为一个以.asm为后缀的文件,如led.asm。

单片机-流水灯的程序

单片机-流水灯的程序

单片机-流水灯的程序流水灯是学习单片机基础知识不可或缺的一个实验,通过流水灯的实现可以掌握单片机 I/O 口的使用、定时器中断的使用以及掌握基本的程序流程控制语句。

本文将介绍流水灯基本概念及实现步骤。

流水灯基本概念流水灯是由多个 LED 灯组成的,每个灯都有一个独立的控制信号,通过按照一定的模式控制信号的输出,就可以实现流水灯的效果。

在单片机中,可以通过将多个 I/O 口作为流水灯中的 LED 控制信号输入口,实现流水灯的效果。

流水灯程序实现步骤在单片机中实现流水灯的程序主要包括以下几个步骤:1.通过 I/O 口控制单片机的 GPIO 端口输出。

2.在控制 GPIO 端口输出时,需要注意端口的方向设置与输出方式的选择。

3.通过控制 GPIO 端口的输出,可以实现 LED 灯的亮灭控制。

4.在亮灭控制中,需要注意定时器中断的使用,以保证流水灯的优美效果。

5.在程序编写的同时,需要考虑到不同型号单片机 I/O 口和定时器的不同特性。

6.需要根据不同的实验要求和要达到的效果,编写相应的程序。

流水灯程序的实现步骤详解下面,将详细介绍流水灯程序的实现步骤:1.首先,需要定义 I/O 口与对应的 LED 灯的对应关系。

一般情况下,LED 灯是连接在单片机的某一 I/O 口上。

我们需要将 I/O 口与 LED 灯的对应关系进行定义,以便在编写程序时可以通过 I/O 口控制 LED 灯的亮灭。

2.接着,需要设置 I/O 口的方向和输出方式。

在单片机的 I/O 口中,默认输入方向,如果要将 I/O 口设置为输出方向,则需要通过软件设置 I/O 口相应的设置寄存器。

同时,需要设置输出方式为推挽输出或是开漏输出,并配置相应的电平。

3.设置定时器。

在流水灯程序中,需通过定时器中断控制 LED 灯的亮灭模式。

需要设置定时器的时钟源、预分频系数、计数值和比较值等参数,以实现不同的滚动速度和亮灭模式。

4.定义中断函数。

中断函数需要根据定时器的计时值进行 LED 灯亮灭的控制操作。

单片机控制流水灯程序汇编语言

单片机控制流水灯程序汇编语言

单片机控制流水灯程序汇编语言随着科技的发展和微电子技术的迅猛进步,单片机逐渐成为智能系统与设备中不可或缺的组成部分。

而流水灯作为最基础的应用之一,不仅在学习过程中具有重要意义,同时也在实际工程中发挥着重要作用。

本文将介绍如何使用汇编语言编写单片机控制流水灯程序,并详细讲解其运行原理和实现方法。

一、流水灯原理流水灯是一种由多个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的亮灭速度。

单片机流水灯c语言实现

单片机流水灯c语言实现
//使数字0--9循环显示
//------------------------------------------------
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code DSY_CODE []=
red_a=1;yellow_a=1;green_a=0;
red_b=0;yellow_b=1;green_b=1;
delayMs(2000);
Operation_Type=2;
break;
case 2://东西向黄灯开始闪烁,绿灯关闭
delayMs(300);
yellow_a=!yellow_a; green_a=1;
while(x--)
{
for(i=0;i<120;i++);
}
}
//---------------------------------------------
//交通灯切换子程序
void Traffic_Light()
{
switch (Operation_Type)
{
case 1://东西向绿灯亮与南北向红灯亮
{
uchar i;
P2=0x01;//P2端口初始化
while(1)//死循环
{
for(i=0;i<7;i++)//i自加1,当i=7时执行第二个for语句
{
P2=_crol_(P2,1);//P2端口循环左移1位
delayMs(150);
}
for(i=0;i<7;i++)

单片机-流水灯的程序

单片机-流水灯的程序
程序分析:
#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
二进制
十六进制
二进制

流水灯[汇编程序]

流水灯[汇编程序]

4.1 流水灯程序介绍:利用P1 口通过一定延时轮流产生低电平输出,以达到发光二极管轮流亮的效果。

实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。

程序实例(LAMP.ASM)ORG 0000HAJMP MAINORG 0030HMAIN:9MOV A,#00HMOV P1,A ;灭所有的灯MOV A,#11111110BMAIN1:MOV P1,A ;开最左边的灯ACALL DELAY ;延时RL A ;将开的灯向右边移AJMP MAIN ;循环DELAY:MOV 30H,#0FFHD1: MOV 31H,#0FFHD2: DJNZ 31H,D2DJNZ 30H,D1RETEND4.2 方波输出程序介绍:P1.0 口输出高电平,延时后再输出低电平,循环输出产生方波。

实际应用中例如:波形发生器。

程序实例(FAN.ASM):ORG 0000HMAIN:;直接利用P1.0口产生高低电平地形成方波////////////// ACALL DELAYSETB P1.0ACALL DELAY10CLR P1.0AJMP MAIN;////////////////////////////////////////////////// DELAY:MOV R1,#0FFHDJNZ R1,$RETEND五、定时器功能实例5.1 定时1秒报警程序介绍:定时器1每隔1秒钟将p1.o的输出状态改变1 次,以达到定时报警的目的。

实际应用例如:定时报警器。

程序实例(DIN1.ASM):ORG 0000HAJMP MAINORG 000BHAJMP DIN0 ;定时器0入口MAIN:TFLA G EQU 34H ;时间秒标志,判是否到50个0.2秒,即50*0.2=1秒MOV TMOD,#00000001B;定时器0工作于方式1MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05秒,定时20次则一秒11SETB EA ;开总中断SETB ET0 ;开定时器0中断允许SETB TR0 ;开定时0运行SETB P1.0LOOP: AJMP LOOPDIN0:;是否到一秒//////////////////////////////////////// INCC: INC TFLAGMOV A,TFLAGCJNE A,#20,REMOV TFLAG,#00HCPL P1.0;////////////////////////////////////////////////// RE:MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05秒,定时20次则一秒RETIEND5.2 频率输出公式介绍:f=1/ts51 使用12M晶振,一个周期是1微秒使用定时器1工作于方式0,最大值为65535,以产生200HZ的频率为例:200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电12平或低电平的时间为2500 微秒。

51单片机经典流水灯程序

51单片机经典流水灯程序

单片机流水灯汇编程序设计开发板上的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秒。

单片机流水灯汇编语言源代码大全(六款流水灯汇编语言源代码)

单片机流水灯汇编语言源代码大全(六款流水灯汇编语言源代码)
源代码:
ORG 0
MOV R1,#3
LOOP1:MOV R0,#8
MOV A,#11111110B
LOOP2:MOV P0,A
RL A
CALL D200MS
DJNZ R0,LOOP2
DJNZ R1,LOOP1
MOV A,#00000000B
MOV P0,A
MOV P2,#0FFH
LOOP:MOV A,P2
ORG 0000H
JMP main
ORG 0003H
JMP int_0
main:
SETB IT0
SETB EX0
SETB EA
MOV A,#11111110B
s:RL A
MOV P2,A
CALL delay
JMP s
delay:
MOV R7,#100
d3:MOV R6,#200
d2:MOV R5,#250
ORG 0000H
MOV R0,#11111110B
start:MOV A,#11111110B
MOV P2,A
s:CALL delay
RL A
MOV P2,A
CALL delay
CJNE A,#01111111B,s
MOV A,R0
MOV P1,A
RL A
MOV R0,A
JMP start
delay:MOV R5,#100
CPL A
MOV P0,A
JMP LOOP
D200MS:
MOV R7,#250
D1:MOV R6,#200
D2:MOV R5,#2
DJNZ R5,$
DJNZ R6,D2
DJNZ R7,D1

单片机编程入门:单片机流水灯程序

单片机编程入门:单片机流水灯程序

单片机编程入门:单片机流水灯程序今日就来教教大家怎么玩玩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,就会有两个灯亮,以此类推下去,等就会渐渐亮起来。

也就是流水灯咯。

大家可以自己随便修改,看看各种亮灯方式。

单片机学习编程之流水灯篇OK

单片机学习编程之流水灯篇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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档