#include "config.h"
THR_Create(Thread1); //定义线程Thread1
THR_Extern(Thread2); //声明外部线程Thread2,Thread2在另外一个文件定义
TMR_Create(Timer1); //定义定时器Timer1
uint8 Thread1(Tpt *pt) //线程1
{
PT_BEGIN(pt);
DDRA=_BV(0); //LED IO口初始化
PORTA=_BV(0);
while(1)
{
PORTA^=_BV(0); //LED闪烁
PT_TIMER_DELAY(&Timer1,200); //延时200ms
}
PT_END(pt);
}
int main()
{
TCNT0 = TCNT0_INIT;
TCCR0 = T0_CLK_DIV256;
TIMSK|=_BV(0);
sei();
while(1) //线程调度
{
pt_execute(PT(Thread1)); //LED闪烁线程
pt_execute(PT(Thread2)); //歌曲线程
}
}
#define IN_SONG_C
#include "config.h"
volatile uint16 Sing;
const __flash uint16 Tone_P[] PROGMEM =
{
0,1907,1700,1514,1432,1275,1135,1011,955,
864, 758, 715, 637, 567, 505,477, 425, 378,
357, 318, 283, 202
};
const __flash uint8 Song_P[] PROGMEM =
{
3,3,2,3,0,3,5,3,2,3,1,1,2,3,5,3,
2,2,1,2,3,5,3,6,5,6,5,5,3,5,'e',
3,2,2,5,3,2,2,2,1,2,3,3,2,3,3,5,
3,2,3,1,1,2,3,5,3,2,2,1,2,3,5,3,
6,5,6,5,5,3,5,0,3,2,3,5,3,2,2,1,
1,0,1,2,3,3,5,6,6,'C','B','A','A',
6,5,6,5,3,2,1,'f',1,2,2,1,2,1,2,
3,3,5,6,6,'C','B','A','A','B','A',
5,5,3,7,'A',1,2,3,2,1
};
const __flash uint8_t Length_P[] PROGMEM =
{
4,2,2,4,2,2,2,2,2,8,4,2,2,2,2,4,
4,2,2,8,6,1,1,2,6,2,2,2,2,6,2,4,
2,2,4,2,2,4,2,2,8,4,2,2,8,2,2,2,
2,8,4,2,2,2,2,4,4,2,2,8,6,1,1,2,
6,2,2,2,2,8,2,2,2,2,4,2,2,2,6,4,
2,2,2,4,2,2,4,2,2,2,2,2,2,8,2,2,
2,2,4,2,2,4,2,2,4,2,2,4,2,2,4,2,
2,2,2,2,2,8,4,2,2,2,2,2,2,8,8,16
};
SIGNAL(SIG_OUTPUT_COMPARE1A)
{
PORTD^=0X80; //PD7接蜂鸣器
OCR1A=Sing;
}
THR_Create(Thread2);
TMR_Create(Timer2);
uint8 playchar(uint8 ch)
{
switch(ch)
{
case 0: return 0;
case 'a': return 1;
case 'b': return 2;
case 'c': return 3;
case 'd': return 4;
case 'e': return 5;
case 'f': return 6;
case 'g': return 7;
case 1: return 8;
case 2: return 9;
case 3: return 10;
case 4: return 11;
case 5: return 12;
case 6: return 13;
case 7: return 14;
case 'A': return 15;
case 'B': return 16;
case 'C': return 17;
case 'D': return 18;
case 'E': return 19;
case 'F': return 20;
case 'G': return 21;
default : return 0;
}
}
void SONG_INIT()
{
DDRD=0X80;
TCCR1B = 0x00;//
TCNT1H = 0x00;
TCNT1L = 0x00;//初始值
OCR1AH = 0x00;
OCR1AL = 0x00;//匹配A值
OCR1BH = 0x00;
OCR1BL = 0x00;//匹配B值
ICR1H = 0xFF;
ICR1L = 0xFF;//输入捕捉匹配值
TCCR1A = 0x00;
TCCR1B = 0x0A;//启动定时器
}
uint8 Thread2(Tpt *pt)
{
static uint8 i,temp,length,ch;
static uint16 sing;
PT_BEGIN(pt);
SONG_INIT(); //定时器初始
while(1)
{
for( i=0;i<sizeof(Song_P);i++)
{
temp=Song_P;
ch=playchar(temp);
sing=Tone_P[ch];
length=Length_P;
if(sing)
{
CRITICAL() //临界断
{
Sing=sing;
}
temp=length;
TIMSK |= 0x10; //中断允许
while(temp--)
{
PT_TIMER_DELAY(&Timer2,125);
}
TIMSK &= ~0x10; //中断关闭
}
else
{
temp=length;
while(temp--)
{
PT_TIMER_DELAY(&Timer2,125);
}
}
}
PORTD|=0X80;
PT_TIMER_DELAY(&Timer2,125);
}
PT_END(pt);
} |