搜索
bottom↓
回复: 0

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

[复制链接]

出0入0汤圆

发表于 2013-1-6 20:19:34 | 显示全部楼层 |阅读模式
问题: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 4  using 2
{            
RI0 = 0;
p = SBUF0;
//bflag = 1;
}
void PCA_ISR () interrupt 9
{
uiCount++;
CCF0 = 0;//清除匹配中断标志
bFlag = 1;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-18 08:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表