|
我用的是内部的1M的RC震荡
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/eeprom.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <avr/iom8.h>//和单片机类型相对应的头文件,选择Atmega8做实验;
#include <avr/sleep.h>
#include <avr/delay.h>
#include <inttypes.h>
unsigned int SINGM[15]={64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178,65217};
unsigned char SINGG[24]={0X82,0X01,0X81,0X94,0X84,0XB4,0XA4,0X04,
0X82,0X01,0X81,0XF4,0XD4,0XB4,0XA4,0X94,
0XE2,0X01,0XE1,0XD4,0XB4,0XC4,0XB4,0X04};
volatile uint8_t TI,TI2,TI3,S1,S2,S3;
void AvrInit (void)
{
TCCR1B = _BV(CS00); /* Set TIMER0 prescaler
// TCNT1 = SINGM[TI]; /* Set TIMER0 3.6kHz/45=80Hz (12.5ms) 0xd3=0x100-0x2d (0x2d=45) */
// timer_enable_int(_BV(TOIE1)); /* Enable TIMER0 overflow
}
SIGNAL(SIG_OVERFLOW1) /* signal handler for Time1 interrupt */
{
// timer_enable_int(0<<TOIE1);
PORTC ^= 0x08;
TCNT1 = SINGM[TI]; /* Set TIMER0 */
}
void deley178ms(void)
{
unsigned int i;
for(i=0;i<300;i++)
{
_delay_loop_2(80);
}
}
int main(void)
{
unsigned char j;
OSCCAL = 0xAF;
cli();
DDRC = 0x0F;
PORTC = 0xff;
AvrInit ();
sei();
S3 = SINGG[S2];
S3 = S3&0X0F; //取低4位,将时间存到S3
TI= SINGG[S2];
TI=TI>>4; //取到音符
if(TI==0) timer_enable_int(0<<TOIE1);
else
{
TI=TI-1;
TCNT1 = SINGM[TI];
timer_enable_int(_BV(TOIE1));
}
while(1)
{
for(j=0;S3>=j;j++)
{
deley178ms();
}
S2++;
timer_enable_int(0<<TOIE1);
if(S2>23) S2=0;
S3 = SINGG[S2];
S3 = S3&0X0F; //取低4位,将时间存到S3
TI= SINGG[S2];
TI=TI>>4; //取到音符
if(TI==0) timer_enable_int(0<<TOIE1);
else
{
TI=TI-1;
TCNT1 = SINGM[TI];
timer_enable_int(_BV(TOIE1));
}
asm("nop");
}
}
-----此内容被lcqqcl于2005-12-08,21:06:47编辑过
-----此内容被lcqqcl于2005-12-09,15:10:20编辑过
-----此内容被lcqqcl于2005-12-09,15:33:53编辑过 |
|