|
楼主 |
发表于 2012-11-21 16:37:48
|
显示全部楼层
本帖最后由 ourdev00001 于 2012-11-21 17:57 编辑
直流电机正反转及PWM调速控制.DSN
1 //-----------------------------------------------------------------
2 // 名称: 直流电机正/反转及PWM调速控制
3 //-----------------------------------------------------------------
4 // 说明: 本例SW1的3个挡位用于设置电机正、反转及停转,K1、K2用于控制
5 // 电机PWM调速,在进行相应操作时,对应的LED被点亮。
6 //
7 //-----------------------------------------------------------------
8 #include <reg51.h>
9 #include <intrins.h>
10 #define INT8U unsigned char
11 #define INT16U unsigned int
12 #define S1_ON() (P3 & (1<<5)) == 0x00 //正转
13 #define S2_ON() (P3 & (1<<6)) == 0x00 //停转
14 #define S3_ON() (P3 & (1<<7)) == 0x00 //反转
15 #define Forward 0 //正转指示灯
16 #define Stop 1 //停转指示灯
17 #define Backward 2 //反转指示灯
18 sbit M_DIR = P1^0; //方向控制
19 sbit M_PWM = P1^1; //PWM调速控制
20 sbit Key_INC = P3^0; //加速键
21 sbit Key_DEC = P3^1; //减速键
22 //-----------------------------------------------------------------
23 // 延时函数
24 //-----------------------------------------------------------------
25 void delay_us(INT16U x) { for(; x>0; x--) _nop_(); }
26 //-----------------------------------------------------------------
27 // 主程序
28 //-----------------------------------------------------------------
29 void main()
30 {
31 int speed = 200; //默认初始速度
32 while (1)
33 { if (S2_ON()) //切换到S2位置时表示停转
34 { P0 = ~(1<<Stop); //停转指示灯亮
35 M_DIR = 0; M_PWM = 0; //控制停转
36 continue; //跳过下面的代码,提前入下一个循环
37 }
38 //方向控制
39 if (S1_ON()) //S1合上为正向
40 { M_DIR = 0; P0 = ~(1<<Forward); }
41 else
42 if (S3_ON()) //S3合上为反向
43 { M_DIR = 1; P0 = ~(1<<Backward); }
44 //按键调速控制
45 if(Key_INC == 0) speed = speed < 400 ? speed + 1 : 400;
46 if(Key_DEC == 0) speed = speed > 0 ? speed - 1 : 0;
47 //PWM调速控制信号输出
48 M_PWM = 1; delay_us(speed);
49 M_PWM = 0; delay_us(400 - speed);
50 }
51 }
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|