如果大家嫌電路圖看不清,
可到文末查看高清電路圖獲取方式
實物圖
心形流水燈控制晶片使用單片機STC12C5A60S2.可通過一個按鍵切換花樣,
看著像不像某寶買的, 其實我想應該不是的, 應該是作者自己設計投板製造的。
部分源碼程式名:心形流水燈
編寫人:劉金昊
編寫時間:2016年7月第一版, 2017年2月第二版
硬體支援:STC12C5A60S2
說明:低電平點亮
/*********************************************************************************************/
#include
#include
#define key_t 50 //按鍵去抖延時時間設置
sbit key=P3 ^ 3; //花樣切換按鍵定義
unsigned char volatile a=1;//功能表標誌位元, 用volatile聲明防止編譯器優化此變數, 使其可在中斷中改變
sbit LED1=P0^0;
sbit LED2=P0^1;
sbit LED3=P0^2;
sbit LED4=P0^3;
sbit LED5=P0^4;
sbit LED6=P0^5;
sbit LED7=P0^6;
sbit LED8=P0^7;
sbit LED9=P2^7;
sbit LED10=P2^6;
sbit LED11=P2^5;
sbit LED12=P2^4;
sbit LED13=P2^3;
sbit LED14=P2^2;
sbit LED15=P2^1;
sbit LED16=P2^0;
sbit LED17=P4^0;
sbit LED18=P4^1;
sbit LED19=P4^2;
sbit LED20=P4^3;
sbit LED21=P4^4;
sbit LED22=P4^5;
sbit LED23=P4^6;
sbit LED24=P4^7;
/*********************************************************************************************/
void delay (unsigned int a) //毫秒級CPU延時函數, 用於花樣閃爍延時
{
unsigned int i;
while( a-- != 0)
{
for(i = 0; i < 600; i++);
if(key==0)break;
}
}
/*********************************************************************************************/
void key_delay (unsigned int a) //按鍵去抖動延時函數
{
unsigned int i;
while( a-- != 0)
{
for(i = 0; i < 600; i++);
}
}
/*********************************************************************************************/
void pwm_delay(unsigned int t) //pwm專用延時函數
{
unsigned int tt;
tt=10*t;
while(--tt);
}
/*********************************************************************************************/
void INT1(void) interrupt 2 using 3 //INT1中斷函數
{
a++;
if(a>13)
{
a=1;
}
}
/*********************************************************************************************/
void m1(void) //相鄰兩燈呼吸點亮
{
unsigned int i;
unsigned char code led=0xaa,led1=0x55; //led首位不亮, led1首位亮
for(i=1;i<400;i++)
{
if(key==0)break;
P2=0xff;
P0=0xff;
P4=0xff;
pwm_delay(i);
P2=led1;
P0=led;
P4=led;
pwm_delay(400-i);
}
P2=0xff;
P0=0xff;
P4=0xff;
for(i=399;i>0;i--)
{
if(key==0)break;
P2=0xff;
P0=0xff;
P4=0xff;
pwm_delay(i);
P2=led;
P0=led1;
P4=led1;
pwm_delay(400-i);
}
P2=led;
P0=led1;
P4=led1;
for(i=1;i<400;i++)
{
if(key==0)break;
P2=0xff;
P0=0xff;
P4=0xff;
pwm_delay(i);
P2=led;
P0=led1;
P4=led1;
pwm_delay(400-i);
}
P2=0xff;
P0=0xff;
P4=0xff;
for(i=399;i>0;i--)
{
if(key==0){key_delay(key_t);if(key==0){a++;break;}}
P2=0xff;
P0=0xff;
P4=0xff;
pwm_delay(i);
P2=led1;
P0=led;
P4=led;
pwm_delay(400-i);
}
P2=led1;
P0=led;
P4=led;
}
/*********************************************************************************************/
void m2(void) //單個led順時針旋轉
{
unsigned char code led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //LED從低位往高位移
unsigned char code led1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //LED從高位往低位移
unsigned char i;
for(i=0;i<=7;i++)
{
P0=led[i];
delay(50);
if(key==0)break;
}
P0=0xff;
for(i=0;i<=7;i++)
{
P2=led1[i];
delay(50);
if(key==0)break;
}
P2=0xff;
for(i=0;i<=7;i++)
{
P4=led[i];
delay(50);
if(key==0){key_delay(key_t);if(key==0){a++;break;}}
}
P4=0xff;
}
/*********************************************************************************************/
void m3(void) //相鄰兩燈交替點亮流水效果
{
unsigned char code led=0xaa,led1=0x55; //led首位不亮, led1首位亮
P2=led;
P0=led1;
P4=led1;
delay(200);
P2=led1;
P0=led;
P4=led;
delay(200);
if(key==0){key_delay(key_t);if(key==0)a++;}
}
/*********************************************************************************************/
void m4(void) //對稱上下點亮熄滅
{
unsigned char i;
unsigned char code led[]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00},t=100; //由低位元向高位點亮
unsigned char code led1[]={0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00}; //由高位向低位元點亮
unsigned char code led2[]={0x3e,0x1c,0x08,0x00}; //LED9~16自上到下點亮
unsigned char code led3[]={0xf7,0xe3,0xc1,0x80,}; //LED9~16自下到上點亮
P4=0xff;
P2=0xff;
P0=0xff;
for(i=0;i<8;i++)
{
P0=led[i+1];
P4=led1[i];
delay(t);
if(key==0)break;
}
P2=0x7f;
P4=0x00;
delay(t);
for(i=0;i<4;i++)
{
P2=led2[i];
delay(t);
if(key==0)break;
}
for(i=0;i<8;i++)
{
P0=~led[i+1];
P4=~led1[i];
delay(t);
if(key==0)break;
}
P2=~0x7f;
P4=~0x00;
delay(t);
for(i=0;i<4;i++)
{
P2=~led2[i];
delay(t);
if(key==0)break;
}
for(i=0;i<4;i++)
{
P2=led3[i];
delay(t);
if(key==0)break;
}
P2=0x00;
P4=0xfe;
delay(t);
for(i=0;i<8;i++)
{
P0=led1[i+1];
P4=led[i+1];
delay(t);
if(key==0)break;
}
for(i=0;i<4;i++)
{
P2=~led3[i];
delay(t);
if(key==0)break;
}
P2=~0x00;
P4=~0xfe;
delay(t);
for(i=0;i<8;i++)
{
P0=~led1[i+1];
P4=~led[i+1];
delay(t);
if(key==0){key_delay(key_t);if(key==0){a++;break;}}
}
}
高清電路圖及餘下麻煩大家前往”51黑電子論壇“下載, 直達連結---//www.51hei.com/bbs/dpj-91376-1.html----