ATmega128 想通过串口控制定时器时间,程序如下。现在问题是,设置后定时器开始工作后不能再更改时间了,只有复位才可以重新设置想要的时间,程序应怎么改呀?
#include<iom128v.h>
#include<macros.h>
/***********************************宏定义**********************************/
#define fosc 7372800 //晶振
#define baud 19200 //波特率
#define uchar unsigned char
#define uint unsigned int
uint min;
/****************************************************************************
函数功能:uart0初始化程序
入口参数:
出口参数:
****************************************************************************/
void uart0_init(void)
{
UCSR0B = 0x00; //关闭UART00
UCSR0A = 0x00; //不使用倍速发送(异步)
UCSR0C =(1<<UCSZ01)|(1<<UCSZ00); //数据位为8位
UBRR0L=(fosc/16/baud-1)%256; //异步正常情况下的计算公式
UBRR0H=(fosc/16/baud-1)/256;
UCSR0B =(1<<RXEN0)|(1<<TXEN0); //接收使能和发送使能
}
/****************************************************************************
函数功能:uart0发送单字节数据
入口参数:c
出口参数:
****************************************************************************/
void putchar0(unsigned char c)
{
while (!(UCSR0A&(1<<UDRE0)));//表明发送器已经准备就绪
UDR0=c; //将要发送的数据装入UDR0寄存器
}
/****************************************************************************
函数功能:uart0接收单字节数据
入口参数:
出口参数:
****************************************************************************/
unsigned char getchar0(void)
{
while(!(UCSR0A& (1<<RXC0)));//表明已经接收完毕
return UDR0;
}
/****************************************************************************
函数功能:uart0发送字符串数据
入口参数:*s
出口参数:
****************************************************************************/
void puts0(char *s)
{
while (*s)
{
putchar0(*s);
s++;
}
putchar0(0x0a);//回车换行
putchar0(0x0d);
}
void port_init(void)
{
PORTC = 0x01;
DDRC = 0x01;
PORTD = 0x00;
DDRD = 0x80;
}
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = (65536-57600/1024*min)/256; //setup
TCNT1L = (65536-57600/1024*min)%256;
TCCR1B = 0x05; //start Timer
}
#pragma interrupt_handler timer1_ovf_isr:15
void timer1_ovf_isr(void)
{ //TIMER1 has overflowed
if(PORTC == 0x00)
{
TCNT1H = (65536-57600/1024*min)/256; //setup
TCNT1L = (65536-57600/1024*min)%256;
PORTD^=0x80;
PORTC^=0x01;
}
else
{
TCNT1H = 0xF2; //off 1min
TCNT1L = 0xEC;
PORTD^=0x80;
PORTC^=0x01;
}
}
//call this routine to initialize all peripherals
void init_devices(void)
{
CLI(); //disable all interrupts
XDIV = 0x80; //xtal divider
port_init();
timer1_init();
TIMSK = 0x04; //timer interrupt sources
SEI(); //re-enable interrupts
}
/****************************************************************************
函数功能:主程序
入口参数:
出口参数:
****************************************************************************/
void main(void)
{
uchar temp;
uart0_init();//UART0初始化
temp=getchar0();
while(1)
{
switch(temp)
{
case '1':
puts0("1min OK!");
min=60;
init_devices();
break;
case '2':
puts0("2min OK!");
min=120;
init_devices();
break;
case '3':
puts0("3min OK!");
min=180;
init_devices();
break;
case '4':
puts0("4min OK!");
min=240;
init_devices();
case '5':
break;
puts0("5min OK!");
min=300;
init_devices();
case '6':
puts0("6min OK!");
min=360;
init_devices();
break;
case '7':
puts0("7min OK!");
min=420;
init_devices();
break;
case '8':
puts0("8min OK!");
min=480;
init_devices();
break;
case '9':
puts0("9min OK!");
min=540;
init_devices();
break;
case '0':
puts0("10min OK!");
min=600;
init_devices();
break;
default :
puts0("1:1min; 2:2min;... 9:9min; 0:10min(Light On) 1min(Off)");
}
temp=getchar0();
}
}
|