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 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
| #include "main.h"
//步进电机引脚 sbit s1=P2^3; sbit s2=P2^4; sbit s3=P2^5; sbit s4=P2^6;
uchar scan_key1,scan_key2; //按键功能选择,00 停止,01 正转, 10 反转 uchar step1;step2; //加减速选择,10加速,01减速 static step_index; uint count1,count2; //定时 static speed; //速度参数 //uint jiaNum=0,jianNum=0; //uchar jiaChar[3],jianChar[2]; //uchar flag=0; void main(void) { step2=0; step1=0; P1=0xff;//按键端口初始化 s1=0;s2=0;s3=0;s4=0; //电机端口初始化 EX1=1;//开启外部中断1 EA=1;//开启总中断 speed=2000;//速度初值,speed越小速度越快 // init\_1302(); LCD\_init(); // jiaChar[2]='\0'; // jianChar[2]='\0'; while(1) { get\_1302(time_1302); DS1302\_change(); LCD\_display\_char(0,2,times); LCD\_display\_char(0,1,date); if((scan_key1==1)&&(scan_key2==0))// 正转 { ground(step_index); delay\_speed(speed); step_index++; //大于7,从头再来 if(step_index>7) step_index=0; LCD\_display\_char(11,1," "); LCD\_display\_char(11,1,"zhen"); } if((scan_key1==0)&&(scan_key2==1)) //反转 { ground(step_index); delay\_speed(speed); step_index--; if(step_index<0) //小于0,从头再来。 step_index=7; LCD\_display\_char(11,1," "); LCD\_display\_char(11,1,"fan"); } if(scan_key1==0&&scan_key2==0) // 停止 { s1=0;s2=0;s3=0;s4=0; // LCD\_display\_char(11,1," "); LCD\_display\_char(11,1,"stop "); // LCD\_display\_char(11,2," "); } if(step1==1&&step2==0) //加速 { speed=speed-100; // if(flag==1) // jiaNum=jiaNum+1; // jiaChar[0]=jiaNum+'0'; if(speed<1000||speed==1000) //速度最大阈值 { speed=1000; } LCD\_display\_char(11,2," "); LCD\_display\_char(11,2,"+su"); // LCD\_display\_char(14,2,jiaChar);
} if(step1==0&&step2==0) //加减速归零 { speed=2000; // LCD\_display\_char(11,2," "); LCD\_display\_char(11,2,"normal"); } if(step1==0&&step2==1)//减速 { speed=speed+100; if(speed>2500||speed==2500) //速度最小阈值 { speed=2500; } LCD\_display\_char(11,2," "); LCD\_display\_char(11,2,"-su"); } } }
//速度延时控制函数 void delay\_speed(uint time) { for (count1=0;count1<time;count1++) for(count2=0;count2<3;count2++); }
//按键处理程序(利用外部中断) void key(void) interrupt 2 { uchar i; uchar butter; for(i=0;i<200;i++);//延时防抖 if(P3^3==0) { butter=~P1;//低电平有效先取反 switch(butter) {case 0x01: scan_key1=1;scan_key2=0; break; //正转 case 0x02: scan_key1=0;scan_key2=0;break; //停止 case 0x04: scan_key1=0 ;scan_key2=1; break; //反转 case 0x08: step1=1;step2=0;break; //加速 case 0x10: step1=0;step2=1;break; //减速 case 0x20: step1=0;step2=0;break; //速度归零(回归初始值) default : ; //其它值返回 } } P1=0Xff;//按键复位 }
//步进电机转步程序 void ground(step_index) { switch(step_index) { case 0://0 s1 = 1; s2 = 0; s3 = 0; s4 = 0; break; case 1://0,1 s1 = 1; s2 = 1; s3 = 0; s4 = 0; break; case 2://1 s1 = 0; s2 = 1; s3 = 0; s4 = 0; break; case 3://1,2 s1 = 0; s2 = 1; s3 = 1; s4 = 0; break; case 4://2 s1 = 0; s2 = 0; s3 = 1; s4 = 0; break; case 5://2,3 s1 = 0; s2 = 0; s3 = 1; s4 = 1; break; case 6://3 s1 = 0; s2 = 0; s3 = 0; s4 = 1; break; case 7://3,0 s1 = 0; s2 = 0; s3 = 0; s4 = 1; } }
|