发布网友 发布时间:2022-04-22 06:15
共2个回答
热心网友 时间:2023-08-22 02:37
首先,PB0只是一个普通IO,它只能判断高低电平,要是换成C口(AD转换口)倒是可以,另外,PC4也不是PWM口,MEGA48和MEGA8基本上一样,都只有3路PWM。当然,你可以把PB0接一个按键,每按一次,占空比对应变化一个值。给你一个小程序,希望你能用的上:
#include<iom48v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#define key1 (PINB&0x01)
#define key2 (PINB&0x02)
#define beep_on PORTD|=0x02
#define beep_off PORTD&=0xfd
#define xtal 8
void beep_three(void);
char t=0;
void delay_1ms(void)
{
uint i;
for(i=0;i<(xtal*143-2);i++)
{
NOP();
}
}
void delay_ms(uint k)
{
uint i=0;
while(i<k)
{
i++;
delay_1ms();
}
}
void port_init(void)
{
DDRB=0xfc; //PB0、1作为按键输入口
PORTB=0xff;
DDRD=0xff;
PORTD=0x00;
DDRC=0xff;
PORTC=0x00;
}
void scan_s1(void)
{ if(t<=250)
{ if(key1==0)
{
delay_ms(20); //消除抖动
if(key1==0)
{
beep_on;
delay_ms(100);
beep_off;
t=t+5; //t递加5,你可以改为1
OCR2=t; //把t值赋给OCR2,用以调节占空比。
delay_ms(200); //防止按压按键时间稍长而导致连加
}
}
}
else //if(t>=244)
{
if(key1==0)
{delay_ms(20);
if(key1==0)
{
t=255;
OCR2=t;
beep_three();
delay_ms(200);
}
}
}
}
void scan_s2(void)
{ if(t>4)
{if(key2==0);
{
if(key2==0)
{
beep_on;
delay_ms(100);
beep_off;
t=t-5;
OCR2=t;
delay_ms(200);
}
}
}
else //if(t==0)
{
if(key2==0)
{delay_ms(20);
if(key2==0)
{
OCR2=0;
beep_three();
delay_ms(200);
}
}
}
}
void beep_three(void)
{
beep_on;
delay_ms(95);
beep_off;
delay_ms(95);
beep_on;
delay_ms(95);
beep_off;
delay_ms(95);
beep_on;
delay_ms(95);
beep_off;
}
void scan_key(void)
{
scan_s1();
scan_s2();
}
void timer2_init(void)
{
TCCR2 = 0x00; //停止定时器
ASSR = 0x00; //异步时钟模式
TCNT2 = 0x00; //初始值
TIMSK |= 0x00; //中断允许
TCCR2 = 0x61; //启动定时器
}
void init_devices(void)
{
CLI(); //禁止所有中断
MCUCR = 0x00;
MCUCSR = 0x80; //禁止JTAG
GICR = 0x00;
port_init();
timer2_init();
SEI(); //开全局中断
}
void main(void)
{
init_devices();
while(1)
{
scan_key();
}
}
热心网友 时间:2023-08-22 02:38
压根不会