📄 new
字号:
/*********************************************************/
/** 频 率 测 试 程 序 **/
/** 作者:施祖清 **/
/** 时间:2007/3/22 **/
/** National University of Defence Technology **/
/** 0731-4534435 **/
/*********************************************************/
#include <absacc.h>
#include <reg51.h>
#include<intrins.h>
#include <math.h>
#include <string.h>
#define uchar unsigned char
#define uint8 unsigned char
#define uint32 unsigned int
#define schar static unsigned char
#define LED1 XBYTE [0xA000] //数码管地址
#define LED2 XBYTE [0xA001]
#define LED3 XBYTE [0xA002]
#define LED4 XBYTE [0xA003]
#define LED5 XBYTE [0xA004]
#define LED6 XBYTE [0xA005]
#define LED7 XBYTE [0xA006]
#define LED8 XBYTE [0xA007]
/*数码管显示使用的变量和常量*/
uchar lednum = 0; //数码管显示位控制寄存器
uchar led[8] = {0,0,0,0,0,0,0,0}; //数码管显示内容寄存器
uchar code segtab[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0xbf}; //七段码段码表
// "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "P" ,"black"
unsigned long num;
uchar end,i;
sbit gate=P1^1;
sbit gate2=P1^2;
sbit rst=P1^0;
schar data_in[9];//数据输入
void make(float buffer);
void process();//数据处理函数
/***************************************************
数码管显示函数
原型: void leddisp(void);
功能: 每次调用轮流显示一位数码管
****************************************************/
void leddisp(void)
{
switch(lednum) //选择需要显示的数码位
{
case 0:
LED1 = segtab[led[0]];
break;
case 1:
LED2 = segtab[led[1]];
break;
case 2:
LED3 = segtab[led[2]];
break;
case 3:
LED4 = segtab[led[3]];
break;
case 4:
LED5 = segtab[led[4]];
break;
case 5:
LED6 = segtab[led[5]];
break;
case 6:
LED7 = segtab[led[6]];
break;
case 7:
LED8 = segtab[led[7]];
break;
}
if(lednum == 0) //更新需要现实的数码位
{
lednum = 7;
}
else
{
lednum = lednum-1;
}
}
void delay(uint8 time_nop)
{
uint8 i;
for(i=0;i<time_nop;i++)
{
_nop_();
}
}
void intT0() interrupt 1 //T0 定时中断处理函数
{
TH0 = 0xf8; //定时器中断时间间隔 1ms
TL0 = 0x30;
if(num<=1000)
{
gate=0;
}
else if(num<2000)
{
gate=1;
}
else if(num==2000)
{
for(i=0;i<8;i++)
data_in[i]=0;
}
else if(num<3000)
{
gate=0;
}
else if(num==3000)
{
num=1;
end=1;
}
if(num<=700)
{
gate2=1;
}
else
{
gate2=0;
}
num++;
leddisp(); //每次定时中断显示更新一次
}
void intT1() interrupt 0
{
data_in[i++]=P0;
if(i==9)
i=1;
}
void main(void)
{
TCON= 0x13;
TH0 = 0xf8; //定时器中断时间间隔 1ms
TL0 = 0x30;
ET0=1;
EX0=1;
TMOD=0x01;
EA=1;
gate=0;
gate2=0;
i=1;
end=0;
num=1;
for(i=0;i<8;i++)
data_in[i]=0;
rst=0;
delay(10);
rst=1;
while(1)
{
if(end)
{
process();
end=0;
}
}
}
void process()//数据处理函数
{
float buffer;
unsigned long sysfre,tfre;
sysfre=16777216*data_in[0]+65536*data_in[1]+256*data_in[2]+data_in[3];
tfre=16777216*data_in[4]+65536*data_in[5]+256*data_in[6]+data_in[7];
tfre=tfre+tfre*4/100;
if(tfre==0)
{
led[7]=0;
led[1]=led[2]=led[3]=led[4]=led[5]=led[6]=led[0]=16;
}
else
{
buffer=10000*(float)tfre/(float)sysfre;
make(buffer);
}
}
void make(float buffer)
{
int i,w;unsigned long n,m;
i=0;
while(1)
{
n=(unsigned long)buffer;
m=1000000000;
if(n<10000)
{
buffer=buffer*10000;
i++;
continue;
}
while(1)
{
if(n>=m)
break;
m=m/10;
}
switch(m)
{
case 1000000000:
w=9-i*4;break;
case 100000000:
w=8-i*4;break;
case 10000000:
w=7-i*4;break;
case 1000000:
w=6-i*4;break;
case 100000:
w=5-i*4;break;
case 10000:
w=4-i*4;break;
}
if(w>=0)
{
led[1]=0;led[0]=w;
}
else{led[1]=17;led[0]=-w;}
led[7]=n/m; n=n%m; m=m/10;
led[6]=n/m; n=n%m; m=m/10;
led[5]=n/m; n=n%m; m=m/10;
led[4]=n/m; n=n%m; m=m/10;
led[3]=n/m;
break;
}
led[2]=16;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -