我正当写点什么的时候突然看到这个贴子
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();
|