打印
[Atmel]

用AtmelStudio6.2跑mega16例程(2)

[复制链接]
1076|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我正当写点什么的时候突然看到这个贴子

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

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

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

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

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

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

以下是仿真时的截图:



整个程序文件:
/*
* GccApplication2.c
*
* Created: 2014-8-25 20:05:24
*  Author: Administrator
*/

/****************************************************************
名称: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;    //
                TIMSK = 0x05;
        sei();    //
                 Pattern = 0x01;
        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();


   

相关帖子

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

本版积分规则

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

2399

主题

6963

帖子

68

粉丝