通过74HC595控制8位流水灯,PCA的三路PWM控制颜色
引脚定义(仅供参考)
sbit DQ=P1^2;
sbit RCK=P1^3;
sbit SCLK=P1^4;
sbit Blue=P1^0;
sbit Red=P1^1;
sbit Green=P3^7;
单片机源程序如下:
- #include<stc15f2k60s2.h>
- #include<intrins.h>
- sbit DQ=P1^2;
- sbit RCK=P1^3;
- sbit SCLK=P1^4;
- /*
- sbit Blue=P1^0;
- sbit Red=P1^1;
- sbit Green=P3^7;
- */
- unsigned int bianliang;
- unsigned char red,green,blue;
- #define CCP_S0 0x10
- #define CCP_S1 0x20
- void delay(void) //误差 0us
- {
- unsigned char a,b;
- for(b=173;b>0;b--)
- for(a=143;a>0;a--);
- }
- void Timer0Init(void) //7500微秒@11.0592MHz
- {
- AUXR &= 0x7F; //定时器时钟12T模式
- TMOD &= 0xF0; //设置定时器模式
- TH0 = 0x0F1;
- TL0 = 0x9A;
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- EA=1;
- ET0=1;
- }
- void Write595(unsigned char dat)
- {
- unsigned char i;
- RCK=0;
- for(i=0;i<8;i++)
- {
- SCLK=0;
- dat<<=1;
- _nop_();
- DQ=CY;
- _nop_();
- _nop_();
- SCLK=1;
- }
- RCK=1;
- }
- void PWMInit()
- {
- ACC=P_SW1;
- ACC&=~(CCP_S0|CCP_S1);
- P_SW1=ACC;
-
- CCON=0X00;
- CL=0;
- CH=0;
- CMOD=0x08;
- /*红*/
- PCA_PWM0=0x00;
- CCAP0H=CCAP0L=0X00;
- CCAPM0=0X42;
- /*蓝*/
- PCA_PWM1=0x00;
- CCAP1H=CCAP1L=0X00;
- CCAPM1=0X42;
- /*绿*/
- PCA_PWM2=0x00;
- CCAP2H=CCAP2L=0Xff;
- CCAPM2=0X42;
- }
- void PWMSet(unsigned char re,blu,gree)
- {
- CCAP0H=CCAP0L=re;
- CCAP1H=CCAP1L=blu;
- CCAP2H=CCAP2L=gree;
- }
- void main()
- {
- bianliang=0;blue=255;green=0;red=0;
- PWMInit();
- Timer0Init();
- while(1)
- {
- unsigned char ams,i,j,sma;
- for(j=0;j<12;j++)
- {
- ams=0x80;
- for(i=0;i<8;i++)
- {
- Write595(~ams);
- ams>>=1;
- delay();
- }
- }
- for(j=0;j<12;j++)
- {
- ams=0x01;
- for(i=0;i<8;i++)
- {
- Write595(~ams);
- ams<<=1;
- delay();
- }
- }
- for(j=0;j<8;j++)
- {
- ams=0x80;
- for(i=0;i<8;i++)
- {
- Write595(~ams);
- ams>>=1;
- delay();
- }
- ams=0x01;
- for(i=0;i<8;i++)
- {
- Write595(~ams);
- ams<<=1;
- delay();
- }
- }
- for(j=0;j<16;j++)
- {
- ams=0x80;sma=0x01;
- for(i=0;i<8;i++)
- {
- Write595(~(ams|sma));
- ams>>=1;
- sma<<=1;
- delay();
- }
- }
- for(j=0;j<8;j++)
- {
- ams=0x7f;
- for(i=0;i<8;i++)
- {
- Write595(ams);
- ams>>=1;
- delay();
- }
- }
- for(j=0;j<8;j++)
- {
- ams=0xfe;
- for(i=0;i<8;i++)
- {
- Write595(ams);
- ams<<=1;
- delay();
- }
- }
- for(j=0;j<12;j++)
- {
- ams=0xf0;
- for(i=0;i<2;i++)
- {
- Write595(~ams);
- delay();
- delay();
- delay();
- ams>>=4;
- Write595(~ams);
- delay();
- delay();
- delay();
- }
- }
- for(j=0;j<12;j++)
- {
- ams=0xaa;
- for(i=0;i<2;i++)
- {
- Write595(~ams);
- delay();
- delay();
- delay();
- Write595(ams);
- delay();
- delay();
- delay();
- }
- }
- for(j=0;j<12;j++)
- {
- ams=0x88;
- for(i=0;i<4;i++)
- {
- Write595(~ams);
- ams>>=1;
- delay();
- delay();
- }
- }
- for(j=0;j<12;j++)
- {
- ams=0x11;
- for(i=0;i<4;i++)
- {
- Write595(~ams);
- ams<<=1;
- delay();
- delay();
- }
- }
- }
- }
- void Timer() interrupt 1
- {
- if(bianliang==0)
- {blue=255;green=0;red=0;}
- if(bianliang>0&&bianliang<255)
- {blue--;red++;}
- if(bianliang==255)
- {blue=0;green=0;red=255;}
- if(bianliang>255&&bianliang<510)
- {red--;green++;}
- if(bianliang==510)
- {blue=0;green=255;red=0;}
- if(bianliang>510&&bianliang<765)
- {blue++;}
- if(bianliang==765)
- {blue=255;green=255;red=0;}
- if(bianliang>765&&bianliang<1020)
- {red++;green--;}
- if(bianliang==1020)
- {blue=255;green=0;red=255;}
- if(bianliang>1020&&bianliang<1275)
- {blue--;green++;}
- if(bianliang==1275)
- {blue=0;green=255;red=255;}
- if(bianliang>1275&&bianliang<1530)
- {blue++;}
- if(bianliang==1530)
- {blue=255;}
- if(bianliang>1530&&bianliang<1785)
- {red--;}
- if(bianliang==1785)
- {red=0;}
- if(bianliang>1785&&bianliang<2040)
- {red++;blue--;}
- if(bianliang==2040)
- {blue=0;red=255;}
- if(bianliang>2040&&bianliang<2295)
- {blue++;green--;}
- if(bianliang==2295)
- {blue=255;green=0;red=255;}
- if(bianliang>2295&&bianliang<2550)
- {red--;green++;}
- if(bianliang==2550)
- {blue=255;green=255;red=0;}
- if(bianliang>2550&&bianliang<2805)
- {blue--;}
- if(bianliang==2805)
- {blue=0;green=255;red=0;}
- if(bianliang>2805&&bianliang<3060)
- {red++;green--;}
- if(bianliang==3060)
- {blue=0;green=0;red=255;}
- if(bianliang>3060&&bianliang<3315)
- {red--;blue++;}
- bianliang++;
- PWMSet(red,blue,green);
- if(bianliang==3315)
- {bianliang=0;}
- }
复制代码
所有程序51hei提供下载:
5050全彩流水灯PCA.zip
(34.5 KB, 下载次数: 11)
|