c51数字频率计运行代码
时间: 2023-12-01 15:03:00 浏览: 24
以下是一个简单的C51数字频率计的代码,可以实现测量输入信号的频率并在LCD显示屏上显示出来。请注意,此代码仅供参考,具体实现可能会因硬件配置和具体需求而有所不同。
```c
#include <reg52.h>
#include <intrins.h>
#define FREQ_IN P3_2 // 输入信号引脚
#define LCD_EN P2_1 // LCD使能引脚
#define LCD_RS P2_0 // LCD指令/数据选择引脚
#define LCD_DAT P1 // LCD数据总线
// 延时函数
void delay(unsigned int t) {
while (t--) {
_nop_();
_nop_();
_nop_();
_nop_();
}
}
// 1602 LCD显示屏初始化函数
void LCD_Init() {
LCD_RS = 0;
LCD_EN = 0;
delay(15);
LCD_DAT = 0x30;
LCD_EN = 1;
LCD_EN = 0;
delay(5);
LCD_DAT = 0x30;
LCD_EN = 1;
LCD_EN = 0;
delay(1);
LCD_DAT = 0x30;
LCD_EN = 1;
LCD_EN = 0;
LCD_DAT = 0x38;
LCD_EN = 1;
LCD_EN = 0;
LCD_DAT = 0x08;
LCD_EN = 1;
LCD_EN = 0;
LCD_DAT = 0x01;
LCD_EN = 1;
LCD_EN = 0;
LCD_DAT = 0x06;
LCD_EN = 1;
LCD_EN = 0;
LCD_DAT = 0x0c;
LCD_EN = 1;
LCD_EN = 0;
}
// 将一个字节的数据写入LCD
void LCD_WriteByte(unsigned char dat) {
LCD_DAT = dat;
LCD_RS = 1;
LCD_EN = 1;
LCD_EN = 0;
}
// 在LCD上显示一个字符
void LCD_WriteChar(unsigned char c) {
LCD_RS = 1;
LCD_EN = 1;
LCD_EN = 0;
LCD_DAT = c;
LCD_RS = 0;
}
// 在LCD上显示一个字符串
void LCD_WriteString(unsigned char *str) {
while (*str) {
LCD_WriteChar(*str++);
}
}
// 从LCD上清除屏幕
void LCD_Clear() {
LCD_WriteByte(0x01);
delay(5);
}
// 将一个整数转换为字符串
void int2str(unsigned int num, unsigned char *str) {
unsigned char i = 0, j = 0, k = 0;
unsigned char buf[16];
while (num) {
buf[i++] = num % 10;
num /= 10;
}
if (i == 0) {
buf[i++] = 0;
}
while (i--) {
str[j++] = buf[i] + '0';
}
str[j] = '\0';
}
// 数字频率计主函数
void main() {
unsigned int freq = 0; // 频率计测得的频率
unsigned char str[16]; // 用于存储显示的字符串
unsigned int tick = 0; // 计数器
unsigned int last_tick = 0; // 上一次计数器的值
unsigned int delta = 0; // 计数器值的差
unsigned int overflow = 0; // 溢出次数
LCD_Init(); // 初始化LCD
LCD_Clear(); // 清屏
TMOD &= 0xf0; // 设置定时器0为16位定时器
TMOD |= 0x01;
TH0 = 0;
TL0 = 0;
TR0 = 1; // 启动定时器0
while (1) {
if (FREQ_IN) {
if (tick > last_tick) {
delta = tick - last_tick;
} else {
delta = 65536 - last_tick + tick;
overflow++;
}
last_tick = tick;
}
if (overflow >= 4) { // 如果溢出次数超过阈值,则停止计数
freq = 0;
} else {
freq = delta * 12; // 将计数值转换为频率
}
int2str(freq, str); // 将频率值转换为字符串
LCD_Clear(); // 清屏
LCD_WriteString("Freq: ");
LCD_WriteString(str); // 在LCD上显示频率值
delay(100);
}
}
// 定时器0中断服务函数
void T0_ISR() interrupt 1 {
TH0 = 0;
TL0 = 0;
tick++; // 每次定时器0中断计数器加1
}
```