3878|2

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

脉冲宽度的测量的怪问题? [复制链接]

目的是测量连续的脉冲宽度

源码见附件

typedef struct times
{   uchar second;       //秒级
    uint m_second;     //毫秒级
    uchar mm_second_1;  //计数器高8位,12/_MHZ_秒级
    uchar mm_second_2;  //计数器低8位
    uint mm_second;    //us级
}TIME;
xdata TIME time[65];         //每次脉冲的时间
main
{  ......
   ......
    for(i=0;i<=(max+1);i++)
    {  time.second=0;
       time.m_second=0;
       time.mm_second_1=0;
       time.mm_second_2=0;
       time.mm_second=0;
    }
    .......
    .......
}
问题:当给max赋小于27的数是,初始化for循环能够,但是大于27时就进入了死循环了,不知是什么原因。。。。
片外RAM是6116,锁存器是74LS373,芯片AT89C52,

最新回复

加上Celing.h #ifndef CeLiang_Program_ #define CeLiang_Program_ typedef struct times {          uchar second;       //秒级     uint m_second;     //毫秒级     uchar mm_second_1;  //计数器高8位,12/_MHZ_秒级     uchar mm_second_2;  //计数器低8位     uint mm_second;    //us级 }TIME; data uchar puls_num;        //脉冲次数 uchar  flag;            //开始计时标志 xdata TIME time[65];         //每次脉冲的时间 data uchar max;              //测量总次数 //中断系统初始化 void int0_initial() {  flag=1;    /* 定时、中断初始化 */    TMOD = 0x10;    // T1使用定时模式,工作模式1,无门控位    TH1 = 0x4C;     // 为T1填入初值,定时时间50ms    TL1 = 0x00;    IT0 = 1;    // 设置INTR0中断方式为边沿触发方式,负跳变时产生中断    PT1 = 1;    // 设置定时器1中断为高优先级    EX0 = 1;    // 允许外部中断0中断    EA = 1;    // CPU开放中断 } /* T1溢出中断处理函数 */ void timer1_int() interrupt 3 using 3                //不同级别的中断函数使用不同的工作组 {   TR1=0;     TH1 = 0x4C;                                 // 重新填入初值,每次溢出间隔50ms       TL1 = 0x00;                                            time[puls_num].m_second++;     if(time[puls_num].m_second>=20)           // 计时满1s     {  time[puls_num].m_second=0;             // 清0        time[puls_num].second++;             // 总秒数增1,溢出时会自动归0     }     TR1=1; } /* 外部中断0处理函数 */ void intr0_int() interrupt 0 using 2                // INTR0中断,使用工作组2 {  unsigned char tmp1,tmp2;    EX0=0;    if(flag)    {  flag=0;       TR1=1;       ET1=1;           puls_num=0;    }    TR1=0;    EA = 0;                   // 关中断    puls_num++;    do                        // 读取T1中的内容    { tmp1 = TH1;      tmp2 = TL1;    }while(tmp1 != TH1);     // 数据无效则反复循环    time[puls_num].mm_second_1=tmp1;   //在这里不进行时间处理,减少中断处理时间    time[puls_num].mm_second_2=tmp2;    TH1 = 0x4C;                                 // 重新填入初值,每次溢出间隔50ms      TL1 = 0x00;    EA = 1;                  // 开中断    TR1=1;    if(puls_num>=max)    {  EA=0;       TR1=0;    }    EX0=1; } /*求出时间*/ void data_processing() {  data uint temp1;    data float temp2;    data uchar ii;    for(ii=1;ii0)        {  time[ii].m_second=time[ii].m_second+temp1;           time[ii].mm_second=(uint)(temp2-1000*temp1);        }//if    }//for   } #endif  详情 回复 发表于 2007-7-20 21:22
点赞 关注

回复
举报

81

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
附件:
#include
#include "LCD1602.h"
#include "Key2.h"
#include "CeLiang.h"

