微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 利用89C51产生38KHZ方波驱动红外发射管问题

利用89C51产生38KHZ方波驱动红外发射管问题

时间:10-02 整理:3721RD 点击:
RT。用51单片机来驱动红外发射管,采用定时器0,方式2在中断翻转IO口的方式。
    /*************TCC相关配置****************/
    TMOD = 0x02;
    EA=1;
    ET0=1;
    TH0 = 243;     //11.0592       50Hz
    TL0 = 243;
    TR0 = 1;
/***************************************************
**函数名称:void timer0(void) interrupt 1
**函数功能:TCC中断服务函数
***************************************************/
void timer0(void) interrupt 1
{
//   count++;
    if(flag == 1)
        SEND = !SEND;
    else
         SEND = 0;         
}
中断及TCC配句语句如上,在中断里如果将count++这句屏蔽掉,输出的波形就是38KHZ,但如果把count++回复后,输出的波形就变成了25KHZ,也就是原先13us翻转一次变成了20us才能翻转一次。也试着改成8us进一次中断,但输出波形依旧是20us。求解~~

我不禁想问:单片机主频多少啊?一条++语句编译之后需要7个us来执行....
既然++占了时间,把它放后面呗
void timer0(void) interrupt 1
{
     if(flag == 1)
         SEND = !SEND;
     else
          SEND = 0;     
     count++;   //放这里试试看
}
还有一种可能,就是编译器处理问题,是不是增加了++语句之后
需要计算,某些寄存器需要压栈,这个时间挺可观的,我的同时测试过
只要压栈,那个时间是固定的
没有计算的时候,编译器是不是优化了?
我瞎掰的,你看看就好,别被我忽悠了

位置的话试过了。没啥区别。

*************TCC相关配置****************/
    TMOD = 0x02;
    EA=1;
    ET0=1;
    TH0 = 243;     //11.0592       50Hz
    TL0 = 243;
    TR0 = 1;
/***************************************************
**函数名称:void timer0(void) interrupt 1
**函数功能:TCC中断服务函数
***************************************************/
void timer0(void) interrupt 1
{
//   count++;
    if(flag == 1)
        SEND = !SEND;
    else
         SEND = 0;         
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top