问题是:
只要串口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;
} |