假设如下这八个灯依次接在P0口的八个口上,高电平为灯亮,低电平为灯灭,程序如下
ORG 0000H
AJMP START
START:MOV P0,#01H;()只有第一个灯亮
ACALL DELAY;延迟,不加延迟的话 你根本看不起清到底那个灯亮的
MOV P0,#02H()只有第二个灯亮
ACALL DELAY
MOV P0,#04H()只有第三个灯亮
ACALL DELAY
MOV P0,#08H()只有第四个灯亮
ACALL DELAY
MOV P0,#10H()只有第五个灯亮
ACALL DELAY
MOV P0,#20H()只有第六个灯亮
ACALL DELAY
MOV P0,#40H()只有第七个灯亮
ACALL DELAY
MOV P0,#80H()只有第八个灯亮
ACALL DELAY
AJMP START;周而复始
DELAY: MOV R6,#40延迟程序,晶振为3.57MHZ时大概是0.1S
0.1SL1: MOV R5,#246
0.1SL2: NOP
DJNZ R5,0.1SL2
DJNZ R6,0.1SL1
RET
END
程序太乱,只用一个定时器就可以如定时100us 中断一次 20次是2 ms 即周期是2 ms
中断一次计数变量a加一,并且与另一变量b(1到20)比较,如果a>b,则输出高电平,反之则输出低电平 a=20时清0
主程序中可不断改变b的值,先由大到 小 再由小到大,就是呼吸灯了
如延时200ms改变一次b的值 则呼吸周期大约是8秒
#include<reg52.h>//端口定义
sbit RED = P2^0//红光控制端,0点亮
sbit GREEN = P2^1//绿光控制端,0点亮
sbit BLUE = P2^2//蓝光控制端,0点亮
//函数声明
void Delay(unsigned int t)
void RGB(unsigned char R ,unsigned char G ,unsigned char B)
//主函数
void main (void)
{
RED = 1 GREEN = 1 BLUE = 1
//开始时先关闭LED,当然由于单片机上电就输出 1 ,所以可不写
while (1) //主循环
{
//7色光依次逐渐变亮
//改变调用顺序可以改变颜色先后次序
RGB(1,1,0)
RGB(1,0,1)
RGB(1,0,0)
RGB(0,1,1)
RGB(0,1,0)
RGB(0,0,1)
RGB(0,0,0)
}
}
void Delay(unsigned int t)
{
while(--t)
}
//7色光依次逐渐变亮
RGB(unsigned char R ,unsigned char G ,unsigned char B)
{
unsigned int pwm , set = 500
for(pwm=1pwm<setpwm++)
{
RED = 1 //熄灭LED
GREEN = 1
BLUE = 1
Delay(set-pwm)//延时长度,500次循环中从599减至1
RED = R
GREEN = G
BLUE = B
Delay(pwm)//延时长度,500次循环中从1加至599
}
}
//改变set可以改变变化快慢
//同理你可以写出7色逐渐变暗的程序
这里的程序只是提供一个思路,你如果直接复制粘贴的话会出现格式错误
把每两行中间的空行删掉一般就可消除格式错误
如果再有什么小问题根据编译信息提示稍作修改就行
串电阻的话一般这样算:
R = [ U - U(LED) ] / I
U是LED和电阻总的电压,U(LED)是LED工作电压,I 是LED工作电流,一般10--20mA
电流大小取的适中就行了,再计算要串联的电阻值
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)