STC15W408AS內置硬件PWM,正常運行不占用CPU資源,控制CCAP0H寄存器預裝值0x00~0xff就能控制占空比。呼吸燈示例程序
- #include <STC15F2K60S2.H>
- #define uint unsigned int
- #define uchar unsigned char
- //sbit key1=P4^2;
- //sbit key2=P4^4;
- //sbit LED=P1^0;
- uchar num=0x00; //占空比變量
- bit a=0; //呼吸位變量
- uint b; //延時計數變量
- void PWM_Init()
- {
- CCON = 0; //初始化PCA控制寄存器
- //PCA定時器停止
- //清除CF標志
- //清除模塊中斷標志
- CL = 0; //復位PCA寄存器
- CH = 0;
- CMOD = 0x02; //設置PCA時鐘源,PWM頻率=12MHZ/2/256=23.4375KHZ
- //PWM頻率=11.0592MHZ/2/256=21.600KHZ
- PCA_PWM0 = 0x00; //PCA模塊0工作于8位PWM
- CCAP0H = CCAP0L = 0xff; //PWM0的占空比為0%(0x00=100%)
- CCAPM0 = 0x42; //PCA模塊0為8位PWM模式
- CR = 1; //PCA定時器開始工作
- }
- void scan()
- {
- static uint count1=0,count2=0;
- if(a==0)
- {
- count1++;
- if(count1>=2000)
- {
- count1=0;
- if(num<0xff)
- {
- num++;
- if(num==0xff)
- {
- a=1;
- b=5000;
- while(b--);
- }
- }
- }
- }
- else
- {
- count2++;
- if(count2>=2000)
- {
- count2=0;
- if(num>0)
- {
- num--;
- if(num==0)
- {
- a=0;
- b=5000;
- while(b--);
- }
- }
- }
- }
- }
- void main()
- {
- P1M0 = 0x01; //P1.0端口推挽輸出模式
- P1M1 = 0x00;
- PWM_Init(); //初始化PWM
- while(1)
- {
- scan(); //呼吸掃描
- CCAP0H=num; //P1.0輸出PWM
- }
- }
復制代碼
|