用单片机编写几种跑马灯
此程序是用单片机的p1口接八个led灯作跑马灯试验

拆字程序Org 0000hMov A , 2000HAdd A ,#F0HMOV 2001H ,AMOV A ,2000HADD A , #0FHMOV 2002H , AMOV A , 2001HADD A , 2002HEND拆分BCD 码?***************************************************************************;此程序是用单片机的p1口接八个led灯作跑马灯试验,八个led依次亮了又熄灭,形成漂亮;的跑马灯。
本人已经试验成功。
;单片机教程网 原创;该8路单片机跑马灯程序代码简单,电路也容易搭建,只需把led接在p1口上就可以了,希望大家能试验成功顺利的完成跑马灯报告;***************************************************************************org 0000hloop0:cjne r0 ,#01h,rel,loop0 ;判断开关打开情况ajmp start;跳转到程序开始org 0030h;定义起始汇编地址start:mov a,#0ffh ;clr c ;mov r2,#08h ;循环八次。
loop: rlc a ;带进位左移。
mov p1,a ;此时led灯开始有反映了。
call delay ;延时djnz r2,loop ;循环(djnz条件判断)mov r2,#07h ;loop1: rrc a ;带进位右移mov p1,a ;此时led灯开始有反映了。
call delay ;djnz r2,loop1 ;反复循环jmp start ;回到程序的开头delay: mov r3,#20 ;延时子程序d1: mov r4,#20d2: mov r5,#248djnz r5,$djnz r4,d2```````````````````````````````````````````````---------3路单片机跑马灯程序---------------------------------------ORG 0000HLJMP MAINORG 030HMAIN: MOV P1,#0DBH ;化为2进制为11011011--0状态时led灯亮ACALL DELayMOV P1,#06DH ;化为2进制为01101101ACALL DELay ;MOV P1,#0B6H ;化为2进制为10110110ACALL DELayAJMP MAINdelay: mov r7,#255d1: mov r6,#255d2: djnz r6,d2djnz r7,d1retend。
实验2-最简单的八路跑马灯-实验说明

实验2: 最简单的八路跑马灯1.0连接说明1.1用跳线帽将SP0排针连接;1.2依据ISP在线编程步骤将程序写到入芯片中;1.3打开电源程序即可运行。
1.4注意该实验结束后可将SP0上的跳线帽去掉,以减少开发板的功耗。
2.0相应原理图如下:3.0实验说明:本实验用到L1-8灯。
本例实验主要用到了延时子程序,clr,lcall,ajmp 指令,通过轮流点亮p1.0 …..P1.7 实现效果。
用户可以通过此程序的学习,初步掌握单片机的IO 端口操作。
练习1:怎样把延时的时间改为更短,或者更长?练习2:怎样用P0,P2,P3端口来操作?练习3:怎样实现不同的跑马花样?4.0程序范例:;//P1口控制跑马灯程序//ORG 0000HAJMP MAINORG 0030HMAIN:MOV P1,#0FFH;ACALL DELCLR P1.0 ;将P1.0送0指令ACALL DEL ;延时SETB P1.0CLR P1.1 ;将P1.1送0指令ACALL DEL ;延时SETB P1.1CLR P1.2 ;将P1.2送0指令ACALL DEL ;延时SETB P1.2CLR P1.3 ;将P1.3送0指令ACALL DEL ;延时SETB P1.3CLR P1.4 ;将P1.4送0指令ACALL DEL ;延时SETB P1.4CLR P1.5 ;将P1.5送0指令ACALL DEL ;延时SETB P1.5CLR P1.6;将P1.6送0指令ACALL DEL ;延时SETB P1.6CLR P1.7 ;将P1.7送0指令ACALL DEL ;延时SETB P1.7ACALL DELMOV P1,#00H;ACALL DELAJMP MAIN ;循环RET;//**************************//;//******延时子程序**********//;//**************************//ORG 0080HDEL: MOV R2,#255 ;想想为什么要这样?D1: MOV R3,#255D2: NOP ;延时2us秒,去掉几个NOP看结果怎样?NOPNOPNOPNOPDJNZ R3,D2DJNZ R2,D1RET。
51单片机8个跑马灯程序汇编设计思路

【51单片机8个跑马灯程序汇编设计思路】1. 引言在嵌入式系统中,跑马灯程序是一个非常常见且基础的程序设计。
通过控制LED灯的亮灭顺序,实现灯光在一组灯中顺序轮流亮起的效果。
其中,51单片机是一种常用的嵌入式系统开发评台,本文将探讨如何通过汇编语言设计实现8个跑马灯程序的思路和方法。
2. 分析题目我们需要对题目进行细致的分析。
51单片机8个跑马灯程序要求我们设计并实现一个程序,能够控制8个LED灯依次轮流亮起的效果。
这意味着我们需要对LED灯进行控制,并且需要考虑如何实现循环、延时等功能。
3. LED灯控制在实现跑马灯程序时,首先需要考虑如何控制LED灯的亮灭。
一种常见的方法是通过I/O口控制LED灯的高低电平,从而实现灯的亮灭。
我们需要了解51单片机的I/O口控制方式,并结合LED灯的连接方式进行设计。
4. 循环控制跑马灯程序的核心在于实现LED灯的依次轮流亮起。
这就需要我们设计循环控制的程序结构。
在汇编语言中,可以通过跳转指令和计数器来实现循环效果,我们需要考虑如何设计循环的次数和顺序。
5. 延时控制为了让人眼能够观察到LED灯的亮灭效果,我们需要在程序中添加延时控制。
这需要我们了解51单片机的定时器控制和时钟频率,并根据LED灯的亮度要求设计合适的延时程序。
6. 汇编设计思路在进行汇编设计时,可以按照以下步骤进行:1)设置I/O口控制LED灯的引脚,确定LED的连接方式;2)设计循环控制结构,确定LED灯的顺序和次数;3)添加延时程序,控制LED灯亮灭的时间间隔;4)编写中断程序,处理定时器中断等事件;5)调试程序,验证跑马灯效果是否符合要求。
7. 个人观点和理解通过设计这个跑马灯程序,我深切体会到了汇编语言的精妙之处。
通过对硬件的直接控制和对程序结构的精心设计,我感受到了嵌入式系统开发中的乐趣和挑战。
而对于初学者来说,设计跑马灯程序也是一个很好的学习过程,可以加深对于51单片机结构和编程思想的理解。
51单片机8个跑马灯程序设计思路

51单片机8个跑马灯程序设计思路单片机是一种集成电路,内部包含了计算机的主要组件,如中央处理单元(CPU)、存储器等。
通过编程,可以实现各种不同的功能。
在这里,我将以设计一个8个跑马灯的程序为例,来讲解单片机程序的设计思路。
1.硬件准备首先,我们需要准备一个适用于单片机的开发板,例如STC89C52,以及8个LED灯。
将LED灯连接到开发板的GPIO引脚上,并通过电阻进行限流。
使用跳线将GPIO引脚与LED灯的正极连接。
2.程序结构设计在单片机程序中,我们通常会使用循环结构。
因此,在设计跑马灯程序时,我们可以使用一个无限循环,来实现LED灯的闪烁效果。
具体的程序结构如下所示:```c#include <reg52.h>sbit led0 = P0 ^ 0; //第1个LED灯sbit led1 = P0 ^ 1; //第2个LED灯sbit led2 = P0 ^ 2; //第3个LED灯//...sbit led7 = P0 ^ 7; //第8个LED灯void mainwhile (1)//跑马灯代码}}```在这段代码中,我们首先引入头文件`reg52.h`,它包含了STC89C52的寄存器定义和常用函数的声明。
然后,我们定义了8个宏,用于表示8个LED灯所连接的引脚号。
接下来,在`main(`函数中,我们使用一个无限循环`while(1)`,来实现LED灯的闪烁效果。
3.跑马灯实现思路在无限循环中,我们需要通过对GPIO的控制来实现8个LED灯的闪烁。
具体的实现思路如下:- 首先,我们可以定义一个变量`index`,用于表示当前亮起的LED灯的索引值。
初始时,`index`的值为0,表示第一个LED灯亮起。
- 然后,我们可以使用`switch...case`语句来判断当前的`index`值,从而控制不同的LED灯亮起。
- 在每次循环中,我们可以通过对`index`的递增来实现灯的滚动效果。
任务9 用自制的跑马灯电路实现8只LED循环点亮