void Delay1ms(unsigned int count)
{
        unsigned int i,j;
        for(i=0;i         for(j=0;j<120;j++);
}


void IntToStr(uint t, uchar *str, uchar n)
{        uchar a[5]; uchar i2, j;                                        
        a[0]=(t/10000)%10;         //取得整数值到数组                
        a[1]=(t/1000)%10;                                            
        a[2]=(t/100)%10;                                             
        a[3]=(t/10)%10;                                              
        a[4]=(t/1)%10;                    
                                                      
        for(i2=0; i2<5; i2++)         //转成ASCII码                     
                a[i2]=a[i2]+'0';                                           
        for(i2=0; a[i2]=='0' && i2<=3; i2++);
    for(j=5-n; j                 { *str=' ';  str++; }                                                               
        for(; i2<5; i2++)                                              
                { *str=a[i2]; str++; }  //加入有效的数字                  
        *str='\0';
}


main()
{   uchar i,key;
    uchar TempBuffer[10];   //LCD字符显示缓存

    max=0;
        LCD_Initial();      //LCD初始化



        /*延时2s*/
    for(i=100;i>0;i--)
          Delay1ms(20);
   
        /*提示输入脉冲的测量次数*/
        GotoXY(0,0);
        Print(" INPUT Measure  ");
        GotoXY(0,1);
        Print(" Number(10-64): ");
   
        /*此while循环为测量次数输入模块*/
        while(1)
        {  key=keyScan();
           switch(key)
         { case(11):
            LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
            max=max*10+1;
                   IntToStr(max,&TempBuffer[0],3);
            GotoXY(0,0);
            Print(&TempBuffer[0]);
               break;

               case(12):
                LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
            max=max*10+2;
                IntToStr(max,&TempBuffer[0],3);
            GotoXY(0,0);
            Print(&TempBuffer[0]);
           break;

               case(13):
                LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
            max=max*10+3;
                IntToStr(max,&TempBuffer[0],3);
            GotoXY(0,0);
            Print(&TempBuffer[0]);
           break;
       
               case(21):
            LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
                max=max*10+4;
                IntToStr(max,&TempBuffer[0],3);
            GotoXY(0,0);
            Print(&TempBuffer[0]);
           break;

                  case(22):
                LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
            max=max*10+5;
                IntToStr(max,&TempBuffer[0],3);
            GotoXY(0,0);
            Print(&TempBuffer[0]);
           break;

                  case(23):
                LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
            max=max*10+6;
                IntToStr(max,&TempBuffer[0],3);
            GotoXY(0,0);
            Print(&TempBuffer[0]);
           break;

               case(31):
                LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
            max=max*10+7;
                IntToStr(max,&TempBuffer[0],3);
            GotoXY(0,0);
            Print(&TempBuffer[0]);
           break;

                  case(32):
                LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
            max=max*10+8;
                IntToStr(max,&TempBuffer[0],3);
            GotoXY(0,0);
            Print(&TempBuffer[0]);
           break;

                  case(33):
                LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
            max=max*10+9;
                IntToStr(max,&TempBuffer[0],3);
            GotoXY(0,0);
            Print(&TempBuffer[0]);
           break;

                  case(42):
                LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
            max=max*10+0;
                IntToStr(max,&TempBuffer[0],3);
            GotoXY(0,0);
            Print(&TempBuffer[0]);
           break;
       }//switch
           if(max>64)
            {  max=64;
                   IntToStr(max,&TempBuffer[0],3);
           GotoXY(0,0);
           Print(&TempBuffer[0]);
                }
           if(max>9)break;
        }//while
    /*输入测量次数模块结束*/

        /*显示输入的数2s*/
    for(i=100;i>0;i--)
          Delay1ms(20);

    LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
        IntToStr(max,&TempBuffer[0],3);
    GotoXY(0,0);
    Print(&TempBuffer[0]);

        for(i=100;i>0;i--)
          Delay1ms(20);
   
    //这里加了初始化
    for(i=0;i<=(max+1);i++)
    {  time.second=0;
       time.m_second=0;
       time.mm_second_1=0;
       time.mm_second_2=0;
       time.mm_second=0;
    }
    //在PROTEUS仿真中发现,当输入值MAX>27,就进入了死循环,不知为什么???????

    GotoXY(0,0);
        Print(" PLEASE PRESS 1 ");
        GotoXY(0,1);
        Print("    TO START    ");
        key=0;

    /*下面为测量脉冲过程*/
    while(keyScan()!=11);
    LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
    GotoXY(0,0);
    Print("  LOADING.....  ");
    int0_initial();
    while(puls_num     /*测量脉冲结束,下面为结果计算和显示*/

    LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
        IntToStr(max,&TempBuffer[0],3);
    GotoXY(0,0);
    Print(&TempBuffer[0]);
        /*显示输入的数5s*/
    for(i=100;i>0;i--)
          Delay1ms(50);

        //数据处理
        data_processing();
       
    LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
        IntToStr(max,&TempBuffer[0],3);
    GotoXY(0,0);
    Print(&TempBuffer[0]);
        /*显示输入的数5s*/
    for(i=100;i>0;i--)
          Delay1ms(50);

    LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
    GotoXY(0,1);
    Print("  Measrue End!  ");

          /*显示输入的数2s*/
    for(i=100;i>0;i--)
          Delay1ms(20);

    GotoXY(0,0);
    Print(" PLEASE PRESS 2 ");
    GotoXY(0,1);
    Print("     TO SHOW    ");
        while(keyScan()!=12);

        for(i=max;i>1;i--)
    {  LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏

           IntToStr(i,&TempBuffer[0],3);
       GotoXY(0,0);
       Print(&TempBuffer[0]);

       GotoXY(0,1);
       Print("DATA:");
       GotoXY(8,1);
       Print(".");

           IntToStr(time.second,&TempBuffer[0],3);
       GotoXY(5,1);
       Print(&TempBuffer[0]);

           IntToStr(time.m_second,&TempBuffer[0],3);
       GotoXY(9,1);
       Print(&TempBuffer[0]);

           IntToStr(time.mm_second,&TempBuffer[0],3);
       GotoXY(12,1);
       Print(&TempBuffer[0]);

           while(keyScan()!=43);
        }
    while(1);
}








 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
加上Celing.h

#ifndef CeLiang_Program_
#define CeLiang_Program_

typedef struct times
{          uchar second;       //秒级
    uint m_second;     //毫秒级
    uchar mm_second_1;  //计数器高8位,12/_MHZ_秒级
    uchar mm_second_2;  //计数器低8位
    uint mm_second;    //us级
}TIME;

data uchar puls_num;        //脉冲次数
uchar  flag;            //开始计时标志
xdata TIME time[65];         //每次脉冲的时间
data uchar max;              //测量总次数


//中断系统初始化
void int0_initial()
{  flag=1;
   /* 定时、中断初始化 */
   TMOD = 0x10;    // T1使用定时模式,工作模式1,无门控位
   TH1 = 0x4C;     // 为T1填入初值,定时时间50ms
   TL1 = 0x00;
   IT0 = 1;    // 设置INTR0中断方式为边沿触发方式,负跳变时产生中断
   PT1 = 1;    // 设置定时器1中断为高优先级
   EX0 = 1;    // 允许外部中断0中断
   EA = 1;    // CPU开放中断
}

/* T1溢出中断处理函数 */
void timer1_int() interrupt 3 using 3                //不同级别的中断函数使用不同的工作组
{   TR1=0;
    TH1 = 0x4C;                                 // 重新填入初值,每次溢出间隔50ms  
    TL1 = 0x00;                                       
    time[puls_num].m_second++;
    if(time[puls_num].m_second>=20)           // 计时满1s
    {  time[puls_num].m_second=0;             // 清0
       time[puls_num].second++;             // 总秒数增1,溢出时会自动归0
    }
    TR1=1;
}


/* 外部中断0处理函数 */
void intr0_int() interrupt 0 using 2                // INTR0中断,使用工作组2
{  unsigned char tmp1,tmp2;
   EX0=0;
   if(flag)
   {  flag=0;
      TR1=1;
      ET1=1;
          puls_num=0;
   }


   TR1=0;
   EA = 0;                   // 关中断
   puls_num++;
   do                        // 读取T1中的内容
   { tmp1 = TH1;
     tmp2 = TL1;
   }while(tmp1 != TH1);     // 数据无效则反复循环
   time[puls_num].mm_second_1=tmp1;   //在这里不进行时间处理,减少中断处理时间
   time[puls_num].mm_second_2=tmp2;
   TH1 = 0x4C;                                 // 重新填入初值,每次溢出间隔50ms  
   TL1 = 0x00;
   EA = 1;                  // 开中断
   TR1=1;

   if(puls_num>=max)
   {  EA=0;
      TR1=0;
   }
   EX0=1;
}

/*求出时间*/
void data_processing()
{  data uint temp1;
   data float temp2;
   data uchar ii;
   for(ii=1;ii<=max;ii++)
   {  time[ii].m_second=50*time[ii].m_second+1;
      temp1=(uint)(time[ii].mm_second_1)*256;          //把十六进制的TH1、TL1转为十进制
      temp1=temp1+time[ii].mm_second_2-19456;  
      temp2=(temp1)*1.085069;                   //一个计数为1.085092us
      temp1=(uint)(temp2/1000);
      if(temp1>0)
       {  time[ii].m_second=time[ii].m_second+temp1;
          time[ii].mm_second=(uint)(temp2-1000*temp1);
       }//if
   }//for  
}

#endif
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表