打印
[AVR单片机]

报警器与旋转灯 各位大侠江湖解救 有声音 LED不旋转

[复制链接]
2076|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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();
}



旋转灯.png (13.22 KB )

旋转灯.png

相关帖子

沙发
gxbltao|  楼主 | 2014-8-25 16:39 | 只看该作者
各位大侠 江湖救急  小弟初学AVR  以上程序按照 书本写上去  但是 有报警声 LED 不旋转  求大侠解救

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

旋转灯.png (13.22 KB )

旋转灯.png

使用特权

评论回复
板凳
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; 不知道是否可以?

以上两点如果不对 烦请大侠 详解 谢谢 !

使用特权

评论回复
5
ddllxxrr| | 2014-8-26 17:48 | 只看该作者
gxbltao 发表于 2014-8-26 14:18
首先 万分感谢 ddllxxrr  在百忙之中 抽空来帮我解决难题
但小弟愚钝 对于大侠所提的三点问题其中有两点 ...

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

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

第二点,初值只是让你的灯有个显示,要不你移来移去就是0也亮不了

使用特权

评论回复
6
gxbltao|  楼主 | 2014-8-26 20:17 | 只看该作者
ddllxxrr 发表于 2014-8-26 17:48
我可不是大侠,一同学习进步吧

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

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

3.23 报警器与旋转灯.rar

65.02 KB

使用特权

评论回复
7
ddllxxrr| | 2014-8-26 21:11 | 只看该作者


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

平台:GCC atmega16

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

*****************************************************************/
#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 SPK()(PORTD^=_BV(PD7))  // 蜂鸣器输出定义

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


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

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

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

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

}


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

ISR(INT0_vect)
{
        ON_OFF=!ON_OFF;     // 启停切换
        if(ON_OFF)
        {
               
                Pattern=0xE0;   // 11100000,开3个灯旋转
        }
        else
        {
                TIMSK=0x00;         // 关闭所有定时器中断
                PORTC=0x00;         // 关闭所有LED
                PORTD&=~_BV(PD7);   // 在蜂鸣器链接的 PD7 脚输出低电平
        }
}


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


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


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

        PORTC=Pattern;     // 显示LED
             
}



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

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




使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
gxbltao + 1 很给力!
8
gxbltao|  楼主 | 2014-8-27 00:08 | 只看该作者
ddllxxrr 发表于 2014-8-26 21:11

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

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

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

2.png (3.09 KB )

2.png

1.png (8.13 KB )

1.png

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

45

帖子

0

粉丝