📄 9.c
字号:
//ICC-AVR application builder : 2005-3-8 15:25:12
// Target : M48
// Crystal: 8.0000Mhz
#include <iom48v.h>
#include <macros.h>
static unsigned char yuequ[]={0x66,0x27,0x68,0x26,0x28,0x28,0x27,0x26,0x47,0x43,
0x67,0x28,0x69,0x27,0x29,0x29,0x28,0x27,0x46,0x46,
0x4a,0x4d,0x4c,0x2d,0x2c,0x2b,0x2b,0x2a,0x29,0x4a,
0x46,0x20,0x4b,0x29,0x6a,0x28,0x27,0x23,0x28,0x27,
0x46,0x46,0x4a,0x4d,0x4c,0x2d,0x2c,0x2b,0x2b,0x2a,
0x29,0x4a,0x46,0x20,0x4b,0x29,0x6a,0x28,0x27,0x23,
0x28,0x27,0x46,0x46,0x00};
//乐曲编码
static unsigned int yinpin[16]={0,392,440,494,523,
587,659,698,784,880,988,1046,1174,1318,1397,1568};
//音频表
unsigned char yinyue,jiepai,delay_tone,pb_buf;
unsigned int yinfu,num=0;
void port_init(void)
{
PORTB = 0xFF;
DDRB = 0x00;
PORTC = 0x7F; //m103 output only
DDRC = 0x00;
PORTD = 0xFF;
DDRD = 0x08;
}
//TIMER0 initialize - prescale:1024
// WGM: Normal
// desired value: 5mSec
// actual value: 4.992mSec (0.2%)
void timer0_init(void)
{
TCCR0B = 0x00; //stop
TCNT0 = 0xD9; //set count
TCCR0A = 0x01;
TCCR0B = 0x05; //start timer
}
#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void)
{
TCNT0 = 0xD9; //set count
delay_tone++;
//TIMER0 has overflowed
}
//TIMER1 initialize - prescale:8
// WGM: 9) PWM phz freq correct, TOP=OCRnA
// desired value: 1Hz
// actual value: Out of range
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0x00 /*INVALID SETTING*/; //setup
TCNT1L = 0x00 /*INVALID SETTING*/;
OCR1AH = 0xff /*INVALID SETTING*/;
OCR1AL = 0xff /*INVALID SETTING*/;
OCR1BH = 0x00 ;/*INVALID SETTING*/;
OCR1BL = 0x00 /*INVALID SETTING*/;
ICR1H = 0x00 /*INVALID SETTING*/;
ICR1L = 0x00 /*INVALID SETTING*/;
TCCR1A = 0x41;
TCCR1B = 0x12; //start Timer
}
#pragma interrupt_handler timer1_compa_isr:12
void timer1_compa_isr(void)
{
//compare occured TCNT1=OCR1A
PORTD^=0x08;//翻转PD3输出状态
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer0_init();
timer1_init();
MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK0 = 0x01; //timer 0 interrupt sources
TIMSK1 = 0x02; //timer 1 interrupt sources
TIMSK2 = 0x00; //timer 2 interrupt sources
PCMSK0 = 0x00; //pin change mask 0
PCMSK1 = 0x00; //pin change mask 1
PCMSK2 = 0x00; //pin change mask 2
PCICR = 0x00; //pin change enable
PRR = 0x00; //power controller
// SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void main(void)
{ //主函数
unsigned char yin_temp;//定义局部字符型变量
init_devices();//调用芯片初始化函数
while(1)//等待PD2按键按下
{ //无键按下等待
pb_buf=PIND & 0x4; //pd2=0
if(pb_buf==0){break;}
}//有键按下运行下面的程序
DDRD = 0xFF;PORTD=0xFF;//PD口输出
yinyue=yuequ[num];//取第一个乐曲编码
SEI();//开中断
while(yinyue != 0)
{
yinyue=yuequ[num];//取乐曲编码
jiepai=(yinyue >>4) * 20;//求得节拍码
yinfu=yinyue& 0x0f;
yinfu=yinpin[yinfu];//取得音频
yinfu = 400000/yinfu; OCR1A=yinfu;//换算得到比较匹配值
while(delay_tone<jiepai);//节拍延时
delay_tone=0;num++;//取下个乐曲编码
}
CLI();//关中断
PORTD=0xFF;//停止输出
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -