?? jianpjianx.c
字號:
#include<reg52.h>
#include <absacc.h>
#include <INTRINS.H>
#define DPTR XBYTE[0X6000]
unsigned char DISPBUF1,DISPBUF2,DISPBUF3,DISPBUF4,keynum,BUFTH0,BUFTL0=100,BUFTH1,BUFTL1=100;
unsigned int TIME1S_count;
unsigned long TMPA;
void mDelay(unsigned int Delay);
void display(void);
unsigned char keyscan(void);
void readkey(unsigned char date);
void BCD_CHANGE(void);
void display1(void);
#include<stdio.h>
sbit P3_2=P3^2;
sbit P3_3=P3^3;
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_7=P3^7;
bit flag1s,flag_countT0;
bit flag_KHz,flag_cexiang,flag_cezhou,flag_openT0,flag_openT1,flag_display1;
unsigned long int period0,period1;
unsigned char n0=0,n1=0,countn0;
void int0() interrupt 0 using 0
{if(!flag_cezhou)//如果flag_cezhou標志被清零了,代表數據已被取走,要重新開TR0
{if(!flag_openT0)
{TH0=0;TL0=0;n0=0;TR0=1;flag_openT0=1;P3_7=~P3_7;}//如果第一次中斷則開TR0
else//如果第二次中斷
{flag_openT0=0;
TR0=0;//則關TR0,
BUFTH0=TH0;BUFTL0=TL0;//并存儲TH0,TL0,
if(!flag_cexiang)
{TH1=0;TL1=0;n1=0;TR1=1;EX1=1;flag_openT1=1;}//并同時開TR1,
flag_cezhou=1; //最后設立flag_cezhou標志
}
}
}
void time0() interrupt 1 using 1
{n0++;countn0++;}
void int1() interrupt 2 using 2
{if(flag_openT1)//如果已經開了TR1
{TR1=0;BUFTH1=TH1;BUFTL1=TL1;flag_cexiang=1;
flag_openT1=0;
}
}
void time1() interrupt 3 using 3
{n1++;}
void time2() interrupt 5 using 3
{
TF2=0;
if(flag_countT0)
{ TIME1S_count++;
if(TIME1S_count==170)
{TR0=0;TIME1S_count=0;P3_1=~P3_1;flag1s=1;}
}
display();
}
main()
{
float f=0,p=0;
// unsigned char tmp0=0;
TMOD=0X11;
TH0=0;
TL0=0;
TH1=0;
TL1=0;
RCAP2H=0xe8;
RCAP2L=0xef;//T2的定時初值,用于數碼管掃描與1s時間的產生
EA=1;
ET0=1;
ET1=1;
ET2=1;
TR2=1;
IT1=1;
IT0=1;
EX0=1;
EX1=1;
P3_3=1;
P3_2=1;
keynum=1;
//flag_KHz=1;
while(1)
{
while(keynum==1)//((keynum==1)&&flag_KHz)
{ EX0=0;
EX1=0;
TMOD=0X15;
flag_countT0=1;
readkey(keyscan());
if(flag1s==1)
{
flag1s=0;
f=TH0*256+TL0+65536*countn0;
if(f>100000)
{f=f/1000;flag_KHz=1;}
else if(f>10000)
{f=f/100;flag_KHz=1;}
else if(f>1000)
{f=f/10;flag_KHz=1;}
else {P3_0=1;flag_KHz=0;}
TMPA=(int)(f*10);
BCD_CHANGE();
TIME1S_count=0;
countn0=0;
n0=0;
TH0=0;
TL0=0;
TR0=1;
display();
}
}
while((keynum==2)|(keynum==3))
{ EX0=1;
EX1=1;
readkey(keyscan());
flag_countT0=0;
TMOD=0X11;
if(flag_cezhou)
{period0=(BUFTH0<<8)+BUFTL0+65536*n0;//計算半周期
//tmp0++;
// if(tmp0==5)
//{
flag_cezhou=0;
//tmp0=0;BUFTH0=0;BUFTL0=0;n0=0;
// }
} //并清標志
if(flag_cexiang)
{period1=(BUFTH1<<8)+BUFTL1+65536*n1;
flag_cexiang=0;}
if(keynum==2)
{ //TMPA=0;
// period0=500;
//if(period0!=0)
f=(10000000./(period0));//計算頻率與實際仿真測試做的校準修正
if(f<10000)
{flag_KHz=0;}
else if(f<15000)
{f=f/10;flag_KHz=0;}
else if(f<100000)
{f=f/10;flag_KHz=1;}
else if(f<1000000)
{f=f/100;flag_KHz=1;}
else
{f=f/1000;flag_KHz=1;}
TMPA=(unsigned long)f;
BCD_CHANGE();
display();
}
/* else if(keynum==3)
{ if(period0!=0)
{
p=period1*1800./period0;
//p=2663;
// TMPA=(unsigned long)p;
// BCD_CHANGE();
display();
}
}
display();*/
}
}
}
void mDelay(unsigned int Delay)
{ unsigned int i;
for(;Delay>0;Delay--)
{ for(i=0;i<124;i++)
{;}
}
}
void BCD_CHANGE(void)
{
DISPBUF1=TMPA/1000;
DISPBUF2=TMPA%1000/100;
DISPBUF3=TMPA%100/10;
DISPBUF4=TMPA%10;
}
///////////////////////////////////
//數碼管顯示程序
void display(void)
{
DPTR=(DISPBUF1|0X70);
mDelay(1);
DPTR=(DISPBUF2|0Xb0);
mDelay(1);
DPTR=(DISPBUF3|0Xd0);
mDelay(1);
DPTR=(DISPBUF4|0Xe0);
mDelay(1);
DPTR=0Xf0;
mDelay(1);
}
void display1(void)
{
DPTR=(DISPBUF1|0X70);
DPTR=(DISPBUF2|0Xb0);
DPTR=(DISPBUF3|0Xd0);
DPTR=(DISPBUF4|0Xe0);
DPTR=0Xf0;
}
unsigned char keyscan(void)
{ unsigned char test,tmp;
P1=0xf0;
if((P1&0xf0)!=0xf0)
{ mDelay(1);
if((P1&0xf0)!=0xf0)
{ test=0xfe;
while((test&0x10)!=0)
{ P1=test;
if((P1&0xf0)!=0xf0)
{ tmp=(P1&0xf0)|0x0f;
return(~(test)+~(tmp));
}
else test=(test<<1)|0x01;
}
}
}
return(0);
}
void readkey(unsigned char date)
{ switch(date)
{ case 0X11: keynum=1;break;
case 0X21: keynum=2;break;
case 0X41: keynum=3;break;
case 0X81: keynum=4;break;
case 0X12: keynum=5;break;
case 0X22: keynum=6;break;
case 0X42: keynum=7;break;
case 0x82: keynum=8;break;
case 0x14: keynum=9;break;
case 0x24: keynum=10;break;
case 0x44: keynum=11;break;
case 0x84: keynum=12;break;
case 0x18: keynum=13;break;
case 0x28: keynum=14;break;
case 0x48: keynum=15;break;
case 0x88: keynum=16;break;
// case 0x00: keynum=0;break;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -