标题: 基于51单片机的等精度频率计Proteus仿真程序设计 [打印本页]

作者: 91hei电子    时间: 2020-4-3 14:16
标题: 基于51单片机的等精度频率计Proteus仿真程序设计


单片机源程序如下:
  1.    /*等精度plj*/
  2.    #include<at89x52.h>
  3.    #define uchar unsigned char
  4.    #define uint  unsigned int
  5.    #define ulong  unsigned  long
  6.    #define duan                P0    //段驱动
  7.    #define wei      P2    //位扫描
  8.    #define shuju    P1    //外部取数据
  9.    sbit clear=P3^7;  //清除外部数据
  10.    sbit on=P3^6;  //闸门信号
  11.    uchar  code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0,1,2,3,4,5,6,7,8,9字型码
  12.    uchar  weixuan[8]={0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1c};
  13.    int    output[8];      //待显示的输出BCD码
  14.    uchar  shuju2;         //外部计数器接收缓存
  15.    ulong  jz;             //基准
  16.    ulong  js;                          //计数
  17.    ulong  huancun;        //缓存
  18.    bit cs;                //允许数据更新标志位
  19.    int i;

  20.    //短延时
  21. void delay(uchar time)
  22.    {
  23.       for(;time!=0;time--);
  24.    }

  25.    //长延时
  26. void  ldelay()
  27.    {
  28.       uint dd=1100;
  29.           while(dd--);
  30.    }



  31.    //八位扫描显示子程序
  32. void  display(ulong p)
  33.    {
  34.                                 output[7]=smgduan[p%100000000/10000000];
  35.                                 output[6]=smgduan[p%10000000/1000000];
  36.                                 output[5]=smgduan[p%1000000/100000];
  37.                                 output[4]=smgduan[p%100000/10000];
  38.                                 output[3]=smgduan[p%10000/1000];
  39.                                 output[2]=smgduan[p%1000/100];
  40.                                 output[1]=smgduan[p%100/10];
  41.                                 output[0]=smgduan[p%10];
  42.                                 for(i=0;i<8;i++)
  43.                                 {
  44.                                    wei=0xff;
  45.                                    wei=weixuan[i];
  46.                                    duan=output[i];
  47.                                    delay(100);
  48.                                    wei=0xff;
  49.                                 }
  50.    }



  51. void  main()
  52.    {
  53.        on=0;                 //闸门关闭
  54.            clear=1;                 //计数器清零
  55.            clear=0;                 //清零关闭

  56.            TMOD=0x55;
  57.           
  58.            EA=1;

  59.            EX1=1;
  60.            IT1=1;

  61.            ET0=1;
  62.            ET1=1;
  63.           
  64.            TR1=1;
  65.            TR0=1;

  66.            on=1;                  //闸门开启

  67.            while(1)  
  68.                  {         
  69.                         display(huancun);

  70.                         if(cs)                    //闸门关闭时处理数据
  71.                         {
  72.                             cs=0;

  73.                                 shuju2=shuju;
  74.                                 huancun=TH0;
  75.                                 huancun<<=8;
  76.                                 huancun+=TL0;
  77.                                 huancun<<=4;
  78.                                 huancun+=(shuju2&0x0f);
  79.                                 js+=huancun;

  80.                                 huancun=TH1;
  81.                                 huancun<<=8;
  82.                                 huancun+=TL1;
  83.                                 huancun<<=4;
  84.                                 huancun+=(shuju2>>4);
  85.                                 jz+=huancun;

  86.                                 huancun=(float)js/(float)jz*24000000;
  87.                 display(huancun);

  88.                                 jz=0;
  89.                                 js=0;
  90.                                 TH0=0;
  91.                                 TL0=0;
  92.                                 TH1=0;
  93.                                 TL1=0;
  94.                                 clear=1;
  95.                                 clear=0;
  96.                                 on=1;
  97.                         }
  98.                         else
  99.                         {
  100.                                ldelay();   //处理数据时间补偿  防止闪烁
  101.                         }
  102.                   }
  103.    }




  104. //定时器0
  105. void   jsq0() interrupt 1 using  2
  106.           {
  107.              js+=0x000001;
  108.                  if(js>=0xc00000)
  109.                  {
  110.                     on=0;     //关闭闸门
  111.                  }
  112.           }


  113. //等精度计数结束,允许处理数据
  114. void   end()   interrupt 2 using 1        //外部中断1
  115.          {
  116.             cs=1;
  117.          }

  118. //定时器1
  119. void         jsq1()  interrupt 3 using  3
  120.           {
  121.              jz+=0x000001;
  122.                  if(jz>=0xc00000)
  123.                  {
  124.                     on=0;     //关闭闸门
  125.                  }
  126.           }
复制代码

所有资料51hei提供下载:
频率计.zip (157.89 KB, 下载次数: 50)


作者: ccawdw    时间: 2020-6-16 00:57
学习一下




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1