51_频率计算

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/**********************51单片机学习例程************************
*  平台:Keil U4 + STC89C52
*  名称: 频率计
*  编写:Tony
*  日期:2022-3-5
*   QQ : 674749794
*  晶体:12MHZ
*    变更记录:无
******************************************************************/
 
#include <reg51.h>
#include "lcd.h"
 
#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long
 
 //--定义LCD显示的文字--//
uchar code EN_CHAR1[16]={"   CYMOMETER    "};
uchar code EN_CHAR2[16]={"FREQ:         HZ"};
 
//--声明全局函数--//
void Timer_Configuration();  //初始化定时器
//--定义全局变量--//
ulong Freq;      //用来存放要显示的频率值
ulong TimeCount; //用于计算1S钟的
 
//sbit LSA=P2^2;
//sbit LSB=P2^3;
//sbit LSC=P2^4;              //138译码器,数码管的位选
//#define       GE      {LSA=1;LSB=1;LSC=1;}                //打开个位位选端
//#define   SHI     {LSA=0;LSB=1;LSC=1;}                //打开十位位选端
 
/*******************************************
*函数名        :main
*功  能   :主函数
*输   入  :无
*输  出       :无
*******************************************/
 
void main()
{
    uchar i, freqValue[6];
 
    LcdInit();
    Timer_Configuration();
 
    //显示要写的字母
    for(i=0; i<16; i++)
    {
        LcdWriteData(EN_CHAR1[i]);
    }
    LcdWriteCom(0x80+0x40);
    for(i=0; i<16; i++)
    {
        LcdWriteData(EN_CHAR2[i]);
    }
    while(1)
    {
        if(TR0==0)         //当计数器提下的时候,表明计数完毕,定时器0定时1S
        {   Freq=Freq+TL1;        //频率的计数是计数器1
            Freq=Freq+(TH1*256);
            LcdWriteCom(0xc8);
            //--求频率的个十百千万十万位
            freqValue[0]='0'+Freq%1000000/100000;
            freqValue[1]='0'+Freq%100000/10000;
            freqValue[2]='0'+Freq%10000/1000;
            freqValue[3]='0'+Freq%1000/100;
            freqValue[4]='0'+Freq%100/10;
            freqValue[5]='0'+Freq%10;
            //--显示求得的数值
            for(i=0;i<5;i++)//从最高位开始查找不为0的数开始显示(最低位为0显示0)
            {
                    if(freqValue[i]==0x30)
                    {
                        freqValue[i]=0x20;  //若为0则赋值空格键
                    }
                                     
                    else
                    {
                        break;
                    }
                         
            }
            for(i=0;i<6;i++)
            {
                LcdWriteData(freqValue[i]);
            }
            //--显示完,重新计算下一次频率。--// 
            Freq=0;//将计算的频率清零
            TH1=0; //将计数器的值清零
            TL1=0;
            TR0=1; //开启定时器
            TR1=1; //开启计数器
       }
    }
 
}
 
/*******************************************
*函数名        :Timer_Configuration
*功  能   :配置定时/计数器T0和T1
*输   入  :无
*输  出       :无
*******************************************/
 
void Timer_Configuration()
{
    //--定时器T1做计数器,工作方式1(16位定时器),只由TRx打开计数器--//
    //--定时器T0做定时器,工作方式1(16位定时器),只由TRx打开定时器--// 
    TMOD=0x51;
 
    //--设置定时器晶振为12MHZ时定时50ms--//
    TH0=0x3C;
    TL0=0xB0;
 
    //--打开中断-//
    ET0=1;
    ET1=1;
    EA=1;
 
    //--打开定时器*/
    TR0=1;
    TR1=1;
}
 
/*******************************************
*函数名        :Timer0
*功  能   :定时器0的中断函数
*输   入  :无
*输  出       :无
*******************************************/
 
void Timer0()   interrupt 1
{
    TimeCount++;
    if(TimeCount==20)//计时到1S
    {
        TR0=0;
        TR1=0;
        TimeCount=0;       
    }
 
    //--12MHZ设置定时50ms的初值--//
    TH0=0x3C;
    TL0=0xB0;  
}
/*******************************************
*函数名        :Timer1
*功  能   :定时器1的中断函数
*输   入  :无
*输  出       :无
*******************************************/
 
void Timer1()   interrupt 3
{  
    //--进入一次中断,表明计数到了65536--//
    Freq=Freq+65536;       
}

 VR1最小:

VR1最大

 

 

 

 

posted @   xiaoberber  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示