
很酷的流水灯
#include <reg51h>
typedef unsigned char uchar;
#define Ton 40
#define LED P0
sbit leds=P1^4;
sbit LED0 = P0^0;
sbit LED1 = P0^1;
sbit LED2 = P0^2;
sbit LED3 = P0^3;
sbit LED4 = P0^4;
sbit LED5 = P0^5;
sbit LED6 = P0^6;
sbit LED7 = P0^7;
unsigned char Maikuan=0;
static unsigned char ledon[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar Occupy_led; //占空比越大,灯越亮
bit light;
uchar m;
void Inittime()
{
TMOD = 0x02; //定时器0,工作方式2,自动重装
TH0 = 256-Ton;
TL0 = 256-Ton;
ET0 = 1;
EA = 1;
TR0 = 1;
}
//定时器0中断
void time0() interrupt 1 using 0
{
Maikuan++;
}
void main()
{
unsigned char i = 0,j = 0; //初始化i,j
leds=0;
Inittime();
while (1)
{
//第1,3,5,7个灯半亮,其余的全亮。
for(i=254; i>0; i--)
{
while ( Maikuan!=20)
{
LED = 0x00;
}
while ( Maikuan!=200)
{
LED = 0x55;
}
Maikuan = 0;
}
//最难的:8个灯从第一个开始依次渐亮,直到最后一个。再从最后一个起渐暗,直到第一个。如此循环往复。
for(j = 0;j<=7;j++)
{
i = 0;
while(i!=255) // 由暗变亮
{
if( Maikuan == 0) // 点亮
{
LED = ledon[j];
}
if(Maikuan == i) // 熄灭
{
LED = 0xff;
}
if( Maikuan== 255)
{
i++;
}
}
}
for(j=7;j>=0;j--)
{
i = 0;
while(i!=255) // 由亮变暗
{
if(Maikuan == 0) // 熄灭
{
LED = 0xff;
}
if( Maikuan == i) // 点亮
{
LED = ledon[j];
}
if( Maikuan == 255)
{
i++;
}
}
}
//所有的灯逐渐从暗到全亮,再由全亮到暗。
for (m=254; m>0; m--)
{
while (Maikuan!=Occupy_led)
{
LED = 0x00;
}
while (Maikuan!=127)
{
LED = 0xff;
}
Maikuan = 0;
if (light)
{
Occupy_led++;
}
else
{
Occupy_led--;
}
if (Occupy_led==128)
{
Occupy_led = 127;
light = !light;
}
if (Occupy_led>128)
{
Occupy_led = 0;
light = !light;
}
}
}
}
;其实很简单,都不用判断键值,有键按下暂停2S程序如下:
ORG 0000H
LJMP STA
ORG 000BH
LJMP T0ISR
ORG 0030H
STA:
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB ET0
SETB EA
MOV 30,#0FEH
MOV R2,#0
CLR 00H
LOOP:
MOV P1,#0F0H
MOV A,P1
CJNE A,#0F0H,LOOP1
SJMP LOOP
LOOP1:
LCALL DELAY
MOV A,P1
CJNE A,#0F0H,LOOP2
SJMP LOOP
LOOP2:
SETB 00H
SJMP LOOP
T0ISR:
CLR TR0
MOV TH0,#3CH
MOV TL0,0B0H
SETB TR0
JNB 00H,T0ISR1
INC R2
MOV A,R2
CJNE A,#40,T0ISRE
MOV R2,#0
CLR 00H
SJMP T0ISRE
T0ISR1:
MOV A,30H
RL A
MOV 30H,A
MOV P0,A
T0ISRE:
RETI
DELAY:
MOV R0,#20
DELAY1:
MOV R1,#250
DJNZ R1,$
DJNZ R0,DELAY1
RET
END
开关,接在 P27 与地之间。
#include <AT89X51H> //预处理命令
void w(unsigned char k)
{
unsigned int a; //定义变量a 为int 类型
if (k) {
while(P2_7); //没有按就循环,等待按下
for (a = 0; a < 600; a++); //延时消抖
while(P2_7); //没有按就循环
}
else while(!P2_7); //按下就循环,等待松开
}
void main(void) //主函数名
{
while(1) {
w(1); P1_0 = 0; w(0); P1_0 = 1;
w(1); P1_1 = 0; w(0); P1_1 = 1;
w(1); P1_2 = 0; w(0); P1_2 = 1;
w(1); P1_3 = 0; w(0); P1_3 = 1;
w(1); P1_4 = 0; w(0); P1_4 = 1;
w(1); P1_5 = 0; w(0); P1_5 = 1;
w(1); P1_6 = 0; w(0); P1_6 = 1;
w(1); P1_7 = 0; w(0); P1_7 = 1;
}
}
即使是LED的驱动,也不要直接用IO口来做。比如,你的限流电阻是1K,电源为5V,8个IO最大会吸入40mA的电流。有些单片机是不支持这样大的电流的。但是因为吸入电流太大而造成的可能性不是很大。我没有看数据手册,不好乱说。
看看有没有其他原因,比如:看门狗,电源等的原因。
这是只是百点亮P1口的程序
#include<reg51h>
void
main()
{
while(1)
{
p1=0x00;
}
}
这是闪烁度P1口回程序
#include<reg51h>
void
delay(unsigned
int
i)
//延时函数
{
unsigned
int
k;
for(k=0;k<i;k++);
}
void
main()
//主函数
{
while(1)
//循环函数
{
P1=0x00;
//点亮P1口
delay(2000);
//延时
P1=0xff;
//熄灭P1口
delay(200);
//延时
}
}
纯手打,答对你有帮助的话请采纳
谢谢
我只有这个程序,希望可以帮上你的忙/
现象说明:
间隔300ms先奇数亮再偶数亮,循环三次;一个灯上下循环
三次;再分别从两边往中间流动三次;再从中间往两边流
动三次;8个全部闪烁3次;关闭发光管,程序停止。注:晶振为110592MHz/
#include<reg52h>
#include<intrinsh>
#define uint unsigned int
#define uchar unsigned char#define led P1
uint delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
{
for(y=110;y>0;y--);
}
}void main()
{
uint i,temp,j;
for(i=0;i<3;i++)
{
led=0xAA;
delay(300);
led=0x55;
delay(300);
} for(i=0;i<3;i++)
{
temp=0xfe;
for(j=0;j<8;j++)
{
led=temp;
delay(300);
temp=_crol_(temp,1);
}
temp=0xbf;
for(j=0;j<6;j++)
{
led=temp;
delay(300);
temp=_cror_(temp,1);
}
} for (i=0;i<3;i++)
{
led=0x7e;
delay(300);
led=0xbd;
delay(300);
led=0xdb;
delay(300);
led=0xe7;
delay(300);
} for (i=0;i<3;i++)
{
led=0xe7;
delay(300);
led=0xdb;
delay(300);
led=0xbd;
delay(300);
led=0x7e;
delay(300);
} for (i=0;i<3;i++)
{
led=0xff;
delay(300);
led=0x00;
delay(300);
} led=0xff; while(1);
}
你可能被扫描数码管和流水灯都需要延时而困扰了吧。确实,对于初学者一时不知怎么处理两个程序调用延时子程序。
解决的办法,方法一,采用中断定时控制流水灯,数码管显示还用延时子程序。因流水灯程序简单,中断后,对中断计数,假如流水灯05秒流动一次,则05秒到了输出一次流水灯。中断程序短,及时从中断返回,不影响数码管显示。
方法二,不想用定时器,还用延时子程序,那数码管显示还用延时子程序,因一般延时比较短。主程序调用一次显示程序,大概需要几毫秒到十几毫秒,对调用显示程序计数,例如调用40次的延时就作为流水灯的延时,流水灯流动一次。改变计数值大小,就改变流水灯流动的速度了。
以上就是关于单片机89C51用汇编制作跑马灯P1控制8个LED(D1~D8)灯实现流水灯的效果,高手速度来全部的内容,包括:单片机89C51用汇编制作跑马灯P1控制8个LED(D1~D8)灯实现流水灯的效果,高手速度来、89C51单片机 4*4矩阵键盘加流水灯问题,求个汇编程序代码。、怎么用89C51单片机实现用一个开关控制8个流水灯,要求开关按下去松开是亮的,再按下去松开是灭的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)