1、首先新建一个工程(新项目)。
2、其次查看原理图确定需求(流水灯)对应LED引脚在单片机上的哪个引脚。
3、然后编写程序(通过查看原理图可以看到需要控制整个P2口以控制8个LED灯)。
4、最后编译程序,下载程序至开发板,查看效果(调试)即可。
流程中的问题!!
#include<reg52h>
#define uchar unsigned char
sbit led=P1^0;
sbit key=P0^0;
void delay(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void main()
{
while(1)
{
if(key==0) //例如:现在按钮被按下
{
delay(5);
if(key==0) //延时消抖后按钮被按下状态,
{
while(key==0); //此行删除,进行下行指令
led=~led; //led灯翻转
}
}
}
}
程序思想如下 可以想象成一个整数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:程序已经修改 重新拷贝一下吧
第一:--d 减号在前表示先自减,后赋值。把d的值减一后与0比较,不为0执行循环体。
第二:不会,一般来说字符型(1字节)比整型(2字节)占用空间少一个字节。用作延时函数没什么区别,但要注意如果反过来的话,数据大于255会出错。
常识:延时函数往往循环次数比较多,建议用整型变量。
第三:0x01;不管什么类型(整型,字符型),在存储器中都是二进制形式存储的。也就是a=1了。
第四:不太明白你问的意思。0x是前缀表示16进制。也可以a=0;这里就是十进制了。
完全可以,不过while(d--)是先判断d是否等于0,然后d减一。也就是d相同情况下(当然要大于0),while(d--)比while(--d)多循环一次。
题意没说的太清楚,随便写一个吧。
#include<reg51h>
sbit led=P1^0;
main()
{
unsigned char dat;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x50;
while(1)
{
if(RI)
{
RI=0;
dat=SBUF;
if(dat==0x5a)led=0;
if(dat==0xa5)led=1;
}
}
}
以上就是关于如何在实现led流水灯时用单片机精确控制流水灯切换时间全部的内容,包括:如何在实现led流水灯时用单片机精确控制流水灯切换时间、按键控制led灯的程序、51单片机控制LED汇编显示程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)