想要實時改變輸出的頻率,比如用按鍵調節不同的頻率
想使用T0,模式1,改變重載數值,的方法來改變,輸出頻率但是不行,
只能象下面一樣用16位自動重載模式嗎
//本示例在Keil開發環境下請選擇Intel的8058芯片型號進行編譯
//若無特別說明,工作頻率一般為11.0592MHz
#include "STC15W401AS.h"
//-----------------------------------------------
#define FOSC 11059200L
#define CCP_S0 0x10 //P_SW1.4
#define CCP_S1 0x20 //P_SW1.5
//-----------------------------------------------
#define uint unsigned int
#define uchar unsigned char
/* Timer0 interrupt routine */
void tm0_isr() interrupt 1
{
//P10 = ! P10; //將測試口取反
}
/* Timer2 interrupt routine */
void tm2_isr() interrupt 12
{
//P11 = ! P11; //將測試口取反
}
float PL;
int Xt1,Xt0;
float t1,t0;
uchar hZ1,l1,h0,l0;
//-----------------------------------------------
void Init_usart1()
{
SCON=0X50;
T2L=(65536-(FOSC/4/19200)); //這個單片機沒有定時器1,因此,用定時器2作為波特率發生器。
T2H=(65536-(FOSC/4/19200))>>8;
AUXR=0x14; //T2為1T模式,并啟動定時器2
AUXR|=0x01; //選擇定時器2為串口1的波特率發生器
ES=1; //使能串口1中斷
EA=1;
}
void dutyANDf(void)
{
t1=0.5/PL; //高電平時長
t0=(1/PL)-t1; //低電平時長
Xt1=65536-1000000*t1; //高電平的時長轉換成的定時器16位數
Xt0=65536-1000000*t0;; //低電平的時長轉換成的定時器16位數
hZ1=(uchar)(Xt1>>8); //高電平高八位保存
l1=(uchar)Xt1; //高電平低八位保存
// h0=(uchar)(Xt0>>8); //低電平高八位保存
// l0=(uchar)Xt0; //低電平低八位保存
}
/* main program */
void main()
{
P1M1 &= ~1; //P1.x 設置為推挽輸出
P1M0 |= 1;
ACC=P_SW1; //讀取外圍設備控制切換寄存器
ACC&=~(CCP_S0|CCP_S1); //CCP_S0=0 CCP_S1=0,設置PWM0輸出在P1.1引腳。
P_SW1=ACC; //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)
CCON=0; //初始化PCA控制器 //??CF //????????
CL=0; //復位PCA寄存器高低位
CH=0; //
CMOD=0x84; //設置PCA時鐘源為T0的溢出,且禁止所有PCA定時器溢出中斷(PCA不作定時器功能)
/*****************************PWM0 - P1.1***************************************/
PCA_PWM0=0x80; //PCA模塊0為6位模式
CCAP0H=CCAP0L=0x20; //PWM0占空比50% ((40H-20H)/40H)
// CCAP0H=CCAP0L=0x00; //PWM0占空比50% ((40H-20H)/40H)
CCAPM0=0x42; //允許CCAPM1比較器功能和PWM功能
/*****************************PWM1 - P1.0***************************************/
PCA_PWM1=0x80; //PCA模塊0為6位模式
CCAP1H=CCAP1L=0x30; //PWM1占空比25% ((40H-30H)/40H)
CCAPM1=0x42; //允許CCAPM2比較器功能和PWM功能
AUXR |= 0x80; //定時器0為1T模式
TMOD = 0x00; //設置定時器為模式0(16位自動重裝載)
TH0 = (65535-156)/256;
TL0 = (65535-156)%256; //初始化計時值
TR0 = 1; //定時器0開始計時
CR=1; //啟動PCA運行
while (1);
}
|