📄 1.c
字号:
/**********************************************************************
* 函 数 名: 测濒
* 功能描述:
* 函数说明:
* 调用函数:
* 全局变量:
* 输 入:
* 返 回:
* IO口分配: P1.~P1.5.....分濒线
P0...........送数据
p2.0~P2.4....键盘显示
T0...........被测信号输入 (16) P3.4
T1...........
T2...........显示
function: first........显示初始化
high.........clear high bit 0
rehigh.......recover high 0
* 设 计 者: 日期:
* 修 改 者: 日期:
* 版 本:
***********************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//define data
#define NTH2D 0xF4 // MODE 1 4MHz: 0FAH 6MHZ: 0FBH 2.5MS
#define NTL2D 0xD0 // 12MHZ: 2.85MS= 2850=B30H=-F4D0H
//define bit
bit Y, // 预测标志
AB, // A中断
START, // 启动
ABX, // 测相位的标志
signe;
//all x
uchar Disbit,PN0,
K, // 分濒系数
TDH,TDL,PDH,PDL;
uchar F;
uint fn;
//function list
void first(void); // first send data
void deal(uint m);
void dealp(uint n);
void delay(uint l);
//arange define
uchar data disbuf[8]={0,0,0,0,0,0,0,0}; // display is area
uchar code tab[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0};//0X77,0X7C,0X39,0X5E,0X79,0X71}; //0-9 A~F
// point define
//T1 MODE 1 2.85S
void timer2(void) interrupt 5 using 3 // T=0.544ms 12MHZ
{
uchar save;
P0=0;
TH2=NTH2D;
TL2=NTL2D;
save=disbuf[Disbit];
if(PN0==Disbit) save=save|0x80;
P2=P2&0xf0;
P2=P2|Disbit;
P0=save;
Disbit+=1;
if(Disbit==8) Disbit=0;
}
void service_int0(void) interrupt 0 using 2
{
if(Y==0)
{if(START==0) goto st;
EX1=1; TH1=0;TL1=0; TR1=1;}
st:if(START==1)
{TH0=0;TL0=0;TR0=1; START=0; return;}
if(START==0)
{TR0=0;START=1;TDH=TH0;TDL=TL0;signe=1;/*EX0=0;*/}
}
// INT1
void service_int1(void) interrupt 2
{
TR1=0;PDH=TH1; PDL=TL1;
ABX=1;
EX1=0;
}
void main(void)
{
uint X,P,fn,fn1,ta;
uchar M,K;
first();
while(1)
{
PN0=6;
IP=0X05;
TMOD=0X11;
TH0=0;
TL0=0;
IT0=1;
IT1=1;
EA=1;
START=1;
signe=0;
while(1)
{
signe=0; START=1;
Y=1; P1=P1&0x0f;
P1=P1|0x1f; M=1;
EX0=1;
while(signe==0);
ta=256*TDH+TDL;
signe=0;
if(ta>=5000) { K=0x1f; M=1; }
else if(ta>=500) { K=0x7f; M=8; }
else if(ta>=100) { K=0xDF; M=64;}
else if(ta>=50) { K=0xff; M=128;}
P1=P1&0x0f;
P1=P1|K;
delay(500);
/******正式测量**********/
Y=0;
START=1;
signe=0;
ABX=0;
TH0=0; TL0=0; TH1=0; TL1=0;
// EX0=1; EX1=0;
while(signe==0); // waite
while(ABX==0);
fn1=256*TDH+TDL;
P=256*PDH+PDL-19;
if(P>=fn1) X=0;
X=(float)3600*P/fn1;
fn=(float)10000/fn1*100*M;
if(fn>=10000) { fn=fn/10; PN0=1;}
deal(fn);
dealp(X);
}
}
}
void first(void)
{
TH2=NTH2D;
TL2=NTL2D;
ET2=1;
EA=1;
T2CON=0x04;
P0=0XFF;
P1=0x1f;
P2=0XFF;
P3=0XFF;
PN0=0xff;
deal(9999);
dealp(9999);
delay(4550);
}
void deal(uint m)
{
uchar data b0,b1,b2,b3;
uint div=1000;
b0=m/div;
m%=div;
div/=10;
b1=m/div;
m%=div;
div/=10;
b2=m/div;
m%=div;
b3=m;
if(b0==0)
{
b0=10;
if(b1==0)
{
b1=10;
if(b2==0) b2=10;
}
}
disbuf[0]=tab[b0];
disbuf[1]=tab[b1];
disbuf[2]=tab[b2];
disbuf[3]=tab[b3];
}
void dealp(uint n)
{
uchar data b0,b1,b2,b3;
uint div=1000;
b0=n/div;
n%=div;
div/=10;
b1=n/div;
n%=div;
div/=10;
b2=n/div;
n%=div;
b3=n;
if(b0==0)
{
b0=10;
if(b1==0)
{
b1=10;
}
}
disbuf[4]=tab[b0];
disbuf[5]=tab[b1];
disbuf[6]=tab[b2];
disbuf[7]=tab[b3];
}
void delay(uint l)
{
while(--l) {_nop_();_nop_();}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -