3961|8

85

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

89c51中断的问题~~~~~~~麻烦大家帮我看看哈 [复制链接]

请帮各位帮我看看为什么interrupt0总是不被执行?当高电平进来时,interrupt0开始执行,同时定时器开始定时,直到下一个高电平进来,定时也结束,这样可以吗?请各位大侠帮忙修改下,谢谢了~~~~我实在不太明白为什么了
#include"at89x51.h"
#include"stdio.h"
#include"stdlib.h"
#define timer 2000000//晶振12MHz
typedef unsigned long ulong;
typedef unsigned int  uint;
typedef unsigned char uchar;
ulong count;          //计数器
sfr CKCON = 0x8f;

void delay(uchar time);
void WriteP1_0(uchar nowbit);
void WriteData(uchar addr,uchar pos,uchar dp);
void WriteLcdData(ulong number);

/*对使用了的端口及寄存器进行初始化,在转速仪中用到了以下端口:
P3.1(TXD)口用作lcd的DATA输入口;P1.1作为lcd的片选控制端;P1.0用着;T0、T1、UINT0、UINT1都接入到方波信号输入端;
X1、X2用作两分频的时钟信号输入;RD与P1.5用来控制输出频率或者转速*/
void reg_init()
{
        ET0 = 1;
        CKCON = 1;                                  //6时钟模式
        TF1 = 0x1;
        P1_0 = 0X0;                                //    DATA
        P1_1 = 0X1;                                //   /WR
        P1_2 = 0X1;                                 //  /CS选通端
        TCON = 0XFE;
        EA = 1;
//        TMOD |= 0x20;               /* TMOD: timer 1, mode 2, 8-nowbit reload        */
}

/*UINT count_speed()
{       
        UINT speed;
        UINT frequency = 0;        //频率
        speed = frequency*60;
        return speed;
}*/
uchar flag = 0;
ulong count1 = 0;                  //计算计数器溢出的次数
void time0(void) interrupt 1
{
        if(flag == 0)
        {
                TR0 = 0;
                TH0        = 0x00;                  //定时0.002ms
                TL0 = 0x20;                         
                count1++;
                ET0 = 0;                 //允许定时器0中断       
                TR0 = 1;        //启动定时器/计数器0
        }else{TR0 = 0;}
}

void t_int0(void) interrupt 0
{       
        TR0 =1;         
        flag = 1;
        //TR0 = 0;//关闭计数器0
        //count1 = 0;;
//        ET1 = 1;               //允许定时器1中断
}

ulong count_frequency()
{
        //UINT time;        //转一圈的时间
        //UINT tcount = 0;
        //tcount = time0_count();
        //time = count / timer;
        ulong frequency;        //频率
        count = TH0*256+TL0+count1*65536;
        frequency = (timer*10*60)/count;
        return frequency;
}



void main()
{
        void reg_init();
        volatile ulong frequency;        //频率
//        UINT roundspeed = 0;  //转速
        TMOD = (TMOD & 0x01);         //定时器0工作模式 方式一
        while(1)
        {
                if(flag == 0)
                {
                        EX0 = 1;
                        IE = 0X82;
                        IE0 = 1;
                        IT0 =1;
                        frequency = count_frequency();
                        TR0 = 1;
                 }
                 
                else if(flag == 1)
                {
                        EX0 = 0;
                        count1 = 0;
                        flag = 0;
                }               
//                roundspeed = count_speed();
                WriteLcdData(frequency);
        }

最新回复

很有可能是中断优先级的问题 设置IP试试 反正程序是没有看的  详情 回复 发表于 2008-10-30 20:41
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
测速啊,用边沿触发中断好了
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
乱七八糟的,试试这个

  1. volatile unsigned int Tick;
  2. volatile unsigned char IrqTimes;
  3. bit Falg_TimeOut;

  4. void Time0_IRQ() interrupt 1 using 1
  5. {
  6.         TH0 = 0x3C;
  7.         TL0 = 0xB0;//50mS
  8.         if(++IrqTimes >= 10)
  9.         {
  10.                 IrqTimes = 0;
  11.                 Flag_TimeOut = 1;
  12.         }
  13. }

  14. void INT0_IRQ() interrupt 0
  15. {
  16.         if(! Flag_TimeOut)
  17.         {
  18.                 Tick++;
  19.         }
  20. }

  21. void RegisterInit()
  22. {
  23.         ET0 = 1;
  24.         EX0 = 1;
  25.         //CKCON = 1;   //6时钟模式
  26.         P1_0 = 0X0; //    DATA
  27.         P1_1 = 0X1; //  /WR
  28.         P1_2 = 0X1; //  /CS选通端
  29.         TCON = 0X01;
  30.         EA = 1;
  31.         TMOD |= 0x01;              /* TMOD: timer 1, mode 2, 8-nowbit reload        */
  32. }

  33. void main()
  34. {
  35.         RegisterInit();
  36.         TR0 = 1;
  37.        
  38.         while(1)
  39.         {
  40.                 if(Flag_TimeOut)
  41.                 {
  42.                         WriteLcdData(Tick * 2);
  43.                         Tick = 0;
  44.                         TH0 = 0x3C;
  45.                         TL0 = 0xB0;
  46.                         IrqTimes = 0;
  47.                         Flag_TimeOut = 0;
  48.                 }
  49.         }
  50. }
复制代码
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 
顶楼上
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(高级)

5
 
2楼挺好。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

6
 
学习
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

7
 
2楼的确实不错,但是我这个外部中断怎么都不响应~~~~~~~~~现在唯一的可能性就是仿真器是坏的了,但是仿真器的脚上输入的就是方波~~~~~~~~~靠实郁闷了
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

8
 
这个程序是很好,但是对于测试要转速在3--10000转每分钟来说,精确度低了,范围小了,
我想通过计数器的值来测出一个转速脉冲的所用的指令条数,然后用1s(或者一分钟) CPU可以执行的条数,来求出转速。
这个方法可行吗?如何测出这个转速脉冲的计数器的值呢?谢谢各位支援
引用 2 楼 guetcw 的回复:
乱七八糟的,试试这个

C/C++ code
volatile unsigned int Tick;
volatile unsigned char IrqTimes;
bit Falg_TimeOut;

void Time0_IRQ() interrupt 1 using 1
{
    TH0 = 0x3C;
    TL0 = 0xB0;//50mS
    if(++IrqTimes >= 10)
    {
        IrqTimes = 0;
        Flag_TimeOut = 1;
    }
}

void INT0_IRQ() interrupt 0
{
    if(! Flag_TimeOut)
    {
        Tick++;
    }
}

void Regi…
 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(初级)

9
 
很有可能是中断优先级的问题
设置IP试试
反正程序是没有看的
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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