[AVR单片机] 报警器与旋转灯 各位大侠江湖解救 有声音 LED不旋转

[复制链接]
 楼主| gxbltao 发表于 2014-8-25 16:33 | 显示全部楼层 |阅读模式
本帖最后由 gxbltao 于 2014-8-25 16:44 编辑

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

平台:GCC atmega16


*****************************************************************/
#define F_CPU 1000000UL   // 1M 晶振
//#define INT8U   unsigned char
//#define INT16U  unsigned int

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

#define INT8U   unsigned char
#define INT16U  unsigned int


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

volatile INT8U FRQ=0x00;       //
INT8U ON_OFF=0;              //
INT8U Pattern=0xE0;            


/****************************************************************
                        主程序
*****************************************************************/

int main()
{
        DDRC=0xFF;         //
        DDRD=~_BV(PD2); PORTD=_BV(PD2); //
        TCCR0=0x05;                  //
        TCNT0=256-F_CPU/1024*0.1;     //

        TCCR1B=0x01;  //
        MCUCR=0x02;   //
        GICR=0x40;    //
        sei();    //
        while(1)
        {
                FRQ ++;         /*FRQ在超过255溢出后 从0开始在继续递增*/
                _delay_ms(1);  
        }

}


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

ISR(INT0_vect)
{
        ON_OFF=!ON_OFF;     // 启停切换
        if(ON_OFF)
        {
                TIMSK|=0x05;   
                Pattern=0xE0;   
        }
        else
        {
                TIMSK=0x00;         
                PORTC=0x00;         
                PORTD&=~_BV(PD7);   
        }
}


/****************************************************************
           T0 定时器中断程序控制 LED 旋转
*****************************************************************/


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



        if(Pattern&=0x80)  Pattern=(Pattern<<1)|0x01;         
        else   Pattern<<=1;

        PORTC=Pattern;     // 显示LED
              
}



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

ISR (TIMER1_OVF_vect)
{
        TCNT1=0xFE00+FRQ;
        SPK();
}



本帖子中包含更多资源

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

×
 楼主| gxbltao 发表于 2014-8-25 16:39 | 显示全部楼层
各位大侠 江湖救急  小弟初学AVR  以上程序按照 书本写上去  但是 有报警声 LED 不旋转  求大侠解救

小弟只有这么多积分万望谅解

本帖子中包含更多资源

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

×
ddllxxrr 发表于 2014-8-25 20:50 | 显示全部楼层
有三个地方得注意:
1。前面初使化应加个:TIMSK = 0x05;允许中断
2。中断函数中的if(Pattern&=0x80) 错误,应把等号去掉
3。Pattern应付初值




 楼主| gxbltao 发表于 2014-8-26 14:18 | 显示全部楼层
ddllxxrr 发表于 2014-8-25 20:50
有三个地方得注意:
1。前面初使化应加个:TIMSK = 0x05;允许中断
2。中断函数中的if(Pattern&=0x80) 错误 ...

首先 万分感谢 ddllxxrr  在百忙之中 抽空来帮我解决难题
但小弟愚钝 对于大侠所提的三点问题其中有两点不是很明白
海请大侠详明。

第一点“前面初使化应加个:TIMSK = 0x05;允许中断” :不知道是否是说在 mai 函数里面加 TIMSK |= 0x05; 呢?

第三点"Pattern应付初值" :不知道我前面有写 INT8U Pattern=0xE0; 不知道是否可以?

以上两点如果不对 烦请大侠 详解 谢谢 !
ddllxxrr 发表于 2014-8-26 17:48 | 显示全部楼层
gxbltao 发表于 2014-8-26 14:18
首先 万分感谢 ddllxxrr  在百忙之中 抽空来帮我解决难题
但小弟愚钝 对于大侠所提的三点问题其中有两点 ...

我可不是大侠,一同学习进步吧

第一点,用你的TIMSK |= 0x05 比较好,我的只是为了解决问题,

第二点,初值只是让你的灯有个显示,要不你移来移去就是0也亮不了
 楼主| gxbltao 发表于 2014-8-26 20:17 | 显示全部楼层
ddllxxrr 发表于 2014-8-26 17:48
我可不是大侠,一同学习进步吧

第一点,用你的TIMSK |= 0x05 比较好,我的只是为了解决问题,

还是弄不好  不知是否可以用我的原文件 调试好在发回来给我呢   
不好意思 这里就你回复我  那只好麻烦你咯 :loveliness:
谢谢了

本帖子中包含更多资源

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

