注册会员
- 积分
- 137
- 威望
- 106
- 贡献
- 27
- 兑换币
- 0
- 注册时间
- 2012-4-6
- 在线时间
- 2 小时
- 毕业学校
- 坪水小学
|
我用ICCAVR模仿书中的“用T1控制交通指示灯”不能实现,我想可能是编译器的区别,
问题是:当在T1内的switch内中遇到return.后,所有变量被初始化?他不是返回到main中的while(1);而是返回到main中的第一条语句。
希望获得解释。
谢谢!
//-----------------------------------------------------------------
// 名称: 定时器T1控制交通指示灯
//-----------------------------------------------------------------
// 说明: 东西向绿灯亮5秒后,黄灯闪烁,闪烁5次后亮红灯,
// 红灯亮后,南北向由红灯变为绿灯,5秒后南北向黄灯闪烁,
// 闪烁5次后亮红灯,东西向绿灯亮,如此往复.
// 本例将时间设得较短是为了调试的时候能较快的观察到运行效果.
//
//-----------------------------------------------------------------
//ICC-AVR application builder : 2012-7-10 10:33:14
// Target : M16
// Crystal: 4.0000Mhz
#include <iom16v.h>
#include <macros.h>
#define INT8U unsigned char
#define INT16U unsigned int
#define RED_EW_ON() PORTC |= (1<<0); //东西向指示灯开
#define YELLOW_EW_ON() PORTC |= (1<<1);
#define GREEN_EW_ON() PORTC |= (1<<2);
#define RED_EW_OFF() PORTC &= ~(1<<0); //东西向指示灯关
#define YELLOW_EW_OFF() PORTC &= ~(1<<1);
#define GREEN_EW_OFF() PORTC &= ~(1<<2);
#define RED_SN_ON() PORTC |= (1<<3); //南北向指示灯开
#define YELLOW_SN_ON() PORTC |= (1<<4);
#define GREEN_SN_ON() PORTC |= (1<<5);
#define RED_SN_OFF() PORTC &= ~(1<<3); //南北向指示灯关
#define YELLOW_SN_OFF() PORTC &= ~(1<<4);
#define GREEN_SN_OFF() PORTC &= ~(1<<5);
#define YELLOW_EW_BLINK() PORTC ^= 0x02; //东西向黄灯闪烁
#define YELLOW_SN_BLINK() PORTC ^= 0x10; //南北向黄灯闪烁
#define BEEP() (PORTB ^= 0x01) //蜂鸣器
void _delay_us(INT16U n)
{
INT8U i,j;
for(i = 0; i < n; i++)
{
for(j = 0; j < 10; j++);
}
}
//------------------------------------------------------------------
// 黄灯警报声音输出
//------------------------------------------------------------------
void Yellow_Light_Alarm(void)
{
INT8U i;
for(i = 0; i < 100; i++)
{
BEEP();
_delay_us(380);
}
}
//TIMER1 initialize - prescale:64
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 500mSec
// actual value: 500.000mSec (0.0%)
//TIMER1 initialize - prescale:64
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 500mSec
// actual value: 500.000mSec (0.0%)
/*
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0x85; //setup
TCNT1L = 0xEE;
TCCR1A = 0x00;
TCCR1B = 0x03; //start Timer
}*/
//延时倍数,闪烁次数,操作类型变量
INT8U Flash_Count = 0, Operation_Type = 1;
//------------------------------------------------------------------
// 主程序
//------------------------------------------------------------------
void main(void)
{
DDRB = 0XFF;//配置输出端口。
//PORTB = 0XFF;
DDRC = 0XFF; //
PORTC = 0X00;
TCCR1B = 0X03;//T1预设分频:64
TCNT1H = 0x85; //reload counter high value
TCNT1L = 0xEE; //reload counter low value
//TCNT1 = 65536- ((4000000/64)/2);//晶振4MHz,0.5s定时初值。
TIMSK = (1<<TOIE1);//允许T1定时器溢出中断
//timer1_init();
SEI();//开中断
while(1);
}
//-----------------------------------------------------------------
// T1定时器溢出中断服务程序(控制交通指示灯切换显示)
//-----------------------------------------------------------------
#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
void timer1_ovf_isr(void)
{
static INT8U Time_Count=9;
//TIMER1 has overflowed
TCNT1H = 0x85; //reload counter high value
TCNT1L = 0xEE; //reload counter low value
//TCNT1 = 65536- ((4000000/64)/2);//晶振4MHz,0.5s定时初值。
PORTB ^= 0x80;
switch(Operation_Type)
{
case 1: //东西向绿灯与南北向灯亮,5S后绿灯灭。
RED_EW_OFF(); YELLOW_EW_OFF(); GREEN_EW_ON();
RED_SN_ON(); YELLOW_SN_OFF(); GREEN_SN_OFF();
//5s后切换操作(0.5*10=5s)
// Time_Count;
if(++Time_Count != 10)
{
return;
}
PORTB ^= 0x40;
Time_Count = 0;
Operation_Type = 2;//下一操作
break;
case 2://东西方向绿灯灭,黄灯开始闪烁;
Yellow_Light_Alarm();
GREEN_EW_OFF();
YELLOW_EW_BLINK();
//闪烁5次
if(++Flash_Count != 10)
{
return;
}
Flash_Count = 0;
Operation_Type = 3;//下一操作;
break;
case 3://东西方向红灯与南北方向绿灯亮
RED_EW_ON();
YELLOW_EW_OFF();
GREEN_EW_OFF();
RED_SN_OFF();
YELLOW_SN_OFF();
GREEN_SN_ON();
//南北方向绿灯亮5S后切换(0.5s*10=5s)
if(++Time_Count != 10)
{
return;
}
Time_Count = 0;
Operation_Type = 4;//下一种操作类型
break;
case 4: //南北方向绿灯灭,黄灯开始闪烁
Yellow_Light_Alarm();
GREEN_SN_OFF();
YELLOW_SN_BLINK();
//闪烁5次
if(++Flash_Count != 10)
{
return;
}
Flash_Count = 0;
Operation_Type = 1;
break;
}
}
|
|