51单片机制作频率计,测周法如何测量(用T0和T1两个就可以了吗),求大虾帮忙啊,最好详细点

2024-12-23 03:19:50
推荐回答(2个)
回答1:

#include 

#define U8 unsigned char

U8 code tab[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28};

U8 code scn[]={0x7f,0xbf,0xdf,0xef};//先点亮左边一个数码管

U8 buf[4]={0,0,0,0};// 显示缓冲区 

U8 cnt = 0;   // 扫描计数

unsigned int freq = 0;

unsigned int F;

void main(void) 

{ EA = 1;   // 允许中断

 TMOD = 0x01; // 设定时器0为模式1(16位) 

 ET0 = 1;   // 定时器0中断允许 

 TH0 = (65536-5000) / 256; // 晶振12MHz,中断周期5mS 

 TL0 = (65536-5000) % 256;;   

 TR0 = 1;  // 开始计数 

 PX0 = 1;  // 外部中断优先级高

 EX0 = 1;  // 允许外部中断 

 IT0 = 1;  // 外部中断下降沿触发

 while(1);

void exint0(void) interrupt 0 // 外部中断0 服务程序

{ freq++;

}

void timeint(void) interrupt 1 // 定时器0中断服务程序

{ char i;

 TH0 = (65536-5000) / 256; // 晶振12MHz,中断周期5mS 

 TL0 = (65536-5000) % 256;;   

 i = cnt & 0x03;  // 求应点亮的LED号(从左到右依次为 0,1,2,3)

 P0 = tab[buf[i]]; // 笔划代码送P0口 

 P2 = scn[i];  // 控制扫描码送P2口

 cnt++;

 if(cnt==200) 

 { cnt=0;   // 到1秒钟,显示的数字加一

  F = freq; freq = 0;

  buf[0] = F / 1000;

  buf[1] = (F / 100) % 10;

  buf[2] = (F / 10)  % 10;

  buf[3] = F % 10;

 }

}

回答2:

下降沿 产生中断~定时器计时 配合计数器~ 算出波的周期~ 换算成频率就好~ 这个不难的