标题:
单片机呼吸灯+流水
[打印本页]
作者:
爱笑的十三
时间:
2018-7-21 19:22
标题:
单片机呼吸灯+流水
这是我最近写的一个呼吸灯,第一次用头文件写遇到了好多小问题,有些问题解答了,有些没解答,小编纯属小白,希望能够对大家有所帮助
/*********************************************
心形灯功能
类1:huxi()
类2:move()
组合:combine()
总体实现函数:amain()
****************************************/
#include<reg52.h>
#include"move.h"
#include"type_def.h"
/*1.***************全局变量声明专区******************/
u16 led1[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
u16 led11[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
u16 led2[4]={0xfc,0xf3,0xcf,0x3f};
u16 led3[5]={0xf8,0xf1,0xe3,0x8f,0x1f};
u16 led4[4]={0xf0,0xc3,0x0f,0x3f};
u16 led5[8]={0xe0,0x0e,0xd0,0x0d,0xc0,0x0c,0x70,0x07};
u16 led6[2]={0x88,0xe0};
//u16 flag=0; //动作选择标志
sbit key=P3^0;
/*2.******************宏定义专区********************/
#define length 10000 //10ms
#define w1_0 20 //输出有效电压的步幅
#define w0_0 10 //初始化灯的亮度
/*3.*****************函数声明专区*******************/
static void delay(u16 i);
static void time_huxi();
static void move_0();
static u16 anjian_0(u16 f);
/*4.**************函数实现模块**********************/
static void delay(u16 i)//延时
{
while(i--)
{
int j;
for(j=0;j<125;j++);//1ms
}
}
static void time_huxi()//呼吸
{
TMOD|=0x01;//定时器进行方式
TH0=(65536-10)/256;
TL0=(65536-10)%256;//1ms初值
ET0=1;
EA=1;
TR0=1; //通过控制TR0,来选择打呼吸灯的效果,缓解了cpu的压力,因为只有在中断瞬间才会跳进去,平常就在背后记着时间
}
static void move_0() //流水0
{
while(1)
{
u16 i; //是小局部变量的全局变量,对于小局部变量,值不会释放
for(i=0;i<8;i++)
{
P1=led1[i];
P0=led1[i];
delay(50);
}
P1=0XFF;
P0=0XFF;
for(i=0;i<8;i++)
{
P3=led1[i];
P2=led11[i];
delay(50);
}
P2=0XFF;
P3=0XFF;
for(i=0;i<8;i++)
{
P2=led1[i];
P3=led11[i];
delay(50);
}
P3=0XFF;
P2=0XFF;
for(i=0;i<8;i++)
{
P1=led11[i];
P0=led11[i];
delay(50);
}
P1=0XFF;
P0=0XFF;
}
}
static u16 anjian_0(u16 f)//按键检测
{
if(key==0)
{
delay(10);
if(key==0)
{
f++;//作为返回值,都达到加
while(!key);
}
}
return f; //仅仅作为返回值返回,返回给谁需要指定
}
/*5.*******************函数组装专区************************/
void amain()
{
time_huxi();
while(1) //在执行定时器中断的时候,必须加while(1)是程序不能从主函数中跳出来,进一步实现定时器里的程序,大多数函数虽然不要while(1)也行,会执行看门狗程序,但是有些必须加,加上绝对正确
{
// static u16 flag=0; //因为在循环的过程中,循环里面定义的变量也是一个局部变量,完成一次循环会自动释放原始值
// flag=anjian_0(flag);
// switch(flag)
// {
// case 0:
// P0=0X00;break;
// case 1:
// P0=0X0F;break;
// case 2:
// P0=0XF0;
// break;
// default :flag=0;
// }
;
}
}
void bmain()
{
time_huxi();
move_0();
}
/*6.********************实现中断专区****************/
void T_PWM()interrupt 1
{
static int wide1=w0_0,wide2=length-w0_0,i=0,flag=0;//因为循环一次过后局部变量i释放 了,所以没有达到++效果
TR0=0;
if(flag==0)
{
i++;
wide1+=w1_0;
wide2-=w1_0;
if(i%2==0)
{
TH0=(65536-wide1)/256;
TL0=(65536-wide1)%256;
P2=0X0F;
}
else
{
TH0=(65536-wide2)/256;
TL0=(65536-wide2)%256;
P2=0XFF;
}
if(wide1==length-w0_0)
flag=1;
}
else if(flag==1)
{
i++;
wide1-=w1_0;
wide2+=w1_0;
if(i%2==0)
{
TH0=(65536-wide1)/256;
TL0=(65536-wide1)%256;
P2=0X0F;
}
else
{
TH0=(65536-wide2)/256;
TL0=(65536-wide2)%256;
P2=0XFF;
}
if(wide1==w0_0)
flag=0;
}
TR0=1;//为什么有些时候声明变量必须是在前面呢
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1