打印

求大神指教程序

[复制链接]
1060|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zloong|  楼主 | 2014-7-21 10:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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();
}
}

相关帖子

沙发
airwill| | 2014-7-21 11:03 | 只看该作者
你应该先停止定时器的记数时钟或者关闭定时器后, 再更改定时器的设置.

使用特权

评论回复
板凳
zloong|  楼主 | 2014-7-21 11:09 | 只看该作者
airwill 发表于 2014-7-21 11:03
你应该先停止定时器的记数时钟或者关闭定时器后, 再更改定时器的设置.

可是通过串口通信怎么关定时器啊?

使用特权

评论回复
地板
airwill| | 2014-7-21 11:19 | 只看该作者
关定时器, 都是一样的,  如何关闭的实现细节, 看 AVR 的编程手册吧

使用特权

评论回复
5
zloong|  楼主 | 2014-7-24 10:34 | 只看该作者
airwill 发表于 2014-7-21 11:19
关定时器, 都是一样的,  如何关闭的实现细节, 看 AVR 的编程手册吧

问题解决了 还是谢谢你

使用特权

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

本版积分规则

6

主题

15

帖子

0

粉丝