基于51单片机的简易数字频率计的设计程序
时间: 2023-11-15 14:06:38 浏览: 129
以下是基于51单片机的简易数字频率计的设计程序:
```
#include <reg51.h>
void delay(unsigned int); // 延时函数
void display(unsigned char); // 数码管显示函数
void init_timer0(void); // 定时器0初始化函数
unsigned char code table[] = { // 数码管段码表
0x3f, 0x06, 0x5b, 0x4f, 0x66,
0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
unsigned int count = 0; // 计数器
void main() {
unsigned int freq; // 频率
unsigned char digit1, digit2, digit3, digit4; // 数码管显示的四位数码
init_timer0(); // 初始化定时器0
while(1) {
freq = count * 10; // 计算频率
digit1 = freq / 1000; // 计算千位数码
digit2 = freq / 100 % 10; // 计算百位数码
digit3 = freq / 10 % 10; // 计算十位数码
digit4 = freq % 10; // 计算个位数码
display(digit1); // 显示千位数码
P2 = 0x08; // 选择第二位数码管
delay(5); // 延时一段时间
display(digit2); // 显示百位数码
P2 = 0x04; // 选择第三位数码管
delay(5); // 延时一段时间
display(digit3); // 显示十位数码
P2 = 0x02; // 选择第四位数码管
delay(5); // 延时一段时间
display(digit4); // 显示个位数码
P2 = 0x01; // 选择第一位数码管
delay(5); // 延时一段时间
}
}
void delay(unsigned int time) { // 延时函数
unsigned int i, j;
for(i = 0; i < time; i++) {
for(j = 0; j < 120; j++);
}
}
void display(unsigned char digit) { // 数码管显示函数
P0 = table[digit]; // 设置P0口为对应数码的段码
}
void init_timer0(void) { // 定时器0初始化函数
TMOD = 0x01; // 设置定时器0为模式1
TH0 = 0xFC; // 定时器0初值为0xFC67,定时1ms
TL0 = 0x67;
TR0 = 1; // 启动定时器0
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
}
void timer0_isr(void) interrupt 1 { // 定时器0中断服务程序
count++; // 计数器加一
}
```
在程序中,我们使用定时器0来计数一定时间内的脉冲数,然后根据计数器的值计算频率,并将频率显示在四位数码管上。程序中还包括延时函数、数码管显示函数和定时器0中断服务程序。在程序中,我们使用了P0口来控制数码管的段码,使用P2口来选择显示的数码管。通过不断改变P2口的值,可以实现四位数码管的显示。
阅读全文