现在的位置: 首页 > 综合 > 正文

数码相框项目模块【四】 TIMER

2013年10月01日 ⁄ 综合 ⁄ 共 12633字 ⁄ 字号 评论关闭

首先,要进行实现定时功能,选择没有输出管教的内部定时器 timer 4

timer 4 定时功能实现

一、首先由规格书可知,定时器4是需要先进行8位的 prescaler 和 4位的 clock divider 的分频设定,其相应的寄存器分别为TCFG0 和 TCFG1
二、根据之上分频器计算出的频率,因本模块取1ms产生一次中断,所以可求得总共所需的次数,赋值给TCNTB4
三、在启动定时器之前,要进行手动更新操作,设置寄存器 TCON,在启动时,要进行清除手动更新位,配置 TCON寄存器

注意点:当赋值给TCNTB4时,该值也将拷贝到 TCNT4中,TCNT4的值每次减1,当其值为0时,产生一次中断,另外在进行启动定时器之前,要进行中断的相应寄存器的设置

利用定时器功能实现音乐播放

一、选择定时器1进行操作,在开发板上找到蜂鸣器LS1,在电路板上找到其位置,然后在核心板上找到其端口GPB1,设置为时钟TCOUT1
二、在初始化操作时,根据参数传进的频率来进行设置 TCNTB1寄存器的值,TCMPB1的值可由自己手动设置,同样地,TCNTB1和TCMPB1的值会分别拷贝给TCNT1和TCMP1,当TCNT1的值减为0或TCNT1的值和TCMP1相等时,产生电平转换
三、定时器的启动步骤,和定时器4一样
四、利用函数的调用来实现时间调用的功能
五、根据传递进来音调的不同和持续时间的长短可以谱写出美妙的音乐

因定时器与音乐播放紧密相关,将代码合成一个模块,便于操作

TIMER.C

