基于AT89C51芯片,用C语言在keil5中写一个程序。要求系统能随时启动、停止直流电动机,并检测直流电动机转速;利用LCD1602显示电机转速。当速度超过一定值或者低于一定值时可以通过蜂鸣器报警
时间: 2023-12-03 07:47:11 浏览: 95
10-基于AT89C51的直流电机转速控制仿真(汇编程序+仿真)
以下是基于AT89C51芯片,用C语言在keil5中编写的程序。程序实现了启动、停止直流电动机,并检测直流电动机转速;利用LCD1602显示电机转速。当速度超过一定值或者低于一定值时,通过蜂鸣器报警。
```
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD_RS P2_0 // LCD1602命令/数据选择输入引脚
#define LCD_RW P2_1 // LCD1602读/写选择输入引脚
#define LCD_EN P2_2 // LCD1602使能引脚
#define LCD_DAT P0 // LCD1602数据引脚
#define BUZZER P1_7 // 蜂鸣器引脚
sbit motor = P3^0; // 直流电动机引脚
uchar speed = 0; // 直流电动机转速
void delay(uint xms) // 延时函数,xms即延时的毫秒数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void write_cmd(uchar cmd) // 写命令函数
{
LCD_RS = 0; // 告诉LCD1602这是命令
LCD_RW = 0; // 告诉LCD1602要写入
LCD_EN = 0; // 先拉低使能引脚
LCD_DAT = cmd; // 写入命令
delay(5); // 等待5ms
LCD_EN = 1; // 拉高使能引脚,完成写入
delay(5); // 等待5ms
LCD_EN = 0; // 再次拉低使能引脚
}
void write_data(uchar dat) // 写数据函数
{
LCD_RS = 1; // 告诉LCD1602这是数据
LCD_RW = 0; // 告诉LCD1602要写入
LCD_EN = 0; // 先拉低使能引脚
LCD_DAT = dat; // 写入数据
delay(5); // 等待5ms
LCD_EN = 1; // 拉高使能引脚,完成写入
delay(5); // 等待5ms
LCD_EN = 0; // 再次拉低使能引脚
}
void init_lcd() // 初始化LCD1602函数
{
write_cmd(0x38); // 设置16*2显示,5*7点阵,8位数据接口
write_cmd(0x0c); // 显示开,光标关闭
write_cmd(0x06); // 光标右移,不移动显示
write_cmd(0x01); // 清屏
}
void display_speed() // 显示速度函数
{
uchar i;
uchar str[5] = {'0', '0', '0', '0', '0'}; // 初始化字符串
for(i=0;i<5;i++)
{
str[i] = speed % 10 + '0'; // 将数字转换为字符
speed /= 10;
}
write_cmd(0x80); // 光标移动到第一行第一列
for(i=0;i<5;i++)
write_data(str[4-i]); // 逆序输出字符串
write_data('r');
write_data('p');
write_data('m');
}
void main()
{
uchar alarm_flag = 0; // 报警标志,0表示未报警,1表示超速报警,2表示低速报警
init_lcd(); // 初始化LCD1602
motor = 0; // 关闭直流电动机
while(1)
{
if(P3_1 == 0) // 按下启动按钮
{
motor = 1; // 启动直流电动机
alarm_flag = 0; // 取消报警
}
if(P3_2 == 0) // 按下停止按钮
{
motor = 0; // 停止直流电动机
speed = 0; // 速度清零
alarm_flag = 0; // 取消报警
}
if(motor == 1) // 直流电动机正在转动
{
delay(100); // 延时100ms
speed = (uchar)(_cror((unsigned char)TH0, 1)); // 计算速度,TH0为定时器0的高8位
display_speed(); // 显示速度
if(speed > 200) // 超过一定值
{
if(alarm_flag != 1) // 如果未报警
{
BUZZER = 1; // 报警
alarm_flag = 1; // 标志为超速报警
}
}
else if(speed < 100) // 低于一定值
{
if(alarm_flag != 2) // 如果未报警
{
BUZZER = 1; // 报警
alarm_flag = 2; // 标志为低速报警
}
}
else // 正常转速
{
BUZZER = 0; // 停止报警
alarm_flag = 0; // 取消报警
}
}
}
}
```
阅读全文