#includeC8051f120.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedint#defineSYSCLK22118400#define_Nop()_nop_()ucharcodeCCW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};//逆时钟旋转相序表ucharcodeCW[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};//正时钟旋转相序表sbitK1=P3^2;//反转按键sbitK2=P3^3;//正转按键sbitK3=P3^4;//停止按键sbitFMQ=P3^5;//蜂鸣器sbitLED1=P5^0;//sbitLED2=P5^1;//voidSYSCLK_Init(void);voidPORT_Init();voiddelaynms(uintaa){ucharbb;while(aa--){for(bb=0;bb115;bb++)//1ms基准延时程序{;}}}voiddelay500us(void){intj;for(j=0;j1500;j++){;}}voidbeep(void)//蜂鸣器发生函数{uchart;for(t=0;t50;t++){delay500us();FMQ=!FMQ;//产生脉冲}FMQ=0;//关闭蜂鸣器(它用ULN2003驱动的)}voidmotor_ccw(void){uchari,j;for(j=0;j8;j++)/*电机旋转一周,不是外面所看到的一周,是里面的传动轮转一周步进电机28BYJ48型四相八拍电机*/{if(K3==0){break;//如果K3按下,退出此循环,停止转动}for(i=0;i8;i++)//旋转45度{P2=CCW[i];delaynms(20);//调节转速}}}voidmotor_cw(void){uchari,j;for(j=0;j8;j++){if(K3==0){break;//如果K3按下,退出此循环}for(i=0;i8;i++)//旋转45度{P2=CW[i];delaynms(20);//调节转速}}}voidmain(void){ucharr;ucharN=64;//因为步进电机是减速步进电机,减速比的1/64,所以N=64时,步进电机主轴转一圈WDTCN=0xde;//关闭WDTWDTCN=0xad;SYSCLK_Init();PORT_Init();FMQ=0;while(1){if(K1==0){LED1=0;beep();for(r=0;rN;r++){motor_ccw();//电机逆转if(K3==0){beep();break;}}}elseif(K2==0){beep();for(r=0;rN;r++){motor_cw();//电机反转if(K3==0){beep();break;}}}elseP2=0xf0;//电机停止}}/******************************************************************//系统时钟配置//******************************************************************/voidSYSCLK_Init(void){idataunsignedintn;SFRPAGE=CONFIG_PAGE;//OSCICL=0x34;//25M//OSCICL=0x87;//40MOSCICN=0x82;for(n=0;n255;n++);while((OSCICN&0x40)==0);CLKSEL|=0x00;}///******************************************************************//I/O配置//******************************************************************/voidPORT_Init(){charSFRPAGE_SAVE=SFRPAGE;//保存当前页面SFRSFRPAGE=CONFIG_PAGE;XBR2=0x40;//允许交叉开关和弱上拉P3MDOUT=0xFF;P2MDOUT=0xFF;P5MDOUT=0xFF;SFRPAGE=SFRPAGE_SAVE;//恢复SFR页面}