打印

请帮忙看下关于cygnal020外中断与串口程序

[复制链接]
2546|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sackfc|  楼主 | 2010-4-25 09:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题是:
只要串口1 一发送数据,外中断1就不能响应中断,不知何故。


// 链接工具: KEIL C51 8.08 / KEIL  C51
//-----------------------------------------------------------------------------
// 包含文件
//-----------------------------------------------------------------------------
#include <c8051f020.h> // SFR声明
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
//-----------------------------------------------------------------------------
// 全局常量
//-----------------------------------------------------------------------------
#define SYSCLK 11059200 // 系统时钟频率Hz
#define BAUDRATE 9600   // UART波特率bps
/******************串口1定义******************************/
#define TI1         (SCON1&(1<<1))>>1
#define TI1_0       SCON1&=~(1<<1)
#define RI1         (SCON1&(1<<0))>>1
#define RI1_0       SCON1&=~(1<<0)
#define ES1_1             EIE2|=(1<<6)   //ES1=1
#define ES1_0             EIE2&=~(1<<6)  //ES1=0
sbit  com0_rst           =P3^4;     //与串口0连接的vk3214复位
sbit  led                =P3^5;   //调试指示灯控制
sbit  com1_rst           =P1^6;     //与串口1连接的vk3214复位

// 全局变量
uint t;
//-----------------------------------------------------------------------------
// 函数原型
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void UART0_Init (void);
void UART1_init(void);
void TIMER0_Init(void);
void INT0_Init(void);
void INT1_Init(void);
void VK3214_Init(void);
void delay(uint i);
//-----------------------------------------------------------------------------
// 全局变量
//-----------------------------------------------------------------------------
bit int1_flag;
//-----------------------------------------------------------------------------
// 主程序      
//-----------------------------------------------------------------------------
void main (void)
{uchar i;
WDTCN = 0xde; // 禁止看门狗定时器
WDTCN = 0xad;
SYSCLK_Init (); // 初始化振荡器
PORT_Init (); // 初始化数据交叉开关和通用IO口
UART0_Init (); // 初始化UART0
UART1_init();
TIMER0_Init();
INT0_Init();
INT1_Init();
VK3214_Init();
EA = 1; // 使能所有中断
i=IE1;;
led=0;
while (1)
{if(int1_flag==1)
    {int1_flag=0;
  SBUF1=0x55;while(TI1==0)IE1=0;;TI1_0;
  led=!led;
  delay(60000);
}
  //led =!led ;
  delay(6000);//delay(60000);delay(60000);
  //SBUF0=0x55; while(TI0==0);TI0=0;
  


}
}
//-----------------------------------------------------------------------------
// 子程序初始化
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// 系统时钟初始化
//-----------------------------------------------------------------------------

//
void SYSCLK_Init (void)
{
int i; // 延时计数器
OSCXCN = 0x67; // 起动外部振荡器22.1184MHz晶体
for (i=0; i < 256; i++) ; // 等待振荡器启动(>1ms)
while (!(OSCXCN & 0x80)) ; // 等待晶体振荡器稳定
OSCICN = 0x88; // 选择外部振荡器作为系统时钟源并允许丢失时钟检测器
}
//-----------------------------------------------------------------------------
// IO口初始化
//-----------------------------------------------------------------------------
//
// 配置数据交叉开关和通用IO口
//
void PORT_Init (void)
{
//交叉开关配制:PCA0 - CEX0
//              UART0- RX0、TX0
//              SMBUS- SDA、SCL
  XBR0 = 0x0f; //XBR0.0--SM使能
                //XBR0.1--SPI使能  
    //XBR0.2--UART0使能
    //XBR0.3--CEX0使能
  XBR1 = 0x14; //启用外中断0 ,1
                //XBR1.2--INT0使能
    //XBR1.4--INT1使能
  XBR2 = 0x44;   
                //XBR2.2--UART1使能
    //XBR2.6--启动交叉开关设置
P0MDOUT |= 0x01; // 使能TX0推挽输出
P1MDOUT |= 0x01; // 使能TX1推挽输出
P3MDOUT |= 0x20; // 使能P3.5(led)为推挽输出
//P1MDOUT |= 0x40; // 使能P1.6(led)为推挽输出
}
//-----------------------------------------------------------------------------
// UART0初始化
//-----------------------------------------------------------------------------
//
// 配置UART0 使用定时器1作为波特率发生器
//
void UART0_Init (void)
{
SCON0 |= 0x50; // SCON0: 模式1, 8位UART, 使能RX
TMOD |= 0x20; // TMOD: 定时器1, 模式2, 8位重装
TH1 = -(SYSCLK/BAUDRATE/16); // 按波特率设置T1重装值
TR1 = 1; // 起动定时器1
CKCON |= 0x10; // 定时器1使用系统时钟作为时基
PCON |= 0x80; // SMOD00=1
TI0 = 1; // 表示TX0就绪
}
/*  */
void UART1_init(void)
{   CKCON     |= 0x40;
    T4CON     = 0x34;

  RCAP4L    = 0xdc;//晶振11.0592M,波特率9600
  RCAP4H    = 0xFf;
SCON1 |= 0x70;   //方式1,8位UART,可变波特率,允许接收
ES1_1;       //串口1中断开启
}

void delay(uint i)
{ uint j;
  for(j=0;j<=i;j++);;
}
void TIMER0_Init(void)
{//定时器0设置
TMOD|= 0x01;  // 用定时器0作软件时钟,16位定时器
TH0=0xdc;     //采用外部11.0592M  10ms中断一次
TL0=0x00;
  PT0 = 1;
  TR0 = 1;
//-----------------------------------------------
//中断设置//
  ET0=1;      //定时器0中断允许
}
void timer00(void) interrupt 1
{ TH0=0xdc;     //采用外部
  TL0=0x00;
  t++;
  if(t>5)
    {t=0;
  SBUF0=0x55; while(TI0==0);TI0=0;
     
}
  //led=!led;
}
void INT0_Init(void)
{//交叉开关设置:根据管教分配,P1.3为INT0输入
   XBR1|=0x04; //XBR1.2--INT0使能

//中断设置
   EX0=1;  //INT0中断使能
   PX0=1;
   IT0=1;  //下降沿触发
}
void INT1_Init(void)
{//交叉开关设置:
   XBR1|=0x10; //XBR1.4--INT1使能

//中断设置
   EX1=1;  //INT1中断使能
   IT1=1;  //下降沿触发
   
}
void int0(void) interrupt 0
{ //uchar i;
  led=!led;
}
void int1(void) interrupt 2
{ IE1=0;
  //led=!led;
  int1_flag=1;
}
void VK3214_Init(void)
{  com0_rst=0;
   com1_rst=0;
   delay(10000);
   com0_rst=1;
   com1_rst=1;
}

相关帖子

沙发
sackfc|  楼主 | 2010-4-25 10:46 | 只看该作者
1# sackfc

使用特权

评论回复
板凳
sackfc|  楼主 | 2010-4-25 10:47 | 只看该作者
那位兄弟帮忙看一下,问题出在哪里,老板催得很急啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

69

帖子

1

粉丝