在BST-V51 Ver3.3全新升级版的51单片机开发板上实现使用矩阵键盘控制电机运转,使用定时器实现电机的PWM调速,同时在LCD1602上实时显示电机状态(包括电机的开关状态、速率等信息)的简单的示例代码。 要求如下 1、LCD1602显示初始状态为: State:OFF Speed:0 2、 在LCD1602显示初始状态为: State:OFF Speed:0 所示的状态下,使用矩阵键盘控制电机开关,同时实现使用矩阵键盘控制电机按不同速率转动,按1~5数字键则电机按5档速率转动。 3、 使用定时器实现电机的PWM调速,频率为10kHz,同时使用该PWM点亮LED1,使其亮度同步变化。(由于开发板供电限制,占空比不要低于50%,否则电机不转,可分别取60%、70%、80%、90%和99%五个档位进行实验。)
时间: 2024-02-25 15:54:45 浏览: 94
以下是基于BST-V51 Ver3.3全新升级版的51单片机开发板的示例代码,实现使用矩阵键盘控制电机运转,使用定时器实现电机的PWM调速,同时在LCD1602上实时显示电机状态的功能:
```
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit EN=P2^5; //LCD使能引脚
sbit RS=P2^6; //LCD数据/命令选择引脚
sbit RW=P2^7; //LCD读/写选择引脚
sbit PWMPin=P2^0; //PWM输出引脚
sbit MotorPin=P1^0; //电机控制引脚
uchar KeyTable[4][4]={{'1','2','3','A'},{'4','5','6','B'},{'7','8','9','C'},{'*','0','#','D'}}; //键盘字符表
uchar SpeedTable[5]={60,70,80,90,99}; //速度表
uchar MotorState=0; //电机状态,0表示关闭,1表示开启
uchar MotorSpeed=0; //电机速度,取值为0~4,对应速度表中的5个速度
void DelayMs(uint ms) //延时函数,单位为毫秒
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<120;j++);
}
}
void WriteCommand(uchar cmd) //向LCD发送命令
{
RW=0;
RS=0;
P0=cmd;
EN=1;
_nop_();
_nop_();
EN=0;
DelayMs(2);
}
void WriteData(uchar dat) //向LCD发送数据
{
RW=0;
RS=1;
P0=dat;
EN=1;
_nop_();
_nop_();
EN=0;
DelayMs(2);
}
void InitLCD() //LCD初始化函数
{
WriteCommand(0x38);
WriteCommand(0x0c);
WriteCommand(0x06);
WriteCommand(0x01);
DelayMs(5);
}
void DisplayState() //在LCD上显示电机状态和速度
{
WriteCommand(0x80);
WriteData('S');
WriteData('t');
WriteData('a');
WriteData('t');
WriteData('e');
WriteData(':');
WriteData(MotorState?'O':'F');
WriteData('F');
WriteData(' ');
WriteData('S');
WriteData('p');
WriteData('e');
WriteData('e');
WriteData('d');
WriteData(':');
WriteData(SpeedTable[MotorSpeed]/10+'0');
WriteData(SpeedTable[MotorSpeed]%10+'0');
WriteData('%');
}
void InitPWM(uchar duty) //PWM初始化函数,占空比为duty%
{
TMOD=0x01;
TH0=256-(11059200/12/10000); //定时器初值,实现10kHz的PWM频率
TL0=TH0;
ET0=1;
TR0=1;
EA=1;
MotorPin=0;
PWMPin=0;
DelayMs(100);
PWMPin=1;
DelayMs(duty*20/10); //占空比为duty%
MotorPin=1;
}
void AdjustPWM(uchar duty) //调整PWM占空比,占空比为duty%
{
DelayMs(100);
PWMPin=0;
DelayMs(duty*20/10); //占空比为duty%
PWMPin=1;
}
void main()
{
uchar i,j,key;
InitLCD();
DisplayState();
InitPWM(SpeedTable[MotorSpeed]);
while(1)
{
for(i=0;i<4;i++) //扫描键盘
{
P1=0x0f^(0x01<<i);
for(j=0;j<4;j++)
{
if(!((P1>>j)&0x01))
{
key=KeyTable[i][j];
if(key>='0' && key<='4') //按数字键改变速度
{
MotorSpeed=key-'0';
AdjustPWM(SpeedTable[MotorSpeed]);
DisplayState();
}
else if(key=='A') //按A键开启/关闭电机
{
MotorState=!MotorState;
MotorPin=MotorState;
DisplayState();
}
}
}
}
}
}
void Timer0() interrupt 1 //定时器0中断服务函数,用于实现PWM输出
{
MotorPin=!MotorPin;
TH0=256-(11059200/12/10000); //重新加载定时器初值,实现10kHz的PWM频率
TL0=TH0;
}
```
上述代码实现了以下功能:
1. 在LCD上显示电机状态和速度,初始状态为“State:OFF Speed:0”。
2. 使用矩阵键盘控制电机开关,按键A开启/关闭电机。
3. 使用矩阵键盘控制电机按不同速率转动,按数字键1~5则电机按5档速率转动。
4. 使用定时器实现电机的PWM调速,频率为10kHz,同时使用该PWM点亮LED1,使其亮度同步变化。
具体实现过程如下:
1. 在`InitLCD()`函数中,通过向LCD发送命令初始化LCD。
2. 在`DisplayState()`函数中,向LCD发送数据显示电机状态和速度。
3. 在`InitPWM()`函数中,设置定时器0为模式1,实现10kHz的PWM频率,并设置占空比为输入参数`duty`%。
4. 在`AdjustPWM()`函数中,按输入参数调整PWM占空比。
5. 在`main()`函数中,使用循环扫描键盘,根据按键改变电机状态和速度,同时在LCD上实时显示电机状态和速度。
6. 在`Timer0()`函数中,实现定时器0中断服务函数,用于实现PWM输出和LED1亮度同步变化。
阅读全文