51单片机测量频率和占空比并用LCD显示代码

时间: 2023-11-26 16:05:14 浏览: 33
下面是用51单片机测量频率和占空比并用LCD显示的代码,注释已经添加在代码中: ```c #include <reg51.h> // 定义LCD显示所需的引脚和命令 #define LCD_RS P2_0 #define LCD_RW P2_1 #define LCD_EN P2_2 #define LCD_DAT P0 // 定义计时器计数值和捕获寄存器值 unsigned int count = 0; unsigned int capture = 0; // 函数声明 void LCD_Init(); void LCD_Com(unsigned char com); void LCD_Data(unsigned char dat); void LCD_Str(unsigned char *str); void delay(unsigned int t); void Timer_Init(); void Interrupt_Init(); void main() { // 初始化LCD和定时器 LCD_Init(); Timer_Init(); Interrupt_Init(); // 无限循环 while(1) { // 计算频率和占空比 float freq = 11059200.0 / (capture * 12.0); float duty = (capture - count) * 100.0 / capture; // 将频率和占空比转换为字符串 char freq_str[16]; char duty_str[16]; sprintf(freq_str, "Freq: %.2f Hz", freq); sprintf(duty_str, "Duty: %.2f %%", duty); // 在LCD上显示频率和占空比 LCD_Com(0x80); // 光标移到第一行第一列 LCD_Str(freq_str); LCD_Com(0xC0); // 光标移到第二行第一列 LCD_Str(duty_str); // 等待一段时间 delay(1000); } } // LCD初始化函数 void LCD_Init() { LCD_Com(0x38); // 显示模式设置:16*2显示,5*7点阵,8位数据总线 LCD_Com(0x0C); // 显示控制:显示开,光标关,光标闪烁关 LCD_Com(0x06); // 输入模式设置:光标右移,字符不移动 LCD_Com(0x01); // 清屏 } // 发送LCD命令函数 void LCD_Com(unsigned char com) { LCD_RS = 0; // 选择命令寄存器 LCD_RW = 0; // 选择写入模式 LCD_DAT = com; // 发送命令 LCD_EN = 1; // 使能LCD delay(1); // 延时 LCD_EN = 0; // 关闭LCD } // 发送LCD数据函数 void LCD_Data(unsigned char dat) { LCD_RS = 1; // 选择数据寄存器 LCD_RW = 0; // 选择写入模式 LCD_DAT = dat; // 发送数据 LCD_EN = 1; // 使能LCD delay(1); // 延时 LCD_EN = 0; // 关闭LCD } // 在LCD上显示字符串函数 void LCD_Str(unsigned char *str) { while(*str != '\0') { LCD_Data(*str++); } } // 延时函数 void delay(unsigned int t) { unsigned int i, j; for(i = 0; i < t; i++) for(j = 0; j < 125; j++); } // 定时器初始化函数 void Timer_Init() { TMOD = 0x10; // 定时器1工作在模式1:16位定时器,仅用TR1打开 TH1 = 0x00; // 设置定时初值 TL1 = 0x00; TR1 = 1; // 打开定时器 } // 中断初始化函数 void Interrupt_Init() { EA = 1; // 总中断开关 ET1 = 1; // 打开定时器1中断 EX1 = 1; // 打开外部中断1(捕获中断) IT1 = 1; // 设置外部中断1下降沿触发 } // 定时器1中断服务函数 void Timer1_ISR() interrupt 3 { count++; // 计数器加1 } // 外部中断1(捕获中断)服务函数 void External1_ISR() interrupt 2 { capture = TH1 * 256 + TL1; // 读取捕获寄存器值 count = 0; // 计数器清零 TH1 = 0x00; // 重置定时器初值 TL1 = 0x00; } ``` 注:该代码仅作为示例,具体实现方式可能会因为硬件等原因而有所不同。建议根据具体硬件情况进行调整。

相关推荐

最新推荐

recommend-type

单片机测量占空比、方波的频率及其相位差方法论.doc

当脉冲的上升沿来临时,将定时器打开;紧接着的下降沿来临时,读取定时器的值,假设定时时间为t1;下一个上升沿来临时关闭定时器,读取定时器的值,假设定时...一个比较好的思路,可以试一下~文档内附有部分代码和截图
recommend-type

输出两路占空比和频率可调的互补PWM

如何利用STM32通用定时器实现输出两路占空比和频率可调的互补PWM ,高级定时器资源有限,本文利用通用定时器(General-purpose timers)实现互补PWM输出,在高级定时器资源不够时不失为一个好方法。
recommend-type

51单片机模拟PWM输出占空比可调.doc.doc

51单片机模拟PWM输出占空比可调.docdoc,51单片机模拟PWM输出占空比可调.doc
recommend-type

51单片机脉冲宽度调制(PWM)控制LED灯亮度

绍一个51系列单片机采用脉冲宽度调制(PWM)方式控制LED灯亮度的一个程序,大家都知道,51单片机本身是没有pwm接口的,这个程序是通过软件...在一定的频率的方波中,调整高电平和低电平的占空比,即可实现LED灯亮度控制。
recommend-type

基于51单片机和Proteus仿真的波形发生器设计

一个能产生正弦波、方波、三角波、梯形波、锯齿波的波形发生器。 用数码管显示每次输出波的类型,输出正弦波时数码管显示1;...方波的占空比可调。五种波的频率可调。五种波的幅度可调。电源指示灯。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

spring添加xml配置文件

1. 创建一个新的Spring配置文件,例如"applicationContext.xml"。 2. 在文件头部添加XML命名空间和schema定义,如下所示: ``` <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。