原理图:
这两个小灯意味着电流方向,到时候是可以控制电机的正转反转的
程序:
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit PWM=P1^0;// P1.0输出pwm
sbit K1=P1^4;//占空比加5
sbit K2=P1^5;//占空比减5
sbit K3=P1^6;//正转
sbit K4=P1^7;//反转
sbit LED0=P2^0;//
sbit LED1=P2^1;//
uchar time; // 定义占空比的变量
//uchar count=30;//定义占空比上限
int count=30;
void main()
{
//LED0=1;
//LED1=0;
EX0=1;//外部中断打开
IT0=1;
TMOD=0x01;//定时器0工作方式1
TH0=0xff;//(65536-10)/256;//赋初值定时
TL0=0xf7;//(65536-10)%256;//0.01ms
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
while(1)
{
if (K1==0) //占空比减5
{
count+=5;
while(!K1);
}
else if (K2==0) //占空比加5
{
count-=5;
while(!K2);
}
else if (K3==0) //正转
{LED0=1;
LED1=0;while(!K3);}
else if (K4==0) //反转
{LED0=0;
LED1=1;while(!K4);}
else;
}
}
void tim0() interrupt 1
{
//TR0=0;//赋初值时,关闭定时器
TH0=0xff;//(65536-10)/256;//赋初值定时
TL0=0xf7;//(65536-10)%256;//0.01ms,因为一个周期1us
//TR0=1;//打开定时器
time++;
if(time>=100) //1khz
time=0;
if(time<=count) //占空比%30,可改
PWM=1;
else PWM=0;
}
void control() interrupt 0 //中断函数测试
{
{LED0=0; //双口关闭
LED1=0;}
}
我觉得唯一要注意的是判断语句里的while语句:
if (K1==0) //占空比减5
{
count+=5;
while(!K1);
}
因为是按钮,所以只能持续一瞬间,所以用while语句这样执行完count+=5语句后就一直在while中循环,直到下一次按下按钮后才会继续操作,最好还能加上消抖:参考:http://www.51hei.com/mcu/1869.html