Code:
  1. #include "2440addr.h"   
  2. #include "uart.h"   
  3. #include "key.h"   
  4. #include "led.h"   
  5. #include "timer.h"   
  6. #include "song.h"   
  7.   
  8. static int div2ms, div10ms;   
  9. static volatile unsigned int timer1mscnt,timer10mscnt;   
  10.   
  11. /*  
  12. Function  name  :   Timer4_Handle  
  13. Description     :   deal with the interrruption of Timer 4
     
  14. Input parameter :   none  
  15. Return          :   none        
     
  16. Others          :   none                                            
     
  17. */  
  18.   
  19. static void __irq Timer4_Handle()   
  20. {   
  21.     rSRCPND |= (1<<14);   
  22.     rINTPND |= (1<<14);   
  23.   
  24.     if(timer1mscnt)   
  25.     {   
  26.         timer1mscnt--;   
  27.     }   
  28.          
  29.     div2ms++;   
  30.     switch(div2ms&1)     // 2个事情隔1毫秒交替执行
      
  31.     {   
  32.         case 0:   
  33.             {   
  34.                 //checkkey();  // 2 毫秒执行一次
      
  35.                 break;   
  36.             }   
  37.         case 1:   
  38.             {   
  39.                 set10mstimer();  // 2 毫秒执行一次
      
  40.                 break;   
  41.             }   
  42.         default:   
  43.             {   
  44.                 break;   
  45.             }   
  46.     }      
  47.   
  48. }   
  49.   
  50. /*  
  51. Function  name  :   delay1ms  
  52. Description     :   delay the time ,1ms  
  53. Input parameter :   one unsigned int vlaue --- waits
     
  54. Return          :   none          
  55. Others          :   none                                            
     
  56. */  
  57.   
  58. void delay1ms(unsigned int waits)   
  59. {   
  60.     timer1mscnt = waits;     
  61.     while(1)   
  62.     {      
  63.         if(0==timer1mscnt)   
  64.         {      
  65.             //Uart_Printf("1s delay/n");
      
  66.             break;   
  67.         }   
  68.     }   
  69. }   
  70.   
  71. /*  
  72. Function  name  :   delay10ms  
  73. Description     :   delay the time ,10ms
     
  74. Input parameter :   one unsigned int vlaue --- wait1ms
     
  75. Return          :   none        
     
  76. Others          :   none                                            
     
  77. */  
  78.   
  79. void delay10ms(unsigned int wait1ms)   
  80. {   
  81.     timer10mscnt = wait1ms;   
  82.     while(1)   
  83.     {   
  84.         if(0==timer10mscnt) break;   
  85.     }   
  86. }   
  87.   
  88. /*  
  89. Function  name  :   set10mstimer
     
  90. Description     :   Every 2ms to execute the fuction,every case occur use time 10ms
     
  91. Input parameter :   none  
  92. Return          :   none          
  93. Others          :   none                                            
     
  94. */  
  95.   
  96. void set10mstimer(void)   
  97. {   
  98.     (div10ms<4)?(++div10ms):(div10ms=0);  // Each time 2ms, total 10ms
      
  99.     switch(div10ms)    
  100.     {   
  101.         case 0:   
  102.             {              
  103.                 break;   
  104.             }   
  105.         case 1:   
  106.             {   
  107.                 if(timer10mscnt)   
  108.                     timer10mscnt--;   
  109.                 //  Uart_Printf("timer1 10 ms ccured/n");
      
  110.                 break;   
  111.             }   
  112.         case 2:   
  113.             {   
  114.                 break;   
  115.             }   
  116.         case 3:   
  117.             {   
  118.                 if(playsongflag)   //Every 10ms occured
      
  119.                 {   uart0_puts("playing.../n");   
  120.                     playsong();   
  121.                 }      
  122.                    
  123.                 break;   
  124.             }   
  125.         case 4:   
  126.             {   
  127.                    
  128.                 break;   
  129.             }      
  130.     }   
  131. }   
  132.   
  133. /*  
  134. Function  name  :   Timer4_init  
  135. Description     :   Timer 4 init
     
  136. Input parameter :   one unsigned int value  -- ms
     
  137. Return          :   none        
     
  138. Others          :   none                                            
     
  139. */  
  140.   
  141. void Timer4_init(unsigned int ms)   
  142. {   
  143.     timer1mscnt = 0;   
  144.     timer10mscnt = 0;   
  145.     div2ms = 0;   
  146.     div10ms = 0;   
  147.        
  148.     rTCFG0 |= 0xff<<8;    
  149.     rTCFG1 =  (rTCFG1& ~(0xf<<16)) |(1<<16);           
  150.   
  151.     ms=(ms==0)? 1:ms;   
  152.        
  153.     rTCNTB4 =(PCLK>>10)*0.001*ms;    
  154.        
  155.     rTCON |= (1<<21); //manual update
      
  156.   
  157.     rINTMSK &= ~(1<<14);           
  158.     rSRCPND |= (1<<14);   
  159.     rINTPND |= (1<<14);   
  160.   
  161.     rTCON = ((rTCON & ~(0x7<<20))|(1<<20)|(1<<22)); //disable manual update, auto load,start
      
  162.        
  163.     pISR_TIMER4 = (unsigned ) Timer4_Handle;   
  164. }   
  165.   
  166. /*  
  167. Function  name  :   StartBuzzer
     
  168. Description     :   Start the Buzzer  
  169. Input parameter :   one unsigned int value --- freq
     
  170. Return          :   none          
  171. Others          :   none                                            
     
  172. */  
  173.   
  174. void StartBuzzer(unsigned int freq)   
  175. {   
  176.     rGPBCON  = (rGPBCON & ~(0x3<<2)) |(2<<2);   
  177.        
  178.     rTCFG0  |= ((rTCFG0 &~0xf)|(7));       
  179.     rTCFG1  = ((rTCFG1 &(~0xf))|(2));      
  180.        
  181.     freq = (freq==0)? 1:freq;   
  182.        
  183.     rTCNTB1 = (PCLK>>6)/freq;      
  184.     rTCMPB1 = (rTCNTB1>>1);        
  185.        
  186.     rTCON  |= (1<<9);    
  187.     rTCON   = ((rTCON & ~(0xf<<8))|(1<<8)|(1<<10)|(1<<11));   
  188. }   
  189.   
  190. /*  
  191. Function  name  :   StopBuzzer
     
  192. Description     :   Stop the Buzzer  
  193. Input parameter :   none  
  194. Return          :   none          
  195. Others          :   none                                            
     
  196. */  
  197.   
  198. void StopBuzzer(void)   
  199. {   
  200.     rTCON  = ((rTCON & ~(0xf<<8))|(0<<8));   
  201. }   
  202.   
  203.   

TIMER.H

Code:
  1. #ifndef _TIMER_H   
  2. #define _TIMER_H   
  3.   
  4. extern void Timer4_init(unsigned int ms);   
  5.   
  6. extern void delay10ms(unsigned int waitms);   
  7.   
  8. extern void delay1ms(unsigned int waitms);   
  9.   
  10. extern void set10mstimer(void);   
  11.   
  12. extern void StartBuzzer(unsigned int hz);   
  13.   
  14. extern void StopBuzzer(void);   
  15.   
  16. #endif  

SONG.C 代码
 

Code:
  1. /*  Copyright (C), 2008-2010, wanczy  Tech. Co., Ltd.
     
  2. File  name  :   song.c  
  3. Author      :   cy  
  4. version     :   V1.0  
  5. Date        :   2010-6-28  
  6. Description :   song module function  implement  
     
  7. History     :           
  8. 1  Date         2010-6-28   
  9.    Author       cy  
  10.    Modification    
  11. */  
  12.   
  13. #include "timer.h"   
  14. #include "song.h"   
  15.   
  16. //音符频率对应表   
  17. unsigned short tonefreq[][8]={   
  18.       /* 1     2     3     4     5     6     7*/  
  19.     /* low */  
  20.     {0, 262,  294,  330,  349,  392,  440,  494 },   
  21.     {0, 277,  311,  330,  370,  415,  466,  494 },  //("#"表示半音,用于上升或下降半个音)
      
  22.     /* middle */  
  23.     {0, 523,  578,  659,  698,  784,  880,  988 },   
  24.     {0, 554,  622,  659,  740,  831,  932,  988 },  //#
      
  25.     /* high */  
  26.     {0, 1046, 1175, 1318, 1397, 1568, 1760, 1976},   
  27.     {0, 1109, 1245, 1318, 1480, 1661, 1865, 1976}   //#
      
  28. };   
  29.   
  30. struct songdata {          //圣斗士
      
  31.     int tone;   
  32.     int freq;   
  33.     int time;   
  34. }song[] = {   
  35.         
  36.     {STARTTONE,3,TIMELONG/2},   
  37.     {STARTTONE,6,TIMELONG/2},   
  38.     {STARTTONE,6,TIMELONG/2},   
  39.     {STARTTONE,6,TIMELONG/2},   
  40.     {STARTTONE,7,TIMELONG/4},   
  41.     {STARTTONE,1,TIMELONG/2},   
  42.        
  43.     {STARTTONE,7,TIMELONG/2},   
  44.     {STARTTONE,5,TIMELONG},   
  45.     {STARTTONE,0,TIMELONG/10},   
  46.     {STARTTONE,6,TIMELONG/4},   
  47.     {STARTTONE,5,TIMELONG/2},   
  48.     {STARTTONE,3,TIMELONG/4},   
  49.     {STARTTONE,4,TIMELONG/4},   
  50.     {STARTTONE,1,TIMELONG/2},   
  51.     {STARTTONE,1,TIMELONG/2},   
  52.     {STARTTONE,1,TIMELONG/2},   
  53.     {STARTTONE,2,TIMELONG/2},   
  54.     {STARTTONE,1,TIMELONG/2},   
  55.     {STARTTONE,3,TIMELONG},   
  56.     {STARTTONE,0,TIMELONG/10},   
  57.     {STARTTONE,3,TIMELONG/2},   
  58.     {STARTTONE,6,TIMELONG/2},   
  59.     {STARTTONE,6,TIMELONG/2},   
  60.     {STARTTONE,6,TIMELONG/2},   
  61.        
  62.     {STARTTONE,7,TIMELONG/4},   
  63.     {STARTTONE,+1,TIMELONG/2},   
  64.     {STARTTONE,+2,TIMELONG/2},   
  65.     {STARTTONE,7,TIMELONG},   
  66.     {STARTTONE,0,TIMELONG/10},   
  67.     {STARTTONE,5,TIMELONG/4},   
  68.     {STARTTONE,6,TIMELONG/2},   
  69.     {STARTTONE,6,TIMELONG/2},   
  70.     {STARTTONE,6,TIMELONG/2},   
  71.     {STARTTONE,7,TIMELONG/4},   
  72.     {STARTTONE,+1,TIMELONG/2},   
  73.     {STARTTONE,7,TIMELONG},   
  74.     {STARTTONE,0,TIMELONG/10},   
  75.     {STARTTONE,6,TIMELONG/4},   
  76.     {STARTTONE,7,TIMELONG/2},   
  77.     {STARTTONE,+1,TIMELONG/2},   
  78.     {STARTTONE,+1,TIMELONG/2},   
  79.     {STARTTONE,7,TIMELONG/2},   
  80.     {STARTTONE,+5,TIMELONG/2},   
  81.     {STARTTONE,6,TIMELONG},   
  82.     {STARTTONE,6,TIMELONG/4},   
  83.     {STARTTONE,7,TIMELONG/2},   
  84.     {STARTTONE,+1,TIMELONG/2},   
  85.     {STARTTONE,+1,TIMELONG/2},   
  86.     {STARTTONE,7,TIMELONG/2},   
  87.     {STARTTONE,+2,TIMELONG/2},   
  88.     {STARTTONE,+1,TIMELONG},   
  89.     {STARTTONE,0,TIMELONG/10},   
  90.     {STARTTONE,6,TIMELONG/4},   
  91.     {STARTTONE,7,TIMELONG/2},   
  92.     {STARTTONE,+1,TIMELONG/2},   
  93.     {STARTTONE,+1,TIMELONG/2},   
  94.     {STARTTONE,7,TIMELONG/2},   
  95.     {STARTTONE,+5,TIMELONG/2},   
  96.     {STARTTONE,6,TIMELONG/2},   
  97.     {STARTTONE,+5,TIMELONG/4},   
  98.     {STARTTONE,+4,TIMELONG/2},   
  99.     {STARTTONE,+3,TIMELONG/2},   
  100.     {STARTTONE,+2,TIMELONG/4},   
  101.     {STARTTONE,+3,TIMELONG/2},   
  102.     {STARTTONE,+4,TIMELONG/4},   
  103.     {STARTTONE,+4,TIMELONG/2},   
  104.     {STARTTONE,6,TIMELONG/2},   
  105.     {STARTTONE,6,TIMELONG/4},   
  106.     {STARTTONE,6,TIMELONG/2},   
  107.     {STARTTONE,6,TIMELONG/4},   
  108.     {STARTTONE,7,TIMELONG/2},   
  109.     {STARTTONE,+5,TIMELONG},   
  110.     {STARTTONE,0,TIMELONG/10},   
  111.     {STARTTONE,+1,TIMELONG/4},   
  112.     {STARTTONE,+1,TIMELONG/2},   
  113.     {STARTTONE,+2,TIMELONG/4},   
  114.     {STARTTONE,+3,TIMELONG/2},   
  115.     {STARTTONE,+3,TIMELONG/2},   
  116.     {STARTTONE,+4,TIMELONG/4},   
  117.     {STARTTONE,+3,TIMELONG/2},   
  118.     {STARTTONE,+2,TIMELONG/4},   
  119.     {STARTTONE,+3,TIMELONG/2},   
  120.     {STARTTONE,+1,TIMELONG/4},   
  121.     {STARTTONE,+1,TIMELONG/2},   
  122.     {STARTTONE,+2,TIMELONG/4},   
  123.     {STARTTONE,+1,TIMELONG/2},   
  124.     {STARTTONE,+3,TIMELONG},   
  125.     {STARTTONE,0,TIMELONG/10},   
  126.     {STARTTONE,+3,TIMELONG/4},   
  127.     {STARTTONE,+2,TIMELONG},   
  128.     {STARTTONE,0,TIMELONG/10},   
  129.     {STARTTONE,+1,TIMELONG/4},   
  130.     {STARTTONE,6,TIMELONG/4},   
  131.     {STARTTONE,+1,TIMELONG/2},   
  132.     {STARTTONE,6,TIMELONG/4},   
  133.     {STARTTONE,7,TIMELONG/2},   
  134.     {STARTTONE,+1,TIMELONG/2},   
  135.     {STARTTONE,+2,TIMELONG/2},   
  136.     {STARTTONE,+1,TIMELONG},   
  137.     {STARTTONE,0,TIMELONG/10},   
  138.     {STARTTONE,+1,TIMELONG/4},   
  139.     {STARTTONE,+2,TIMELONG/2},   
  140.     {STARTTONE,+3,TIMELONG/2},   
  141.     {STARTTONE,+3,TIMELONG/2},   
  142.     {STARTTONE,+4,TIMELONG/4},   
  143.     {STARTTONE,+3,TIMELONG/2},   
  144.     {STARTTONE,+2,TIMELONG/4},   
  145.     {STARTTONE,+3,TIMELONG/2},   
  146.     {STARTTONE,+1,TIMELONG/4},   
  147.     {STARTTONE,+1,TIMELONG/2},   
  148.     {STARTTONE,+2,TIMELONG/4},   
  149.     {STARTTONE,+1,TIMELONG/2},   
  150.     {STARTTONE,+3,TIMELONG},   
  151.     {STARTTONE,0,TIMELONG/10},   
  152.     {STARTTONE,+3,TIMELONG/4},   
  153.     {STARTTONE,+4,TIMELONG/2},   
  154.     {STARTTONE,+5,TIMELONG/4},   
  155.     {STARTTONE,+4,TIMELONG/2},   
  156.     {STARTTONE,+3,TIMELONG/4},   
  157.     {STARTTONE,+4,TIMELONG/2},   
  158.     {STARTTONE,+3,TIMELONG/4},   
  159.     {STARTTONE,+2,TIMELONG/2},   
  160.     {STARTTONE,+1,TIMELONG/4},   
  161.     {STARTTONE,7,TIMELONG/2},   
  162.     {STARTTONE,+1,TIMELONG/2},   
  163.     {STARTTONE,+2,TIMELONG/4},   
  164.     {STARTTONE,+2,TIMELONG/2},   
  165.     {STARTTONE,+1,TIMELONG*2},   
  166.   
  167. };   
  168. int songplaytime,songindex,songfreq,songtone;  //定义播放的时间,索引,音调频率,音调
      
  169.   
  170. int playsongflag;  //定义标签决定是否进行播放
      
  171.   
  172.   
  173. /*  
  174. Function  name  :   playsong  
  175. Description     :   the play song function
     
  176. Input parameter :   none  
  177. Return          :   none        
     
  178. Others          :   none                                        
     
  179. */  
  180.   
  181.   
  182. void playsong(void)//由定时器每10ms调用一次
      
  183. {   
  184.     if(songplaytime)   
  185.     {   
  186.         songplaytime--;  //   
  187.     }   
  188.     else  
  189.     {   
  190.         StopBuzzer();   
  191.         songplaytime = song[songindex].time;   
  192.         songfreq = song[songindex].freq;   
  193.         songtone = song[songindex].tone;   
  194.         if(songfreq)   
  195.         {   
  196.             StartBuzzer(tonefreq[songtone][songfreq]);   
  197.         }   
  198.         songplaytime--;   
  199.         ++songindex;   
  200.         // (songindex<(sizeof(bjfyn)/sizeof(struct songdata)))?++songindex:(songindex=0);
      
  201.         if(songindex>=(sizeof(song)/sizeof(struct songdata))) //如果音乐播放到末尾,则停止播放
      
  202.             Stopplaysong();   
  203.     }   
  204. }      
  205.   
  206. /*  
  207. Function  name  :   Startplaysong
     
  208. Description     :   Start to play song  
  209. Input parameter :   none  
  210. Return          :   none          
  211. Others          :   none                                        
     
  212. */  
  213.   
  214. void Startplaysong(void)   
  215. {   
  216.     songplaytime = 0;   
  217.     songindex = 0;   
  218.     playsongflag = 1;   
  219. }   
  220.   
  221. /*  
  222. Function  name  :   Stopplaysong  
  223. Description     :   Stop to play song
     
  224. Input parameter :   none  
  225. Return          :   none        
     
  226. Others          :   none                                        
     
  227. */  
  228.        
  229. void Stopplaysong(void)   
  230. {   
  231.     playsongflag = 0;   
  232.     songplaytime = 0;   
  233.     songindex = 0;   
  234.   
  235.     StopBuzzer();   
  236. }   
  237.   
  238.   
  239. /*  
  240. Function  name  :   pauseplaysong  
  241. Description     :   pause to play song
     
  242. Input parameter :   none  
  243. Return          :   none        
     
  244. Others          :   none                                        
     
  245. */  
  246.   
  247. void pauseplaysong(void)   
  248. {   
  249.     playsongflag = 0;   
  250.     songplaytime = 0;   
  251.   
  252.     StopBuzzer();   
  253. }  

SONG.H

Code:
  1. #ifndef _SONG_H   
  2. #define _SONG_H   
  3.   
  4. #define TIMELONG   80   
  5. #define STARTTONE  2   
  6.   
  7. extern int playsongflag;   
  8.   
  9. extern void playsong(void);   
  10. extern void Startplaysong(void);   
  11. extern void Stopplaysong(void);   
  12. extern void pauseplaysong(void);   
  13.   
  14. #endif  

 

抱歉!评论已关闭.