#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uint ff; //接受频率值
uchar start=1; //定时器,计数模式启动变量
code uchar tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
code uchar seg[]={0X00,0X04,0X08,0X0C,0X10,0X14,0X18,0X1C};
void delay(k)
{
while(k--);
}
void display_1(uchar yi) //数值显示函数
{
P2=0x00; // 1100-0000
P0=tab[yi]; //数码管显示
delay(500);
}
void display_2(uchar er)
{
P2=0x04; //
P0=tab[er]; //数码管显示
delay(500);
}
void display_3(uchar san)
{
P2=0xc08; //
P0=tab[san]; //数码管显示
delay(500);
}
void display_4(uchar si)
{
P2=0x0c; //
P0=tab[si]; //数码管显示
delay(500);
}
void time0_init() //定时器初始化
{
TMOD|=0x01; //定时器0 定时模式 计数范围65536
TH0=0x3c; //定时初值50ms
TL0=0xb0;
TR0=0; //暂停定时器0
}
void time1_init() //计数器初始化
{
TMOD|=0x50; //定时器1 计数模式,计数范围65536
TH1=0; //计数初值0
TL1=0;
TR1=0; //暂停计数器
}
void str_init()
{
EA=1;
ET0=1;
}
void time0_event() interrupt 1 //定时器中断
{
static uchar i;
i++;
TH0=0x3c; //定时初值50ms
TL0=0xb0;
if(i==20) //循环20次为1秒
{
i=0;
TR1=0; //停止计数
TR0=0; //停止定时
ff=(TH1*256+TL1); //求出频率值 就是1秒内脉冲次数
TH1=0; //计数值清零
TL1=0;
TH0=0x3c; //定时初值50ms
TL0=0xb0;
start=1; //启动定时器开启变量
}
}
void main()
{ uint yi,er, san, si;
uchar i,j;
uint ss[5];
time0_init(); //定时器初始化
time1_init();
str_init(); //开中断
while(1)
{
if(start==1)
{
TR0=1; //启动定时器
TR1=1; //启动计数器
start=0; //关闭启动变量位 保证1秒时间
}
i=0;
do
{
ss[i]=ff%10;
i++;
}while(ff/=10);
yi=ss[0];
er=ss[1];
san=ss[2];
si=ss[3];
while(1)
{
display_1(yi);
display_2(er);
display_3(san);
display_4(si);
}
}
}
|