朴实无华,没有笔记
频率测量比较简单:将定时器 0 初始化为计数模式,对输入到 P34(T0)的脉冲进行计数,1s 的计数值即为频率值。
频率测量时需要将 J3-15(SIGNAL)与 J3-16(P34)短接。
练习:数码管显示测量的频率
#include"reg52.h"
sfr AUXR = 0x8e;
code unsigned char code duanma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
code unsigned char code duanmadot[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
void SelectHC573(unsigned char n){
switch(n)
{
case 4:
P2 = (P2 & 0x1f) | 0x80;
break;
case 5:
P2 = (P2 & 0x1f) | 0xa0;
break;
case 6:
P2 = (P2 & 0x1f) | 0xc0;
break;
case 7:
P2 = (P2 & 0x1f) | 0xe0;
break;
}
}
void SystemInit(){
SelectHC573(4);
P0=0xff;
SelectHC573(5);
P0=0x00;
}
void delay(unsigned int t){
while(t--);
}
void Display(unsigned char pos,unsigned int value){
SelectHC573(7);
P0=0xff;
SelectHC573(6);
P0=0x01<<pos;
SelectHC573(7);
P0=value;
}
void InitTimer()
{
TMOD = 0x04;
TH0 = 0xff;
TL0 = 0xff;
TH1 = (65536 - 1000) / 256;
TL1 = (65536 - 1000) % 256;
ET0 = 1;
ET1 = 1;
TR0 = 1;
TR1 = 1;
EA = 1;
}
unsigned int k;
void Service_T0() interrupt 1
{
k++;
}
unsigned int count,fre;
void Service_T1() interrupt 3
{
count++;
if(count == 1000)
{
fre = k;
count = 0;
k = 0;
}
}
unsigned char a,b,c,d,e;
void show(){
a=fre/10000;
b=(fre/1000)%10;
c=(fre/100)%10;
d=(fre/10)%10;
e=fre%10;
Display(3,duanma[a]);
delay(100);
Display(4,duanma[b]);
delay(100);
Display(5,duanma[c]);
delay(100);
Display(6,duanma[d]);
delay(100);
Display(7,duanma[e]);
delay(100);
Display(0,0xff);
delay(100);
Display(1,0xff);
delay(100);
Display(2,0xff);
delay(100);
}
void main()
{
SystemInit();
InitTimer();
while(1)
{
show();
}
}