51单片机使用LCD1602实时显示当前PWM风扇转速的C语言代码
时间: 2023-11-28 16:49:56 浏览: 131
红外解码+LCD1602显示,51单片机C语言代码
以下是使用51单片机和LCD1602实时显示PWM风扇转速的C语言代码。
```
#include <reg52.h>
#include <intrins.h>
#define LCD1602_DATA P0 // LCD1602数据端口
sbit RS = P2^6; // LCD1602 RS引脚
sbit EN = P2^5; // LCD1602 EN引脚
sbit FAN = P1^2; // PWM风扇控制引脚
unsigned int speed = 0; // 风扇转速计数器
unsigned char pos = 0; // LCD1602显示位置
// 延时函数
void delay(unsigned int t)
{
while(t--);
}
// LCD1602写命令
void lcd_write_cmd(unsigned char cmd)
{
RS = 0; // RS置0表示写命令
LCD1602_DATA = cmd;
EN = 1; // 使能
_nop_();
EN = 0; // 禁能
delay(10); // 等待10us
}
// LCD1602写数据
void lcd_write_data(unsigned char dat)
{
RS = 1; // RS置1表示写数据
LCD1602_DATA = dat;
EN = 1; // 使能
_nop_();
EN = 0; // 禁能
delay(10); // 等待10us
}
// LCD1602初始化
void lcd_init()
{
lcd_write_cmd(0x38); // 初始化
lcd_write_cmd(0x0c); // 开显示
lcd_write_cmd(0x06); // 光标右移,不移动显示
lcd_write_cmd(0x01); // 清屏
}
// 16位定时器0中断服务程序
void timer0_isr() interrupt 1
{
TH0 = 0xfc; // 重装初值
TL0 = 0x67;
speed++; // 计数器加1
}
// PWM风扇控制函数
void fan_control(unsigned char duty)
{
if(duty == 0) // 占空比为0
{
FAN = 0; // 关闭风扇
}
else if(duty == 100) // 占空比为100
{
FAN = 1; // 打开风扇
}
else // 占空比在0~100之间
{
FAN = 1; // 打开风扇
delay(duty * 10); // 延时
FAN = 0; // 关闭风扇
delay((100 - duty) * 10); // 延时
}
}
// 主函数
void main()
{
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0xfc; // 初始值
TL0 = 0x67;
TR0 = 1; // 启动定时器0
ET0 = 1; // 开中断
EA = 1; // 总中断开启
lcd_init(); // LCD1602初始化
while(1)
{
fan_control(50); // 控制PWM风扇占空比为50%
delay(5000); // 延时5s
fan_control(0); // 控制PWM风扇占空比为0%
delay(5000); // 延时5s
// 显示当前风扇转速
lcd_write_cmd(0x01); // 清屏
lcd_write_cmd(0x80 | pos); // 设置光标位置
lcd_write_data('S');
lcd_write_data('p');
lcd_write_data('e');
lcd_write_data('e');
lcd_write_data('d');
lcd_write_data(':');
lcd_write_data(' ');
lcd_write_data(speed / 10 + '0');
lcd_write_data(speed % 10 + '0');
pos += 16; // 光标位置加16
if(pos >= 32) // 光标位置超出范围,重新设为0
{
pos = 0;
}
speed = 0; // 计数器清零
}
}
```
这个代码中使用了定时器0来计数风扇转速,同时使用PWM控制风扇占空比。LCD1602用于实时显示当前风扇转速。你需要根据自己的具体硬件连接情况进行相应的修改。
阅读全文