找回密码
 注册
关于网站域名变更的通知
查看: 326|回复: 2
打印 上一主题 下一主题

单片机直流电机调速系统仿真+源代码

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-11-7 09:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
单片机直流电机调速系统仿真+源代码

+ t4 W5 J8 N# w9 P  G4 m: o
直流电机调速仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
* h. ?+ H5 X, J, u
, \& C7 A: i! Z8 b2 e% ~; J
#include <reg52.h>( D" C. O% p- R$ o1 ]2 u( m5 M; H
/*********************************************2 o, b( L! Z1 X6 Q7 }' f
* 定时器初值
: g8 w$ h5 W8 i1 E: j*********************************************// F3 z$ G. I+ \9 |0 G
#define T0HIGH        0xec# g: f2 ?& @/ I& ?1 b
#define T0LOWW        0x8a0 }. z8 a9 |. z7 x+ A: K6 k
9 m# c9 `: {/ E! f! j
/*********************************************
/ S8 d* Y, P" |7 W: B*! o; u3 |7 \# m0 ?2 I
*********************************************/
& [- Q, B- C5 _( Z, Utypedef unsigned char        u8;
9 F, ~4 I& Q5 F* s* Btypedef unsigned int        u16;
# G; I0 [. u( [- c% ]; |1 L/ wtypedef unsigned long        u32;
& v  U4 I4 }7 M: o% W% e$ F9 Xtypedef bit                                BOOL;8 s/ j* W7 `- F3 c7 o6 ?
7 l3 C! r9 i3 C- y% R
/*********************************************
. ^# j- U+ q# H9 `* 单片机管脚定义* j+ k! i. Q! U( g2 i
*********************************************/& y% d: |+ p0 I& X& Z- k/ w
sbit KEY_ON_PIN = P2^0;
2 f& C! u" \' Isbit KEY_INC_PIN = P2^1;7 [5 ^% f6 r& w9 L2 ]" }1 t( p
sbit KEY_DEC_PIN = P2^2;
7 }- h7 H9 e7 S. [
5 {0 _$ i9 k- M4 hsbit MOTO_LEFT = P3^6;
) i& {8 g' v5 a+ g& U% Qsbit MOTO_RIGHT = P3^7;+ s# q6 X" y3 k) h* x, A& y- y
9 o$ i8 l0 I* M9 ~4 t( T
/*********************************************
9 |. \/ u' {7 A4 Q8 B, ?6 A* 按键定义
/ }0 l8 @7 m( ?/ @/ Q*********************************************/
( p  G9 V# |& e+ E9 ?1 \#define KEY_NULL                0xff; Z3 J) I# O* e/ ?. c) @9 l4 t
#define KEY_LONG_PERIOD        258 l3 w' ]7 v( M: e
#define KEY_CONTINUE_PERIOD        20
# g, T' v! q6 \( O) H
* s: A, G) e2 S#define KEY_DOWN                0x80
# B! Z% n& }  Y#define KEY_CONTINUE        0x40
  ?. z% L% [1 W: `. d0 _#define KEY_UP                        0x20
. }3 ^9 @+ g9 O% d& L# U4 Y1 x7 D" D, }: O# d
#define KEY_STATE_INIT                0) Y/ l- q7 s% n, `8 c/ s7 S/ {
#define KEY_STATE_WOBBLE        16 N. m4 m+ I! p  p
#define KEY_STATE_PRESS                2! Y9 s# H, h) @. K
#define KEY_STATE_LONG                3
/ d2 K2 v/ |5 M4 x#define KEY_STATE_CONTINUE        4
& K+ A- l$ E+ T#define KEY_STATE_RELEASE        5) b: S1 e( ^0 p! j( k8 I% o' p

) w! a: R2 ?2 u: j# T- Z; i#define KEY_ON_VALUE                1# B1 i4 Q* }6 I! y# c
#define KEY_INC_VALUE                2) [( H  g8 d$ h
#define KEY_DEC_VALUE                33 P4 @* R( Y' ]# i  R7 }. q: U
0 r% e, U6 C* A! r
#define KEY_ON                (KEY_ON_VALUE | KEY_DOWN)
3 Z4 j4 k# O: F% b. V/ |. r# C9 b#define KEY_INC                (KEY_INC_VALUE | KEY_DOWN)
! u) x; g2 Y$ n" ?#define KEY_INC_CON        (KEY_INC_VALUE | KEY_CONTINUE)
2 {8 ^: L* }% ?. d, a& G#define KEY_DEC                (KEY_DEC_VALUE | KEY_DOWN)
' F- _) X% N. L4 j6 _) p( {8 E#define KEY_DEC_CON        (KEY_DEC_VALUE | KEY_CONTINUE)
5 d7 z1 W4 v- B1 ]2 E/*********************************************
5 ]) z# H" K1 G& L* 常量定义
% d# F0 g: r* o7 @% t*********************************************/
: h3 z. [- a, L  @#define true        1* V3 P: e0 {7 ^2 @; S' a) \
#define false        0! a+ ?6 ?* Q3 B" C/ o- B
# \* }# X1 k9 Z$ O2 Q6 Q6 ~
#define MOTO_ON                MOTO_LEFT = false;\: H0 F7 z$ e3 P0 n' h3 V7 F$ V
                                        MOTO_RIGHT = true
4 a' }! ]  q* |7 ]#define MOTO_OFF        MOTO_LEFT = true;\; [/ x4 I. B" o, k4 W# G
                                        MOTO_RIGHT = true5 t1 y0 j# a) \+ B. m& [( x" Q$ K
/*********************************************5 O; a5 I$ q( {+ z5 V, S
* 全局变量定义% i/ H3 M& a: l% h; j, Q) \
*********************************************/
" o; U5 d  o1 l& f/ b/ zcode u8 DisCode[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xff};( M( x. s- q6 |7 H7 |

9 r+ G; z. |* l$ o1 y) q7 Tu8 PWMpercent = 0;
7 }. P* _0 _; ?  ~u8 DisNum[4] = {0x0a, 0x0a, 0x0a, 0x00};
- D% E" E- n- ]+ _* r$ T! a7 Ou8 DisPosition = 0;/ @" G( B4 L, `
u8 SecCount = 0;3 p, r! d# e" Q" I( L$ D1 ~: a0 N
u8 u10msNum = 0;
  F1 j* Z* r) U2 j7 a: q/ a+ J, d) t% y( A& B8 Y. x
BOOL b10msEvent = false;6 r$ J9 V- ~7 @3 V
BOOL b100msEvent = false;
$ i: S+ p# A' O( t; `BOOL b1secEvent = false;
! I( C* V& n- c; k9 GBOOL MotoStart = false;
  n. A) O  [+ M0 E, M  nBOOL MotoRun = false;
$ Q( i" b0 M: h# W2 I$ r! w5 P/ e1 O2 ^. }2 x- G
void Key_Prosess(void);0 |6 y6 B) W; j) X
void Dynamic_Display(void);8 k+ X7 s4 u* J- y+ u
void Speed_Display(void);& k# M! J, u6 q7 ]3 l
# \6 K: {& t' `# }
/*********************************************
. D' {1 ]+ P" h, [* 主函数
$ _/ o) x' g/ l$ k*********************************************/% F/ k6 n6 t* T5 S$ C
main()7 t( M: }' ?) ~6 x- C
{
( F+ R4 F0 W. H+ _" Q/ a* C        TMOD = 0x01;
' G+ `4 e+ M. t* m  A5 j        TH0 = T0HIGH;
8 ~; Y/ u+ m  B        TL0 = T0LOWW;! G7 A1 k4 V, \" E. H2 C% O; x
        TR0 = 1;
6 v4 U' G, l4 z1 E( X% t' ?        ET0 = 1;% c5 ~& B6 J+ J  b/ n1 H) C
        EA = 1;
$ |8 ^3 D# e" b0 D" w        P1 = 0x00;
; }8 s. i. J( Q, R
) u+ m" E& @2 m' G  E        while(1)
' |- I$ Y+ s: n5 j" Z5 o        {
/ ]9 ^3 k7 G9 F0 Q+ {5 D                if(true == b10msEvent)        //10毫秒定时标志4 b7 k- v# L' v* V1 p$ b$ s, H
                {
9 s" [- r- f0 P0 U0 t                        b10msEvent = false;, M- t6 c# X- ?
                        Key_Prosess();                //按键扫描! Z" D! n8 q  f/ q2 i/ f
                        Dynamic_Display();                //动态显示
5 h9 y, K3 ~# Z4 p$ T" M! `4 k
- [9 E* x9 h, }2 h, x                        if(true == MotoStart)        //如果电机启动
8 R0 V  }: c/ F- t; |1 _- w9 y                        {
5 y# i! H5 j9 _  Z3 U                                if(true == MotoRun), H7 q4 w; |! y8 W- b. I3 y
                                {  [7 `2 k" g% r
                                        if(--u10msNum == 0)                //如果电机转动时间到,停止电机4 |7 [$ {5 t5 ]% h
                                        {
* J( ]: M4 j4 L, E' z                                                MotoRun = false;+ R' e1 y# T4 T1 E
                                                MOTO_OFF;
9 @% v: E* H  |% p                                        }
  v& u5 M$ l' `5 S                                }
9 n8 V  @& ?. |7 j: y                                if(true == b1secEvent)                //PWM周期为1秒,1秒钟时间到,开始下一个周期. e. K! y( [7 O2 @8 p& R
                                {) Y' u4 I# l. h
                                        b1secEvent = false;
- k* w+ q- @% ^- p                                        MotoRun = true;
0 B7 X+ g2 q0 J2 Y* U  E( h! ]# U8 b                                        MOTO_ON;
4 s  {9 h8 c3 C0 w/ ?                                        u10msNum = PWMpercent;( L6 \0 Z: f5 y
                                }: `* I% p% A8 l8 s4 u' x
                        }
, h8 }  `# O2 l0 R: f& I                }2 n- f4 f6 f- s: W( C, |! t& I
        }6 t: A% Z. ^2 u6 I6 A
}$ a/ [2 j  N/ U- u0 ?
/*********************************************8 H# N0 Q- A5 b3 V
* 清显示1 ?4 f- y* K  m/ O, r
*********************************************/% m4 R& J5 ?* d4 X! g* Y1 T, ]
void Num_Clear(void)
9 s' b$ _  S9 H$ w{
% s8 {, C8 y" c5 D6 T        u8 i;7 H% ?, [; B: g" t" @3 }/ |% Q
        for(i=0; i<3; i++). ?- c7 [1 b# x
        {/ m  K8 K8 Q% S2 m& R5 D, g
                DisNum = 0x0a;
7 A! S& ~6 B2 D1 L' f  i9 c3 M8 d        }7 a) L1 p+ f6 t
        DisNum[3] = 0x00;
# x, G3 L# ~, [2 n8 r}' [  t) y& {, J# z
/*********************************************. z) a$ ~: ?+ P" i
* 读键值
7 a; w5 n/ F2 n  c: v*********************************************/
* V+ `: p; Z; Y0 v# eu8 Key_Scan(void)& h6 x/ O) j. f/ ?
{
2 Z  c5 {: m4 k        if(KEY_ON_PIN == false)) S1 G1 d7 A; I! o3 d/ E
                return KEY_ON_VALUE;% G! H$ R* Q& Q+ a4 X' T: g
        if(KEY_INC_PIN == false)
5 H# @7 x0 _8 F# A  x                return KEY_INC_VALUE;" v+ O( Y+ l. J( W' z7 Y/ R
        if(KEY_DEC_PIN == false)
! F$ s7 ]  B4 |6 J1 [; `: P                return KEY_DEC_VALUE;
8 @# V3 O$ U6 q/ d; s        return KEY_NULL;
% c! u* J, {. _5 e) ?' j4 Z}
- z* _9 M2 `# C! ]8 v/*********************************************
- u! m8 T4 U3 J2 i* 按键状态扫描
; @, K7 ?7 x. h% D0 Z! i*********************************************/3 }% b) M! X7 O# p
u8 GetKey(void)
: D2 S* O  D, ~' Z# Z- D8 f{
( t  P# x$ Z/ y. V7 r" L. g$ S        static u8 KeyState = KEY_STATE_INIT;
* H! {% o' |, T/ ?3 U# |        static u8 KeyTimeCount = 0;& @, h5 ~; ?. H# L
        static u8 LastKey = KEY_NULL;        //保存按键释放时候的键值
/ H* x- }, l/ }        u8 KeyTemp = KEY_NULL ;4 c; t4 g6 e) u4 s( I* ?9 k

+ K" K1 V' u: p! H/ ?  M" h3 j7 w/ i        KeyTemp = Key_Scan();
6 r5 C$ ^% o. r( V$ G, w# ^
5 H: o3 ]/ u0 w* A  @1 z- v- `- e0 F        switch(KeyState)' i  u9 Y# t0 W1 Y. x3 a
        {& ]8 I6 V' P5 i8 G( V8 o
                case KEY_STATE_INIT:        //初始状态  V2 k' r7 }0 A$ Q2 q' h
                        if(KEY_NULL != KeyTemp)        //有键按下- G2 C; C" z: u6 d! q( x& {4 g
                        {& b& d  j- H  K
                                KeyState = KEY_STATE_WOBBLE;        //进入消抖
* w% q" f" d/ C& |% `                        }6 U5 W5 C. f1 S! a" r
                        break;3 V1 t& ]+ d6 J" X% W

* c9 L9 O5 R/ V1 N                case KEY_STATE_WOBBLE:        //消抖
( X( ?. ^" F, E7 t                        KeyState = KEY_STATE_PRESS;
& q) g8 B6 e* o: s. N& l                        break;# ~% @6 r7 u3 Y( v" ]* j

4 l0 @1 S/ a! F+ X& ]                case KEY_STATE_PRESS:) \; s, K) W% N2 D9 s& N
                        if(KEY_NULL != KeyTemp)
2 H) K* X9 {4 U. S1 }. Y                        {6 J3 v* E) ^: H0 r8 E! [0 g, J
                                LastKey = KeyTemp;        //保存键值,以便在释放按键状态返回键值& ]1 V% X; G! {4 J9 ]& ^* l
                                KeyTemp |= KEY_DOWN;        //按键按下
! V: Y5 i5 K' {; b3 W8 c! x                                KeyState = KEY_STATE_LONG;/ T' }! w* }/ N- E( s0 S5 p; Z
                        }6 i( ?/ P+ G) G+ b7 a0 O
                        else
' S# c; }5 Z- j' G. ]                        {6 S9 ]- z) w. _/ L+ L
                                KeyState = KEY_STATE_INIT;
& i  T! R5 ^3 N; |3 n- }9 K                        }
/ @6 n: {7 m/ C" a7 g1 Z& G  j                        break;8 f8 e7 n/ n) d" M# g

+ d* P2 Y7 L' q5 B5 {, H& ], W- _                case KEY_STATE_LONG:- @. x  W0 z$ t1 S* p" X5 G$ ]
                        if(KEY_NULL != KeyTemp)- |- S. J. @: z5 y6 z
                        {, a/ E5 V  Q- [* M- C
                                if(++KeyTimeCount >= KEY_LONG_PERIOD)9 }' A( c6 P0 h# h  R
                                {& C- q7 `: w/ ?* y5 W7 f
                                        KeyTimeCount = 0;/ O4 ]/ H- I2 h1 w3 L# p! y
                                        KeyState = KEY_STATE_CONTINUE;
2 k" {$ V3 N2 F7 @6 L                                }
6 ]  p9 j* [# I, e* C( b                        }" Q% P* O+ h5 z7 R+ k" h, r
                        else; p8 I5 I9 f) c3 y, q
                        {
# T" ]* G) d6 L& x8 ?7 M3 [                                KeyState = KEY_STATE_RELEASE;/ @! O5 Z5 j" L' U7 Y1 }; k
                        }0 I+ V( |4 a2 P
                        break;
, J# J' b# F% a9 r2 X* Q$ K* i
) A) p1 v$ _% p                case KEY_STATE_CONTINUE:
9 t- G! ~8 k3 |                        if(KEY_NULL != (KeyTemp)); d$ X5 L+ G  e! P& ~  T$ u) I& w
                        {
9 H8 p; ]! X* S  b( J- I                                if(++KeyTimeCount >= KEY_CONTINUE_PERIOD)
2 p4 f2 g) w% N$ d$ H" J$ x" t# F5 R                                {
8 m6 d/ R4 h0 T9 r                                        KeyTimeCount = 0;
* _$ Y+ Z! ~# p                                        KeyTemp |= KEY_CONTINUE;  //连击按键事件发生
5 A4 f- J/ M2 p' K  [/ n( d' e) z                                }* ~3 d/ d" L/ y! S) ^
                        }4 W( J$ @  S( Q0 ~2 ]
                        else6 z4 N- r( ?' T: `' j7 E/ m( W) H3 d$ `
                        {
0 v3 T' ]% H: o3 [                                KeyState = KEY_STATE_RELEASE;
; e& b/ b8 ~+ l                        }
8 V& N" o- I; j3 |! o                        break;2 K; e- _- [4 e  h* {
. z; }. g, W. O! L
                case KEY_STATE_RELEASE:- h7 d, Z+ G( L& M" x
                        LastKey |= KEY_UP;        //按键释放
0 E2 |9 P; R, d9 {: m+ I                        KeyTemp = LastKey;
' z: O$ T) m( c8 F& A0 [7 t                        KeyState = KEY_STATE_INIT;
0 S2 g$ H# Z* @. _1 o* o& e2 h                        break;
! C5 K" j1 Y  f' }3 w0 V- C# X& h2 B2 e$ ^
                default:; z  _" v' A5 n% u8 S
                        break;0 [6 b+ X% H  r) `2 d1 X# \
        }) z' x3 i$ P, L9 U
        return KeyTemp;
) k* e1 ]' t# u9 c}% |7 e$ R  d+ I; a, B  F# X
/*********************************************
" O; K8 |% L) {% ?* 按键功能处理7 X1 Q; `$ \: \! x8 t
*********************************************/) `' K* a" A+ z0 T
void Key_Prosess(void)! _; l5 r) M3 Y7 W- Q9 l
{
& K2 F" l7 w+ s  v/ d) _" ?9 @        u8 KeyData;
8 Q* V/ `6 c# U$ c# D  K3 X) f0 O, [# X, N: i  U3 Q
        KeyData = GetKey();0 s3 ]% H$ N& l7 w+ q6 j3 ^

