/**================================================**/
/**=============按键K1按下,测周期=================**/
/**=============按键K2按下,测频率=================**/
/**=============按键K3按下,测脉宽=================**/
/**=============按键4按下,复位====================**/
#include<reg51.h>
sbit DS1=P2^0;
sbit DS2=P2^1;
sbit DS3=P2^2;
sbit DS4=P2^3;
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
sbit DI=P3^3;
#define uint unsigned int
#define uchar unsigned char
char xdata xsdm _at_ 0x7fff;
char code tbl[]={0x3F,0x06,0x5B,0x4F,0x66, //01234
0x6D,0x7D,0x07,0x7F,0x6F, //56789
0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,0x40}; //ABCDEF -
char code tbl_1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef} ;
uint data dd[]={1111,2222,3333,4444,5555,6666}; //显示数据
char data dn=0; //显示数据指针
char data xsd[]={1,2,3,4}; //位显示值
char data xsn=0; //位指针
char data lopn=10; //循环计数
uint a;
uint b;
uint c;
long e;
int j=0; //周期中断
int i=20; //频率中断参数
int SE;
void delay(z); //延时函数
void display_zq(); //周期显示函数
void display_pl(); //频率显示函数
void display_mk();
void init_zq(); //周期初始化函数
void init_pl(); //频率初始化函数
void init_mk();
void bcd_zq(); //周期BCD码转化函数
void bcd_pl(); //频率BCD码转化函数
void bcd_mk();
void interr();
void key();
void main_zq();
void main_pl();
void main_mk();
void main()
{
while(1)
{
key();
if(SE==3) xsdm=0xbf;
switch(SE)
{
case 0: main_zq();break;
case 1: main_pl();break;
case 2: main_mk();break;
case 3: P2=0x0f; break;
}
}
/*if(K1=0)
{
init_zq();
for(;;)
{
display_zq();
delay(1);
if(lopn--==0)
{
lopn=20;
bcd_zq();
}
}
}
//===============
else
{
if(K2==0)
{
init_pl();
for(;;)
{
display_pl();
delay(5);
if(lopn--==0)
{
lopn=20;
bcd_pl();
}
}
}
}
//=============
else
{if(K3=0)
{
init_mk();
interr();
for(;;)
{
display_mk();
delay(5);
if(lopn--==0)
{ lopn=20;
bcd_mk();
}
}
}
}*/
//===============
}
void main_zq()
{
init_zq();
/* for(;;)
{
display_zq();
delay(1);
if(lopn--==0)
{
lopn=20;
bcd_zq();
}
} */
while(SE==0)
{
display_zq();
delay(1);
if(lopn--==0)
{
lopn=20;
bcd_zq();
}
key();
}
}
void main_pl()
{
init_pl();
/*for(;;) //死循环
{
display_pl();
delay(5);
if(lopn--==0)
{
lopn=20;
bcd_pl();
}
}*/
while(SE==1)
{
display_pl();
delay(1);
if(lopn--==0)
{
lopn=20;
bcd_pl();
}
key();
}
}
void main_mk()
{
init_mk();
interr();
/*for(;;)
{
display_mk();
delay(5);
if(lopn--==0)
{ lopn=20;
bcd_mk();
}
} */
while(SE==2)
{
display_mk();
delay(5);
if(lopn--==0)
{ lopn=20;
bcd_mk();
}
key();
}
}
//按键函数开始
void key()
{
//按键1
if(K1==0)
{
delay(5);
if(K1==0)
{
while(!K1)
{
SE=0;
}
}
}
//按键2
if (K2==0)
{
delay(5);
if(K2==0)
{
while(!K2)
{
SE=1;
}
}
}
//按键3
if (K3==0)
{
delay(5);
if(K3==0)
{
while(!K3)
{
SE=2;
}
}
}
//按键4
if (K4==0)
{
delay(5);
if(K4==0)
{
while(!K4)
{
SE=3;
}
}
}
//按键结束
}
//显示函数开始
void display_zq()
{ P2=0xf0;
if (xsn==0){DS1=1; xsdm=tbl[xsd[xsn]];}
if (xsn==1){DS2=1; xsdm=tbl_1[xsd[xsn]];}
if (xsn==2){DS3=1; xsdm=tbl[xsd[xsn]];}
if (xsn==3){DS4=1; xsdm=tbl[xsd[xsn]];}
xsn=xsn+1;
if (xsn==4){xsn=0;}
}
void display_pl()
{ P2=0xf0;
if (xsn==0){DS1=1; xsdm=tbl[xsd[xsn]];}
if (xsn==1){DS2=1; xsdm=tbl[xsd[xsn]];}
if (xsn==2){DS3=1; xsdm=tbl[xsd[xsn]];}
if (xsn==3){DS4=1; xsdm=tbl[xsd[xsn]];}
xsn=xsn+1;
if (xsn==4){xsn=0;}
}
void display_mk()
{
P2=0xf0;
if (xsn==0){DS1=1; xsdm=tbl[xsd[xsn]];}
if (xsn==1){DS2=1; xsdm=tbl_1[xsd[xsn]];}
if (xsn==2){DS3=1; xsdm=tbl[xsd[xsn]];}
if (xsn==3){DS4=1; xsdm=tbl[xsd[xsn]];}
xsn=xsn+1;
if (xsn==4){xsn=0;}
}
//BCD码转化函数
void bcd_zq()
{
a=dd[0]*256+dd[1];
xsd[0]=a/10000;
if(xsd[0]==0)
xsd[0]=16;
xsd[1]=a%10000/1000;
xsd[2]=a%1000/100;
xsd[3]=a%100/10;
}
void bcd_pl()
{
b=dd[2]*256+dd[3];
xsd[0]=b/1000;
if(xsd[0]==0)
xsd[0]=16;
xsd[1]=b%1000/100;
if (xsd[1]==0&xsd[0]==16)
xsd[1]=16;
xsd[2]=b%100/10;
if(xsd[2]==0&xsd[1]==16)
xsd[2]=16;
xsd[3]=b%10;
}
void bcd_mk()
{
c=dd[4]*256+dd[5];
e=c*100000/a;
xsd[0]=e/10000; //取两位整数
if(xsd[0]==0)
xsd[0]=16;
xsd[1]=e%10000/1000;
xsd[2]=e%1000/100;
xsd[3]=e%100/10;
}
//初始化函数
void init_zq()
{
TMOD=0x10;//T1定时器方式
TCON=0x44;//TR1允许计数,IT1负边沿触发
EA=1; //开总中断
ET1=0; //定时器T1溢出中断允许位,不允许
EX1=1; //外部中断1允许位,允许
TL1=0;TH1=0;//计数器T1装入初值
}
void init_pl()
{
TMOD=0x51;//16位的定时计数器,T1为计数器,T0为定时器
TCON=0x50;//定时器,计数器允许计数
EA=1; //开总中断
ET1=0; //定时器T1溢出中断允许位
ET0=1; //定时器T0溢出中断允许位
TL1=0;TH1=0; //计数器T1装入初值
TH0=0x3c; // 定时器T0装入初值,定时50ms
TL0=0xb0; //
}
void init_mk()
{
TMOD=0x90;//定时器1,方式2定时,受门空位外部引脚P3.3控制
TCON=0; //当INT1=1(P3.3)且TR1=1才允许T1计数
EA=1;
TH1=0;TL1=0;
}
//延时子函数开始
void delay(z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//中断服务函数
//void inter_1() interrupt 0 //外部中断0服务函数
/*******==============================******/
void inter_0() interrupt 2 //外部中断1服务函数,周期测量使用
{
j++;
if(j==1)
{TH1=0;TL1=0;}
if(j==2)
{TR1=0;dd[0]=TH1;dd[1]=TL1;}
}
/*******==============================******/
void time_0() interrupt 1 //定时器0中断服务函数,频率测量使用
{
i--;
if(i!=0)
{TH0=0x3c;TL0=0xb0;TR0=1;}
else {TR0=0;TR1=0;dd[2]=TH1;dd[3]=TL1;}
}
/*******==============================******/
//void time_1() interrupt 3 //定时器1中断服务函数
void interr() //脉宽中断函数,这个脉宽检测肯定不准啦,特别是频率太高的时候 ,低的时候应该可以
{
if(DI==0)
while(!DI); //当DI=0,!DI=1,语句为真一直执行while(!DI)这一句;
//如果DI=1,!DI=0,语句为假则跳出while循环
else
{
while(DI);
while(!DI);
}
TR1=1;
while(DI);
TR1=0;
dd[4]=TH1;dd[5]=TL1;
}
*/
评论1
最新资源