51单片机测量频率和占空比并使用LCD液晶屏显示结果代码
时间: 2024-03-10 07:46:14 浏览: 17
以下是51单片机测量频率和占空比并使用LCD液晶屏显示结果的代码示例:
```C
#include <reg52.h>
#include <intrins.h>
#define LCD1602_DB P0 //LCD1602数据总线
sbit LCD1602_RS = P1^0; //LCD1602命令/数据选择引脚
sbit LCD1602_RW = P1^1; //LCD1602读/写选择引脚
sbit LCD1602_E = P1^2; //LCD1602使能引脚
sbit PWM_IN = P3^3; //PWM信号输入引脚
unsigned int high_time = 0; //高电平时间
unsigned int low_time = 0; //低电平时间
unsigned int total_time = 0; //总时间
unsigned int freq = 0; //频率
unsigned char duty = 0; //占空比
void Init_LCD1602(); //LCD1602初始化函数
void Write_Command(unsigned char command); //向LCD1602写入指令
void Write_Data(unsigned char data); //向LCD1602写入数据
void main()
{
Init_LCD1602(); //初始化LCD1602
TMOD = 0x09; //定时器0工作在模式1,定时器1工作在模式2
TH1 = 0; //定时器1计数初值
TL1 = 0;
TR1 = 1; //启动定时器1
while(1)
{
while(PWM_IN); //等待PWM信号为低电平
while(!PWM_IN); //等待PWM信号为高电平
TF1 = 0; //清除定时器1溢出标志
high_time = (unsigned int)TH1*256 + TL1; //计算高电平时间
while(PWM_IN); //等待PWM信号为低电平
low_time = (unsigned int)TH1*256 + TL1; //计算低电平时间
total_time = high_time + low_time; //计算总时间
if(total_time != 0) //避免除数为0
{
freq = 1000000/total_time; //计算频率
duty = (unsigned char)(high_time*100/total_time); //计算占空比
Write_Command(0x80); //将光标移动到第一行第一列
Write_Data('f'); //显示频率
Write_Data(':');
Write_Data(freq/10000+'0');
Write_Data(freq%10000/1000+'0');
Write_Data(freq%1000/100+'0');
Write_Data(freq%100/10+'0');
Write_Data(freq%10+'0');
Write_Data('H');
Write_Data('z');
Write_Command(0xC0); //将光标移动到第二行第一列
Write_Data('d'); //显示占空比
Write_Data(':');
Write_Data(duty/100+'0');
Write_Data(duty%100/10+'0');
Write_Data(duty%10+'0');
Write_Data('%');
}
}
}
void Init_LCD1602()
{
Write_Command(0x38); //开启显示,设置数据总线为8位,显示模式为2行5x7点阵
Write_Command(0x0C); //开启显示,关闭光标,不闪烁
Write_Command(0x06); //光标右移,字符不移动
Write_Command(0x01); //清除显示,光标回到原点
}
void Write_Command(unsigned char command)
{
LCD1602_RS = 0; //选择命令模式
LCD1602_RW = 0; //选择写入模式
LCD1602_E = 0; //使能引脚置低
_nop_(); //延时
LCD1602_DB = command; //写入命令
_nop_(); //延时
LCD1602_E = 1; //使能引脚置高
_nop_(); //延时
LCD1602_E = 0; //使能引脚置低
}
void Write_Data(unsigned char data)
{
LCD1602_RS = 1; //选择数据模式
LCD1602_RW = 0; //选择写入模式
LCD1602_E = 0; //使能引脚置低
_nop_(); //延时
LCD1602_DB = data; //写入数据
_nop_(); //延时
LCD1602_E = 1; //使能引脚置高
_nop_(); //延时
LCD1602_E = 0; //使能引脚置低
}
```
该代码使用定时器1来测量PWM信号的高电平时间和低电平时间,然后计算出频率和占空比,并使用LCD液晶屏分别显示出来。注意,在使用该代码时需要将PWM信号输入引脚连接到单片机的P3.3引脚,将LCD1602数据总线连接到单片机的P0口,将LCD1602命令/数据选择引脚连接到单片机的P1.0引脚,将LCD1602读/写选择引脚连接到单片机的P1.1引脚,将LCD1602使能引脚连接到单片机的P1.2引脚。