, q, g0 z1 D3 M; ]- o7 a' F1 j) {3 }2 e        switch(KeyData)
3 i7 }0 @: D5 ?        {5 G! f$ w& m7 p% {# f7 |! H  F% W
                case KEY_ON:        //开关电机
& Q0 E; J' |* v2 ?0 F! T+ E                        if(true == MotoStart)
5 ^% ^0 R( O6 F                        {  g+ I" ]5 [7 v( k% X! z/ ^* r$ L
                                MotoStart = false;
- ~8 w5 C8 D" ]: l% D9 N1 o                                Num_Clear();
0 h6 ^& ~$ |, w                                MOTO_OFF;, m. _! h5 L4 Y$ N
                                MotoRun = false;
7 h2 n8 j' s" Q$ D0 H4 Z                                PWMpercent= 0;8 ]0 N# r' ^3 \9 {8 Y
                        }
$ O2 N+ d6 }8 r3 }& \& \1 F2 e                        else; D+ O1 X+ o3 r- D3 E/ }' g8 t4 n
                        {3 Y: q# [* Q/ P! S0 L) \
                                MotoStart = true;
7 e! p, U2 X, R                                MOTO_ON;
0 o5 x4 y; t  k2 j2 Z) ^0 E                                MotoStart = true;8 Z8 ^8 @3 T* `, O8 x' B/ O; ?
                                MotoRun = true;
* p3 _* I" r- Z' }; @# V                                u10msNum = PWMpercent = 1;
6 x2 m5 A! E) k1 [                        }
% s: c) {. I! }  Q$ r+ ]                        break;7 J2 |- m+ `  o7 b. h$ M/ A

( A( ~$ V: r; U                case KEY_INC:        //单步增加( j3 q- G+ L" `2 T  w8 A
                case KEY_INC_CON:        //连续增加4 s0 h; D7 q6 ?4 v
                        if((PWMpercent < 100) && MotoStart)                //PWM从1%~100%
5 x- F! C5 ~+ E2 D' C                                PWMpercent++;) _) q; F7 u- ^$ ~1 d( t8 s3 n
                        break;
, t1 `! w2 {, B$ c, ?* P' S. c3 k: B) H8 l4 Q, Z
                case KEY_DEC:        //单步减小1 O; R- C- \) S: Q  f' b
                case KEY_DEC_CON:        //连续减小
, r5 ]; a9 ?- x/ R+ N/ i9 D; f: T0 e! t                        if((PWMpercent > 1) && MotoStart)                //PWM从1%~100%( ?& V$ T! C+ D' b
                                PWMpercent--;; g5 u# I* u( `' h( a9 \
                        break;
' f% L3 P# l2 W) O; h1 `) K
/ ~+ q) z( w: u; B                default:
9 Q3 c' g7 L) J  N1 ~6 N                        break;
2 O5 `, t+ g1 Y        }
. L6 T) k2 W1 h. W3 L; ~$ P6 z( x        Speed_Display();/ y# X4 S. j$ _' J
}
) }- H* |, [: P( ]1 R3 C, _. j/*********************************************
5 t1 h- N. }: t; h! ~) u2 ?1 P: h* 速度转换成十进制数2 w) r# Q* F  f
*********************************************// M. a) ^& o, m/ e: i: D6 V5 G
void Speed_Display(void)$ M+ g' p- @) W
{
+ e& i2 g. \9 B) |* u0 c        u8 i;
! K9 b- c# q! U9 W' K( t9 M
9 G( ]; C! C+ {6 s4 I& M" k6 S        DisNum[1] = PWMpercent / 100;1 ~" y7 o+ e7 x& v$ C
        DisNum[2] = PWMpercent % 100 / 10;
* s2 b; R" l) R% L# t8 F- K        DisNum[3] = PWMpercent % 10;
) e- s) C9 |, s5 m  ~        for(i=1; i<3; i++), m4 \0 @- W( q/ {- f+ f
        {" L6 s7 D. e# a2 E
                if(DisNum != 0)" p0 i& e- u9 T" X3 ~
                        break;3 `- Z( P# \; v( u2 N
                DisNum = 0x0a;
( z: H. s! Z+ Z" l4 t& h2 d……………………7 Q) p9 X0 p+ l- T+ c; E; J2 c( H* _

8 }/ N/ X% _/ f' ~) I6 n. s" L…………限于本文篇幅 余下代码请从eda365.com下载附件…………& T8 F9 g5 o4 k( {" n6 N% Z
# C0 ?* Q& t" ^  c2 E1 C2 J0 w
游客,如果您要查看本帖隐藏内容请回复
: C& |: j2 b4 ^. K- r! M

3 Y8 l+ p( @5 d

该用户从未签到

3#
发表于 2019-1-23 15:55 | 只看该作者
看看楼主的代码,谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-19 17:44 , Processed in 0.109375 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表