• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

stc mcu c语言 延时老是出问题

我用了一款STC12C系列 QFP 在用T0中断做延时时 设置1T和12T频率一样 搞了好久没搞定不知道怎么回事?

下面程序out=46.8KHZ  fosc=4M (这个很难理解46.8KHZ怎么来的)

#unsigned char b;

void Init_Timer0(void)

TMOD |= 0x01;  

//TH0=0x00; 

//TL0=0x00; 

EA=1;          

ET0=1;         

TR0=1;          

}

void main (void)

{

    Init_Timer0();

    if(b=1)

    OUT=~OUT;

    b=0;

    while(1)

    {

    }

 

}

void Timer0_isr(void) interrupt 1 using 1

{    

    static unsigned char i; 

   TH0=(65536-1)/256;

   TL0=(65536-1)%256;

    i++;

   b=1;

    {  

     i=0;  

     //       

     }

}

 

全部回复(4)
正序查看
倒序查看
2014-10-30 11:30
void main (void)
{
    Init_Timer0();
    if(b=1)
    OUT=~OUT;
    b=0;
    while(1)
    {
    }
}
看看你的这段代码,while(1)前面的,
if(b=1)
 OUT=~OUT;
 b=0;
放在whlie(1)x循环里面试试
0
回复
2014-10-30 11:34
@yueyunno1
voidmain(void){Init_Timer0();if(b=1)OUT=~OUT;b=0;while(1){}}看看你的这段代码,while(1)前面的,if(b=1)OUT=~OUT;b=0;放在whlie(1)x循环里面试试
下面这是官方的资料,好好参考一下
#include "reg51.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;

//-----------------------------------------------

/* define constants */
#define FOSC 18432000L
#define MODE1T                      //Timer clock mode, comment this line is 12T mode, uncomment is 1T mode

#ifdef MODE1T
#define T1MS (65536-FOSC/1000)      //1ms timer calculation method in 1T mode
#else
#define T1MS (65536-FOSC/12/1000)   //1ms timer calculation method in 12T mode
#endif

/* define SFR */
sfr AUXR = 0x8e;                    //Auxiliary register
sbit TEST_LED = P0^0;               //work LED, flash once per second

/* define variables */
WORD count;                         //1000 times counter

//-----------------------------------------------

/* Timer0 interrupt routine */
void tm0_isr() interrupt 1 using 1
{
    TL0 = T1MS;                     //reload timer0 low byte
    TH0 = T1MS >> 8;                //reload timer0 high byte
    if (count-- == 0)               //1ms * 1000 -> 1s
    {
        count = 1000;               //reset counter
        TEST_LED = ! TEST_LED;      //work LED flash
    }
}

//-----------------------------------------------

/* main program */
void main()
{
#ifdef MODE1T
    AUXR = 0x80;                    //timer0 work in 1T mode
#endif
    TMOD = 0x01;                    //set timer0 as mode1 (16-bit)
    TL0 = T1MS;                     //initial timer0 low byte
    TH0 = T1MS >> 8;                //initial timer0 high byte
    TR0 = 1;                        //timer0 start running
    ET0 = 1;                        //enable timer0 interrupt
    EA = 1;                         //open global interrupt switch
    count = 0;                      //initial counter

    while (1);                      //loop
}
0
回复
jerrywong
LV.2
4
2014-10-31 13:07
@yueyunno1
下面这是官方的资料,好好参考一下#include"reg51.h"typedefunsignedcharBYTE;typedefunsignedintWORD;//-----------------------------------------------/*defineconstants*/#defineFOSC18432000L#defineMODE1T//Timerclockmode,commentthislineis12Tmode,uncommentis1Tmode#ifdefMODE1T#defineT1MS(65536-FOSC/1000)//1mstimercalculationmethodin1Tmode#else#defineT1MS(65536-FOSC/12/1000)//1mstimercalculationmethodin12Tmode#endif/*defineSFR*/sfrAUXR=0x8e;//AuxiliaryregistersbitTEST_LED=P0^0;//workLED,flashoncepersecond/*definevariables*/WORDcount;//1000timescounter//-----------------------------------------------/*Timer0interruptroutine*/voidtm0_isr()interrupt1using1{TL0=T1MS;//reloadtimer0lowbyteTH0=T1MS>>8;//reloadtimer0highbyteif(count--==0)//1ms*1000->1s{count=1000;//resetcounterTEST_LED=!TEST_LED;//workLEDflash}}//-----------------------------------------------/*mainprogram*/voidmain(){#ifdefMODE1TAUXR=0x80;//timer0workin1Tmode#endifTMOD=0x01;//settimer0asmode1(16-bit)TL0=T1MS;//initialtimer0lowbyteTH0=T1MS>>8;//initialtimer0highbyteTR0=1;//timer0startrunningET0=1;//enabletimer0interruptEA=1;//openglobalinterruptswitchcount=0;//initialcounterwhile(1);//loop}

#define T1MS (65536-FOSC/1000)    
#else
#define T1MS (65536-FOSC/12/1000)

改成

#define T1MS (65536-FOSC/1)     

#else
#define T1MS (65536-FOSC/12/1)

理论上应该是1us 但实际相差很多,而且很不稳定。

 

0
回复
jerrywong
LV.2
5
2014-11-05 14:19
@jerrywong
#defineT1MS(65536-FOSC/1000)    #else#defineT1MS(65536-FOSC/12/1000)改成#defineT1MS(65536-FOSC/1)     #else#defineT1MS(65536-FOSC/12/1)理论上应该是1us但实际相差很多,而且很不稳定。 

没解决得了,最后还是用软件延时解决了

0
回复