#include
#include
#define uchar unsigned char
#define uint unsigned int
#define NOP() _nop_()
sbit key1=P1^0;//key1 按此按键输出1000Hz
sbit key2=P1^1;//key2 按此按键输出100Hz
sbit key3=P1^2;//key3 按此按键输出1Hz 1Hz是采用纯粹软件延时
sbit square=P2^7;//方波输出引脚
sbit fenpin=P2^6;//分频后信号输出引脚
uchar TMRH,TMRL;//定时器T1初值寄存器
uchar square_delay;//延时产生方波标志
struct
{
uchar value;//当前键值
uchar backvalue;//上次键值
uchar done;//按键是否响应 1为已经响应
} key;
uchar KeyScan(void); //按键扫描 获取键值
void KeyProc(void);//按键处理
void KeyAction(void);//按键散转 转向需要执行的程序
void delay500ms(void);//500ms延时程序 用于产生1Hz方波
void timer0() interrupt 1 using 1 //12M晶振 20ms中断 用于按键扫描 T0中断
{
TH0=0xB1;
TL0=0xE0;
KeyProc(); //避免按键在纯粹软件延时的时候不响应
}
void timer1() interrupt 3 using 1 //T1中断
{
TH1=TMRH;
TL1=TMRL;
square=~square;
if(square==1)
EX1=1;
}
void EXT_INT1() interrupt 2 using 1 //外部INT1中断 低电平触发
{
EX1=0;
fenpin=~fenpin;
}
void main()
{
TMRH=0xFE;
TMRL=0x0C;
TCON=0x00;
EX1=1; //允许INT1中断
TMOD=0x11; //定时器T0,T1工作在方式1
TH0=0xB1;
TL0=0xE0;
TH1=TMRH;
TL1=TMRL;
ET0=1; //允许T0溢出中断
ET1=1; //允许T1溢出中断
TR0=1; //启动计数器T0
TR1=1; //启动计数器T1
EA = 1; //开中断
while(1)
{
if(square_delay)
{
delay500ms();
square=~square;
if(square==1)
EX1=1;
}
}
}
void KeyProc(void)
{
key.value=KeyScan();
if(key.value==key.backvalue)
{
if(!key.done)
{
KeyAction();
key.done=1;
}
}
else
{
key.backvalue=key.value;
key.done=0;
}
}
void KeyAction(void)
{
switch(key.value)
{
case 1:
{
ET1=0;
TR1=0;
TMRH=0xFE; //0.5ms初值
TMRL=0x0C;
TR1=1;
ET1=1;
square_delay=0;
}break;
case 2:
{
ET1=0;
TR1=0;
TMRH=0xEC;//5ms初值
TMRL=0x78;
TR1=1;
ET1=1;
square_delay=0;
}break;
case 3:
{
ET1=0;
TR1=0;
square_delay=1;
}break;
}
}
//获取键值
uchar KeyScan(void)
{
uchar keyval=0;
if (key1==0) keyval=1;
else if(key2==0) keyval=2;
else if(key3==0) keyval=3;
else keyval=0;
return keyval;
}
//500ms延时 晶振12M
void delay500ms(void)
{
unsigned char i,j,k;
for(i=15;i>0;i--)
for(j=202;j>0;j--)
for(k=81;k>0;k--);
}
//文件名:main.c
//文件功能:包含液晶显示子文件和定时器子文件
#include
#include
#include
sbit LED=P0^7;
unsigned int num=0;
unsigned int dis_num=0;
//------------------------------------------------
void display(unsigned int num)//液晶显示数字
{
unsigned int i;
i=5;LCD_dis(0,i,0x30+num/10000); // '0'-0 =0x30
i++;LCD_dis(0,i,0x30+num%10000/1000);
i++;LCD_dis(0,i,0x30+num%1000/100);
i++;LCD_dis(0,i,0x30+num%100/10);
i++;LCD_dis(0,i,0x30+num%10);
}
//------------------------------------------------
void ex0_sev() interrupt 0 //中断服务
{
num++;
}
//------------------------------------------------
void main()//主函数
{
Init_LCD(); //液晶初始化
init_timer0();
EA=1;
IT0 = 1;
EX0 = 1;//外部中断初始化
loop1:
if(flag==1)
{
flag=0;
display(num);
num=0;
TR0 = 1;
EX0 = 1;
}
goto loop1;
}
其它发你
main()
{
while(1)
{
while(1)
{
f=using1();//f=n/t
d[0]=f/1000;
d[1]=f/100%10;
d[2]=f/10%10;
d[3]=f%10;
display(1);
if(f<=1000)break;//频率小于1000Hz转向方法2测量
}
while(1)
{
f=using2();//f=1/T
d[0]=f/1000;
d[1]=f/100%10;
d[2]=f/10%10;
d[3]=f%10;
display(1);
if(f>1000)break; //频率大于1000Hz转向方法1测量
}
}
}