❶ 51单片机跑马灯程序
不好意思,延时用了楼上的。keil下编译OK。假设P1接灯。
ORG00H
SJMPSTART
ORG30H
START:
MOVA,#00
SETBC
MOVR0,#9
;从左到右
LOOP1:
RLCA
MOVP1,A
ACALLDELAY
DJNZR0,LOOP1
;从右到左
MOVR0,#9
LOOP2:
RRCA
MOVP1,A
ACALLDELAY
DJNZR0,LOOP2
SJMPSTART
DELAY:
MOVR6,#20
DELAY_0:MOVR5,#255
DJNZR5,$
DJNZR6,DELAY_0
RET
这个程序比较简单了。再精简,只能精简一句,将MOVP1,A放在DELAY函数里。这样减少一行。
简单介绍一下:
首先就是你要轮流点亮,就是将1循环一圈,因为你要全灭一次,所以用到CY。
RG00H
SJMPSTART
ORG30H
START:
MOVA,#00;//清空A寄存器
SETBC;//将CY置1,然后带进位左移就会进入将A的b0
MAINLOOP:;//大循环起始
MOVR0,#9;设置移位次数,要灭一次,所以设置为9
;从左到右
LOOP1:
RLCA;带进位左移一次;第一次移位结果为01
MOVP1,A;将A中值放入P1点亮对应LED;该句可放在DELAY里,然后从右到左也去掉该句
ACALLDELAY;延时,保持灯亮一段时间,自己根据实际情况调整一下。
DJNZR0,LOOP1;循环,点亮下一个灯,最后一次,A为0,将全灭一次,CY为1
;从右到左
MOVR0,#9;设置循环次数
LOOP2:;循环起始表示
RRCA;带进位右移,第一次结果为80H
MOVP1,A;更新P1点亮对应LED
ACALLDELAY;延时,保持灯亮一段时间
DJNZR0,LOOP2;循环,点亮下一个灯
SJMPMAINLOOP;循环,重新开始下一轮
如果你是管脚输出低LED才亮,只需将MOVA,#00和SETBC改为MOVA,#0FFH和CLRC即可。
方案2:位寻址区00做标志,为0从左到右,该标志为1从右到左
ORG00H
SJMPSTART
ORG30H
START:
MOVA,#00
SETBC
MOVR0,#9
CLR00H
LOOP1:
RLLED:
JB00H,RRLED
RLCA
AJMPDISP
RRLED:
RRCA
DISP:
MOVP1,A
ACALLDELAY
DJNZR0,LOOP1
CPL00H
AJMPSTART
DELAY:
MOVR6,#20
DELAY_0:MOVR5,#255
DJNZR5,$
DJNZR6,DELAY_0
RET
下面是方案1的流程图,这种流程图不知怎么写好,而且写出来基本是对每行的代码的解释。
❷ 单片机,跑马灯
void delay(unsigned char i)
{
unsigned char m;
for(i;i>0;i--)
{
for(m=120;m>0;m--);
}
}
和
void delay()
{
unsigned int i,m;
for(i=110;i>0;i--)
{
for(m=120;m>0;m--);
}
}
延时时间长短不一样
❸ 怎么用单片机按键控制循环跑马灯
我刚好写过一个这样的程序,参考一下吧,希望对你有帮助
/*硬件电路连接:流水灯接在P0口, 阳极接高电平,
阴极接P0口,4个按键分别接P3.4,P3.5, P3.6,P3.7 ,按下时是低电平 */
#include <regx51.h>
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
int a[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//左流水灯数组
int b[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//右流水灯数组
int c[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff}; //逐盏点亮,逐盏灭掉数组
//************************************************************************************************************
void delay()
//延时子程序
{int i;
for(i=0;i<30000;i++);
}
//**********************************************************************************************************
void aa() //实现要求(1)的子程序(key1按下时流水灯,弹开时全灭)
{ int i=0;
while(!key1) //判断是否有键按下
{P0=a[i];delay();i++;if(i==8)i=0;}//流水灯
}
//*************************************************************************************************************
void bb() // 实现要求(2)的子程序(key2按下时实现计数功能,弹开时停止计数;)
{
while(!key2){P0--;delay();if(P0==0)P0=0xff;} //判断是否有键按下,按下则计数器加1
}
//*************************************************************************************************************
void cc() // 实现要求(3)的子程序(key3按下时实现逐盏点亮,逐盏灭掉)
{ int i=0;
P0=0xff ;// 发光二极管全灭
while(!key3) //判断是否有键按下
{P0=c[i];delay();i++;if(i==16)i=0;}//逐盏点亮,逐盏灭掉
}
//*************************************************************************************************************
void dd() // 实现要求(4)的子程序(key4按第一次按下,左流水,第二次按下,右流水,第三次按下,熄灭)
{ int i=0,j=0,k=0,h=0;
loop:P0=0xff;
if(key4==0)
//第一次判断是否有键按下
{for(i=0;i<30000;i++); //延时防抖动
if(key4==1)
//判断按键是否弹起
while(1){P0=a[j];delay();j++;if(j==8)j=0; //左流水灯
if(key4==0)
//第二次判断是否有键按下
{for(i=0;i<30000;i++);
//延时防抖动
if(key4==1)
//判断按键是否弹起
while(1){P0=b[k];delay();k++;if(k==8)k=0; //右流水灯
if(key4==0)
//第三次判断是否有键按下
{for(i=0;i<30000;i++);
//延时防抖动
if(key4==1)
//判断按键是否弹起
goto loop;
//跳转到LOOP处,即P3=0xff,此时灯全灭
}}}}}}
//****************************************************************************************************************
main()
{while(1){P0=0xff;
while(!key1)aa();
while(!key2)bb();
while(!key3)cc();
while(!key4)dd();
}}
❹ 单片机跑马灯
#include#include#defineucharunsignedchar#(uintx){uchari;while(x--){for(i=0;i
❺ 单片机跑马灯!
这只是个宏定义,
#define DataPort P0
#define LedPort P3 //自己定义,根据你连的引脚
注意上边两句,现在#define LedPort P3 //自己定义,根据你连的引脚
是P3,就是LedPort相当于P3,当改成#define LedPort P1时,LedPort相当于 P1,
请参考C语言宏定义部分知识
❻ 单片机编写跑马灯指令 在线等
#include<reg51.h>
sbit led1=P0^0;
sbit led2=P0^1;
sbit led3=P0^2;
sbit led4=P0^3;
sbit led5=P0^4;
sbit led6=P0^5;
sbit led7=P0^6;
sbit led8=P0^7;
sbit led_k=P1^0;
sbit =P1^1;
sbit we=P1^2;
void delayms(unsigned int i);/*延时函数*/
main()
{
led_k=1;/*打开8个led的总开关*/
=0;
we=0;
while(1)
{
led1=0;
delayms(500);
led1=1;
delayms(500);
led2=0;
delayms(500);
led2=1;
delayms(500);
led3=0;
delayms(500);
led3=1;
delayms(500);
led4=0;
delayms(500);
led4=1;
delayms(500);
led5=0;
delayms(500);
led5=1;
delayms(500);
led6=0;
delayms(500);
led6=1;
delayms(500);
led7=0;
delayms(500);
led7=1;
delayms(500);
led8=0;
delayms(500);
led8=1;
delayms(500);
}
}
void delayms(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
for(j=100;j>0;j--);
}
这是逐个点亮的,给你思路,你只要将四个灯点亮写在一块,再延迟后点亮就OK
❼ 单片机跑马灯如何编程!
如果是一个字节型的数据控制LED灯的话,且是1控制LED灯灭,0控制灯亮。
从灭到亮,先是0xFF,然后开始左移,最终移到0x00,就是全亮了。
从亮到灭,先是0x00,然后左移并且加1,重复此工作就是0xFF了
按照上面的思想,你自己应该可以搞定的。
❽ 单片机中的流水灯,花样灯,跑马灯
等 到 你单片机学到一定程度就理解了,这些灯只是按照自己的意思来亮,至于名称都无所谓
❾ 单片机跑马灯代码
//假设晶振12MHZ,P1控制8个LED低电平亮
#include "reg51.h"
unsigned int YSJS=0;
signed char LED=0XFF;
void main(void)
{
TMOD |= 0X10; //定时器1工作于方式1,16位定时器
TH1 = 0XFE; //定时器1定时时间=500uS
TL1 = 0X0C;
ET1 = 1; //使能定时器1中断
TR1 =1;
EA =1; //开总中断
while(1)
{
}
}
void TIMER1(void) interrupt 3 //定时器1中断函数使用默认寄存器组
{
TH1 = 0XFE; //定时器1定时时间=500us
TL1 = 0X0C;
YSJS++;
if(YSJS==1000) //500uS*1000=500000us=0.5s,可调整
{
P1 = LED;
LED=LED<<1
if(LED==0X00)LED=0XFF;
YSJS = 0
}
}