|
占空比可以不變,一直是百分之50,直接改變定時(shí)器定時(shí)時(shí)長周期=1/頻率 定時(shí)時(shí)長=周期/2假設(shè)晶振頻率12M,定時(shí)器可以定時(shí)1us至65ms1000HZ時(shí)周期1ms,定時(shí)500us 50HZ時(shí)周期為20ms 定時(shí)10ms,剛好在其定時(shí)范圍內(nèi).以下是我寫的程序
#include "15.h"
#define uchar unsigned char
#define uint unsigned int
#define CCP_S0 0x10
#define CCP_S1 0x20
sbit pluse=P1^1;
sbit key1=P2^0;
uint f=0,t;
void delayms(uint z)
{
uint i,j;
for(i=z;i>=0;i--)
for(j=110;j>=0;j--);
}
void keyscan()
{
if(key1==0)
{
delayms(10);//延時(shí)消抖
if(key1==0)
{
while(key1==0);//等待按鍵抬起
f=f+50;//頻率增加50HZ
}
if(f>1000)
f=50;//超過1000HZ回到最低50HZ
t=1000000/f/2;//計(jì)算定時(shí)器定時(shí)時(shí)長,即計(jì)時(shí)脈沖個(gè)數(shù)
}
}
void T0_timer() interrupt 1
{
TL0=(65536-t)%256;
TH0=(65536-t)/256;
pluse=~pluse;
}
void init()
{
TMOD=0x01;
TL0=(65536-t)%256;
TH0=(65536-t)/256;
EA=1;
ET0=1;
TR0=1;
}
void pwminit()
{
CMOD=0x20; //系統(tǒng)頻率為原來的二分之一
CCAPM0=0x42;
PCA_PWM0=0x00;
CH=0;
CL=0;
CCAP0H=128; //初始化裝載值
CCAP0L=128;
CR=1;
}
void main()
{
ACC = P_SW1;
ACC &= ~(CCP_S0 | CCP_S1); //CCP_S0=0 CCP_S1=0
P_SW1 = ACC; //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)
// ACC = P_SW1;
// ACC &= ~(CCP_S0 | CCP_S1); //CCP_S0=1 CCP_S1=0
// ACC |= CCP_S0; //(P3.4/ECI_2, P3.5/CCP0_2, P3.6/CCP1_2, P3.7/CCP2_2)
// P_SW1 = ACC;
//
// ACC = P_SW1;
// ACC &= ~(CCP_S0 | CCP_S1); //CCP_S0=0 CCP_S1=1
// ACC |= CCP_S1; //(P2.4/ECI_3, P2.5/CCP0_3, P2.6/CCP1_3, P2.7/CCP2_3)
// P_SW1 = ACC;
init();
pwminit();
while(1)
{
keyscan();
}
}
|
|