• 出栈指令格式为:POP direct ;(direct)←(SP) • • ;SP←SP-1 该指令执行时先将SP所指单元数据弹出至direct所指的地址单元, 然后SP减1指向新的栈顶单元地址。
• •
4)子程序调用指令 ) 子程序调用指令的功能调用子程序,执行时先将断点地址(调用 指令的下一条指令的首地址)压入堆栈区,然后将子程序的首地址送 PC,执行子程序。 (1)长调用指令LCALL addr16 ;PC←PC+3 ;SP←SP+1 ;(SP)←PC7-0 ;SP←SP+1 ;(SP)←PC15-8 ; PC←addr16
执行该指令时,先将PC+2得到下一条指令的16位首地址,并将其压入堆栈, 最后子程序标号所在的子程序入口地址送给PC,CPU转入子程序执行。由于短 调用指令中的PC高5位地址不变,所以其转移的范围为2KB。
任务9 用自制的跑马灯电路实现8只 任务 用自制的跑马灯电路实现 只LED循环点亮 循环点亮 程序分析讲解
任务9 用自制的跑马灯电路实现8只 任务 用自制的跑马灯电路实现 只LED循环点亮 循环点亮
9.1.3 跟我学 1)减1不为零循环转移指令 ) 不为零循环转移指令DJNZ 不为零循环转移指令 DJNZ Rn,rel ;PC←PC+2,Rn←(Rn)-1,若(Rn)≠0,则PC←PC+rel DJNZ direct,rel ;PC←PC+2, direct←(direct)-1,若(direct)≠0,则 PC←PC+rel; 每执行一次循环转移指令,第一操作数(Rn或direct中的数)减1,并 保存,若减1后结果不为零,则转移至目的地(标号处);若减1后结果为零, 则程序按顺序执行下一条指令。
单片机 跑马灯实验精选全文

