用16产生了10K,50%占空比的PWM波,但是用按键无法控制PWM的占空比
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
int num=50;
//*******延时函数*******//
void delay(uint MS) //约为1MS的延时函数
{
uint i,j;
for(i=0;i<MS;i++)
for(j=0;j<1141;j++); //1141是在8MHz晶振下为MS毫秒
}
//******PWM初始化******//
void KPWM(void)
{
DDRD = 0x30; //PD5,PD6输出
PORTD = 0x00; //不带上拉输出
TCCR1A = 0xA3; //两路PWM,匹配清零
TCCR1B = 0x19; //快速PWM模式,位数可调,预分频1
OCR1A=100; //频率为10K
OCR1B=num; //匹配初值,占空比为50%左右
}
//*******按键程序********//
void key()
{
DDRB=0x00; //PB口输入状态
PORTB=0XFF; //PB口带上拉输入
if(PINB==0XFE) //如果PB0按下
{
delay(10); //延时1毫秒,按键防抖
if(PINB==0XFE)
{
num=num+5; //比较值加5,即占空比增加5%
if(num==90) //判断占空比是否到90%
{
num=90; //占空比钳位在90%
}
}
while(PINB==0XFE); //按键释放程序
}
if(PINB==0XFD) //如果PB1按下
{
delay(10); //延时10毫秒,按键防抖
if(PINB==0XFD)
{
num=num-5; //比较值减5,即占空比减少5%
if(num==10) //判断占空比是否到10%
{
num=10; //占空比钳位在10%
}
}
while(PINB==0XFD); //按键释放程序
}
}
//*******主函数********//
void main()
{
while(1)
{
KPWM(); //PWM产生函数
key(); //按键函数
}
} |