久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5761|回復: 0
打印 上一主題 下一主題
收起左側

51單片機頻率計Proteus仿真+程序+元件清單 LCD1602顯示

[復制鏈接]
跳轉到指定樓層
樓主
51單片機頻率計,可以測量0-500Khz的頻率 ,采用計數器的方式采集,里邊附有論文資料。采用Proteus仿真,程序在下邊壓縮包里,自取按鍵支持保存頻率和回看歷史記錄數據

1.單片機+最小系統+LCD1602液晶顯示模塊+NE555模塊+電位器調節模塊+按鍵模塊
      2.采用LCD1602液晶顯示頻率值,測量范圍0~500KHZ(理論上500KHZ,實際480KHZ左右)。
      3.配有鱷魚夾,可以隨意測量外部的頻率。撥動開關,也可以測NE555產生的頻率,通過電位器調節頻率值的大小。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


元件清單:
1    104    直插瓷片電容    2
2    10uf    直插電解電容    1
3    30p    直插瓷片電容    2
4    LCD1602    液晶顯示器    1
5    CON2    排針2-Pin    1
6    12MHZ    晶振    1
7    SW-PB    按鍵6X6X5MM    1
8    POWER    DC電源插座    1
9    S9013    NPN三極管    1
10    10K    色環電阻    1
11    1k    色環電阻    2
12    2.2k    色環電阻    1
13    10K    電位計可調電阻    1
14    SW-SPST    波動開關    1
15    SW8*8    自鎖開關    1
16    MCU    單片機    1
17    555    555芯片    1
配套器材            
1    導線    XXcm    1
2    焊錫    XXcm    1
3    USB轉DC3.5mm電源線    系統供電    1
4    7*9萬用板        1
5    單片機插座    40腳IC座    1
6    IC插座    8腳IC座    1
7    2P杜邦線    公對母    1
8    16P排針        1
9    16P排母        1

