#include <REGX52.H>
#include "juzhen.h"
#define uchar unsigned char
#define uint unsigned int
sbit INT=P3^3;
uchar keynum,key_down,key_up,key_flag,key_old;
uchar smg[]={10,10,10,10,10,10};
uchar smg_duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
uchar pos;
uint smg_flag,F;
uchar count;
unsigned long kuandu;
bit moshi;//0 频率 1 脉宽
bit jinzhi;//0 us 1ms
void key_disp()
{
// if(key_flag)return;
// key_flag=1;//20ms
keynum=juzhen();
// key_down=keynum&(key_old^keynum);
// key_old=keynum;
if(keynum==1)moshi^=1;
if(keynum==2)jinzhi^=1;
}
void smg_disp()
{
if(moshi==0)
{
smg[5]=moshi;
smg[4]=F/10000%10;
smg[3]=F/1000%10;
smg[2]=F/100%10;
smg[1]=F/10%10;
smg[0]=F%10;
}else
{
if(jinzhi==0)
{
smg[5]=moshi;
smg[4]=kuandu/10000%10;
smg[3]=kuandu/1000%10;
smg[2]=kuandu/100%10;
smg[1]=kuandu/10%10;
smg[0]=kuandu%10;
}else
{
smg[5]=moshi;
smg[4]=kuandu/10000000%10;
smg[3]=kuandu/1000000%10;
smg[2]=kuandu/100000%10;
smg[1]=kuandu/10000%10;
smg[0]=kuandu/1000%10;
}
}
}
void xinxi_disp()
{
if(smg_flag)return;
smg_flag=1;
if(moshi)
{
while(INT==1);
while(INT==0);
TR1=1;
while(INT==1);
TR1=0;
kuandu=count*65535+(TH1<<8|TL1);
TH1=TL1=0;
count=0;
}
// P1_0=jinzhi;
}
void smg_scanf(uchar wei,shu)
{
P0=0x00;
P2=~(0x01<<wei);
P0=smg_duan[shu];
}
void Timer0_Init() //[email protected]
{
TMOD &= 0xF0; //???????
TMOD |= 0x05; //???????
TL0 = 0x00; //???????
TH0 = 0x00; //???????
TF0 = 0; //??TF0??
TR0 = 1; //???0????
}
void Timer1_Init() //[email protected]
{
TMOD &= 0x0F; //???????
TMOD |= 0x90;
TL1 = 0; //???????
TH1 = 0; //???????
TF1 = 0; //??TF1??
TR1 = 1; //???1????
ET1=1;
EA=1;
}
void Timer2_Init()
{
T2MOD = 0;
T2CON = 0;
TL2 = 0x18;
TH2 = 0xFC;
RCAP2L = 0x18;
RCAP2H = 0xFC;
TR2 = 1;
ET2=1;
PT2=1;
EA=1;
}
void main()
{
Timer0_Init();
Timer1_Init();
Timer2_Init();
while(1)
{
xinxi_disp();
key_disp();
smg_disp();
}
}
void Timer1() interrupt 3
{
TF1=0;
count++;
}
void Timer2() interrupt 5
{
TF2=0;
if(++pos==6)pos=0;
if(++key_flag==20){key_flag=0;juzhen_Loop();}
smg_scanf(pos,smg[pos]);
if(++smg_flag==1000)
{
TR0=0;
F=(TH0<<8)|TL0;
smg_flag=0;
TH0=TL0=0;
TR0=1;
}
}
基于51单片机的频率计
需积分: 0 88 浏览量
更新于2023-06-23
3
收藏 183KB ZIP AIGC 举报
【基于51单片机的频率计】
51单片机是微控制器领域中的经典型号,广泛应用于电子设备和教学实验。在这个项目中,我们利用51单片机设计了一个频率计,它能够通过测频法采集外部脉冲信号,并在6位数码管上实时显示频率值。此外,该频率计还具备测量脉宽的功能,适用于大范围的脉宽测量,用户可以通过按键在频率显示和脉宽显示之间进行切换。
**一、51单片机基础**
51单片机是Intel公司8051系列的一种,采用CISC(复杂指令集计算)架构。它内置4KB ROM(程序存储器)、128B RAM(数据存储器)、32个可编程I/O口线以及多个定时/计数器,非常适合初学者学习和用于各种控制应用。51单片机的开发工具通常包括编程器、仿真器和开发软件,如Keil uVision。
**二、频率计工作原理**
1. **测频法**:频率计通过计数器记录一定时间内的外部脉冲个数,然后根据计数结果和时间间隔计算出频率。公式为:`频率 = (脉冲数 / 时间) * 采样周期的倒数`。在51单片机中,可以使用定时器作为计数器,设定一个固定的采样周期,例如1秒,然后计数器累加外部脉冲的次数。
2. **脉宽测量**:脉宽是指脉冲信号的高电平或低电平持续时间。对于大范围脉宽测量,51单片机可以设置两个定时器,一个作为启动计时器,另一个作为停止计时器。当检测到脉冲的边沿变化时,启动计时器开始计数,直到下一个边沿变化,停止计时器记录这段时间,从而得到脉宽。
**三、硬件设计**
1. **数码管显示**:6位数码管通常由7段LED组成,通过驱动电路和译码器控制每个段的亮灭,来显示数字。51单片机通过I/O口输出相应的电平控制数码管的显示。
2. **按键输入**:至少需要两个按键,一个用于开始/停止测量,另一个用于模式切换(频率/脉宽)。按键信号需通过去抖动处理,避免因按键抖动造成误操作。
3. **脉冲输入接口**:51单片机的一个I/O口作为脉冲输入,通过中断或者轮询方式检测脉冲变化。
**四、软件设计**
1. **定时器配置**:根据需要选择合适的定时器模式,如方式1(16位定时器)或方式2(8位自动重载定时器),设置适当的预分频因子和初值,确保定时器能在所需时间内完成计数。
2. **中断处理**:对脉冲输入和按键事件设置中断服务函数,实现高效的数据处理和模式切换。
3. **计数算法**:编写计数算法,包括频率计算和脉宽计算,确保精度和实时性。
4. **显示更新**:将计算结果转换为数码管可显示的格式,通过I/O口驱动数码管显示。
**五、实验步骤与调试**
1. 硬件搭建:连接51单片机、数码管、按键和脉冲信号源。
2. 编程:使用Keil uVision等开发工具编写C语言程序。
3. 下载与调试:通过编程器将程序烧录到51单片机,观察并调试数码管显示和按键功能。
这个基于51单片机的频率计项目不仅涵盖了单片机基本原理,还涉及了定时器、中断、数码管显示和按键处理等实用技能,对于提升电子工程和嵌入式系统开发能力有很好的实践意义。

『CoolGuy』
- 粉丝: 440
最新资源
- 基于plc柔性制造生产线中物料立体仓库的设计-毕设论文.doc
- 精益求精-创新驱动网站发展——我在2023年的网站编辑工作总结.doc
- 网络素养教案案例.doc
- 综合布线施工组织设计方案.doc
- 简洁IOS风格国外商务ppt模板.pptx
- 互联网时代心得体会[迎接高清影音时代].doc
- 网络营销方案推荐.doc
- 某海事局大厦综合布线设计专业技术方案...doc
- 电气工程求职信500字-电气自动化工程师求职信(五篇).docx
- Unit5IntotheWildUnderstandingideas教学设计-高中英语外研版(1)2.docx
- 2-3用算法解决问题的过程课件-高中信息技术浙教版必修1.pptx
- 人教A版高中数学高三一轮第十章统计统计案例及算法初步104第2讲基本算法语句【素材】.doc
- 基于Jboss-Seam框架的中小型IT企业项目管理系统的研究和实现培训资料.ppt
- 软件行业保密协议书范本.doc
- 互联网电子商务大数据PPT模板.pptx
- 2021互联网战略合作协议模板.doc