📄 pinlv.c
字号:
/*********************************************************************************
频率计程序
可存5个频率数据.
利用记数器1记数,定时器0定时.
*********************************************************************************/
#include<AT89X52.H> //头文件//
//全局变量定义
unsigned int bittime=0,k=0,ds=0;//计数变量
double F=0;//频率
double T=0;//周期
double TORF=0;//要显示数的中间数据
bit tf=0;//状态变量 tf=0 显示频率/tf=1显示周期;
unsigned int disp=0;//显示的数值
unsigned long datas=0;//测量中间数据保存
unsigned long savedata[5]={0,0,0,0,0};//测量数据存储(最多存5个)
unsigned int dp=0;//小数点位置控制变量
//数码字型表
//unsigned char code seg7code[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};/*0~9*/
unsigned char code seg7code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段码
//端口定义
sbit L0=P2^0;//hz/us 单位标识灯
sbit L1=P2^1;//khz/ms 单位标识灯
sbit L2=P2^2;//灯亮则显示的是周期
sbit L3=P2^3;//上下限报警灯
sbit k1=P1^4;//频率和周期切换键
sbit k2=P1^5;//存储键
sbit k3=P1^6;//显示存储的数据
sbit k4=P1^7;//返回测量程序
//函数声明
void datadeal(void);//数据处理(量程显示转换)
void keyset(void);//按键设定处理
void delay(unsigned int i);//延时
void display(void);//显示
//主程序//
void main (void)
{
//端口初始化
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
//定时/计数器初始化
TMOD=0x51;
TH0=0x3c;//(65536-50000)/256;定时50ms 0x3c
TL0=0xb0;//(65536-50000)%256 0xb0
IP=0x08;//设置T1为高优先级
EA=1;
ET0=1;
ET1=1;
TH1=0;
TL1=0;
TR0=1;
TR1=1;
while(1)//死循环
{
keyset();//安键设定处理
display();//显示
}
}
//定时中断服务程序//
void timer0(void) interrupt 1 using 1
{
bittime++;
if(bittime==19)//1秒时间到
{
TR1=0;
TR0=0;
L0=1;
L1=1;
//dp=0;//清零
F=k*65536+TH1*256+TL1;//频率值
if(F>500000||F<1)//判断是否超限
L3=0;
else
L3=1;
datas=F;//频率暂存变量
k=0;//清零
bittime=0;//清零
datadeal();//数据处理
TH1=0;
TL1=0;
TR1=1;
}
TH0=0x3c;//(65536-5000)/256;定时50ms
TL0=0xb0;//(65536-5000)%256;
TR0=1;
}
//T1计数器中断服务程序//
void timer1(void) interrupt 3 using 1
{
TH1=0;
TL1=0;
k++;
}
void delay(unsigned int i)//延时
{
while(i!=0)
{
unsigned int j;
for(j=0;j<100;j++);
i--;
}
}
/*数据处理(量程显示转换),频率0~9999999HZ,周期0~9999999微秒*/
void datadeal(void)
{
if(F!=0)
T=1000000/F;//计算周期:单位为us
if(tf==0)
TORF=F;
else
TORF=T;
if((TORF>0)&&(TORF<=9))//一位
{
TORF=TORF*1000;
dp=1;//1.000~9.000hz
L0=1;//hz/us
L1=0;
}
else
if((TORF>=10)&&(TORF<=99))//两位
{
TORF=TORF*100;
dp=2;//10.00~99.00hz
L0=1;//hz/us
L1=0;
}
else
if((TORF>=100)&&(TORF<=999))//三位
{
TORF=TORF*10;
dp=3;//100.0
L0=1;//hz/us
L1=0;
}
else
if((TORF>=1000)&&(TORF<=9999))//四位
{
TORF=TORF*1;
dp=1;//1.000
L0=0;//khz/ms
L1=1;
}
else
if((TORF>=10000)&&(TORF<=99999))//五位
{
TORF=TORF/10;//取高四位
dp=2;//10.00
L0=0;//khz/ms
L1=1;
}
else
if((TORF>=100000)&&(TORF<=999999))//六位
{
TORF=TORF/100;//取高四位
dp=3;//100.0
L0=0;//khz/ms
L1=1;
} //51单片机速度有限,最高测500KHZ
/*
else
if((TORF>=1000000)&&(TORF<=9999999))//七位
{
TORF=TORF/1000;
dp=4;//1000.
L0=0;//khz/ms
L1=1;
}
*/
else
if(TORF>=1000000)//超范围时显示9999
{
TORF=9999;
dp=4;
L0=0;
L1=0;
}
}
/*数码管显示显示,P0段选,P2_0~P2_3片选*/
void display(void)
{
P2_4=0;//千位
P2_5=1;
P2_6=1;
P2_7=1;
P0=seg7code[disp/1000];
if(dp==1)
P0_7=1;//显示小数点
delay(6);
P2_4=1;
P2_5=0;//百位
P2_6=1;
P2_7=1;
P0=seg7code[(disp%1000)/100];
if(dp==2)
P0_7=1;//显示小数点
delay(6);
P2_4=1;
P2_5=1;
P2_6=0;//十位
P2_7=1;
P0=seg7code[(disp%100)/10];
if(dp==3)
P0_7=1;
delay(6);
P2_4=1;
P2_5=1;
P2_6=1;
P2_7=0;//个位
P0=seg7code[disp%10];
delay(6);
}
/*按键设定处理*/
void keyset(void)
{
unsigned int i;
if(k1==0)//周期与频率切换
{
delay(3);//去抖动
if(k1==0)
{
tf=!tf;
}
}
if(tf==1)
L2=1;//周期显示灯亮
else
L2=0;//周期显示灯灭
disp=TORF;//把要显示的数据放入显示单元
if(k2==0)//保存数据
{
delay(3);
if(k2==0)
{
savedata[ds]=datas;
ds++;
if(ds==5)
ds=0;
//while(k3==0);
}
}
if(k3==0)//显示保存的数据
{
delay(3);
if(k3==0)
{
TR0=0;
TR1=0;
L0=0;//清单位标志
L1=0;
F=savedata[ds];
datadeal();//数据显示预处理
ds++;
if(ds==5)//只存储五个数据,超过则覆盖前面的数据
ds=0;
tf=0;//显示保存的频率
}
}
if(k4==0)//返回测量状态
{
delay(3);
if(k4==0)
{
TR0=1;
TR1=1;
for(i=0;i<5;i++)
savedata[i]=0;//存储区清零
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -