keil 8个led灯间隔点亮的程序

keil 8个led灯间隔点亮的程序,第1张

把延时改一下就行了,数值不要大于50000,想多延时更长时间,在下面再复制出一行。

#include <reg52h>

void main()

{

unsigned int i = 0; //定义循环变量i,用于软件延时

unsigned char cnt = 0; //定义计数变量cnt,用于移位控制

while (1) //主循环,程序无限循环执行该循环体语句

{

P0 = ~(0x01 << cnt); //P0等于1左移cnt位,控制8个LED

for (i=0; i<20000; i++); //软件延时

cnt++; //移位计数变量自加1

if (cnt >= 8) //移位计数超过7后,再重新从0开始

{

cnt = 0;

}

}

}

首先,是单灯如何点亮的问题,无非就是某个gpio口输出高电平或者低电平(由外部电路决定)使灯亮灭,假设输出高电平为亮,输出低电平为灭。

其次,1hz闪烁,即代表定时1s开、关灯。所以要用到定时器。

代码如下:

#include

"stdioh"

#define

led_on

p11

=

1;

#define

led_off

p11

=

0;

bit

flag_1s;

bit

flag_cnt;

void

main(void)

{

sys_init();

while(1)

{

if(flag_1s

==

1)

{

flag_1s

=

0;

if(flag_cnt

^=

1)

led_on;

else

led_off;

}

}

}

sys_init()

{

//

初始化mcu的io口

//

初始化定时器

}

void

timer_isr

(void)

interrupt

1

{

//

定时器中断处理函数

1s

进入一次

flag_1s

=

1;

}

x0为启动按钮,x1为停止按钮。y0~y7为8盏灯。程序在按下启动按钮后,灯1先亮,1秒(T0延时)后灭,1秒后(T1延时)灯2亮,依次循环。当按下x1后,循环结束。

按下x0后,m0得电为1并自保持,此时1秒计时器T0计时,1秒后T0常开点闭合1秒计时器T1计时,再过1秒T1计时结束常闭点断开T0线圈,

T0失电复位并断开T0常开点,此时T1线圈也失电复位,T1常闭点又闭合,T0得电重复上述计时过程。

第二个程序块:

当M0为1时,在T0触点的上升沿来时k3M10这个二进制数乘以2再写入k3M10中。

K3M10代表M10~M21共12个辅助继电器的组合,那么可以将K3M10看作是一个二进制数。程序未启动时,M10~M21均为0,那么这个二进制数为0;当程序启动时,在下一个程序块中利用了M0的上升沿置位M10,此时M10~M21为1,当T0触点的上升沿来时k3M10(此时为1)这个二进制数乘以2再写入k3M10中(写入后为2),2在二进制数中为10,此时M10失电,M11得电,可以认为M10把"1"交给了M11,以此类推。当第8个M17得电时,完成了一次循环。下一个T0上升沿来到时,M18得电,M17失电。此时下面的程序块利用了M18的上升沿重新置位M10并且将M18复位。这样程序又从M10得电开始循环下去了。

这个程序块的作用就是每次T0的上升沿来到时,“1”在M10~M17之间转移。

#include <reg52h>

#define LED P0 /宏定义LED接于P0口/

void delay (int); /声明延迟子函数/

main()

{

int i;

while(1)

{

LED=0xfe;

for(i=0;i<7;i++)

{

delay(100);

LED=(LED<<1)|0x01; /最低位LED灯左移一位后进行或运算使得最低位不会为“0”/

}

for(i=0;i<7;i++)

{

delay(100);

LED=(LED>>1)|0x80; /最低位LED灯右移一位后进行或运算使得最高位不会为“0”/

}

LED=0xff;

for(i=0;i<4;i++)

{

delay(300);

LED=~LED; /所有的LED灯取反全亮或者全灭/

}

}

}

嘿嘿 俺帮你详细分析一下吧1 这段代码 总共有2个程序 一个是主程序MAIN 一个是定时计数器0的中断服务程序IPTO2 定时计数器0 工作在定时方式1 即使一个16位的定时计数器 定时时间=50ms R1做为软件计数器(初始值为14H 即20) 每当定时器定时时间到( 50ms到) 就会进入 定时计数器0的中断服务程序IPTO,重新送定时时间常数3CB0H 同时软件计数器R1内容减1 减为0时,表示1秒时间到(即 50ms×20=1秒) 置1秒时间到标志 SETB 00H 即可寻址位 00H=13 在主程序中 最后一部分代码 NT: JNB 00H,NT ;判断1秒时间到否 可寻址位 00H=0 表示没到 转NT继续判断和等待 RL A ;如果1秒时间到了 即可寻址位 00H=1 则使LED的点亮位左移一位 MOV P1,A CLR 00H ;清除1秒时间到的标志 LJMP NT ; 跳转到NT处 继续判断和等待下一个1秒时间到4 程序的功能就是定时每到1秒后,让LED的点亮位左移一位。 呵呵 给你分析完了 明白了 就选满意回答喽 详细的解释 见右上角百度知道的消息

请设计一个8个led同时全部闪烁的程序

#include <reg51h>

main ()

{int i;

while (1)

{for (i=0;i<=30000;i++);

P1=~P1;

}

}

这个流水灯是很普通的一种花样,假设LED接P1口,程序如下:

ORG 0000H

LJMP MAIN

0RG 000BH

LJMP T0ISR

ORG 0030H

MAIN:

MOV TMOD,#01H

MOV TH0,#HIGH(65536-50000) ;50毫秒定时

MOV TL0,#LOW(65536-50000)

SETB TR0

SETB ET0

SETB EA

MOV A,#0FEH

MOV P1,A

MOV R2,#20

SJMP $

T0ISR:

CLR TR0

MOV TH0,#HIGH(65536-50000)

MOV TL0,#LOW(65536-50000)

SETB TR0

DJNZ R2,T0E ;1秒未到直接退出

MOV R2,#20

RL A

MOV P1,A ;1秒一变的花样流水灯。

T0E:

RETI

END

以上就是关于keil 8个led灯间隔点亮的程序全部的内容,包括:keil 8个led灯间隔点亮的程序、汇编语言编一个八个灯,由左至右循环闪烁的程序~~~谢谢、如何用PLC梯形图做一个8盏灯轮流闪烁的流水灯等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10217968.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存