wave_generator_measure2.lst

来自「自己的平时一些制作 现在整理一下 与大家一起分享」· LST 代码 · 共 157 行

LST
157
字号
C51 COMPILER V7.20   WAVE_GENERATOR_MEASURE2                                               03/06/2007 16:18:03 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE WAVE_GENERATOR_MEASURE2
OBJECT MODULE PLACED IN wave_generator_measure2.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE wave_generator_measure2.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /************测低频信号周期的一个程序***********/
   2          //       经过数学变换后就可以用来测频率
   3          //       思路:数一个周期中有多少个100us,用count放这个计数值
   4          /**************************************/
   5          
   6          #include <reg51.h>
   7          /*****定义50ms方波的波形输出接口******/
   8          sbit led=P1^0; 
   9          
  10          sbit int0=P1^1;         //被测量信号,当然也可以接到其他的引脚
  11          
  12          //下面两个变量就是用来 切换数码管的序号 和 存放显示的数据
  13          unsigned char n; 
  14          unsigned char d[4];
  15          
  16          //定义全局变量用于存放计算值
  17          unsigned int count;
  18          
  19          unsigned char code digit[4]={0xf8,0xf4,0xf2,0xf1};  //数码管显示选择
  20          unsigned char code tab[16]={0x3f,6,0x5b,0x4f,0x66,0x6d,0x7d,
  21                                      7,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71};                                          
  22                                                        //显示0--9;a--f;
  23          
  24          /********十进制到bcd码转换************/
  25          void hextobcd (unsigned int hexs)          
  26          {
  27   1      d[0]=hexs/1000;
  28   1      hexs=hexs%1000;
  29   1      d[1]=hexs/100;
  30   1      hexs=hexs%100;
  31   1      d[2]=hexs/10;
  32   1      hexs=hexs%10;
  33   1      d[3]=hexs;
  34   1      }
  35          
  36          
  37          /********延时子程序***********/
  38           void delay(unsigned char dy)
  39           {
  40   1       while(--dy);
  41   1       }
  42          
  43          /*******定时器初始化**********/
  44          void Init_Timer (void)
  45          {
  46   1       TMOD=0x12;  //设定定时器的工作模式  定时器1工作在16位定时状态
  47   1                           //设定定时器0工作在8位自动重装方式
  48   1       TH1=(65536-23040)/256;  //设定定时常数,产生25ms中断,这样输出的就是周期50ms的方波
  49   1       TL1=(65536-23040)%256;
  50   1       TH0=(256-92);  //设定定时常数,定时100us
  51   1       TL0=(256-92);
  52   1       EA=1;     //cpu开中断
  53   1       ET1=1;    //定时器1开中断
  54   1       ET0=1;    //定时器0开中断
  55   1       TR1=1;   //启动定时器1
C51 COMPILER V7.20   WAVE_GENERATOR_MEASURE2                                               03/06/2007 16:18:03 PAGE 2   

  56   1      }
  57          
  58          /*********定时器1中断服务程序************/
  59          void timer1 (void) interrupt 3
  60          {
  61   1      // TR1=0;                                               //停定时器1
  62   1       TH1=(65536-23040)/256;  //设定定时常数,产生25ms中断,这样输出的就是周期50ms的方波
  63   1       TL1=(65536-23040)%256;
  64   1       led=!led;                      //输出去反
  65   1      // TR1=1;                                               //启动定时器1
  66   1      }
  67          
  68          /*********定时器0中断服务程序**************/
  69          /*********定时2毫秒*********/
  70          void timer0 (void) interrupt 1
  71          { 
  72   1       count++; //计数
  73   1      }
  74          
  75          
  76          /*******非中断的数码管显示子程序***********/
  77          //由于这里中断用完了,所以
  78          /******************************************/
  79          void display()
  80          {
  81   1       unsigned char m;
  82   1       for(m=0;m<4;m++)
  83   1         {
  84   2          P2=digit[m]; P0=tab[d[m]];  
  85   2              delay(250);
  86   2          P0=0;
  87   2         }
  88   1      }
  89          
  90          /****************主函数main****************/
  91          /*****实现P1^0输出周期50ms方波,P1^1输入该方波..****/ 
  92          /**..因为这俩个脚比较靠近所以选择这两个引脚****/
  93          /*..我们可以用金属线连接两个引脚,....*/
  94          /**..从而可以实现本机产生本机测量************/
  95          /***数码管显示方波的周期:单位ms**/
  96          /***定时器0产生100us中断,定时器1产生25ms中断*****/
  97          /***基本思路:****/
  98          /**用计算一个脉冲周期内定时器0中断了多少次..***/
  99          /***再用定时器的定时间隔乘以次数就能得到总的时间****/
 100          //测试结果:数码管在 49-50 之间跳动
 101          /************/
 102          /*****************************/
 103          
 104          main()
 105          {
 106   1      unsigned char i;
 107   1      unsigned int snumber=0;  //周期: 单位ms
 108   1      Init_Timer();
 109   1      while(1)
 110   1              {
 111   2                      snumber=0;              //先给个初值0,他用于累加十次测量值,..
 112   2                                                      //..最后再除以10就可以了。
 113   2                      for(i=0;i<10;i++)         //累加十次测量结果
 114   2                      {
 115   3                              count=0;
 116   3                              while(int0==0) ;        //测周期长度 //先等待上升沿..
 117   3                              TR0=1;              //..启动定时器0..
C51 COMPILER V7.20   WAVE_GENERATOR_MEASURE2                                               03/06/2007 16:18:03 PAGE 3   

 118   3                              while(int0==1) display();    //..等待下降沿..
 119   3                              while(int0==0) display();    //..再等待上升沿..
 120   3                              TR0=0;              //同时停止定时器0
 121   3                              TH0=(256-92);  //设定定时常数,定时100us
 122   3                              TL0=(256-92);
 123   3                              snumber=count+snumber;   //计算出有几个0.1ms,除以10即可后得到周期。
 124   3                      }
 125   2                      hextobcd(snumber/100);
 126   2              }
 127   1      }
 128          
 129          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    245    ----
   CONSTANT SIZE    =     20    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7       2
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?