搜索
bottom↓
回复: 6

马老师AVR实验板基于Protothreads下一个歌曲实验

[复制链接]

出0入0汤圆

发表于 2008-4-1 20:58:19 | 显示全部楼层 |阅读模式
马老师AVR实验板,ATMEGA16,8M,PD7接轰鸣器。
点击此处下载 ourdev_243221.rar(文件大小:134K) (原文件名:test_pt_avr_iar.rar)

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

 楼主| 发表于 2008-4-1 21:01:37 | 显示全部楼层
#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);
}

出0入0汤圆

发表于 2012-7-14 00:30:08 | 显示全部楼层
好东西 值得收藏

出0入0汤圆

发表于 2012-8-17 11:07:38 | 显示全部楼层
学习了。

出0入0汤圆

发表于 2012-8-17 12:43:56 | 显示全部楼层
3楼挖得够深啊,最近也开始使用 ProtoThreads

出0入0汤圆

发表于 2012-8-24 10:26:59 | 显示全部楼层
good job !!!

出0入10汤圆

发表于 2013-12-19 15:02:41 | 显示全部楼层
学习一下!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-2 23:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表