供电电压DC5V,可直接接于单片机通过ul2003驱动芯片驱动,数码管是共阴极接口,是初学者的好例程。 /*本单片机是STC89C52RC,本程序应用于step motor--28BYJ,小型步进电机, 供电电压DC5V,可直接接于单片机通过ul2003驱动芯片驱动,数码管是共阴极接口,*/ #include #define uchar unsigned char//数据宏定义 #define uint unsigned int #define A P10 // #define _A P11 //步进电机脉冲接口 #define B P12 // #define _B P13 //步进电机脉冲接口 uchar su_du=0; //转速 bit fang_xiang=0; //方向 bit qi_dong=0; //启动标志 /********************************************************************/ #include//包含移位标准库函数头文件 sbit DU = P2^6;//数码管段选 sbit WE = P2^7;//数码管段选 //共阴数码管段选表0-9 uchar code shu_ma[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,}; /*********************************************************************/ /*==================================== 函数 : delay(uint z) 参数 :z 延时毫秒设定,取值范围0-65535 返回值 :无 描述 :12T/Fosc11.0592M毫秒级延时 ====================================*/ void delay(uint z) { uint x,y; for(x = z; x > 0; x--) for(y = 114; y > 0 ; y--); } /*==================================== 函数 :display(uchar i) 参数 :i 显示数值,取值范围0-255 返回值 :无 描述 :三位共阴数码管动态显示 ====================================*/ void display(uchar i) //数据处理 { uchar bai, shi, ge; // bai = i / 100; //236 / 100 = 2 // shi = i % 100 / 10; //236 % 100 / 10 = 3 ge = i;// % 10;//236 % 10 =6 /* 第一位数码管 P0 = 0XFF;//清除断码 WE = 1;//打开位选锁存器 P0 = 0XFE; //1111 1110 WE = 0;//锁存位选数据 DU = 1;//打开段选锁存器 P0 = shu_ma[bai];// DU = 0;//锁存段选数据 delay(5); //第二位数码管 P0 = 0XFF;//清除断码 WE = 1;//打开位选锁存器 P0 = 0XFD; //1111 1101 WE = 0;//锁存位选数据 DU = 1;//打开段选锁存器 P0 = shu_ma[shi];// DU = 0;//锁存段选数据 delay(5);*/ /********* 第三位数码管 */ P0 = 0XFF;//清除断码 WE = 1;//打开位选锁存器 P0 = 0XFB; //1111 1011 WE = 0;//锁存位选数据 DU = 1;//打开段选锁存器 P0 = shu_ma[ge];// DU = 0;//锁存段选数据 delay(5); } void yanshi2(uint a) //延时程序 { while(a--); } uchar an_jian() //按键检测,P3.0,P3.1,P3.2,P3.3分别接4个按键 { if((P3&0x0f)!=0x0f)//判断 P3只要有一个按键按下,就延时返回按键值。 { yanshi2(20000); if((P3&0x0f)!=0x0f) { return P3&0x0f; } } return P3&0x0f; } void yanshi() //步进电机延时时间 { uint sd1=0; sd1=8000+5753*(10-su_du);// su_du值越大,周期越短,频率越高 while(sd1--) { if((P3&0x0f)!=0x0f)return; //在延时里面判断有没有按键按下,有就直接返回主函数 } } void bu_jin() //每调用一次步进电机向指定方向走一步 { static char j=1; //把起始速度设置为1。 if(fang_xiang) //判断方向位,为1则按正相序循环, { j++; if(j==5)j=1; } else { j--; if(j==0)j=4; //否则,按反相序循环 } switch(j) //根据拍数选择不同的电压组合 { case 1: A=1;B=1;_A=0;_B=0;yanshi(); //ab 1100 break; case 2: A=0;B=1;_A=1;_B=0;yanshi(); //a~b 0110 break; case 3: A=0;B=0;_A=1;_B=1;yanshi(); //a~b~0011 break; case 4: A=1;B=0;_A=0;_B=1;yanshi(); //ab~ 1001 break; } } void main() { P14=0;//方向标志 P15=0;//启动 标志 while(1) { switch(an_jian()) //按键处理 { case 0x0e: //第一个按键按下按键状态取反,启动/停止 qi_dong=!qi_dong; P15=qi_dong; //状态指示 break; case 0x0d: //第二个按键按下,速度加 if(su_du<9) su_du++; //速度加 break; case 0x0b: //第三个按键按下,速度减 if(su_du>0) |
|