×
ddllxxrr 发表于 2014-8-26 21:11 | 显示全部楼层


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

  3. 平台:GCC atmega16

  4. 说明:本例启用了2个定时中断器中断和1个外部中断
  5.       其中T0定时器溢出中断控制 LED 旋转,T1 定时器溢出中断控制报警
  6.       声音输出,INT0 中断控制系统的启动与停止。

  7. *****************************************************************/
  8. #define F_CPU 1000000UL   // 1M 晶振
  9. #define INT8U   unsigned char
  10. #define INT16U  unsigned int

  11. #include <avr/io.h>
  12. #include<avr/interrupt.h>
  13. #include<util/delay.h>



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

  15. volatile INT8U FRQ = 0x00;       // (volatile :不优化程序的意思 )定时初值循环递增控制频率循环递减
  16. INT8U ON_OFF=0;              // 开关变量
  17. INT8U Pattern=0xE0;             //Pattern:模式  旋转灯端口花样初值 11100000


  18. /****************************************************************
  19.                         主程序
  20. *****************************************************************/

  21. int main()
  22. {
  23.         DDRC=0xFF;         // 配置LED输出端口
  24.         DDRD=~_BV(PD2); PORTD=_BV(PD2); // 配置按键输入与蜂鸣器输出端口
  25.         TCCR0=0x05;                  //T0 预设分频:1024
  26.         TCNT0=256-F_CPU/1024.0*0.1;     // 1 MHz时钟,0.1s 定时初值

  27.         TCCR1B=0x01;  // T1 预设分频:1
  28.         MCUCR=0x02;   // INT0为下降沿触犯
  29.         GICR=0x40;    // INT0中断使能
  30.         TIMSK|=0x05;    // 开启2个定时器中断,分别控制报警器和LED
  31.         sei();    // 开总中断

  32.         while(1)
  33.         {
  34.                 FRQ++;          /*定时初值循环递增 控制频率循环递增*/  /*FRQ在超过255溢出后 从0开始在继续递增*/
  35.                 _delay_ms(1);   /*改变延时时参数 可调整报警声音输出的急促程度 (如:1、2、3、4)*/
  36.         }

  37. }


  38. /****************************************************************
  39.            外部中断0,启停报警器声音和 LED 旋转
  40. *****************************************************************/

  41. ISR(INT0_vect)
  42. {
  43.         ON_OFF=!ON_OFF;     // 启停切换
  44.         if(ON_OFF)
  45.         {
  46.                
  47.                 Pattern=0xE0;   // 11100000,开3个灯旋转
  48.         }
  49.         else
  50.         {
  51.                 TIMSK=0x00;         // 关闭所有定时器中断
  52.                 PORTC=0x00;         // 关闭所有LED
  53.                 PORTD&=~_BV(PD7);   // 在蜂鸣器链接的 PD7 脚输出低电平
  54.         }
  55. }


  56. /****************************************************************
  57.            T0 定时器中断程序控制 LED 旋转
  58. *****************************************************************/


  59. ISR(TIMER0_OVF_vect)
  60. {
  61.         TCNT0=256-F_CPU/1024.0*0.1;     // 重装0.1s 定时初值


  62. /* 以下两行 实现111 的循环左移(高位为1时 左移后 右端补1,否则直接左移)*/
  63.         if(        Pattern&0x80)  Pattern=        (Pattern<<1)|0x01;        
  64.         else   Pattern<<=1;

  65.         PORTC=Pattern;     // 显示LED
  66.              
  67. }



  68. /****************************************************************
  69.            T1 定时器中断程序控制报警声音输出
  70. *****************************************************************/

  71. ISR (TIMER1_OVF_vect)
  72. {
  73.         TCNT1=0xFE00+FRQ; //主程序中 FRQ 的递增导致输出频率递减
  74.         SPK();
  75. }




本帖子中包含更多资源

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

×

评分

参与人数 1威望 +1 收起 理由
gxbltao + 1 很给力!

查看全部评分

 楼主| gxbltao 发表于 2014-8-27 00:08 | 显示全部楼层
ddllxxrr 发表于 2014-8-26 21:11

怎么称呼您好呢 还是大侠好了 毕竟对我还说你是蛮厉害的

这么说吧 我复制了您的代码  还是只 报警LED不旋转
我仔细看了您给的代码  只改了下 TIMSK|=0x05; 这个而已

我在下如果你那边都可以正常运行 我怀疑是我的软件有问题
我所用的编译环境 和 仿真软件 如附件
不知你是否有遇到过这种现象呢

本帖子中包含更多资源

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

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

本版积分规则

6

主题

45

帖子

0

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