单片机定时中断与adc中断有冲突
时间:10-02
整理:3721RD
点击:
请教! 这里是一个例子,用的是stc12c5a60s2的芯片,在用adc的过程中发现一adc中断对定时器中断有影响,定时器的定时时间变得不准确,
#include<reg51.h>
#include<intrins.h>
#define FOSC 11059200L
#define BAUD 9600
typedef unsigned char BYTE;
typedef unsigned int WORD;
sfr ADC_CONTR = 0xBC;
sfr ADC_RES = 0xBD;
sfr ADC_LOW2 = 0xBE;
sfr P1ASF = 0x9D;
#define ADC_POWER 0x80
#define ADC_FLAG 0x10
#define ADC_START 0x08
#define ADC_SPEEDLL 0x00
#define ADC_SPEEDL 0x20
#define ADC_SPEEDH 0x40
#define ADC_SPEEDHH 0x60
void InitUart();
void SendData(BYTE dat);
void Delay(WORD n);
void InitADC();
BYTE ch = 0;
char count;
char a;
WORD num1=0;
void main()
{
InitUart();
InitADC();
IE = 0xa2; //问题在这里 当IE=0x82时下载结果是LED以1秒间隔闪烁,当IE=0xa2 时变成了4秒间隔了 就只改 // 了这一 个地方
TL0=6;
TR0=1;
TR1=1;
while(1)
{
if(num1>=3686)
{
P00=~P00;//P00对应的管脚写在了头文件中
}
}
}
void tm0_isr() interrupt 1
{
TL0 =6;
num1++;
}
void tm1_isr() interrupt 3
{
TH0 =6;
num2++;
}
void adc_isr() interrupt 5 using 1
{
ADC_CONTR &=!ADC_FLAG;
SendData(ADC_RES);
ch = 0x03;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
}
void InitADC()
{
P1ASF=0xff;
ADC_RES=0;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
Delay(2);
}
void InitUart()
{
SCON = 0x5a;
TMOD = 0x23;
TH1 = TL1 = -(FOSC/12/32/BAUD);
TR1 = 1;
}
void SendData(BYTE dat)
{
while(!TI);
TI=0;
SBUF=dat;
}
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 5000;
while (x--);
}
}
这是在芯片手册的adc 程序上修改的 adc的有关部分实测是正确的
#include<reg51.h>
#include<intrins.h>
#define FOSC 11059200L
#define BAUD 9600
typedef unsigned char BYTE;
typedef unsigned int WORD;
sfr ADC_CONTR = 0xBC;
sfr ADC_RES = 0xBD;
sfr ADC_LOW2 = 0xBE;
sfr P1ASF = 0x9D;
#define ADC_POWER 0x80
#define ADC_FLAG 0x10
#define ADC_START 0x08
#define ADC_SPEEDLL 0x00
#define ADC_SPEEDL 0x20
#define ADC_SPEEDH 0x40
#define ADC_SPEEDHH 0x60
void InitUart();
void SendData(BYTE dat);
void Delay(WORD n);
void InitADC();
BYTE ch = 0;
char count;
char a;
WORD num1=0;
void main()
{
InitUart();
InitADC();
IE = 0xa2; //问题在这里 当IE=0x82时下载结果是LED以1秒间隔闪烁,当IE=0xa2 时变成了4秒间隔了 就只改 // 了这一 个地方
TL0=6;
TR0=1;
TR1=1;
while(1)
{
if(num1>=3686)
{
P00=~P00;//P00对应的管脚写在了头文件中
}
}
}
void tm0_isr() interrupt 1
{
TL0 =6;
num1++;
}
void tm1_isr() interrupt 3
{
TH0 =6;
num2++;
}
void adc_isr() interrupt 5 using 1
{
ADC_CONTR &=!ADC_FLAG;
SendData(ADC_RES);
ch = 0x03;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
}
void InitADC()
{
P1ASF=0xff;
ADC_RES=0;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
Delay(2);
}
void InitUart()
{
SCON = 0x5a;
TMOD = 0x23;
TH1 = TL1 = -(FOSC/12/32/BAUD);
TR1 = 1;
}
void SendData(BYTE dat)
{
while(!TI);
TI=0;
SBUF=dat;
}
void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 5000;
while (x--);
}
}
这是在芯片手册的adc 程序上修改的 adc的有关部分实测是正确的
请了解下中断方式,你用的是软中断会出现这样问题,在中断函数里处理,就没问题了
谢谢,不是说能写在外部的程序少些写在中断程序中吗? 我要写的其他程序比较多,写在中断中会影响时间的准确性,我想请教下能不能在中断外解决?
设置下中断优先级看看行不行呢
num1怎么没清零
