6577|4

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求助:关于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,则置位
}

最新回复

切换外部时钟要检测  详情 回复 发表于 2010-1-12 19:14
点赞 关注

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
各位高手帮帮忙啊!
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
咋个没得人理我呢
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

4
 
我知道什么原因啦,串口0初始化设置错了,应该是0x50才对
嘿嘿
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 
切换外部时钟要检测
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表