基本上任何型号的单片机都可以满足此功能,具体看你条件吧。电源的话外接5V的直流适配器就可以了,基本不需要做任何电压转化,硬件电路上主要是你要加一个三极管做一下驱动,单片机的IO可能没有办法驱动130电机。
程序就更简单了,直流小电机,两个IO口,轮询进行高低切换,在定时器里面完成就可以了。

给你原理图,修改一下,
两个程序修改一下。。
实在弄不来我再帮忙
这是控制正反转的程序:
#include?<reg52.h>
bit?Flag;//定义正反转标志位
unsigned?char?code?F_Rotation[4]={0xf1,0xf2,0xf4,0xf8};?//正转表格
unsigned?char?code?B_Rotation[4]={0xf8,0xf4,0xf2,0xf1};?//反转表格
void?Delay(unsigned?int?i)//延时
{
while(--i);}
main()
{
unsigned?char?i; EX1=1;?//外部中断0开 IT1=1;?//边沿触发 EA=1;?//全局中断开 while(!Flag) { P0=0x71;//显示?F?标示正转 for(i=0;i<4;i++)?//4相 { P1=F_Rotation[i];?//输出对应的相?可以自行换成反转表格 Delay(800);//改变这个参数可以调整电机转速?,数字越小,转速越大?}
}while(Flag)
{? P0=0x7C;//显示?b?标示反转 for(i=0;i<4;i++)?//4相 { P1=B_Rotation[i];?//输出对应的相? Delay(500);//改变这个参数可以调整电机转速?,数字越小,转速越大?}
}}
void?ISR_Key(void)?interrupt?2?using?1
{
Delay(300); Flag=!Flag;?//s3按下触发一次,标志位取反 }这是控制转速的程序:
#include<reg52.h>?//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit?KEY1?=?P3^1;?//定义调速按键
sbit?PWM?=?P1^5;?//定义调速端口

unsigned?char?CYCLE;?//定义周期?该数字X基准定时时间?如果是10?则周期是10?x?0.1ms
unsigned?char?PWM_ON?;//定义高电平时间
void?delay(unsigned?int?cnt)
{
while(--cnt);}
main()
{
unsigned?char?PWM_Num;//定义档位
TMOD?|=0x01;//定时器设置?1ms?in?12M?crystal
TH0=(65536-1000)/256;?
TL0=(65536-1000)%256;//定时1mS?
IE=?0x82;?//打开中断
TR0=1;
CYCLE?=?10;//?时间可以调整?这个是10步调整?周期10ms?8位PWM就是256步
while(1)
{if(!KEY1)
{delay(10000);
if(!KEY1)
{ PWM_Num++;?if(PWM_Num==4)PWM_Num=0;
switch(PWM_Num){
case?0:P0=0x06;PWM_ON=0;break;//高电平时长?
case?1:P0=0x5B;PWM_ON=4;break;
case?2:P0=0x4F;PWM_ON=6;break;
case?3:P0=0x66;PWM_ON=8;break;
default:break;
}}
} }}
void?tim(void)?interrupt?1?using?1
{
static?unsigned?char?count;?//
TH0=(65536-1000)/256;?
TL0=(65536-1000)%256;//定时1mS?
if?(count==PWM_ON)
{
PWM?=?1;//灯灭?}
count++;if(count?==?CYCLE)
{
count=0;

if(PWM_ON!=0)//如果左右时间是0?保持原来状态
PWM?=?0;?//灯亮
}
}


