找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1450|回复: 0
打印 上一主题 下一主题
收起左侧

单片机定时器测量频率程序 用1602液晶显示

[复制链接]
跳转到指定楼层
楼主
ID:595580 发表于 2021-4-16 16:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /*******************************************************************
  2. *                                                                  *
  3. *         555定时器试验 -—— 频率计                               *
  4. *                                                                  *
  5. *                                                                  *
  6. * LCD1602显示                                                      *
  7. *改变VR1电位器的电阻值,观察液晶屏频率发生变化                                                *
  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个字节

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

  30. us延时函数   (4.34us)

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

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

  40. ms延时函数

  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. * 显示函数                                                *
  54. *                                                         *
  55. **********************************************************/
  56. void play()
  57. {
  58.   unsigned char n;

  59.   for (n = 0; n <= 4; n++)
  60.   //数据转换
  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. * 主函数                                                 *
  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工作在计数方式
  99.   TH0 = 0x4c; //50ms定时
  100.   TL0 = 0x00;
  101.   TH1 = 0x00; //计数初值
  102.   TL1 = 0x00;
  103.   ET0 = 1; //使能TIMER0中断
  104.   ET1 = 1; //使能TIMER1中断
  105.   EA = 1; //允许中断
  106.   PT1 = 1; //定义TIMER1中断优先
  107.   TR0 = 1;
  108.   TR1 = 1;

  109.   while (1)
  110.   {
  111.     if (sec)
  112.     {
  113.       Hdata = TH1; //取计数值
  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中断函数                                           *
  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中断函数                                           *
  149. *                                                         *
  150. **********************************************************/
  151. void Time1()interrupt 3
  152. {
  153.   Count++;
  154. }

  155. /*********************************************************/
复制代码

hex文件: 21 555脉冲发生器.rar (172.81 KB, 下载次数: 13)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表