#include<reg51h>
#define uchar unsigned char
void delay(uchar a)
{
uchar i,j;
for(i=0;i<a;i++)
for(j=0;j<120;j++);
}
main()
{
uchar LED=0xfe,i;
while(1)
{
for(i=0;i<4;i++)
{
P0=LED;
delay(100);
P0=0xff;
delay(100);
}
LED=(LED<<1)|0x01;
if(LED==0xff)LED=0xfe;
}
}
// LedTimeCount应该为100
// 把下面这段的宏定义放在前面,代码段覆盖你原来那段试试
// 注意保存和备份
// LED = 0表示灯亮,LED = 1表示灯灭,如果是反着的就把下面的0和1换一下,或者改下宏定义
// pwmcount初始值为三角波,因此后半段的意思是把100次分为pwmcount自减段和常0段
// 如果自减段和常0段LED都为0则常亮
// c为偶数时pwmcount逐渐增加,自减段增加,此时LED如果为0,常0段为1,则变亮,反之变暗
// c为奇数时pwmcount逐渐减小,自减段减小,此时LED如果为1,常0段为0,则变亮,反之变暗
#define fLED(a,b,c) {LED1 = a;LED2 = b;LED3 = c;}
if (pwmcount > 0)
{
switch(c)
{
case 0://1变亮,2常亮,3变暗
fLED(0,0,1);
break;
case 1://1常亮,2变暗,3变亮
fLED(0,0,1);
break;
case 2://1变暗,2变亮,3常亮
fLED(1,0,0);
break;
case 3://1变亮,2常亮,3变暗
fLED(1,0,0);
break;
case 4://1常亮,2变暗,3变亮
fLED(0,1,0);
break;
case 5://1变暗,2变亮,3常亮
fLED(0,1,0);
break;
}
pwmcount--;
}
else
{
switch(c)
{
case 0://1变亮,2常亮,3变暗
fLED(1,0,0);
break;
case 1://1常亮,2变暗,3变亮
fLED(0,1,0);
break;
case 2://1变暗,2变亮,3常亮
fLED(0,1,0);
break;
case 3://1变亮,2常亮,3变暗
fLED(0,0,1);
break;
case 4://1常亮,2变暗,3变亮
fLED(0,0,1);
break;
case 5://1变暗,2变亮,3常亮
fLED(1,0,0);
break;
}
}
程序思想如下 可以想象成一个整数000每次加1后显示一次知道999后溢出跳回起点继续,程序如下
ORG 0000H
AJMP START
START: MOV 30H,#00H ;数码管显示初值
MOV 31H,#00H
MOV 40H,#00H ;显示增量
MOV 41H,#01H
STL1: ACALL LED ;LED显示
ACALL DELAY05S
ACALL BCDADD
MOV A,30H
ANL A,#0F0H
JNZ START ;判断是不是超过999
AJMP STL1
BCDADD: CLR C
MOV A,31H
ADDC A,41H
DA A
MOV 31H,A
MOV A,30H
ADDC A,40H
DA A
MOV 30H,A
RET
LED: MOV A,30H
ANL A,#0FH
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
MOV A,31H
ANL A,#0F0H
SWAP A
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
MOV A,31H
ANL A,#0FH
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P2,A
RET
DELAY05S: MOV R6,#200
SL1: MOV R5,#250
SL2: NOP
DJNZ R5,SL2
DJNZ R6,SL1
RET
TAB: DB 0C0H ;0
DB 0F9H ;1
DB 0A4H ;2
DB 0B0H ;3
DB 099H ;4
DB 092H ;5
DB 082H ;6
DB 0F8H ;7
DB 080H ;8
DB 090H ;9
DB 088H ;A
DB 083H ;B
DB 0C6H ;C
DB 0A1H ;D
DB 086H ;E
DB 08EH ;F
END
PS1:延迟05秒的晶振是357MHZ
PS2:希望我的LED显示代码没写错,我是认为你是0-7接的A-DP
PS3:百度的显示格式真恶心 将就着看吧 程序倒是应该没有什么错误
P4:程序已经修改 重新拷贝一下吧
51单片机来实现60个led灯循环点亮的程序://汇编程序:
#include<at89x51h>
#define uchar unsigned char
#define uint unsigned int
uchar data count=0;
bit flag=0;
//主函数
void main(void)
{
uchar i=0,k=0xfe;
TMOD=0x01;
TH0=0x4c;TL0=0x00;//定时50ms
EA=1;ET0=1;TR0=1;
while(1)
{
if(flag==1){k=k<<1|0x01;flag=0;i++;}
if(i==8){i=0;k=0xfe;}
P1=k;
}
}
//中断函数//0111 1111
void dy1s(void) interrupt 1 using 1
{
TH0=0x4c;TL0=0x00;//定时50ms
count++;
if(count==20){flag=1;count=0;} //1s到了
}。C语言程序编写。
void main() { P1=0XFF; /定义初始状态为全灭/while(1) { delay(2000); P1=0X7e; delay(2000); P1=0Xbd; delay(2000);P1=0Xdb;delay(2000); P1=0Xe7; delay(2000); P1=0Xdb;delay(2000); P1=0Xbd;delay(2000); P1=0X7e; delay(2000); P1=0XFF; /此循环使得发光二极管按照07,16,25,34,43,52,61,70的顺序循环交替两两点亮/} /end while/}/end main/
以上就是关于求一段简单51单片机程序,8个led按顺序每个闪4次全部的内容,包括:求一段简单51单片机程序,8个led按顺序每个闪4次、求51单片机C51LED灯渐亮渐暗程序。。、51单片机控制LED汇编显示程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)