- 1 #include <reg51.h> //包含單片機頭文件
- 2 //宏定義方便使用
- 3 #define uint unsigned int
- 4 #define uchar unsigned char
- 5
- 6 uchar code FFW[]= //8拍編碼
- 7 {
- 8 0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09
- 9 };
- 10 sbit K1 = P3^0;
- 11 sbit K2 = P3^1;
- 12 sbit K3 = P3^2;
- 13 sbit K4 = P3^3;
- 14 sbit K5 = P3^4;
- 15 uchar Pos_N=1; //定義正轉圈數變量
- 16 uchar Inv_N=2; //定義反轉圈數變量
- 17 uchar Run_flag=0; //電機運行的標志
- 18 uint speed=20;
- 19 /*-----------------------------------
- 20 延時函數
- 21 ------------------------------------*/
- 22 void DelayMS(uint ms)
- 23 {
- 24 1 uchar i;
- 25 1 while(ms--)
- 26 1 {
- 27 2 for(i=0;i<20;i++);
- 28 2 }
- 29 1 }
- 30 /*-----------------------------------
- 31 正轉函數
- 32 ------------------------------------*/
- 33 void SETP_MOTOR_FFW()
- 34 {
- 35 1 static uint i=0,j=0;
- 36 1 if(++i>speed*10) //延時
- 37 1 {
- 38 2 i=0;
- 39 2 P1=FFW[j]; //送8拍
- 40 2 if(++j>7)j=0;
- 41 2 }
- 42 1
- 43 1 }
- 44 /*-----------------------------------
- 45 反轉函數
- 46 ------------------------------------*/
- 47 void SETP_MOTOR_REV()
- 48 {
- 49 1 static uint i=0,j=0;
- 50 1
- 51 1 if(++i>speed*10) //延時
- 52 1 {
- 53 2 i=0;
- 54 2 P1=FFW[7-j]; //倒序送八拍編碼
- 55 2 if(++j>7)j=0;
- C51 COMPILER V8.02 MAIN 01/27/2021 19:00:20 PAGE 2
- 56 2 }
- 57 1 }
- 58 //*********************************
- 59 //按鍵掃描程序
- 60 //mode:0,不支持連續按;1,支持連續按;
- 61 //*********************************
- 62 uchar KEY_Scan()
- 63 {
- 64 1 static uchar key_up=1;//按鍵按松開標志
- 65 1 if(key_up&&(K1==0||K2==0||K3==0||K4==0||K5==0))
- 66 1 {
- 67 2 DelayMS(5);//去抖動
- 68 2 if(K1==0||K2==0||K3==0||K4==0||K5==0)
- 69 2 {
- 70 3 key_up=0;
- 71 3 if(K1==0)return 1;
- 72 3 else if(K2==0)return 2;
- 73 3 else if(K3==0)return 3;
- 74 3 else if(K4==0)return 4;
- 75 3 else if(K5==0)return 5;
- 76 3 }
- 77 2 else
- 78 2 {
- 79 3 return 0;
- 80 3 }
- 81 2 }else if(K1==1&&K2==1&&K3==1&&K4==1&&K5==1)key_up=1;
- 82 1 return 0;// 無按鍵按下
- 83 1 }
- 84 /*-----------------------------------
- 85 主函數
- 86 ------------------------------------*/
- 87
- 88 void main()
- 89 {
- 90 1 uchar key_num=0;
- 91 1 P1=0x01; //電機初始位置
- 92 1 P2=0xfb; //停止指示燈
- 93 1 while(1)
- 94 1 {
- 95 2 key_num=KEY_Scan(); //掃面按鍵
- 96 2 if(key_num==1) //正轉
- 97 2 {
- 98 3 P2=0xfe; //正轉指示燈
- 99 3 Run_flag=1;//正轉標志
- 100 3 }
- 101 2 else if(key_num==2)//反轉
- 102 2 {
- 103 3 P2=0xfd; //反轉指示燈
- 104 3 Run_flag=2;//反轉標志
- 105 3 }
- 106 2 else if(key_num==3)//停止
- 107 2 {
- 108 3 P2=0xfb; //停止指示燈
- 109 3 P1=0x01; //回到初始位置
- 110 3 Run_flag=0;//停止標志
- 111 3 }
- 112 2 else if(key_num==4)//加速
- 113 2 {
- 114 3 if(speed!=0)
- 115 3 {
- 116 4 speed-=1;
- 117 4 }
- C51 COMPILER V8.02 MAIN 01/27/2021 19:00:20 PAGE 3
- 118 3 }
- 119 2 else if(key_num==5)//減速
- 120 2 {
- 121 3 speed+=1;
- 122 3 if(speed>100) //限定調速范圍0-100
- 123 3 {
- 124 4 speed=100;
- 125 4 }
- 126 3 }
- 127 2
- 128 2 if(Run_flag==1)//正轉標志
- 129 2 {
- 130 3 SETP_MOTOR_FFW();
- 131 3 }
- 132 2 else if(Run_flag==2)//反轉標志
- 133 2 {
- 134 3 SETP_MOTOR_REV();
- 135 3 }
- 136 2 else
- 137 2 {
- 138 3 P2=0xfb; //停止指示燈
- 139 3 }
- 140 2
- 141 2
- 142 2 }
- 143 1 }
復制代碼 加減速轉+提示燈
|