#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;
}
}
下降沿 产生中断~定时器计时 配合计数器~ 算出波的周期~ 换算成频率就好~ 这个不难的