#include <reg52.H>
unsigned char code Tab[]={ 0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,
0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0x00,};
unsigned char cfDispPos=0;
unsigned long ifTimes=0;
unsigned long Freq=0;
unsigned long DispNow;
bit bfComplete=0;
bit bfTesting=0;
unsigned char Method=0;
sbit KEY=P3^7;
void Delay(int t)
{
while(t--);
}
void StartFreq(unsigned char Method)
{
switch(Method)
{
case 0:
{
EX0=1; //从中断开定时器,测周法
IT0=1;
TMOD=0x51; //Timer0 for precise Time
EA=1;
break;
}
case 1:
{
//计数测频法
TH0=0xf8;TL0=0x30; //1ms
ifTimes=0;
TMOD=0x51; //Time0 for precise Time ,Timer1 for counter
TH1=0;TL1=0;
EA=1; ET0=1; TR0=1;TR1=1;ET1=1;
PT1=1;
}
default:break;
}
}
void timer0 (void) interrupt 1
{
switch(Method)
{
case 0: //用于计数功能
ifTimes++;
break;
case 1: //work with T1
TH0=0xf8; TL0=0x30; //1ms
ifTimes++;
if(ifTimes>2000) //2s
{
TR1=0;
TR0=0;
EA=0;
ET0=0;
ET1=0;
Freq+=(TH1*256+TL1);
Freq=Freq*10/2; //Keep One bit for '.'
if(Freq>900000)Freq=0;
bfComplete=1;
}
break;
default:break;
}
}
void timer1(void) interrupt 3
{
Freq+=65536;
}
void EX0_IRQ(void) interrupt 0 //测周法使用
{
if(!bfTesting) //first falling edge
{
TH0=0x0;TL0=0x0; //1ms
ifTimes=0;
ET0=1; TR0=1; //Timer0 for Time
bfTesting=1;
}
else //second falling edge
{
EA=0;TR0=0; ET0=0; EX0=0;
Freq=(ifTimes*65536+256*TH0+TL0)*1/2;// us S
Freq=10000000/Freq; //Keep one bit for '.'
bfComplete=1;
}
}
void SystemInitial(void)
{
SCON=0X00;
//TH0=0xfc;TL0=0x18; //0.5ms
StartFreq(Method);
}
void main(void)
{
SystemInitial();
while(1)
{
if(!KEY)
{
Delay(2000);
if(!KEY)
{
while(!KEY);
if(Method)
Method=0;
else Method=1;
DispNow=0;
StartFreq(Method);
}
}
if(bfComplete)//开始测量
{
DispNow=Freq;
Freq=0;
bfComplete=0;
bfTesting=0;
StartFreq(Method);
}
{//显示
switch(cfDispPos)
{
case 0:P2=0x6E; P0=0xFE;break;
case 1:P2=Tab[DispNow/1%10]; P0=0xFD;break;
case 2:P2=Tab[DispNow/10%10]|(~Tab[8]); P0=0xFB;break;
case 3:P2=Tab[DispNow/100%10]; P0=0xF7;break;
case 4:P2=Tab[DispNow/1000%10]; P0=0xEF;break;
case 5:P2=Tab[DispNow/10000%10]; P0=0xDF;break;
case 6:P2=Tab[DispNow/100000%10]; P0=0xBF;break;
case 7:if(Method)P2=0x02;else P2=0; P0=0x7F;break;
}
Delay(100);cfDispPos++;
if(cfDispPos>=8){cfDispPos=0;}
}
}
}
chepin.rar_51单片机测频_单片机 测频_单片机测频_测频 单片机
版权申诉
99 浏览量
2022-09-14
16:13:19
上传
评论
收藏 1KB RAR 举报
我虽横行却不霸道
- 粉丝: 72
- 资源: 1万+
最新资源
- JavaScript《基于自动分析数据并给出营业建议的餐厅管理系统(接入AI) 》+源代码+项目说明及资料
- 355670834783295707ad04e-427f-4cde-9589-e578224a8459.zip
- 动态sql解析引擎,类似mybatis动态sql的功能
- EDA365-Skill-V2.5安装包,支持Allegro17.x版本
- C# 常用单词汇总,常用单词汇总
- 【ERP标准流程-标准流程-库内业务管理】(DOC 14页).doc
- Python《数据库期末作业-餐厅点单系统 》+源代码+设计资料
- 学生成绩管理系统(C++课程设计
- 双指针法判断链表有环-go语言实现
- MyBatis动态SQL是一种强大的特性,它允许我们在SQL语句中根据条件动态地添加或删除某些部分,从而实现更加灵活和高效的数据
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0