找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3483|回復(fù): 1
收起左側(cè)

基于51單片機的等精度頻率計Proteus仿真程序設(shè)計

[復(fù)制鏈接]
ID:704458 發(fā)表于 2020-4-3 14:16 | 顯示全部樓層 |閱讀模式

proteus仿真

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    //段驅(qū)動
  7.    #define wei      P2    //位掃描
  8.    #define shuju    P1    //外部取數(shù)據(jù)
  9.    sbit clear=P3^7;  //清除外部數(shù)據(jù)
  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;         //外部計數(shù)器接收緩存
  15.    ulong  jz;             //基準(zhǔn)
  16.    ulong  js;                          //計數(shù)
  17.    ulong  huancun;        //緩存
  18.    bit cs;                //允許數(shù)據(jù)更新標(biāo)志位
  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;                 //閘門關(guān)閉
  54.            clear=1;                 //計數(shù)器清零
  55.            clear=0;                 //清零關(guān)閉

  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)                    //閘門關(guān)閉時處理數(shù)據(jù)
  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();   //處理數(shù)據(jù)時間補償  防止閃爍
  101.                         }
  102.                   }
  103.    }




  104. //定時器0
  105. void   jsq0() interrupt 1 using  2
  106.           {
  107.              js+=0x000001;
  108.                  if(js>=0xc00000)
  109.                  {
  110.                     on=0;     //關(guān)閉閘門
  111.                  }
  112.           }


  113. //等精度計數(shù)結(jié)束,允許處理數(shù)據(jù)
  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;     //關(guān)閉閘門
  125.                  }
  126.           }
復(fù)制代碼

所有資料51hei提供下載:
頻率計.zip (157.89 KB, 下載次數(shù): 50)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:780349 發(fā)表于 2020-6-16 00:57 | 顯示全部樓層
學(xué)習(xí)一下
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表