找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1817|回復: 0
打印 上一主題 下一主題
收起左側(cè)

單片機定時器測量頻率程序 用1602液晶顯示

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:595580 發(fā)表于 2021-4-16 16:55 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. /*******************************************************************
  2. *                                                                  *
  3. *         555定時器試驗 -—— 頻率計                               *
  4. *                                                                  *
  5. *                                                                  *
  6. * LCD1602顯示                                                      *
  7. *改變VR1電位器的電阻值,觀察液晶屏頻率發(fā)生變化                                                *
  8. *                                                                  *
  9. *******************************************************************/

  10. #include <reg52.h>
  11. #include <intrins.h>
  12. #include "1602.h"

  13. unsigned char code cdis1[] =
  14. {
  15.   "    CYMOMETER   "   //頻率計
  16. };
  17. unsigned char code cdis2[] =
  18. {
  19.   "FREQ:        Hz "
  20. };

  21. bit sec = 0;
  22. unsigned char msec = 0, Hdata = 0, Ldata = 0, Count = 0;
  23. unsigned long temp = 0;
  24. unsigned char data display[] =
  25. {
  26.   0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  27. };

  28. char code reserve[3]_at_ 0x3b; //保留0x3b開始的3個字節(jié)

  29. /*********************************************************

  30. us延時函數(shù)   (4.34us)

  31. *********************************************************/
  32. void delayNOP()
  33. {
  34.   _nop_();
  35.   _nop_();
  36.   _nop_();
  37.   _nop_();
  38. }

  39. /*********************************************************

  40. ms延時函數(shù)

  41. *********************************************************/
  42. void delayms(unsigned int ms)
  43. {
  44.   unsigned char n;
  45.   while (ms--)
  46.   {
  47.     for (n = 0; n < 114; n++)
  48.       ;
  49.   }
  50. }

  51. /**********************************************************
  52. *                                                         *
  53. * 顯示函數(shù)                                                *
  54. *                                                         *
  55. **********************************************************/
  56. void play()
  57. {
  58.   unsigned char n;

  59.   for (n = 0; n <= 4; n++)
  60.   //數(shù)據(jù)轉(zhuǎn)換
  61.   {
  62.     display[n] = temp % 10+0x30;
  63.     temp = temp / 10;
  64.   }
  65.   display[5] = temp + 0x30;

  66.   for (n = 5; n > 0; n--)
  67.   //高位為"0"不顯示
  68.   {
  69.     if (display[n] == 0x30)
  70.       display[n] = 0x20;
  71.     else
  72.       break;
  73.   }

  74.   lcd_pos(0x46); //顯示實際頻率值
  75.   for (n = 5; n != 0xff; n--)
  76.     lcd_wdat(display[n]);
  77. }

  78. /*********************************************************
  79. *                                                        *
  80. * 主函數(shù)                                                 *
  81. *                                                        *
  82. *********************************************************/
  83. void main()
  84. {
  85.   unsigned char m;
  86.   unsigned long frq_num;

  87.   P3 = 0xff;

  88.   lcd_init();
  89.   lcd_pos(0x00); //設置顯示位置為第一行
  90.   for (m = 0; m < 16; m++)
  91.     lcd_wdat(cdis1[m]);
  92.   //顯示字符
  93.   lcd_pos(0x40); //設置顯示位置為第二行
  94.   for (m = 0; m < 16; m++)
  95.     lcd_wdat(cdis2[m]);
  96.   //顯示字符

  97.   TMOD = 0x51; //定時器0工作在定時方式
  98.   //定時器1工作在計數(shù)方式
  99.   TH0 = 0x4c; //50ms定時
  100.   TL0 = 0x00;
  101.   TH1 = 0x00; //計數(shù)初值
  102.   TL1 = 0x00;
  103.   ET0 = 1; //使能TIMER0中斷
  104.   ET1 = 1; //使能TIMER1中斷
  105.   EA = 1; //允許中斷
  106.   PT1 = 1; //定義TIMER1中斷優(yōu)先
  107.   TR0 = 1;
  108.   TR1 = 1;

  109.   while (1)
  110.   {
  111.     if (sec)
  112.     {
  113.       Hdata = TH1; //取計數(shù)值
  114.       Ldata = TL1;
  115.       frq_num = ((Count *65535+Hdata * 256+Ldata) *108 / 100);
  116.       TH1 = 0;
  117.       TL1 = 0;
  118.       sec = 0;
  119.       Count = 0;
  120.       TR1 = 1;
  121.       TR0 = 1;
  122.     }
  123.     temp = frq_num;
  124.     play();
  125.   }
  126. }

  127. /**********************************************************
  128. *                                                         *
  129. * Time0中斷函數(shù)                                           *
  130. *                                                         *
  131. **********************************************************/
  132. void Time0()interrupt 1
  133. {
  134.   TH0 = 0x4c; //50ms定時
  135.   TL0 = 0x00;
  136.   msec++;
  137.   if (msec == 20)
  138.   //50*20=1S
  139.   {
  140.     TR0 = 0; //關閉TIMER0
  141.     TR1 = 0; //關閉TIMER1
  142.     msec = 0;
  143.     sec = 1; //置秒標記位
  144.   }
  145. }

  146. /**********************************************************
  147. *                                                         *
  148. * Time1中斷函數(shù)                                           *
  149. *                                                         *
  150. **********************************************************/
  151. void Time1()interrupt 3
  152. {
  153.   Count++;
  154. }

  155. /*********************************************************/
復制代碼

hex文件: 21 555脈沖發(fā)生器.rar (172.81 KB, 下載次數(shù): 13)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表