思路:
循环控制常亮状态的值,将其从最高位循环到最低位。这个用于最后状态的常亮
在常亮循环中,控制不是常亮的其它所有位进行再次循环,逐渐从最低位亮灭循环到最高位
代码如下:
#include <reg51h>unsigned char PData; //整体结果
unsigned char CurrData;//变化的最高位
//延时,本函数是非精确延时,若需要精确延迟则需要根据本函数的汇编语句进行精确计算后调整循环体次数
void delay(unsigned int ms){
unsigned char i;
while(ms--){
for(i=0;i<120;t++){
;
}
}
}
void main(){
unsigned char i=0,j=0;
PData=0x00;//全灭状态
for (i=8;i>0;i--){//控制常亮的位置,先从最高位开始,依次循环到最低位
for (j=0;j<i-1;j++){//从最低位循环到不是常亮的最高位
P1=~(PData+(1<<j));//第i位亮
delay(500);
P1=~PData;//第i位灭
delay(500);
}
PData=PData+(1<<(i-1));//置最高位为常亮状态
P1=~PData;
delay(500);
}
//停机
while(1){
;
}
}
#include <REGX52H>
void Delay1ms(unsigned int count) /延时函数,延迟时间为count×1ms)/
{
unsigned int i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++);
}
main()
{
unsigned char LEDIndex = 0; /声明8位变量LEDIndex,用来指示8个LED中哪个被点亮,初始值为00000000/
bit LEDDirection = 1; /声明位变量LEDDirection,用来指示点亮的方向,初始值为1/
while(1) /一直循环执行大括号里面的语句/
{
if(LEDDirection) /当LEDDirection=1时,0000 0001左移LEDIndex位,取反后送给P2端口,点亮一个LED/
P2 = ~(0x01<<LEDIndex);
else /当LEDDirection=0时,1000 0000右移LEDIndex位,取反后送给P2端口,点亮一个LED/
P2 = ~(0x80>>LEDIndex);
if(LEDIndex==7) /当一次循环结束时,把LEDDirection取反,下次循环时将以相反的顺序点亮/
LEDDirection = !LEDDirection;
LEDIndex = (LEDIndex+1)%8; /LEDIndex+1对8取余,保证LEDIndex在0~7之间/
Delay1ms(500); /延时500ms,即LED的点亮间隔为05s/
}
}
假设P1接8个LED,高电平时LED点亮,主程序如下:
voidmain(void){uchari;while(1){for(i=0;i<7;i++){P1=1<<i;delay_ms(500);}for(i=0;i<7;i++){P1=0x80>>i;delay_ms(500);}}}
方法有很多的,给你一个,你可以调试一下,你可以通过不同的晶振去计算定时器初值,如果你懂定时器这部分很好调通的
#include <reg51h>
#include <intrinsh>
unsigned char i;
void main()
{
TMOD=0x00;
TH1=0x3c;
TL1=0xb0;
EA=1;
ET1=1;
TR1=1;
while(1)
{
if(i==20)
{
i=0;
//下面写你要处理的的其他程序,你只要了定时1s。
}
}
}
void a(void) interrupt 3
{
unsigned char i;
TH1=0x3c;
TL1=0xb0;
i++;
}
流程:
1点亮1个灯;
2延时100毫秒
3灭第一个灯,点亮第二个灯;
4延时100毫秒;
。。。
依次类推,直到灭第8个灯,再返回到1,重新开始。
#include<reg51h>
#include<intrinsh> //头文件中的循环移动函数
void SoftDelay(unsigned int us);
void main(void)
{
unsigned char temp;
temp=0x3f; //先点亮1,2
while(1)
{
P1=temp;
SoftDelay(2000);
P1=_crol_(temp,1); //循环右移
}
}
void SoftDelay(unsigned int us)
{
while(us--);
}
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV R2,#8
MOV A,#0FEH
LOOP1:
MOV P1,A
CLR C
RLC A
LCALL DELAY
DJNZ R2,LOOP1
MOV R2,#8
MOV A,#80H
LOOP1:
MOV P1,A
SETB C
RRC A
LCALL DELAY
DJNZ R2,LOOP1
SJMP MAIN
DELAY:
MOV R2,#200
DLY:
MOV R3,#250
DJNZ R3,$
DJNZ R2,DLY
RET
END
以上就是关于51单片机汇编控制8个流水灯全部的内容,包括:51单片机汇编控制8个流水灯、用AT89C51单片机的P2口控制8个Led的流水灯的C程序看不懂、stm32控制8个流水灯倒序亮灯等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)