#include <reg51.h> #define uint unsigned int #define uchar unsigned char sbit IN1=P1^0; sbit IN2=P1^1; sbit ENA=P1^2; sbit k0=P2^0;//正转 sbit k1=P2^1;//反转 sbit k2=P2^2;//加速 sbit k3=P2^3;//减速 sbit k4=P2^4;//停止 uchar Counter=0,Compare=0; void delay(uint n) { uint i=0,j=0; for(i=0;i<n;i++) { for(j=0;j<120;j++); } } void Timer0_init()//100us { TMOD &= 0xF0; //设置定时器模式 TMOD |= 0x01; //设置定时器模式 TL0 = 0x9C; //设置定时初值 TH0 = 0xFF; //设置定时初值 ET0=1; EA=1; TR0=1; } void main() { ENA=0; IN1=0; IN2=0;//一开始让电机停止 Timer0_init(); Compare=50; while(1) { if(k0==0)//正转 { delay(100); while(!k0); ENA=1; IN1=1; IN2=0; } else if(k1==0)//反转 { delay(100); while(!k1); ENA=1; IN1=0; IN2=1; } else if(k2==0)//加速 { delay(100); while(!k2); Compare=Compare+20; } else if(k3==0)//减速 { delay(100); while(!k3); Compare=Compare-20; } if(k4==0)//停止 { delay(100); while(!k4); ENA=0; TR0=0; IN1=0; IN2=0; } } } void Timer0() interrupt 1 { TL0 = 0x9C; //设置定时初值 TH0 = 0xFF; //设置定时初值 Counter++; Counter%=100; if(Counter<Compare)//如果小于占空比 { IN1=1; } else { IN1=0; } }
时间: 2023-10-30 11:08:14 浏览: 41
这是一段基于51单片机的直流电机控制程序,通过按键控制电机正转、反转、加速、减速和停止。同时使用定时器0和中断实现PWM控制,达到控制电机转速的目的。其中,使用了P1口的0、1、2号引脚分别控制电机的输入端IN1、IN2和ENA。同时,使用P2口的0、1、2、3、4号引脚分别控制电机的正转、反转、加速、减速和停止。程序还定义了一个计数器Counter和一个比较值Compare,用于控制PWM的占空比。
相关问题
#include <reg52.h> #define uint unsigned int #define uchar unsigned char sbit IN1=P1^0; sbit IN2=P1^1; sbit ENA=P1^2; sbit k0=P2^0;//正转 sbit k1=P2^1;//反转 sbit k2=P2^2;//加速 sbit k3=P2^3;//减速 sbit k4=P2^4;//停止 uchar Counter=0,Compare=0; void delay(uint n) { uint i=0,j=0; for(i=0;i<n;i++) { for(j=0;j<120;j++); } } void Timer0_init()//100us { TMOD &= 0xF0; //设置定时器模式 TMOD |= 0x01; //设置定时器模式 TL0 = 0x9C; //设置定时初值 TH0 = 0xFF; //设置定时初值 ET0=1; EA=1; TR0=1; } void main() { ENA=0; IN1=0; IN2=0;//一开始让电机停止 Timer0_init(); Compare=50; while(1) { if(k0==0)//正转 { delay(100); while(!k0); ENA=1; IN1=1; IN2=0; } else if(k1==0)//反转 { delay(100); while(!k1); ENA=1; IN1=0; IN2=1; } else if(k2==0)//加速 { delay(100); while(!k2); Compare=Compare+20; } else if(k3==0)//减速 { delay(100); while(!k3); Compare=Compare-20; } if(k4==0)//停止 { delay(100); while(!k4); ENA=0; TR0=0; IN1=0; IN2=0; } } } void Timer0() interrupt 1 { TL0 = 0x9C; //设置定时初值 TH0 = 0xFF; //设置定时初值 Counter++; Counter%=100; if(Counter<Compare)//如果小于占空比 { IN1=1; } else { IN1=0; } }优化代码
以下是对代码进行优化后的版本:
```
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit IN1 = P1^0;
sbit IN2 = P1^1;
sbit ENA = P1^2;
sbit k0 = P2^0; //正转
sbit k1 = P2^1; //反转
sbit k2 = P2^2; //加速
sbit k3 = P2^3; //减速
sbit k4 = P2^4; //停止
uchar Compare = 50; //占空比
bit isRunning = 0; //电机是否正在运行
bit isForward = 1; //电机方向是否为正转
void delay(uint n) {
uint i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < 120; j++);
}
}
void Timer0_init() {
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x9C; //设置定时初值
TH0 = 0xFF; //设置定时初值
ET0 = 1;
EA = 1;
TR0 = 1;
}
void motorStop() {
ENA = 0;
TR0 = 0;
IN1 = 0;
IN2 = 0;
isRunning = 0;
}
void motorStart() {
ENA = 1;
TR0 = 1;
isRunning = 1;
}
void motorForward() {
IN1 = 1;
IN2 = 0;
isForward = 1;
}
void motorBackward() {
IN1 = 0;
IN2 = 1;
isForward = 0;
}
void main() {
ENA = 0;
IN1 = 0;
IN2 = 0;
Timer0_init();
while (1) {
if (k0 == 0) { //正转
delay(100);
while (!k0);
motorStop();
motorForward();
motorStart();
} else if (k1 == 0) { //反转
delay(100);
while (!k1);
motorStop();
motorBackward();
motorStart();
} else if (k2 == 0) { //加速
delay(100);
while (!k2);
Compare += 20;
} else if (k3 == 0) { //减速
delay(100);
while (!k3);
Compare -= 20;
} else if (k4 == 0) { //停止
delay(100);
while (!k4);
motorStop();
}
}
}
void Timer0() interrupt 1 {
TL0 = 0x9C;
TH0 = 0xFF;
if (isRunning) {
if (Counter < Compare) {
IN1 = 1;
} else {
IN1 = 0;
}
Counter++;
Counter %= 100;
}
}
```
此版本代码对程序进行了如下优化:
- 使用 `bit` 类型定义了三个变量,可以减少内存的使用。
- 将电机停止、启动、正转、反转等操作封装为函数,提高代码的可读性和可维护性。
- 删除了无用的 `Counter` 变量初始化,减少了内存的使用。
- 在 `Timer0()` 函数中,只有在电机正在运行时才进行控制,减少了不必要的计算。
51灰度循迹小车代码
以下是51灰度循迹小车代码的示例:
```c
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit L1=P2^0;
sbit L2=P2^1;
sbit L3=P2^2;
sbit L4=P2^3;
sbit L5=P2^4;
sbit L6=P2^5;
sbit L7=P2^6;
sbit L8=P2^7;
sbit ENA=P1^1;
sbit ENB=P1^2;
sbit IN1=P1^3;
sbit IN2=P1^4;
sbit IN3=P1^5;
sbit IN4=P1^6;
sbit beep=P1^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delayms(uint x)
{
uchar i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar num)
{
P0=table[num];
}
void forward()
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
ENA=1;
ENB=1;
}
void back()
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
ENA=1;
ENB=1;
}
void left()
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
ENA=1;
ENB=1;
}
void right()
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
ENA=1;
ENB=1;
}
void stop()
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
ENA=0;
ENB=0;
}
void main()
{
uchar i;
while(1)
{
if(L3==0&&L4==0)
{
forward();
display(0);
}
else if(L3==0&&L4==1)
{
left();
display(1);
}
else if(L3==1&&L4==0)
{
right();
display(2);
}
else
{
back();
display(3);
}
}
}
```