//程序功能简介:本程序产生15HZ~~~50KHZ的方波,并且实现频率和脉宽的独立调制,即可
//在改变频率的同时不改变脉宽,再改变脉宽的同时不改变频率;同时设置
//两个调节步长------在KEY键按下时,粗调,没有按下时,细调;
//程序思路: 本程序用到两个定时器------定时器0和定时器1,其中定时器0工作在定时方式下,
//决定方波的频率;定时器1,同样工作在定时方式下,用于设定脉宽;
//------------------------------------------------------------------------------------
#include
#define uint unsigned int
#define ALL 65536 //定时器工作方式1时,最大基数长度 65536;
#define F_osc 12000000 //晶振频率12M;
sbit KEY_F_DOWN=P0^3; //频率下调按钮;
sbit KEY_W_UP=P0^4; //脉宽上调按钮;
sbit KEY_W_DOWN=P0^5; //脉宽下调按钮;
sbit KEY=P0^6; //粗细调节按钮-----按下为粗调,否则为细调;
sbit OUTPUT=P1^0; //波形输出;
uchar PERCENT=50; //初始占空比;
uchar FLAG_F=0,FLAG_W=0; //频率调节标志和脉宽调制标志;
uint FREQ=50000; //初始频率;
float temp; //临时全局变量,用于数据传递;
void init(); //初始化函数,用于定时器的初始化;
void calculate_F(); //频率计算函数,当频率变化,计算出定时器0初值;
void calculate_W(); //脉宽计算函数,脉宽变化时,计算出定时器1初值;
void key_scan(); //按键扫描函数;
void timer0(); //定时器0中断函数;
void timer1(); //定时器1中断函数;
{
uchar i,j;
{
for(i=0;i<100;i++)
for(j=0;j<100;j++);
}
}
{
temp = ALL - F_osc/12.0/FREQ;
TIMER0_L = (uint)temp%256;
}
{
float TEMP;
TIMER1_L = (uint)TEMP%256;
}
{
delay(4);
{
FLAG_F=1; //置标志位;
FREQ+=10;
FREQ++;
FREQ=1;
}
{
FLAG_F=1; //置标志位;
FREQ-=10;
FREQ--;
FREQ=50000;
}
{
FLAG_W=1; //置标志位;
PERCENT+=5;
PERCENT++;
PERCENT=1;
}
{
FLAG_W=1; //置标志位;
PERCENT-=5;
PERCENT--;
PERCENT=49;
}
{
TH0=TIMER0_H;
TL0=TIMER0_L;
TR1=1; //开定时器1;
OUTPUT=1;
}
{
TH1=TIMER1_H;
TL1=TIMER1_L;
TR1=0; //关定时器1,一定要这一步,因为定时器1的定时短于定时器0;
OUTPUT=0;
}
{
TMOD=0x11; //定时器0和定时器1都工作在方式1,16位计数器;
calculate_F(); //初始为1KHZ,占空比为50%;
calculate_W();
TL0=TIMER0_L;
TL1=TIMER1_L;
ET1=1;
TR1=1;
}
{
init();
{
key_scan();
if(FLAG_F) //改变频率时要注意要进行脉宽的重新设置;
{
calculate_F();
calculate_W();
FLAG_F=0;
}
{
calculate_W();
FLAG_W=0;
}
}
}