|
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uint ff; //接受頻率值
uchar start=1; //定時(shí)器,計(jì)數(shù)模式啟動(dòng)變量
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) //數(shù)值顯示函數(shù)
{
P2=0x00; // 1100-0000
P0=tab[yi]; //數(shù)碼管顯示
delay(500);
}
void display_2(uchar er)
{
P2=0x04; //
P0=tab[er]; //數(shù)碼管顯示
delay(500);
}
void display_3(uchar san)
{
P2=0xc08; //
P0=tab[san]; //數(shù)碼管顯示
delay(500);
}
void display_4(uchar si)
{
P2=0x0c; //
P0=tab[si]; //數(shù)碼管顯示
delay(500);
}
void time0_init() //定時(shí)器初始化
{
TMOD|=0x01; //定時(shí)器0 定時(shí)模式 計(jì)數(shù)范圍65536
TH0=0x3c; //定時(shí)初值50ms
TL0=0xb0;
TR0=0; //暫停定時(shí)器0
}
void time1_init() //計(jì)數(shù)器初始化
{
TMOD|=0x50; //定時(shí)器1 計(jì)數(shù)模式,計(jì)數(shù)范圍65536
TH1=0; //計(jì)數(shù)初值0
TL1=0;
TR1=0; //暫停計(jì)數(shù)器
}
void str_init()
{
EA=1;
ET0=1;
}
void time0_event() interrupt 1 //定時(shí)器中斷
{
static uchar i;
i++;
TH0=0x3c; //定時(shí)初值50ms
TL0=0xb0;
if(i==20) //循環(huán)20次為1秒
{
i=0;
TR1=0; //停止計(jì)數(shù)
TR0=0; //停止定時(shí)
ff=(TH1*256+TL1); //求出頻率值 就是1秒內(nèi)脈沖次數(shù)
TH1=0; //計(jì)數(shù)值清零
TL1=0;
TH0=0x3c; //定時(shí)初值50ms
TL0=0xb0;
start=1; //啟動(dòng)定時(shí)器開(kāi)啟變量
}
}
void main()
{ uint yi,er, san, si;
uchar i,j;
uint ss[5];
time0_init(); //定時(shí)器初始化
time1_init();
str_init(); //開(kāi)中斷
while(1)
{
if(start==1)
{
TR0=1; //啟動(dòng)定時(shí)器
TR1=1; //啟動(dòng)計(jì)數(shù)器
start=0; //關(guān)閉啟動(dòng)變量位 保證1秒時(shí)間
}
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);
}
}
}
|
|