tc.c

来自「很有意思的一个单片机程序 用AVR(MEGA16)和BEEP演奏两只老虎 使」· C语言 代码 · 共 67 行

C
67
字号
/*音谱对照           1    2    3    4    5    6    7
           低音    0x8D 0x7E 0x70 0x69 0x5E 0x53 0x4A
           中音    0x46 0x3E 0x37 0x34 0x2E 0x29 0x25
           高音    0x23 0x1F 0x1B 0x1A 0x17 0x14 0x12*/
          
#define ENABLE_BIT_DEFINITIONS
#include <inavr.h>
#include <ioavr.h>
#include <stdio.h>
#include <iom16.h>
unsigned char __flash twotigersnote[] = 
   {
    0x8D,0x7E,0x70,0x8D,0x8D,0x7E,0x70,0x8D,0x70,0x69,0x5E,0x70,0x69,0x5E,
    0x5E,0x53,0x5E,0x69,0x70,0x8D,0x5E,0x53,0x5E,0x69,0x70,0x8D,
    0x46,0x2E,0x46,0x46,0x2E,0x46,0xFF   
   };
unsigned int __flash twotigerspace[] = 
   {
    2000,2000,2000,2000,2000,2000,2000,2000,2000,2000,4000,2000,2000,4000,
    1000,500,1000,500,2000,2000,1000,500,1000,500,2000,2000,
    2000,2000,4000,2000,2000,4000,0xFF
   };

void timer2_init(void)
{
  TCCR2 = (1<<WGM21)|(1<<COM20)|(1<<CS20)|(1<<CS22);//工作于CTC模式,TCNT2与OCR2匹配是OC2取反,128分频
  TCNT2 = 0x00;
  
}
void Delay(unsigned int ms)
{
    unsigned char j;
    while(ms--)
    {
      j = 255;
      while(j--);
    }
}
void playmusic(unsigned char __flash buffer[],__flash unsigned int delaytime[])
{
  unsigned char __flash *note_p;
  unsigned int __flash *pace_p;
  note_p = buffer;
  pace_p = delaytime;
  DDRD_Bit7 = 1;
  timer2_init();
  while(1)
  {   
  OCR2 = *note_p;
  Delay(*pace_p);
  DDRD_Bit7 = 0;
  Delay(200);
  DDRD_Bit7 = 1;
  note_p++;
  pace_p++;
  if(*note_p == 0xFF)
    break;
  }
}

void main(void)
{
  playmusic(twotigersnote,twotigerspace);
  DDRD_Bit7 = 0;
  while(1);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?