基于单片机的直流电机控制(正反转,开关控制)原理图如下:程序如下:/*用电机来代表门的转动情况*/#includereg51.h//定义变量sbitkaimen=P0^0;sbitzanting=P0^1;sbitfanxiang=P0^2;sbitP2_0=P2^0;sbitP2_1=P2^1;bitFlag=1;//定义电机正反向标志//函数声明voidmotor_turn(void);//正反向控制voidTimer0_init(void);//定义定时器0初始化/******************************延时处理***************************/voidDelay(unsignedintz){unsignedintx,y;for(x=z;x0;x--)for(y=110;y0;y--);}/***************************************************************/voidTimer0_int(void)interrupt1using1//定时器0中断处理主要用来处理换方向的时候{TR0=0;TL0=(65536-50000)/256;//定时50msTH0=(65536-50000)%256;TR0=1;if(Flag==1)//代表改变方向{P2_0=0;P2_1=1;}else//方向不变{P2_1=0;P2_0=1;}}/****************开始转动:人满时候开始转动**************/voidmotor_start(void){if(kaimen==1){//Delay(10);if(kaimen==1){P2_0=0;P2_1=1;}}}/***************有人但是人未满时或者有夹到人的时候暂停*************/voidmotor_pause(void){if(zanting==1){Delay(10);if(zanting==1){EA=0;P2_0=0;P2_1=0;}}}/**********************电机方向转动**************************/voidmotor_turn(void)//电机反向转动{if(fanxiang==1){Delay(10);if(fanxiang==1){Flag=~Flag;}while(fanxiang==1);}}/***********************定时器0初始化**************************/voidTimer0_init(void)//定时器0初始化{TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;ET0=1;}/**********************主函数***********************/voidmain(void)//主函数{Timer0_init();while(1){if(kaimen==1)EA=1;//开始时候开启中断motor_start();motor_pause();motor_turn();}}