占空比可以不变,一直是百分之50,直接改变定时器定时时长周期=1/频率 定时时长=周期/2假设晶振频率12M,定时器可以定时1us至65ms1000HZ时周期1ms,定时500us 50HZ时周期为20ms 定时10ms,刚好在其定时范围内.以下是我写的程序
#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);//延时消抖
if(key1==0)
{
while(key1==0);//等待按键抬起
f=f+50;//频率增加50HZ
}
if(f>1000)
f=50;//超过1000HZ回到最低50HZ
t=1000000/f/2;//计算定时器定时时长,即计时脉冲个数
}
}
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; //系统频率为原来的二分之一
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();
}
}
|