8952+LED数码管测单片机时钟频率C程序- Jary的日志- 网易博客

8952+LED数码管测单片机时钟频率C程序

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 code table[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,

      0X90,0X88,0X83,0XC6,0XA1,0X8E,0X86,0xbf,0xff}; //0~F,-,全不亮,共阳

uchar code table_yin[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

        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和硬件电路上验证通过

8952+LED数码管测单片机时钟频率C程序 - Jary - Jarysの讀鵼鑒

8952+LED数码管测单片机时钟频率C程序 - Jary - Jarysの讀鵼鑒

TMOD=0x15   测试外部时钟频率

外部时钟频率为10K测得为10003HZ (误差为3HZ)

8952+LED数码管测单片机时钟频率C程序 - Jary - Jarysの讀鵼鑒

外部时钟为100K时测为100027HZ(误差为27HZ)

8952+LED数码管测单片机时钟频率C程序 - Jary - Jarysの讀鵼鑒

8952+LED数码管测单片机时钟频率C程序 - Jary - Jarysの讀鵼鑒

<#--{zx1}日志--> <#--推荐日志--> <#--引用记录--> <#--相关日志--> <#--推荐日志--> <#--推荐阅读--> <#--相关文章--> <#--历史上的今天--> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构-->
郑重声明:资讯 【8952+LED数码管测单片机时钟频率C程序- Jary的日志- 网易博客】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——