單片機源程序如下:
  1. //包含頭文件
  2. #include <reg52.h>
  3. #include <math.h>
  4. #define uc unsigned char
  5. #define ui unsigned int
  6. #define     u8                          unsigned char
  7. #define     u16                   unsigned int
  8. #define     uchar                          unsigned char
  9. #define     uint                   unsigned int
  10. unsigned char dispbuf[6]={0,0,0,0,0,0};   //顯示數據暫存數組
  11. unsigned char temp[6];                                           //頻率值暫存數組
  12. unsigned char T0count;                                           //計數器計滿次數,計滿一次對應的脈沖數為65536個
  13. unsigned int timecount;                                   //定時器定時1秒的變量,每次對應為50ms,計20次對應就是1秒,然后計算一秒內的計數器脈沖個數
  14. bit flag;                                                                   //計時到1秒時該標志位置1,進行脈沖數的運算,得出結果送顯示,然后該位清零,重新開始脈沖計數
  15. unsigned long x;                                                   //計算脈沖的數據范圍一般比較大,所以用無符號長整形變量定義該變量


  16. /***********************************************************************************************************
  17. LCD1602相關函數
  18. ***********************************************************************************************************/
  19. //LCD管腳聲明 (RW引腳實物直接接地,因為本設計只用到液晶的寫操作,RW引腳一直是低電平)
  20. sbit LCDRS = P2^7;
  21. sbit LCDEN = P2^6;
  22. sbit D0                 = P0^0;
  23. sbit D1                 = P0^1;
  24. sbit D2                 = P0^2;
  25. sbit D3                 = P0^3;
  26. sbit D4                 = P0^4;
  27. sbit D5                 = P0^5;
  28. sbit D6                 = P0^6;
  29. sbit D7                 = P0^7;
  30. //LCD延時
  31. void LCDdelay(uint z)                  //該延時大約100us(不精確,液晶操作的延時不要求很精確)
  32. {
  33.   uint x,y;
  34.   for(x=z;x>0;x--)
  35.     for(y=10;y>0;y--);
  36. }
  37. //LCD寫數據
  38. void LCD_WriteData(u8 dat)         
  39. {
  40.         if(dat&0x01)D0=1;else D0=0;
  41.         if(dat&0x02)D1=1;else D1=0;
  42.         if(dat&0x04)D2=1;else D2=0;
  43.         if(dat&0x08)D3=1;else D3=0;
  44.         if(dat&0x10)D4=1;else D4=0;
  45.         if(dat&0x20)D5=1;else D5=0;
  46.         if(dat&0x40)D6=1;else D6=0;
  47.         if(dat&0x80)D7=1;else D7=0;
  48. }
  49. //寫命令
  50. void write_com(uchar com)
  51. {
  52.   LCDRS=0;                                 
  53.         LCD_WriteData(com);
  54.   LCDdelay(5);
  55.   LCDEN=1;
  56.   LCDdelay(5);
  57.   LCDEN=0;
  58. }
  59. //寫數據
  60. void write_data(uchar date)
  61. {
  62.   LCDRS=1;
  63.         LCD_WriteData(date);
  64.   LCDdelay(5);
  65.   LCDEN=1;
  66.   LCDdelay(5);
  67.   LCDEN=0;
  68. }

  69. /*------------------------------------------------
  70.               選擇寫入位置
  71. ------------------------------------------------*/
  72. void SelectPosition(unsigned char x,unsigned char y)
  73. {     
  74.         if (x == 0)
  75.         {     
  76.                 write_com(0x80 + y);     //表示第一行
  77.         }
  78.         else
  79.         {      
  80.                 write_com(0xC0 + y);      //表示第二行
  81.         }        
  82. }
  83. /*------------------------------------------------
  84.               寫入字符串函數
  85. ------------------------------------------------*/
  86. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  87. {     
  88.         SelectPosition(x,y) ;
  89.         while (*s)
  90.         {     
  91.                 write_data( *s);     
  92.                 s ++;     
  93.         }
  94. }
  95. //========================================================================
  96. // 函數: void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l)
  97. // 應用: LCD_Write_Char(0,1,366,4) ;
  98. // 描述: 在第0行第一個字節位置顯示366的后4位,顯示結果為 0366
  99. // 參數: x:行,y:列,s:要顯示的字,l:顯示的位數
  100. // 返回: none.
  101. // 版本: VER1.0
  102. // 日期: 2013-4-1
  103. // 備注: 最大顯示65535
  104. //========================================================================
  105. void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l)
  106. {     
  107.         SelectPosition(x,y) ;

  108.         if(l>=5)
  109.                 write_data(0x30+s/10000%10);        //萬位
  110.         if(l>=4)
  111.                 write_data(0x30+s/1000%10);                //千位
  112.         if(l>=3)
  113.                 write_data(0x30+s/100%10);                //百位
  114.         if(l>=2)
  115.                 write_data(0x30+s/10%10);                        //十位
  116.         if(l>=1)
  117.                 write_data(0x30+s%10);                //個位

  118. }

  119. //1602初始化
  120. void Init1602()
  121. {
  122.   uchar i=0;
  123.   write_com(0x38);//屏幕初始化
  124.   write_com(0x0c);//打開顯示 無光標 無光標閃爍
  125.   write_com(0x06);//當讀或寫一個字符是指針后一一位
  126.   write_com(0x01);//清屏
  127.         
  128. }
  129. void display()                                                          //顯示函數
  130. {
  131.         unsigned int j;                                                  //定義變量用于顯示延時        
  132.         if(dispbuf[5]!=0)                                          //如果十萬位不為0
  133.         {
  134.                 LCD_Write_Char(1,6,dispbuf[5],1) ;
  135.                 for(j=50;j>0;j--);
  136.         }
  137.         else
  138.         {
  139.                 SelectPosition(1,6) ;
  140.                 write_data(' ');        //萬位
  141.         }
  142.         if(dispbuf[8]!=0||dispbuf[4]!=0)          //如果十萬位和萬位都不等于零
  143.         {
  144.                 LCD_Write_Char(1,7,dispbuf[4],1) ;
  145.                 for(j=50;j>0;j--);
  146.         }
  147.         else
  148.         {
  149.                 SelectPosition(1,7) ;
  150.                 write_data(' ');        //萬位
  151.         }

  152.         LCD_Write_Char(1,8,dispbuf[3],1) ;
  153.         for(j=50;j>0;j--);

  154.         LCD_Write_Char(1,10,dispbuf[2],1) ;
  155.         for(j=50;j>0;j--);

  156.         LCD_Write_Char(1,11,dispbuf[1],1) ;
  157.         for(j=50;j>0;j--);

  158.         LCD_Write_Char(1,12,dispbuf[0],1) ;
  159.         for(j=50;j>0;j--);
  160. }




  161. void main(void)                                                   //主函數
  162. {
  163.         unsigned char i;
  164.         TMOD=0x15;                                                           //定義T1為定時模式,T0位計數模式
  165.         TH0=0;
  166.         TL0=0;                                                                   //計數器清零
  167.         TH1=0x3c;
  168.         TL1=0xb0;                                                           //定時器賦值(定時50ms)
  169.         TR1=1;                                                                   //打開定時器T1
  170.         TR0=1;                                                                   //打開計數器T0
  171.         ET0=1;                                                                   //打開中斷允許
  172.         ET1=1;                                                                  //打開中斷允許
  173.         EA=1;                                                                   //打開中斷總開關
  174.         Init1602();                          //調用初始化顯示函數
  175. //**********************0123456789ABCDEF***************
  176.         LCD_Write_String(0,0,"The Frequency:");  //開機界面
  177.         LCD_Write_String(1,0,"        3.570kHz");  //

  178.         while(1)                                                           //進入循環,因為括號內為常數1,不會變化,所以該表達式一直成立,又稱死循環
  179.         {        
  180.                 display();                                                  //調用顯示函數
  181.                 if(flag)                                                   //判斷1秒時間是否到
  182.                 {
  183.                         flag=0;                                           //標志位清零,計算完脈沖數后重新開始計時計數
  184.                         x=T0count*65536+TH0*256+TL0;  //讀取1秒時間內的計數個數(T0count為每次計數超過65536時進入計數中斷加1)
  185.                         for(i=0;i<6;i++)                           //for循環將暫存數組內數據清零
  186.                         {
  187.                                 temp[i]=0;
  188.                         }           
  189.                         i=0;                                                   //i清零
  190.                         while(x/10)                                   //將x拆分為6個一位數
  191.                         {
  192.                                 temp[i]=x%10;                           //如果x/10不為0,將x除以10的余數賦值temp【i】
  193.                                 x=x/10;                                   //然后將x/10的商賦值給x
  194.                                 i++;                                           //i++
  195.                         }
  196.                         temp[i]=x;                                           //最高位直接賦值給temp【i】
  197.                         for(i=0;i<6;i++)                           //for循環用于將數據送入顯示暫存數組
  198.                         {
  199.                                 dispbuf[i]=temp[i];           //賦值語句
  200.                         }
  201.                         T0count=0;                                           //計數器中斷次數清零
  202.                         TH0=0;
  203.                         TL0=0;                                                   //計數器清零
  204.                         TR0=1;
  205.                         TR1=1;                                                  //重新打開定時計數器
  206.                 }
  207.         }
  208. }

  209. void t0() interrupt 1                                          //計數器中斷函數
  210. {
  211.   T0count++;                                                           //計數超過65536,就產生一次中斷
  212. }

  213. void t1() interrupt 3                                          //定時器中斷函數
  214. {
  215.   TH1=0x3c;
  216.   TL1=0xb0;                                                           //50ms進入一次中斷,進入中斷后要重新賦初值
  217.   timecount++;                                                           //每進一次中斷就是50ms,該變量加一
  218.   if(timecount==20)                                           //該變量加到20次時,代表1秒到了
  219.     {
  220.       TR0=0;                                                          //關閉計數器
  221.             TR1=0;                                                           //關閉定時器
  222.       timecount=0;                                                   //計時變量清零,準備下次定時
  223.       flag=1;                                                           //一秒時間到,該標志位置1,主函數中執行脈沖數運算與顯示函數
復制代碼

全部資料51hei下載地址:
頻率計 - LCD1602.7z (1.6 MB, 下載次數: 169)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区在线视频 | 我爱操 | 欧美一级大片免费观看 | 午夜小电影 | 一区在线视频 | 久久久久国产一区二区三区 | 成人亚洲视频 | 久久精品国产一区二区电影 | 久久99视频这里只有精品 | 成人综合视频在线观看 | 日韩一区二区三区在线观看视频 | 亚洲视频国产视频 | 九九九国产 | 四虎伊人 | 四虎永久免费地址 | 日本高清不卡视频 | 久久男女视频 | 欧美日韩国产一区二区三区 | 97偷拍视频 | 欧美h| 国产一级在线 | 欧洲精品一区 | 精品在线一区 | 久久久精| 欧美黄色一区 | 久草视频网站 | 精品99爱视频在线观看 | 日韩精品久久一区二区三区 | 国产一二三视频在线观看 | 亚洲欧美日韩一区二区 | 欧美在线一区二区三区四区 | 欧美日韩一区二区三区四区五区 | 亚洲精品电影网在线观看 | 日韩一区二区三区视频在线观看 | av黄色免费在线观看 | 免费午夜剧场 | 国产乱码精品一区二区三区忘忧草 | 狠狠久 | 性精品 | 久久久国产精品 | 成人国产a |