把延时改一下就行了,数值不要大于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盏灯轮流闪烁的流水灯等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)