打印
[AVR单片机]

164驱动数码管,串口通讯时,数码管闪烁?

[复制链接]
1580|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qazplm3218|  楼主 | 2016-3-9 20:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
写了个简单的164驱动6位数码管、串口通讯测试程序:164驱动6位数码管,定时器间隔1秒,自动向串口发送数据,共17位数据
问题是:每当向串口发送数据时,数码管都会闪烁一下,不发送数据时,数码管显示正常。以下是程序,帮忙看看哪里有问题?谢谢
#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
void timer0_ovf_isr(void)    //10ms
{
  TCNT0 = 0x94;
  timer0_1s_temp++;
  if(timer0_1s_temp>=100)
  {
    timer0_1s_temp=0;
    uart_receive_ok=1;
  }
}

void send_byte1_164(unsigned char byte)
{
  unsigned char num,c;
  if((byte&0x80)==0x80)
  {
    num=table1[byte&0x7F]|0x80;
  }
  else
  {
    num=table1[byte&0x7F];
  }
  for(c=0;c<8;c++)
  {
    if(( num & 0x80))     //(0x80即十进制的128, 二进制的10000000 按位发送)
    {
      ab_set;
    }
    else
    {
      ab_clr;
    }
    NOP();NOP();NOP();
    cp_set;
    NOP();NOP();NOP();
    cp_clr;
    num= num<<1;
}
}

void dis_led(void)
{
send_byte1_164(1);
led_1_set;
delayms(1);
led_1_clr;
send_byte1_164(2);
led_2_set;
delayms(1);
led_2_clr;
send_byte1_164(3);   // "-"
led_3_set;
delayms(1);
led_3_clr;
send_byte1_164(4);
led_4_set;
delayms(1);
led_4_clr;
send_byte1_164(5);
led_5_set;
delayms(1);
led_5_clr;
send_byte1_164(6);
led_6_set;
delayms(1);
led_6_clr;
}

void main(void)
{
  CLI();
  port_init();
  timer0_init();
  usart_init();    //串口初始化
  MCUCR=0x00;
  GICR=0x00;
  TIMSK=0x01;
  SEI();
  while(1)
  {
    dis_led();
    if(uart_receive_ok)     //串口发送数据
    {
      uart_receive_ok=0;
      xor_check=0;
      for(send_temp=0;send_temp<16;send_temp++)
      {
        usart_send_data(send_buf[send_temp]);
        xor_check^=send_buf[send_temp];         //异或校验
      }
      usart_send_data(xor_check);               //发送异或校验码
      timer0_1s_temp=0;
    }
  }
}

相关帖子

沙发
qazplm3218|  楼主 | 2016-3-9 20:24 | 只看该作者
晶振是11.0592MHZ,波特率:9600

使用特权

评论回复
板凳
yklstudent| | 2016-3-10 12:45 | 只看该作者
显示放到定时器中断内

使用特权

评论回复
地板
金海江湖| | 2016-3-10 16:28 | 只看该作者
dis_led();在while(1)中,若没有发送数据那么,1-2-3-4-5-6-1中间保持亮的时间是delayms(1),马上轮换,一直保持下去。
但是一旦定时器中断发生,发送数据 楼主说得17位数据应该是17个字节吧,如果是的话,17*8/9600*1000 = 14ms 那么发送数据帧的时间占用了14ms 此时数码管保持的状态是led_6_ctl.

本人理解。

使用特权

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

本版积分规则

26

主题

70

帖子

1

粉丝