|
沙发
楼主 |
发表于 2011-7-11 15:14:01
|
只看该作者
本帖最后由 gongyuancun 于 2011-9-8 18:16 编辑
频率计程序
#include<reg2051.h>
#define ON 0
#define OFF 1
/****************定义显示*****************/
sbit led1=P3^5; //指示灯
sbit led2=P3^7;
sbit L1=P3^0; //扫描位
sbit L2=P3^1;
sbit L3=P3^2;
sbit L4=P3^3;
char code disp_data[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; //段码
char disp_buffer[4]; //显存
char disp_count; //显示指针
/**************定义计时,计数**************/
unsigned char count;
unsigned char time;
bit timer_flag;
/***************************************************
延时1S
***************************************************/
void delay(void)
{
unsigned char ys1,ys2,ys3;
for(ys1=167;ys1;ys1--) //设
for(ys2=39;ys2;ys2--)
for(ys3=76;ys3;ys3--);
}
/***************************************************
定时器1中断
功能: 计数溢出中断,用于计数扩展
***************************************************/
void count_timer0(void) interrupt 1
{
count++;
}
/***************************************************
定时器0中断
功能: 1S计时和显示
***************************************************/
void timer1(void) interrupt 3 using 0
{
TL1|=0x60; //4MS 12M晶振
TH1=0xF0;
led2=OFF;
//1S计时
if(++time==250)
{
TR0=0;
TR1=0;
time=0x00;
timer_flag=1;
}
//显示
P3 |= 0x0F;
P1=disp_buffer[disp_count];
switch(disp_count)
{
case 0:
L1=0;
break;
case 1:
L2=0;
break;
case 2:
L3=0;
break;
case 3:
L4=0;
break;
}
if(++disp_count==4) disp_count=0x00;
}
/********************************
1. 定时器0作为外部输入计数器
2. 定时器1作为定时器,用于1S计时和显示
******************
void main(void)
{
unsigned long x;
unsigned char i,j,temp;
delay();
led1=ON;
led2=ON;
TMOD=0x15;
EA=1;
ET0=1;
ET1=1;
PT1=1;
// TH1=0xF0;
// TL1=0x60+0x12;
TR1=1;
// TR0=1;
while(1)
{
PCON |= 0x01;
//1S计时时间到的处理
if(timer_flag)
{
//计算计数值
((char*)&x)[3]=TL0;
((char*)&x)[2]=TH0;
((char*)&x)[1]=count;
//开始第二次测量
led2=ON;
timer_flag=0;
count=0x00;
TH1=0xF0;
TL1=0x60+0x12;
TH0=0x00;
TL0=0x00;
TR1=1;
TR0=1;
//确定小数点位置和显示的数
if(x<1000)
{
led1=OFF; //KHZ单位小数点灭
j=4; //小数点不显示
}
else if(x<10000)
{
led1=ON; //KHZ单位小数点亮
j=3; //小数点位置
}
else if(x<100000)
{
led1=ON;
j=2;
x/=10; //只要显示高四位
}
else if(x<1000000)
{
led1=ON;
j=1;
x/=100;
}
//将要显示的内容存放到显示缓存
for(i=0;i<4;i++)
{
temp=x%10;
disp_buffer=disp_data[temp];
if(i==j) disp_buffer &= 0xFB; //小数点
x/=10;
}
for(i=3;i;i--)
if(disp_buffer==0xc0)
disp_buffer=0xff;
else
break;
}
}
}
|
|