51单片机测量PWM风扇转速并且通过LCD1602显示转速的C语言代码
时间: 2023-12-10 18:42:04 浏览: 135
以下是51单片机测量PWM风扇转速并且通过LCD1602显示转速的C语言代码:
```c
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit EN=P3^4;
sbit RS=P3^5;
sbit RW=P3^6;
sbit DQ=P1^2;
uint cnt=0; //计数值
uchar flag=0; //计数标志
uchar dis[4]; //显示数组
void delay(uint t) //延时函数
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++);
}
void write_com(uchar com) //写命令函数
{
EN=0;
RS=0;
RW=0;
P0=com;
delay(5);
EN=1;
delay(5);
EN=0;
}
void write_data(uchar dat) //写数据函数
{
EN=0;
RS=1;
RW=0;
P0=dat;
delay(5);
EN=1;
delay(5);
EN=0;
}
void init() //初始化函数
{
write_com(0x38); //显示模式设置:16x2,5x7点阵,8位数据接口
write_com(0x0c); //显示控制:开显示,光标关闭,光标闪烁关闭
write_com(0x06); //光标/显示移位:光标右移,字符不移动
write_com(0x01); //清屏
}
void display() //显示函数
{
uchar i;
write_com(0x80); //设定显示地址为第一行第一列
for(i=0;i<4;i++)
write_data(dis[i]); //显示计数值
}
void timer0() interrupt 1 //定时器0中断服务函数
{
TH0=0xfc;
TL0=0x67;
cnt++; //计数值加1
if(cnt>=1000) //计数满1000
{
cnt=0; //计数清零
flag=1; //计数标志置1
}
}
void main()
{
TMOD=0x01; //定时器0工作在方式1
TH0=0xfc;
TL0=0x67;
ET0=1; //允许定时器0中断
EA=1; //开总中断
TR0=1; //启动定时器0
init(); //初始化LCD1602
while(1)
{
if(flag) //计数标志为1
{
flag=0; //计数标志清零
dis[0]=cnt/1000+0x30; //千位
dis[1]=cnt%1000/100+0x30; //百位
dis[2]=cnt%100/10+0x30; //十位
dis[3]=cnt%10+0x30; //个位
display(); //显示计数值
}
}
}
```
在这个代码中,使用了定时器0来计数,每秒中断1000次,计数值加1,当计数满1000时,计数标志置1,LCD1602显示计数值。需要注意的是,需要连接PWM风扇的PWM信号输出引脚到单片机的外部中断0/1/2引脚上,通过外部中断计算PWM信号的周期和占空比,从而计算出风扇的转速。
阅读全文