2009-08-30 03:09:28 阅读851 评论2 字号:大中小
//**********头文件区************
#include<reg52.h>
#include<math.h>
#include<absacc.h>
#include<intrins.h>
//*********宏定义方便使用*******
#define uchar unsigned char
#define uint unsigned int
//*********定义变量区***********
sbit dula=P2^6; //数码管段选
sbit wela=P2^7; //数码管位选
sbit k5=P3^7; //测频启动按键
uchar k,count,key=0;
uchar co
0X90,0X88,0X83,0XC6,0XA1,0X8E,0X86,0xbf,0xff}; //0~F,-,全不亮,共阳
uchar co
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x00}; //共阴
uchar tab_freq[]={0,0,0,0,0,0};
//==========================================================================
//*********函数声明区***********
void delay(uint); //延时函数
void disp(); //显示函数
void int_count0(); //T0计数中断函数
void int_time1(); //T1定时中断函数
void trans_count(); //数据转换函数
void freq_key();
//=========================================================
//*********主函数开始************
void main()
{
dula=0;
wela=0;
TMOD=0x11;
TH0=0;
TL0=0;
TH1=0x4c;
TL1=0X00; //50ms
EA=1;
ET0=1;
ET1=1;
//TR1=1;
//TR0=1;
while(1)
{
freq_key();
trans_count();
disp();
}
}
//=============================================================
//*********T0计数中断函数开始*****
void int_count0() interrupt 1
{
k++;
}
//*********T1定时中断函数开始*****
void int_time1() interrupt 3
{
TH1=0x4c;
TL1=0x00; //50ms
count++;
if(count>=20)
{
TR0=0;
TR1=0;
count=0;
}
}
//=============================================================
//*********数据转换函数开始*******改进了一下,程序简洁了许多
void trans_count()
{
unsigned long int z;
z=k*65535+TH0*256+TL0;
tab_freq[0]=z/100000; //十万位
tab_freq[1]=(z%100000)/10000; //万位
tab_freq[2]=(z%10000)/1000; //千位
tab_freq[3]=(z%1000)/100; //百位
tab_freq[4]=(z%100)/10; //十位
tab_freq[5]=z%10; //个位
}
//=============================================================
//*********显示函数开始***********
void disp()
{
uchar i,n,a;
n=0x01; //共阳位选
// n=0xfe; //共阴位选
dula=0;
wela=1; // 选中位选
P0=n;
for(i=0;i<6;i++)
{
wela=0;
dula=1; //选中段选
a=tab_freq[i];
P0=table[a];
dula=0;
wela=1; // 选中位选
P0=n;
delay(2);
n=n<<1;
/*n=~n;
n=n<<1;
n=~n; */ //共阴数码管
}
}
//*********延时函数开始************
void delay(uint k)
{
uint i,j;
for(i=k;i>0;i--)
for(j=110;j>0;j--);
}
//==============================================================
//*********按键函数开始*************
void freq_key()
{
if(k5==0)
{
delay(20);
if(k5==0)
{
key++;
while(k5==0);
if(key==1)
{
TR0=1;
while(TH0==0&&TL0==0);
TR1=1;
}
else
{
TR0=0;
TR1=0;
}
}
}
}
//==================================================================
//程序在Proteus和硬件电路上验证通过
TMOD=0x15 测试外部时钟频率
外部时钟频率为10K测得为10003HZ (误差为3HZ)
外部时钟为100K时测为100027HZ(误差为27HZ)