找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 258|回复: 0
收起左侧

STC15W408单片机T0 T2+LCD1602频率计源程序

[复制链接]
ID:343102 发表于 2025-6-1 12:08 | 显示全部楼层 |阅读模式
使用STC15W408的T0、T2 中断+ 1602显示的频率计程序,测量振动频率用。

单片机源程序如下:
  1. //STC15W408,P34 T0为频率输入口
  2. #define CPU_Fosc 6000000uL //定义时钟
  3. #include<STC15F2K60S2.H>
  4. //#include<stdio.h>
  5. #include <intrins.h>
  6. #include"1602.h"
  7. #include"delay.h"

  8. bit OVERFLOWFLAG;
  9. bit TIMERFLAG;

  10. /*------------------------------------------------
  11.                     定时器0初始化子程序
  12.                                         本程序用于计数
  13. ------------------------------------------------*/
  14. void Init_Timer0(void)
  15. {
  16. TMOD |= 0x01 | 0x04;          //使用模式1,16位计数器,使用"|"符号可以在使用多个定时器时不受影响                     
  17. TH0=0x00;              //给定初值
  18. TL0=0x00;         
  19. EA=1;            //总中断打开
  20. ET0=1;           //定时器中断打开
  21. TR0=1;         
  22. }                             //定时器开关打开
  23. /*------------------------------------------------
  24.                     定时器2初始化子程序
  25.                                         本程序用于定时
  26. ------------------------------------------------*/
  27. void Timer2Init(void)                //100微秒@6.000MHz
  28. {
  29.         AUXR |= 0x04;                //定时器时钟1T模式
  30.         T2L = 0xA8;                //设置定时初始值
  31.         T2H = 0xFD;                //设置定时初始值
  32.         AUXR |= 0x10;                //定时器2开始计时
  33. }
  34. /*
  35. void Init_Timer1(void)
  36. {
  37. TMOD |= 0x10;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
  38. TH1=0x3c;              //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
  39. TL1=0xb0;
  40. EA=1;            //总中断打开
  41. ET1=1;           //定时器中断打开
  42. TR1=1;           //定时器开关打开
  43. }
  44. */
  45. /*------------------------------------------------
  46.                     主程序
  47. ------------------------------------------------*/
  48. main()
  49. {
  50. unsigned  long int a;
  51. char temp[16];      //定义字符显示缓冲数组
  52. Init_Timer0();      //初始化定时器0
  53. Timer2Init();      //初始化定时器2
  54. LCD_Init();         //初始化液晶屏
  55. LCD_Str(0,0,"    PIN LV JI ");//写入第一行信息,主循环中不再更改此信息,所以在while之前写入

  56. while(1)
  57. {
  58.   if(OVERFLOWFLAG)//检测溢出标志,如果溢出表明频率过高,显示溢出信息
  59.     {
  60.          OVERFLOWFLAG=0;//标志清零
  61.      LCD_Str(0,1,"overflow >655KHz");
  62.         }
  63.   if(TIMERFLAG)      //定时1s到,做数据处理
  64.     {
  65.          a=TL0+TH0*256;//读取计数值
  66.          a=a*16;     //扩大到实际值
  67. //     sprintf(temp,"FREQ:%08.0f Hz",(float)a);
  68.      LCD_Str(0,1,temp);//显示到液晶第二行
  69.          TR0=1;                     //2个定时器打开
  70. //         TR1=1;
  71.      IE2  = 0x04;   //T2中断允许
  72.          TH0=0;                     //保证计数器初值为0
  73.          TL0=0;
  74.          TIMERFLAG=0;               //打开计时计数标志
  75.          
  76.         }
  77.   }                         
  78. }

  79. /*------------------------------------------------
  80.                  定时器0中断子程序
  81. ------------------------------------------------*/
  82. void Timer0_isr(void) interrupt 1
  83. {
  84. TH0=00;              //重新给定初值
  85. TL0=00;

  86. OVERFLOWFLAG=1;  //溢出标志

  87. }
  88. /*------------------------------------------------
  89.                  定时器2中断子程序
  90. ------------------------------------------------*/
  91. void Timer2_isr(void) interrupt 12
  92. {
  93. static unsigned char i;
  94.         T2L = 0xA8;                //设置定时初始值
  95.         T2H = 0xFD;                //设置定时初始值

  96. i++;
  97. if(i==10)       //1s计数时间单位,得出1s脉冲个数,即为频率Hz
  98.    {
  99.    i=0;
  100.    TR0=0;        //2个定时器关闭
  101. //   TR1=0;
  102.    AUXR=0x00;         //T2关闭中断
  103.    TIMERFLAG=1;  //标志位清零
  104.         T2L = 0xA8;                //设置定时初始值
  105.         T2H = 0xFD;                //设置定时初始值
  106.    }
  107. }
复制代码

原理图: 无
仿真: 无
代码: STC15W408+1602频率计1s.7z (81.21 KB, 下载次数: 0)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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