51单片机+步进电机控制正反转8拍控制+Proteus仿真
51单片机+步进电机控制正反转8拍控制+Proteus仿真

更新内容(2022年5月2日)
调整了Proteus仿真接线问题,
程序代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
| #include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int //四相八拍转动数组 uchar code FFW[8]={0x02,0x06,0x04,0x0c,0x08,0x09,0x01,0x03//315,270,225......360(0) };//八拍 uchar code REV[8]={0x01,0x09,0x08,0x0c,0x04,0x06,0x02,0x03//45,90,145......360(0) }; uchar key1_down,key2_down,key3_down,key1_flag,key2_flag,key3_flag;//变量定义 sbit key1 = P3^0;//按键定义 sbit key2 = P3^1; sbit key3 = P3^2; /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*按键程序\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*按键延迟函数100MS\*\*\*\*\*\*\*\*\*\*/ void delay() { unsigned char i, j, k;
\_nop\_(); \_nop\_(); i = 2; j = 13; k = 237; do { do { while (--k); } while (--j); } while (--i); }
//开启外部中断 void Init\_P( ) { EA=1; //开全局中断 EX0=1; //开外部中断0 IT0=1; //外部中断0边沿触发 IT1=0; //外部中断1电平触发 } //外部中断0处理 void interint0() interrupt 0 //using \*\* { key1_flag = 0; key2_flag = 0; key3_flag = 1; } void key\_scan() { /\*\*\*\*\*\*\*\*\*\*\*\*按键1\*\*\*\*\*\*\*\*\*\*\*\*\*/ if(key1 == 0) { delay(); if(key1 == 0)key1_down = 1; } if(key1_down == 1 && key1 == 1) { key1_flag = 1; key2_flag = 0; key3_flag = 0; key1_down = 0; } /\*\*\*\*\*\*\*\*\*\*\*\*按键2\*\*\*\*\*\*\*\*\*\*\*\*\*/ if(key2 == 0) { delay(); if(key2 == 0)key2_down = 1; } if(key2_down == 1 && key2 == 1) { key1_flag = 0; key2_flag = 1; key3_flag = 0; key2_down = 0; } /\*\*\*\*\*\*\*\*\*\*\*\*按键3\*\*\*\*\*\*\*\*\*\*\*\* if(key3 == 0) { delay(); if(key3 == 0)key3\_down = 1; } if(key3\_down == 1 && key3 == 1) { key1\_flag = 0; key2\_flag = 0; key3\_flag = 1; key3\_down = 0; } \*/ } /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*转动延迟函数\*\*\*\*\*\*\*\*\*\*/ void delayB(uint t) { uchar k; while(t--) { for(k=0; k<125; k++) { } } } /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*电机正转\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ void motor\_ffw() { uchar i; for (i=0; i<8; i++) //一个周期转30度 { P1 = FFW[i]; //取数据 delayB(100); //调节转速 } } /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*电机反转\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ void motor\_rev() { uchar i; for (i=0; i<8; i++) //一个周期转30度 { P1 = REV[i]; //取数据 delayB(100); //调节转速 } } /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*主程序\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ main() { Init\_P( ); while(1) { key\_scan(); if(key1_flag == 1)motor\_ffw(); //电机正转 if(key2_flag == 1)motor\_rev(); //电机反转 if(key3_flag == 1) P1 = 0x0f; //电机停止 } }
|
程序源码和仿真
1 2 3
| 链接:https://pan.baidu.com/s/12ShpxKJxTVWPpx9Q2uQDhA 提取码:68zz
|
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!