可编辑修改精选全文完整版实验一跑马灯实验一、实验内容1、基本的流水灯根据图1电路,编写一段程序,使8个发光二极管D1、D2、D3、D4、D5、D6、D7、D8顺序(正序)点亮:先点亮D1,再点亮D2、D3……D8、D1……,循环点亮。
每点亮一个LED,采用软件延时一段时间。
2、简单键控的流水灯不按键,按正序点亮流水灯;按下K1不松手,按倒序点亮流水灯,即先点亮D8,再顺序点亮D7、D6……D1、D8……。
松手后,又按正序点亮流水灯。
3、键控的流水灯上电,不点亮LED,按一下K1键,按正序点亮流水灯。
按一下K2键,按倒序点亮流水灯,按一下K3键,全部关闭LED。
二、实验方案1、总体方案设计考虑到K4键未被使用,所以将实验内容中的三项合并到一个主函数中:K4键代替实验内容第二项中的K1键;单片机一开机即执行实验内容第一项;K1、K2、K3键实现实验内容第三项。
所用硬件:AT89C52、BUTTON、LED-BLUE、电源输入:P2.0-K1;P2.1-K2;P2.2-K3;P2.3-K4。
低电平有效输出:P0.0~P0.7-D0~D7。
LED组连线采用共阳极,低电平有效软件设计:软件延时采用延时函数delay(t),可调整延迟时间:void delay(uint t){uint i;while(t--)for(i=0;i<1000;i++){if(P2!=oldK&&P2!=K[0])break;//按下了其他键退出循环}}由于涉及到按键变化所以要设置一个变量oldK保留按键键值,要在延时程序中检测是否按键,当按键后立即设置oldK的值。
按键判断采用在while循环中利用条件语句判断P2的值然后执行该键对应的代码段,达到相应的响应。
为了让K4键的效果优化,即状态变化从当前已亮灯开始顺序点亮或逆序点亮,利用全局变量n来记录灯号,利用算法即可实现。
主要算法:1、全局变量的定义:uchar D[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0X7f};//单个LED亮uchar AllOff=0xff;//LED全灭uchar AllOn=0x00;//LED全亮uchar K[]={0xff,0xfe,0xfd,0xfb,0xf7};//按键开关uchar oldK;//记录已按键int n;2、顺序、逆序点亮流水灯:void forward(){for(n=0;n<=7;n++){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}void backward(){for(n=7;n>=0;n--){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}3、实验内容第二项流水灯灯亮顺序变换:void hold(){n=8;while(1){if(P2==K[4]){//一直按着K4键,逆序点亮跑马灯oldK=K[4];if(n==-1)n=7; //D0灯亮后点亮D7while(n>=0){out=D[n];n--;if(delay4(15))break;}}if(P2==K[0]){//未按下K4键,一直正序点亮跑马灯oldK=K[0];if(n==8)n=0;//D7灯亮后点亮D0while(n<=7){out=D[n];n++;if(delay4(15))break;}}if(P2!=K[4]&&P2!=K[0]){//按下了其他键,退出hold函数break;}}}4、对应实验内容第一项,开机顺序点亮流水灯:while(1){//开机即正序点亮流水灯forward();if(P2!=K[0]){break;}}2、实验原理图图2-1 实验原理图3、程序流程图图2-2 程序流程图三、源程序#include"reg51.h"#define uchar unsigned char#define uint unsigned int#define out P0uchar D[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0X7f};//单个LED亮uchar AllOff=0xff;//LED全灭uchar AllOn=0x00;//LED全亮uchar K[]={0xff,0xfe,0xfd,0xfb,0xf7};//按键开关uchar oldK;//记录已按键int n;//记录当前亮的灯号void delay(uint t){uint i;while(t--)for(i=0;i<1000;i++){if(P2!=oldK&&P2!=K[0])break;//按下了其他键退出循环}}void delay10ms(){uint i;for(i=0;i<10000;i++);}void forward(){for(n=0;n<=7;n++){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}void backward(){for(n=7;n>=0;n--){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}int delay4(uint t){uint i;while(t--)for(i=0;i<1000;i++){if(P2!=oldK){ //按键变化退出循环return 1;}}return 0;}void hold(){n=8;while(1){if(P2==K[4]){//一直按着K4键,逆序点亮跑马灯oldK=K[4];if(n==-1)n=7; //D0灯亮后点亮D7while(n>=0){n--;if(delay4(15))break;}}if(P2==K[0]){//未按下K4键,一直正序点亮跑马灯oldK=K[0];if(n==8)n=0;//D7灯亮后点亮D0while(n<=7){out=D[n];n++;if(delay4(15))break;}}if(P2!=K[4]&&P2!=K[0]){//按下了其他键,退出hold函数break;}}}void main(){oldK=K[0];while(1){//开机即正序点亮流水灯forward();if(P2!=K[0]){break;}}while(1){out=AllOff;if((P2&0x0f)!=0x0f){//检测有键按下delay10ms();//延时10ms再去检测//P2.0_K1键按下正序点亮流水灯if(P2==K[1]){oldK=K[1];while(1){forward();if(P2!=K[1]&&P2!=K[0]){//按下了其他键,退出break;}}}//P2.1_K2键按下逆序点亮流水灯if(P2==K[2]){while(1){backward();if(P2!=K[2]&&P2!=K[0]){//按下了其他键,退出break;}}}//P2.2_K3键按下关闭全部LEDif(P2==K[3]){oldK=K[3];out=AllOff;}//P2.3_K4键按下长按逆序点亮流水灯,不按正序点亮流水灯,直到其他键按下停止if(P2==K[4]){hold();}}}}四、实验结果1、基本的流水灯:开机后即重复顺序点亮流水灯,等待其他按键。
跑马灯--动态心形(汇编语言)

DELAY: MOV R3 , #08FH DJNZ R3 , $ DJNZ R2, DELAY MOV P1 , #0 INC R0 CJNE R0 , #8 , KKK MOV R0 , #0 DJNZ R4 , KKK INC DPTR INC R6 CJNE R6 , #08H, III MOV R6,#0 MOV DPTR,#200H SJMP III ORG 200H TAB: DB 0E3H, 0C1H, 081H,03H,03H,081H,0C1H, 0E3H, DB 0E3H, 0C1H ,081H,03H,03H,081H,0C1H, 0E3H END
程序编写:
CJNE R6 , #18H, III MOV R6, #0 MOV DPTR, #200H SJMP III ORG 200H 0FFH, 0FFH, 7DH, 01H, 01H, 7DH, 0FFH, 0FFH 0E3H, 0C1H ,81H, 03H, 03H, 81H, 0C1H, 0E3H 0FFH, 81H, 01H, 3FH, 3FH, 3FH, 01H, 81H 0FFH, 0FFH,7DH, 01H, 01H, 7DH, 0FFH,0FFH
利用IO口实现跑马灯功能: 跑马灯又称为流水灯。简单地说就是一 组灯在控制系统的控制下按照设定的时间和顺序 来发亮或熄灭,组成不同的图形,从而达到一定 的视觉效果。 • 基本跑马灯电路的组成: MCS—51单片机,LED小灯泡,电容电阻, 振荡电路,译码电路,光源电路等。
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 列置高电平 行置低电平
点阵共有64 个二极管每 个发光二极 管是放置在 行线和列线 的交叉点上
当对应的 某一列置 1电平, 某一行置 0电平, 则相应的 二极管就 亮
单片机实例之跑马灯

在P1.0引脚上输出0,应使用的命令是: light=0;(汇编:CLR P1.0)
同理,让LED熄灭,应使用的命令是: light=1; (汇编:SETB P1.0)
单片机实例之跑马灯
4、延时程序的编写
单片机执行一条指令的执行时间,称为指令周期。 指令周期是以机器周期为单位的,为1~4个机器周期,多 数指令都是单周期指令,也就是执行一条指令的时间为一 个机器周期。在MCS-51单片机规定一个机器周期为单片 机振荡器的12个振荡周期。如果晶振频率为12MHz,则 一个机器周期为1μs。
程序开始 输出低电平
在本任务的程序设计框图 就是图3-4。从框图中可看出两 点,一是程序是一个循环结构, 即程序开始后就反复地循环执 行,二是程序包含了端口输出 控制和0.5秒的延时程序。
延时0.5秒 输出高电平 延时0.5秒
图3-4 1Hz的闪烁程序设计框图
单片机实例之跑马灯
在本任务中的引脚定义使用如下命令: sbit light=P1^0;
单片机实例之跑马灯
图3-2 八路发光二极管控制电路演示图
单片机实例之跑马灯
三、程序设计
P1.0端口的LED闪亮
AT89S51
单片机的 I/O端口
P1.0
+Vcc
图3-3 单片机驱动一只发光二极管的原理电路
单片机实例之跑马灯
0.5秒延时的汇编程序:
MOV R6,#5
SS:
MOV R7, #200
单片机的指令运行是很快的,要在端口获得一定时间 长度的脉冲信号,就要通过编写程序,使单片运行设计程 序产生时间延迟,实现从单片机输出端口上获得需要频率 的电脉冲信号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用单片机编写几种跑马灯
任务:
1、在电路板上实现跑马灯,一次1匹
2、在电路板上实现跑马灯,一次2匹
3、在电路板上实现4个二极管的同时闪烁
源程序1:
/***********************************信息****************************************
**作者:刘海涛
**版本:初始版V1.0
**描叙:用电路板实现跑马灯。
**日期:2010年7月25日
*******************************************************************************/ /**********************************头文件*************************************** **头文件"reg52.h"
*******************************************************************************/ /**********************************函数名*************************************** **函数名:延时函数delay()
**输入:无
**输入:无
**宏定义:无
*******************************************************************************/ /**********************************宏定义*************************************** 宏定义:#define XBYTE ((unsigned char *)0x20000L)
*******************************************************************************/ #include"reg52.h"
delay(unsigned int dat) // 延时函数定义
{
unsigned int i,j;
for(i=0;i<dat;i++)
{
for(j=0;j<10000;j++);
}
}
#define XBYTE ((unsigned char *)0x20000L) //宏定义
void main(void) //主函数
{
unsigned char i;
while(1)
{
for(i=0;i<4;i++)
XBYTE[0xd000]=(0x01<<i)^0xFF; //参考电路图,点亮第一个灯,并循环左移
delay(10); //延时函数调用
}
}
}
源程序2:
/***********************************信息**************************************** **作者:刘海涛
**版本:初始版V1.0
**描叙:用电路板实现跑马灯,一次移动2灯。
**日期:2010年7月25日
*******************************************************************************/ /**********************************头文件*************************************** **头文件"reg52.h"
*******************************************************************************/ /**********************************函数名*************************************** **函数名:延时函数delay()
**输入:无
**输入:无
**宏定义:无
*******************************************************************************/
/**********************************宏定义*************************************** **宏定义:#define XBYTE ((unsigned char *)0x20000L)
*******************************************************************************/
#include"reg52.h" // 头文件
#define XBYTE ((unsigned char *)0x20000L) //宏定义
delay(unsigned int dat) //延时函数
{
unsigned int i,j;
for(i=0;i<dat;i++)
{
for(j=0;j<10000;j++);
}
}
void main(void) //主函数
{
unsigned int i;
while(1)
for(i=0;i<3;i++)
{
XBYTE[0xd000]=(0x03<<i)^0xff; //点亮1、2两个灯
delay(10);
}
XBYTE[0xd000]=(0x09<<0)^0xff; //点亮第一、第四个灯
delay(10);
}
}
源程序3:
/***********************************信息**************************************** **作者:刘海涛
**版本:初始版V1.0
**描叙:用电路板实现跑马灯,四个二极管同时闪烁。
**日期:2010年7月25日
*******************************************************************************/ /**********************************头文件*************************************** **头文件"reg52.h"
*******************************************************************************/ /**********************************函数名*************************************** **函数名:延时函数delay()
**输入:无
**输入:无
*******************************************************************************/
/**********************************宏定义*************************************** **宏定义:#define XBYTE ((unsigned char *)0x20000L)
*******************************************************************************/ #include"reg52.h" //主函数
#define XBYTE ((unsigned char *)0x20000L) //宏定义
delay(unsigned int dat) //延时函数
{
unsigned int i,j;
for(i=0;i<dat;i++)
{
for(j=0;j<10000;j++);
}
}
void main(void) //主函数
{
while(1)
{
XBYTE[0xd000]=(0x0f<<0)^0xff; // delay(10);
XBYTE[0xd000]=(0x0f<<4)^0xff; delay(10);
}
}。