笑看流星雨 发表于 2013-1-6 20:19:34

求助:请问怎么解决C8051F021的PCA中断与UART中断冲突问题

问题:1、程序如果加入ES0=1,则无法进入PCA_ISR;将ES0=1屏蔽,则可以进入PCA_ISR。ES0是控制uart0的中断,应该和pca的中断没关系啊,怎么会出现这种问题?
      2、将ES0=1屏蔽后,串口接收到的数据为01 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25
             26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37,缺了02,不知道为什么

求大神解答,感激不尽。

程序功能:用P1.7模拟方波,PCA0正沿捕捉计数,通过串口发送出去


//单片机是c8051f021,外部晶振24M
#include<c8051f020.h>
#include<intrins.h>
void Oscillator_Init()
{
    int i;

    OSCXCN    = 0x77; //使用晶振的1/2作为系统时钟
    for (i = 0; i < 3000; i++);// Wait 1ms for initialization
    while ((OSCXCN & 0x80) == 0); //等待晶体振荡器工作稳定
    OSCICN    = 0x08; //选用外部振荡器作为系统时钟
}
void Port_IO_Init()
{
    // P0.0-TX0 (UART0), Open-Drain, Digital
    // P0.1-RX0 (UART0), Open-Drain, Digital
    // P0.2-SCK(SPI0), Open-Drain, Digital
    // P0.3-MISO (SPI0), Open-Drain, Digital
    // P0.4-MOSI (SPI0), Open-Drain, Digital
    // P0.5-NSS(SPI0), Open-Drain, Digital
    // P0.6-SDA (SMBus), Open-Drain, Digital
    // P0.7-SCL (SMBus), Open-Drain, Digital
    // P1.0-TX1 (UART1), Open-Drain, Digital
    // P1.1-RX1 (UART1), Open-Drain, Digital
    // P1.2-CEX0 (PCA),Open-Drain, Digital
    // P1.3-CEX1 (PCA),Open-Drain, Digital
    // P1.4-CEX2 (PCA),Open-Drain, Digital
    // P1.5-CEX3 (PCA),Open-Drain, Digital
    XBR0      = 0x27;
    XBR2      = 0x44;
P0MDOUT = 0x03;//推挽
P1MDOUT = 0x80;
}
//外部晶振24MHz,波特率为9615bps,故与9600bps波特率串口通信时可能会丢失数据
void UART_Init()   
{
    SCON0 |= 0x50;//8bitUART,可变波特率,UART0接收允许

CKCON |= 0x20;//定时器2使用系统时钟
T2CON |= 0x34;//定时器T2作为接收/发送时钟,T2溢出时自动重载
   
    RCAP2L    = 0xD9;
    RCAP2H    = 0xFF;   //定时器2的16bit重装载寄存器值
TR2=1;                //定时器2启动
ES0=1;                //IE.4,允许RI0标志位(SCON0.0)或TI0标志位(SCON0.1)产生的中断
   TI0=1;//声明TX0就绪,可以发送
}
void PCA_Init()
{
    PCA0CN    = 0x00;//禁止PCA0计数器/定时器
    PCA0MD    = 0x08;//系统时钟
    PCA0CPM0|= 0x21;//正沿捕捉
PCA0CPL0 = 0x00;
PCA0CPH0 = 0x00;
PCA0L = 0x00;//PCA0计数器
PCA0H = 0x00;
EIE1 |= 0x08;//允许PCA0的中断请求

}
void delay(unsigned int d)
{
unsigned int k;
for(k=0;k<d;k++);
}
bit bFlag=0;
char data p;
sbit P1_7=P1^7;
unsigned int uiCount,i;
void main(void)
{
EA = 0;
WDTCN=0xDE;
WDTCN=0xAD;
Oscillator_Init();
Port_IO_Init();
UART_Init();
PCA_Init();
EA = 1;
PCA0CN |= 0x40;
uiCount = 0;
for(i=0;i<56;i++)
{
P1_7 = 1;
delay(100);
P1_7 = 0;
delay(100);

if(bFlag)
{
   bFlag = 0;
   SBUF0 = uiCount;
   while(!TI0);//等待发送完成
   TI0 = 0;
}
}
while(1){}
}
//接收中断
void interrupt_UART0() interrupt 4using 2
{            
RI0 = 0;
p = SBUF0;
//bflag = 1;
}
void PCA_ISR () interrupt 9
{
uiCount++;
CCF0 = 0;//清除匹配中断标志
bFlag = 1;
}
页: [1]
查看完整版本: 求助:请问怎么解决C8051F021的PCA中断与UART中断冲突问题