打印
[Atmel]

用AtmelStudio6.2跑mega16例程(41) 循环报警灯

[复制链接]
801|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ddllxxrr|  楼主 | 2014-10-28 20:59 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本例用了2个定时器中断和1个外部中断,T0控制灯旋转,T1定时器溢出中断控制着声音输出。

proteus仿真:

Studio6.2编译截图:

程序清单:
/*
* GccApplication4.c
*
* Created: 2014-10-28 20:22:56
*  Author: Administrator
*/

#define F_CPU 1000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdint.h>

#define SPK()(PORTD^= _BV(PD7))

volatile uint8_t FRQ = 0x00;
uint8_t ON_OFF = 0;
uint8_t Pattern = 0xE0;


int main(void)
{
    DDRC = 0xFF;
        DDRD = ~_BV(PD2);PORTD=_BV(PD2);
        TCCR0 = 0x05;
        TCNT0 = 256 - F_CPU/1024.0*0.1;
        TCCR1B = 0x01;
        MCUCR = 0x02;
        GICR = 0x40;
        sei();
        while(1)
        {
           FRQ++;
           _delay_ms(1);       
        }
        }
       
ISR(INT0_vect)
{
        ON_OFF = !ON_OFF;
        if(ON_OFF)
        {
                TIMSK |=0x05;
                Pattern = 0x80;
        }
        else
        {
                TIMSK = 0x00;
                PORTC = 0x00;
                PORTD &=~_BV(PD7);
        }
        }       

ISR(TIMER0_OVF_vect)
{
        TCNT0 = 256-F_CPU/1024.0*0.1;
        if(Pattern&0x80) Pattern=(Pattern<<1)|0x01;
        else Pattern<<= 1;
        PORTC= Pattern;
}

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


相关帖子

沙发
jiang390625| | 2014-10-29 15:51 | 只看该作者
不错,收藏一下。

使用特权

评论回复
板凳
jiang390625| | 2014-10-29 15:51 | 只看该作者
希望楼主多分享例程。

使用特权

评论回复
地板
okyouwin| | 2014-10-29 16:23 | 只看该作者
能用吗?感觉一般吧。

使用特权

评论回复
5
elecsnail| | 2014-10-30 16:23 | 只看该作者
感谢楼分享!

使用特权

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

本版积分规则

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

2398

主题

6956

帖子

67

粉丝