|
求助:关于c8051f020的定时器中断的问题,急急急!!!!!!!!!!!
[复制链接]
我的一个简单的程序,想利用定时器0中断来产生方波,可是调试的时候发现中断标志置位了,也允许中断了,但是就是不进入中断服务程序,请各位大侠帮我看看吧,谢谢!!!!
//主程序
void main()
{
WDTCN=0xDE;
WDTCN=0xAD;
SYSCLK_init();
PORT_init();
TC_init();
UART0_init();
INTERRUPT_init();
TR0 = 1;
// TR2 = 1;
EA = 1;
while(1)
{
LED1 = 1;
LED2 = 1;
LED3 = 1;
bell = 0;
}
}
//初始化程序
#include
/**************************************************************************************************
时钟初始化
选择外部22.1184晶振作为时钟
**************************************************************************************************/
void SYSCLK_init()
{
Uchar i;
OSCXCN = 0x67; //外部振荡器控制寄存器,外部振荡器工作在晶体振荡器方式,频率为22.1184MHz
for(i=0;i<256;i++); //延时
while(!(OSCXCN & 0x80)); //等待外部时钟工作稳定
OSCICN = 0x88; //切换到外部时钟
//内部振荡器控制寄存器,选择外部振荡器作为系统失踪,时钟丢失检测器使能
}
/********************************************************************************************
端口交叉开关初始化
EMIF-----外部数据存储器接口,可用于访问片外存储器喝存储器映射的I/O期间
******************************************************************************************/
void PORT_init()
{
XBR0 = 0x1F; //设置XBR0
XBR1 = 0x1E; //设置XBR1
XBR2 = 0x44; //打开交叉开关和弱上拉
P0MDOUT = 0x15; //设置P0口输出
P0 |= 0xEA; //P0口的输入脚高阻态
P1MDIN = 0x00; //设置P1口输入信号类型
P1MDOUT = 0x00; //设置P1口输出
P1 = 0xFF; //P1口高阻态
P2MDOUT = 0x01; //设置P2口输出
P2 |= 0xFE; //设置P2口输出
P3MDOUT = 0xFE; //设置P3口输出
P3 |= 0x01; //设置P3口输出
P3 &= 0xEF; //P3.4口置0,禁铃
P74OUT = 0xF7; //设置P4-P7口输出
P5 |= 0xF0; //键盘输入P5口高4位高阻态
EMI0CF = 0x2d; //外部存储器接口配置寄存器,EMIF选择在P4-P7口,EMIF工作在地址/数据复用方式
//工作模式为只选用外部存储器,ALE脉冲宽度等于2个时钟周期
EMI0TC = 0x9e; //外部存储器时序控制寄存器
//EMIF地址建立时间 = 2个SYSCLK周期
// /WR和/RD脉冲宽度 = 8个SYSCLK周期
// 地址保持时间 = 2个SYSCLK周期
}
/****************************************************************************************
中断系统初始化
定时器2作为UART0波特率发生器,不能发生中断
定时器0用于产生ST7920的使能信号,在中断服务程序中对A12取反
***************************************************************************************/
void INTERRUPT_init()
{
IE = 0x12; //关闭总中断,开启定时器UART0的中断,开启定时器0,关闭定时器1、2、外部中断0、1
IP = 0x10; //UART0设置为高优先级
EIE2 = 0x01; //允许定时器3中断
// EA = 1;
} //开总中断
/************************************************************************************
定时器初始化
*******************************************************************************************************************
定时器0作为产生ST7920的使能信号(周期为10us的方波,脉宽5us),定时器0工作在2(8位自动重装:TL0保持计数值,TH0保持重载值)
则重装初值计算如下:
(256-x)/22.1184=5
计算得x=145=0x91
注:为保证第一次计数正确,必须在允许定时器之前将TL0初始化为所希望的计数初值
******************************************************************************************************************
定时器2作为UART0的波特率发生器(方式2),波特率计算如下:
波特率 = SYSCLK/((65536-[RCAP2H:RCAP2L])*32)
假设UART0波特率为115200,则计算得[RCAP2H:RCAP2L] = 65530 = 0xfffa
定时器3未设置
****************************************************************************************/
void TC_init()
{
CKCON = 0x78; //时钟控制寄存器,定时器0、1、2、4都使用系统时钟
TCON = 0x00; //定时器控制寄存器,禁止定时器0,1
TMOD = 0x02; //定时器方式寄存器
//定时器0,1工作在定时器方式,定时器1工作在方式0,定时器0工作在方式2,TRX启动运行
TH0 = 0x91;
TL0 = 0x91; //定时器0赋初值
// TR0 = 1; //允许定时器0
T2CON = 0x30; //定时器2溢出作为UART0的接收、发送时钟
RCAP2L = 0xfa; //设置重载值
RCAP2H = 0xff;
// TR2 = 1; //允许定时器2
}
//定时器0的中断服务程序
void T0_inrupt() interrupt 1 using 1
{
Uchar i;
i = P6 & 0x10; //得到P6.4
if(i)
P6 = P6 & 0xef; //如果P6.4为1,则清零
else
P6 = P6 | 0x10; //如果P6.4为0,则置位
}
|
|