C51单片机利用 LCD1602 显示外部方波信号的频率。方波信号来自信号发生器。频率的测量范围是 1000HZ~2000Hz。频率精确到个位即可。显示的样式为“####Hz”,要求在外部方波频率改变的时候,实验显示的频率值也要跟随改变。所用的动态数码管连续相邻即可,没有用到的数码管不得有任何的显示。Keil程序代码
时间: 2024-02-29 08:53:03 浏览: 112
基于51单片机实现的频率计程序,通过51单片机的计数器来实现频率测量
以下是使用C51单片机和LCD1602显示器测量外部方波信号频率的Keil程序代码:
```
#include <reg52.h>
#include <intrins.h>
#define LCD1602_DB P0
sbit LCD1602_RS = P2^0;
sbit LCD1602_RW = P2^1;
sbit LCD1602_EN = P2^2;
unsigned int count = 0; // 计数器
unsigned char frequency[5] = " Hz"; // 存储频率值的数组
void delay(unsigned int i) // 延时函数
{
while(i--);
}
void write_command(unsigned char command) // 写命令函数
{
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = command;
LCD1602_EN = 1;
_nop_();
_nop_();
LCD1602_EN = 0;
delay(5);
}
void write_data(unsigned char data) // 写数据函数
{
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = data;
LCD1602_EN = 1;
_nop_();
_nop_();
LCD1602_EN = 0;
delay(5);
}
void init_LCD1602() // 初始化LCD1602函数
{
write_command(0x38); // 设置16x2显示,5x7点阵,8位数据
write_command(0x0c); // 开显示,关光标
write_command(0x06); // 指针加1,不移动屏幕
write_command(0x01); // 清屏
}
void display_frequency(unsigned int freq) // 显示频率函数
{
frequency[0] = freq / 1000 % 10 + '0'; // 千位
frequency[1] = freq / 100 % 10 + '0'; // 百位
frequency[2] = freq / 10 % 10 + '0'; // 十位
frequency[3] = freq % 10 + '0'; // 个位
for(int i = 0; i < 5; i++) // 显示频率值
{
if(frequency[i] == ' ') // 不显示空格
{
write_data(' '); // 写空格
}
else
{
write_data(frequency[i]); // 写数字
}
}
}
void main()
{
TMOD = 0x05; // 定时器0工作在模式1,定时器1工作在模式0
TH0 = 0; // 定时器0高8位初始值
TL0 = 0; // 定时器0低8位初始值
TH1 = 0; // 定时器1高8位初始值
TL1 = 0; // 定时器1低8位初始值
ET0 = 1; // 允许定时器0中断
TR0 = 1; // 启动定时器0
TR1 = 1; // 启动定时器1
EA = 1; // 允许总中断
init_LCD1602(); // 初始化LCD1602
while(1)
{
display_frequency(count); // 显示频率值
delay(1000); // 延时1秒
}
}
void timer0() interrupt 1 // 定时器0中断函数
{
TH0 = 0; // 定时器0高8位重置
TL0 = 0; // 定时器0低8位重置
count++; // 计数器加1
}
void timer1() interrupt 3 // 定时器1中断函数
{
count = 0; // 计数器清零
}
```
程序中用到了定时器0和定时器1来测量外部方波信号的频率。定时器0每计满一次就加1,定时器1每隔一秒就清零计数器。程序中还用到了LCD1602显示器来显示测量到的频率值,显示的样式为“####Hz”,其中#代表数字。程序能够在外部方波频率改变的时候,实时更新显示的频率值。
阅读全文