?? 可控頻率和占空比.txt
字號:
/******** 頻率可調 占空比可調 ******/
#include <ioM16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
uchar a=0;
uchar b=0;
//端口初始化
void port_init(void)
{
PORTC = 0xff;
DDRC = 0xFF;
PORTB = 0x00;
DDRB = 0x00;
PORTD = 0x30;
DDRD = 0x30;
}
void delay_ms(uint ms)//精確延時1ms
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
//定時T1初始化
void timer1_init(void)
{
TCCR1B = 0x00;//停止定時器
TIMSK |= 0x00;//中斷允許
TCNT1H = 0x00;
TCNT1L = 0x00;//初始值
OCR1AH = 0x00;
OCR1AL = 0x00;
OCR1BH = 0x00;
OCR1BL = 0x00;
//ICR1H = 0xFF;
// ICR1L = 0xFF;//輸入捕捉匹配值
TCCR1A=0X63;
TCCR1B=0X1A;//8分頻 快速PWM模式 匹配時清零 top時置位
}
uchar key_press()//判斷是否有鍵按下
{
uchar j;
DDRA|=0X0F;
PORTA|=0X0F;
DDRA&=0X0F;
j=PINA;
j=j&0X0F;//00001111
if(j==0X0F)
{
return 0;
}
else
{
return 1;
}
}
void key()//鍵控函數
{ //調頻 min=3921HZ max=1000KHZ
uchar key;
delay_ms(1);
if(key_press()) //
{
key=PINA;
key&=0X0F;
}
if (key==0X0E)
{
/*PORTC&= ~BIT(3);//蜂鳴器
delay_ms(10);
PORTC|=BIT(3);*/
if (a!=255)
a++;//減小頻率
else
a=255;
OCR1AL=a;
}
if (key==0X0D)
{
/* PORTC&= ~BIT(3);//蜂鳴器
delay_ms(5);
PORTC|=BIT(3);*/
if (a!=0) //增大頻率
--a;
else
a=0;
OCR1AL=a;
}
/***************** 調節占空比***************************************/
if (key==0X0B) //再次判斷
{
/* PORTC&= ~BIT(3);//蜂鳴器
delay_ms(5);
PORTC|=BIT(3); */
if (b!=255) //增加占空比
++b;
else //使占空比比較器最大值保持為255
b=255;
OCR1BL=b;
}
if (key==0X07) //
{
/*PORTC&= ~BIT(3);//蜂鳴器
delay_ms(10);
PORTC|=BIT(3);*/
if (b!=0) //減少占空比
--b;
else //使占空比比較器最小值保持為0
b=0;
OCR1BL=b;
}
delay_ms(50); //控制按鍵掃描間隔,防止按住不放時變化過快
}
void init_devices(void)
{
CLI(); //禁止所有中斷
// MCUCR = 0x00;
//MCUCSR = 0x80;//禁止JTAG
//GICR = 0x00;
port_init();
timer1_init();
//SEI();//開全局中斷
}
//主函數
void main(void)
{
init_devices();
//在這繼續添加你的代碼
while(1)
{uchar i;
i=key_press();
if(i)
{
key();
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -