[Atmel] 用AtmelStudio6.2跑mega16例程(2)

[复制链接]
1269|0
 楼主| ddllxxrr 发表于 2014-8-25 21:03 | 显示全部楼层 |阅读模式
我正当写点什么的时候突然看到这个贴子

https://bbs.21ic.com/icview-790878-1-1.html

我就把它直接考过来了,并且用模拟仿真把他的问题找到:

1.在程序初始化时应加上使能定时器中断的语句:TIMSK = 0x05;

2.中断中有个语句写错:

if(Pattern&0x80)  楼主原先是if(Pattern&=0x80)

3.Pattern应该付初值,我觉得应是0x01

以下是仿真时的截图:



整个程序文件:
  1. /*
  2. * GccApplication2.c
  3. *
  4. * Created: 2014-8-25 20:05:24
  5. *  Author: Administrator
  6. */

  7. /****************************************************************
  8. 名称:3.23  报警器与旋转灯 (The alarm and the rotary lamp)

  9. 平台:GCC atmega16


  10. *****************************************************************/
  11. #define F_CPU 1000000UL   // 1M 晶振
  12. //#define INT8U   unsigned char
  13. //#define INT16U  unsigned int

  14. #include <avr/io.h>
  15. #include<avr/interrupt.h>
  16. #include<util/delay.h>

  17. #define INT8U   unsigned char
  18. #define INT16U  unsigned int


  19. #define SPK()(PORTD^=_BV(PD7))  // 蜂鸣器输出定义

  20. volatile INT8U FRQ=0x00;       //
  21. INT8U ON_OFF=0;              //
  22. INT8U Pattern=0xE0;            


  23. /****************************************************************
  24.                         主程序
  25. *****************************************************************/

  26. int main()
  27. {
  28.         DDRC=0xFF;         //
  29.         DDRD=~_BV(PD2); PORTD=_BV(PD2); //
  30.         TCCR0=0x05;                  //
  31.         TCNT0=256-F_CPU/1024*0.1;     //

  32.         TCCR1B=0x01;  //
  33.         MCUCR=0x02;   //
  34.         GICR=0x40;    //
  35.                 TIMSK = 0x05;
  36.         sei();    //
  37.                  Pattern = 0x01;
  38.         while(1)
  39.         {
  40.                 FRQ ++;         /*FRQ在超过255溢出后 从0开始在继续递增*/
  41.                 _delay_ms(1);  
  42.         }

  43. }


  44. /****************************************************************
  45.            外部中断0,启停报警器声音和 LED 旋转
  46. *****************************************************************/

  47. ISR(INT0_vect)
  48. {
  49.         ON_OFF=!ON_OFF;     // 启停切换
  50.         if(ON_OFF)
  51.         {
  52.                 TIMSK|=0x05;   
  53.                 Pattern=0xE0;   
  54.         }
  55.         else
  56.         {
  57.                 TIMSK=0x00;         
  58.                 PORTC=0x00;         
  59.                 PORTD&=~_BV(PD7);   
  60.         }
  61. }


  62. /****************************************************************
  63.            T0 定时器中断程序控制 LED 旋转
  64. *****************************************************************/


  65. ISR(TIMER0_OVF_vect)
  66. {
  67.         TCNT0=256-F_CPU/1024.0*0.1;     // 重装0.1s 定时初值



  68.         if(Pattern&0x80)  
  69.                 Pattern=(Pattern<<1)|0x01;         
  70.         else   
  71.                 Pattern<<=1;

  72.         PORTC=Pattern;     // 显示LED
  73.               
  74. }



  75. /****************************************************************
  76.            T1 定时器中断程序控制报警声音输出
  77. *****************************************************************/

  78. ISR (TIMER1_OVF_vect)
  79. {
  80.         TCNT1=0xFE00+FRQ;
  81.         SPK();


   

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2404

主题

7001

帖子

68

粉丝
快速回复 在线客服 返回列表 返回顶部