步进电机仿真和源代码
E:\Altium Designer Workspace\已经完成\步进电机\仿真\步进电机\main.c
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 #include "keyboard.h" #define OSC 12000000 void CheckKey(unsigned char key);//判判长按 void DisplayNum(unsigned int count);//每扫扫数数左左 unsigned long Round;//保保正每保保用用 unsigned char THR0,TLR0; unsigned char code LedChar[] = { 0xC0,/*0*/ 0xF9,/*1*/ 0xA4,/*2*/ 0xB0,/*3*/ 0x99,/*4*/ 0x92,/*5*/ 0x82,/*6*/ 0xF8,/*7*/ 0x80,/*8*/ 0x90,/*9*/ 0xBF,/*-*///保保0~9,-,每扫扫真数数 }; unsigned char code BeatCode[] = {0x0E,0x0C,0x0D,0x09,0x0B,0x03,0x07,0x06};//定定步进电机每拍扫 unsigned long beats;//左左计每拍每 unsigned char ledBuff[] = {0xFF,0xFF,0xFF,0xFF};//保保但数数保每 unsigned char set = 0;//2为正每,1为用用 bit CLW = 0;//0为正正,1正正 bit RUN = 0;//0为暂为,1运执 bit Pause = 0;//暂暂 bit flag2ms = 0;//2毫毫毫毫 sbit Dig1 = P2^4;//每数从左到左1,2,3,4并 sbit Dig2 = P2^5; sbit Dig3 = P2^6; sbit Dig4 = P2^7; void ConfigTimer0(unsigned int ms)//设设左每设设每 { unsigned long tmp = ms; tmp = (tmp*OSC)/12/1000; tmp = 65536 - tmp; THR0 = (unsigned char)(tmp >> 8); TLR0 = (unsigned char)tmp; TMOD &= 0xF0;//左每设0,模模1 TMOD |= 0x01; ET0 = 1;//开启开判 TR0 = 1;//启启定启设0 TH0 = THR0;//给TH0,TL0初数 TL0 = TLR0; } void main() { unsigned char tmp; unsigned char index = 0;//保保保保每拍保保 unsigned char cindex = 0; unsigned char rindex = 6; ConfigTimer0(1); EA = 1;//开启开并开判 ledBuff[0] = LedChar[set]; DisplayNum(0); while(1) { KeyDrive();// if(flag2ms) { flag2ms = 0; if(beats != 0) { tmp = P2; tmp &= 0xF0; tmp |= BeatCode[index]; P2 = tmp;//正启步进电机 if(!CLW) { cindex++; cindex &= 0x07; index = cindex; } else { rindex--; rindex &= 0x07;
Page 3
E:\Altium Designer Workspace\已经完成\步进电机\仿真\步进电机\keyboard.c
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 #include "keyboard.h" unsigned char keySta[] = {1,1,1,1,1,1,1};//长按按按 unsigned int keyTime[] = {0,0}; unsigned char keyCnt[] = {0,0}; extern void CheckKey(unsigned char key); void ScanKey() { static unsigned char keyBuff[] = {0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F};//保保长按按按 unsigned char i; keyBuff[0] = (keyBuff[0] << 1)|Key0;//读取长按按按 keyBuff[1] = (keyBuff[1] << 1)|Key1;//读取长按按按 keyBuff[2] = (keyBuff[2] << 1)|Key2;//读取长按按按 keyBuff[3] = (keyBuff[3] << 1)|Key3;//读取长按按按 keyBuff[4] = (keyBuff[4] << 1)|Key4;//读取长按按按 keyBuff[5] = (keyBuff[5] << 1)|Key5;//读取长按按按 keyBuff[6] = (keyBuff[6] << 1)|Key6;//读取长按按按 for(i = 0;i < 7;i++) { if((keyBuff[i]&0x0F) == 0x0F)//判判长按判判判判判 { keySta[i] = 1; if(i == 2) { keyCnt[0] = 0; keyTime[0] = 0; } else if(i == 3) { keyCnt[1] = 0; keyTime[1] = 0; } } else if((keyBuff[i]&0x0F) == 0x00)//判判长按判判判长判 { keySta[i] = 0; if(i == 2) { keyCnt[0]++; if(keyCnt[0] >= 200) { keyCnt[0] = 0; keyTime[0]++;//为长长按为为加 } } else if(i == 3) { keyCnt[1]++; if(keyCnt[1] >= 200) { keyCnt[1] = 0; keyTime[1]++;//为长长按为为减 } } } } } void KeyDrive() { static unsigned char keyBack[] = {1,1,1,1,1,1,1};//保保保保保保长按 static unsigned int keyTim[] = {3,3};//第第第第第600毫毫毫长长为为,以保以200毫毫为为第第 unsigned char i; for(i = 0;i < 7;i++) { if((keyBack[i] != keySta[i]))//如如长按按按保保 { if(keySta[i] == 0)//如如判长判如如如长按 { CheckKey(i); } keyBack[i] = keySta[i]; } } if(keyTime[0] > 0)//长长加 { if(keyTime[0] > keyTim[0])
} void InterruptTimer0() interrupt 1 { static unsigned char cnt = 0; TH0 = THR0; TL0 = TLR0; if(RUN) { if(!Pause) cnt++; if(cnt > 20)//模模模模以20毫毫判启第如每拍,判不不不每拍,实实第第2毫毫 { cnt = 0; flag2ms = 1; } } else cnt = 0; ScanKey();//扫扫长按 LedScan();//扫扫每扫扫 }
Page 1
E:\Altium Designer Workspace\已经完成\步进电机\仿真\步进电机\main.c
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 index = rindex; } beats--; if(beats > 999) DisplayNum(999); else DisplayNum(beats); } else if(beats == 0) { RUN = 0; DisplayNum(beats); } } } } void DisplayNum(unsigned int count) { unsigned int tmp; unsigned char i,j; tmp = count;//左左每扫扫,并并如如并但并从左到左如如并并1~9保每,每扫扫判数 for(i = 3;i > 0;i--) { ledBuff[i] = LedChar[tmp%10]; tmp /= 10; } for(i = 1;i < 3;i++) { if(ledBuff[i] != 0xC0) break; } for(j = 1;j < i;j++) ledBuff[j] = 0xFF; } void CheckKey(unsigned char key)//判判长按 { if(RUN) { if((key != 5)&&(key !=6)) return; } if(key == 0)//设设判长用用设判长设每 { set++; if(set > 2) set = 1; ledBuff[0] = LedChar[set]; DisplayNum(Round); } if(set == 0) return; if(key == 1)//正正正 { CLW = !CLW; if(CLW) { ledBuff[0] = LedChar[10]; } else { ledBuff[0] = LedChar[CLW]; } DisplayNum(Round); } else if(key == 2)//加 { if(Round < 1000) Round++; DisplayNum(Round); } else if(key == 3)//减 { if(Round > 0) Round--; DisplayNum(Round); } else if(key == 4)//运执长按长判