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

基于proteus的直流电机仿真 带单片机源代码

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
基于proteus的直流电机仿真 带单片机源代码
8 y' Q8 W6 C6 k0 F* V
/ Z! d% |! j! c+ l

, u. t1 v: a. P$ x2 W% J2 I基于proteus的直流电机仿真
7 H7 t" S( T0 K ' D% E. a7 l# _) x( c
8 }2 o" W6 D# Q& q% E4 |
单片机源代码:
- e& s7 @2 ~$ p
        #include <reg51.h>
, {; a- @% V( {! |/ J' _, c$ o0 x9 O. ]6 M$ s
5 k1 M" J3 h( o( S. R
    #define uchar unsigned char  G0 b$ `* F. W( d
    #define uint unsigned int4 _! F* |2 G* |4 E3 g1 B
) c. }( u8 {8 @6 A
% [% x. E" e) i
        sbit open = P2^0;              //启动电机按键) D9 C1 ?- M# I& i1 A
        sbit close = P2^1;                 //关闭电机按键; O* H7 B; z) H6 Z3 r# `4 T; f3 r0 \
        sbit swap = P2^2;               //正反转按键2 @+ V$ h# ]1 G
        sbit sub_speed = P2^3;                //减速按键
. P) f3 F. s( i0 o. z, v        sbit add_speed = P2^4;                //加速按键
" J7 b3 j7 J+ a8 o( i5 P        9 W7 ?2 }& O3 L$ d$ M7 F! }
        sbit PWM1 = P3^0;                  
* g0 c- k7 ^7 J5 L" f5 y5 q9 s        sbit PWM2 = P3^1;                  
; h6 C1 E' }/ V9 t4 O! C    /*液晶显示*/; ?. g' o1 H, [5 r
    sbit E=P3^7;8 u& V7 T3 |, s# L% t: S
    sbit RW = P3^6;% P( x9 T6 E8 u8 v
    sbit RS = P3^5;- X4 h8 G0 W9 {; G' u' y" T* A  c* r
        sbit test = P3^4;1 V% p1 a9 w% T5 {
   * m& U1 q# C% L+ E4 A9 j+ Q1 v
        # w- B; e% l. M$ q" T3 T. V
        int time = 0;
, C& f* |; B* x        int high = 20;
6 [5 I, ^, j4 `- e& |& ]) ]2 U        int period = 30;) A: M! Y3 U: D0 Y3 U; {
        int change = 0;
/ k( c0 t3 |# x& k4 w" q        int flag = 0;# V' u3 h( w7 u1 [& L  S
        int num_medium = 0;
$ T5 I$ V6 N( F2 M( J        int num_display = 0;
+ I- n( n3 f- R. u% f* O        int count_speed = 0;
4 a' O, a- X' I        uchar wword[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};   : v* X4 n  F8 Z7 E
; v7 G; K; X" k1 {' f7 @8 z+ K- j

: q. }; g2 c% D, E5 t0 ]  w  d6 Y( ~  G$ C. ~( _- P
$ Z8 Q7 U/ s4 X; r

5 L: H/ ], p# f! |- d

6 ]; D2 Z: m: e# J- `1 s            8 e- w4 i% W$ X3 [4 I9 v8 r% o
        /*延时t毫秒*/6 k4 \. T( f7 o$ j' s
     void delay(uchar t)
( B" x( [* v% _: G* y  z     {
) m% D6 i# Y! y- Q3 ]           uint i;) R: Q# p' b! A, }2 B4 w2 k  O
           while(t)
" s1 O2 S$ L7 f) B: i9 c+ j* Z3 D$ n             {. d! m# E. W" j
                    /*对于11.0592MHz时钟,延时1ms*/
/ G1 p9 f; a  @# K                        for(i=0;i<125;i++);' u% [" \" D8 J) F' X/ r
                        t--;
% {" c" a: o+ k2 v                 }0 J6 t0 Y* P1 {- Y) D
         }  i& |- H5 D* W9 `' L7 h

7 ^, m; J. _! E. U5 Y0 D
4 U( c9 R7 F/ x2 i7 M3 H: e- x
   //写命令函数LCD3 t/ A: P" Y, G0 u; R, ]
          void wc51r(uchar j)
( h* ?! s# N/ G" b6 m9 ?           {* ^7 o. @0 A" \* A# n
              //fbusy();6 G) K; ~. h' G9 U6 O
                  RS=0;8 D1 A% j4 I& h) B+ s
                  RW=0;
# d' E  _; G4 N          P1=j;7 i/ B+ E6 u) D% ~8 Z: x; x5 z
                  E=1;
: I1 i% W* P. J                  E=0;* G! R1 w. Y3 k6 W
                 delay(3);
# y& @( ]" M! Z/ p           }  z. l+ ~0 U$ l1 j$ P
! D8 x5 R/ M7 k7 F
3 z9 W) t& s: k& I5 S
4 M* Z) b2 d. a6 O
' ^2 l% O- }7 }4 Q. A
           //写数据函数LCD& n6 @% ^' i) J) ~+ c6 x
           void wc51ddr(uchar j)
  ?4 ~+ P. z' }" V' z            {
, V) p* o, l/ a( ^! W8 `" \                  
; U  ?2 ]+ I4 r8 v) y( x                  RS=1;5 I) e( b% x; Z6 P: j
                  RW=0;( f6 N/ y0 u4 B+ Q% }: o3 i- }) e, @
          P1=j;
7 \1 ]3 d" P5 J+ ^/ v6 }: c                  E=1;
8 d, ?3 J8 E  T5 S, `+ j                  E=0;+ ?" r; u, [4 q: k( j8 H
                  delay(2);
! |  t, p5 `8 \  V, c                }
$ T. r- m5 m! O8 ]+ Q7 D# h8 i2 V; i+ R& f5 ]! W
3 U; j/ W" t. a2 F0 b
, S* S! C/ E( u+ B7 \0 _, J, _. }* ]

/ ?+ O5 ?5 H( c2 A9 `           //初始化函数LCD4 T+ A9 K2 I3 S' A- P& E
            void init()
; P: \* g# M; |" x" _5 x                 { 8 E+ r& A9 O+ L1 J; w- x
                   wc51r(0x01);  //清屏. ?  \; a3 H( A& X# H9 a2 C0 |% T8 D) J
               wc51r(0x38);  //使用8位数据,显示两行,使用5*7的字型
+ m, r' G$ e0 j6 d, B               wc51r(0x0c);  //显示器件,光标开,字符不闪烁1 ]' x4 o# S0 G* S) {; l9 M
               wc51r(0x06);  //字符不动,光标自动右移一格4 g2 m! b7 l& z
                 }
# T5 Z$ [- v0 {% E5 Z* W3 \: @9 j4 |. s- t1 f! S8 b3 J9 s4 @8 d
; J3 p% [% E9 _' |/ O5 i1 o6 ?
        ( `; }8 g( B" M2 I$ @7 G# z1 [9 a
      /***********T0中断服务程序************PWM波的生成**********/
2 d4 g/ o: u9 d                void time0_int(void) interrupt 1 6 N0 u& q9 L  p3 K5 @& e
                {
: J* S! _  ?. Y; J                        8 e: G+ v3 o0 P' ~& ^
                        time++;, }4 F  }2 Y4 e' Q2 K
                        TH0 = 0xec;* b( z9 }  }8 c' @; r( R4 Q8 e
                        TL0 = 0x78;           //60536
- P2 t" B6 O  B        . `) T4 W) Y% c  X6 n$ @# D
                         if(change == 0)                  //正转* B* K5 t3 B& ?# w2 x: Z
                                  {- a# C5 g, v# V  V+ J
                                                 PWM2 = 1;                                                
- w& A' I0 t# l, |                                         if(time == high)           //high初始值20
5 n) @6 x  Z9 E" i* h) t; y8 O                                               PWM1=0;$ o0 Z) c+ e$ d9 s( Z# O0 P
                                          else if(time == period)           // period初始值303 f1 z& n1 m! m$ l( L' s4 H
                                             { * R; e6 c: a& X/ x- w
                                            PWM1 = 1;
* B: M3 @5 Z2 S# r& M0 i, h                                                    time = 0;
% q% }, m* G4 f3 n, R& O  h                                          }0 t  J, k; A, I" }, F
                                                     
2 k0 [& A  H; s5 M+ E                                   }
* q% m. x+ U0 R               
1 i( H/ K5 Y( h9 i                         else                                  //反转" f  D, o9 k3 `! d2 N" M0 C* e9 t: Y
                                {     PWM1 = 1;                - u6 @+ q+ i9 V6 `. d: e( X; i
                                    if(time == high)
& F, Z3 {+ i: }  x                                        PWM2=0;' U7 K. |8 Y: \& c2 h# I$ X
                                    else if(time == period)1 _) g/ E4 a. @
                                      {
( q5 N/ v& b4 y) D) U5 j$ ~                                    PWM2 = 1;5 i) V* E5 K) o: p& y
                                            time = 0;
' r; U' R  z8 x) w+ M; U                                  }
. i: w: E: e: j0 e+ m; a                    }1 @- A& @, b/ w8 B; c
                                                  4 J0 J  A3 F* m, M  ^; S/ q3 J
                }4 Z5 p, s+ p8 u% C3 E
                /*************************************************************/. ?* K+ L& f6 g" o

- j2 N+ n( z* R$ m# \9 I- A
% _0 @2 C) @3 W6 a' A1 k9 r
! l9 X/ q4 u8 D! I
& W) m( p* ^& p% B& \. c5 _5 o
       /****T1中断服务程序********单位时间(S)方波的个数*************/$ c7 ^) p, ^! z3 a' X6 r+ U
                void time1_int(void) interrupt 3 . E9 [  d. {/ |1 ]  z
                 {   
: Z) y* C7 u& `) ?) C                      count_speed++;                   //count_speed初始为0
  m9 T! R& j9 Q( d% S8 E                          if(count_speed == 20)9 x) U' a2 H1 N5 \. r1 y9 @
                             {   count_speed = 0;
+ y, K- u% I5 t. k! }8 P9 t1 x                                     num_display = num_medium;4 A2 M% c% ?+ ~* b0 Z) n7 `7 v# y
                                         num_medium = 0;
$ e& u2 s+ f3 n* d; M* I/ w, H                                 }7 i/ X% X5 d; |2 x/ T
                                                            ! a9 P$ e7 x% q/ e6 l
                 }" L+ T1 n, n& j( w+ o; v: z
           /*************************************************************/& g: ]% x/ ]2 E1 z4 ^. r( J
0 [( I- |; c3 C6 ~, h' R2 {
* E; u  C$ w! m5 @7 q# h) y2 |

5 Y1 \* D8 a$ r! b7 Y$ S; b
( j; G* X; |# C2 A3 N
+ j# ^! z2 \2 y% \. `( Y* P

- H9 L: J2 h# a& P      /************************速度显示的数据处理********************/
7 @% E& O3 @" b3 U! u; l2 j$ m                void datamade()
% n' l- }& h% @7 X0 B                    {  uint data MM,NN;1 n6 R1 }1 D) t2 C
        
/ c# C: y; Y6 }! k8 u; B& p                            wc51r(0xc2);0 ^1 b2 k" ^: m
                wc51ddr('S');& Q+ t/ p" c3 Q- _3 ~" t5 s
                        wc51ddr('p');
) B) c, h% i  G/ d' g7 h7 r% p  g6 ~                        wc51ddr('e');9 x6 G# R5 M7 I9 ~8 _
                        wc51ddr('e');
5 }; G- i- t# B, J0 R. ~7 r                        wc51ddr('d');
) t5 h6 B. X4 K1 I: I- I                wc51ddr(0x3a);
% u. p6 ^/ C3 `# G6 Z" V                   NN = num_display%100;& e4 K  O. w2 ^
                           MM = num_display/100;; E8 K( W$ H. @$ Y! `) R% g; N
                           wc51ddr(wword[MM]);5 e' q0 w( }* \% n& o1 j
        4 n2 j, p3 i, d& X
                           MM = NN/10;
! v* M! g) @! H- F) I                   NN = NN%10;1 q' c2 C# Z% r8 n* |8 X
                           wc51ddr(wword[MM]);
0 ^2 {4 b2 Z. P2 u; O                           wc51ddr(wword[NN]);* b+ u+ s8 g: `3 s. \1 O
                                                                    
& T0 b, V# ~3 f/ {                        }
# K0 B, @( J# M( z- r        /*****************************************************************/1 e: l# L% D# ~- Y
& [8 `7 B5 Y4 n
9 T' D/ }/ C3 |. A8 N# q
    /**********通过按键实现对电机开关、调速、转向的控制***************/( r. ~/ w, _4 u! r- K
                 void motor_control()) ~1 D0 m. m" P. j: o& X3 n& [
                 {
, j8 k# l( R: V                            if(open == 1)( p: M6 E4 S4 ^% ^2 U$ a. A' q3 j
                                       EA = 1;
$ V; V# Y' e4 Q$ O- {                6 ?  j9 E6 D: f4 p! ~' i
                                   if(close == 1)
" j: ?/ }6 y3 U& E$ Y                                            EA = 0;" P3 O) ^4 h  R7 i4 Y2 P
                4 M: w' a) s2 Y6 \9 c  K5 V/ y* b
                                   if(swap == 1)9 g, B9 _0 n) ?9 [: p4 ]
                                            {
# m/ X  B& {# A. z0 w1 z4 Z4 V                                                   change = ~change;
3 `, J# r2 d" D! d                                                   while(swap != 0)
4 v& e' y. F# L                                                   {}8 ~. u' Z: K! Q, }; C
                                                   
. Y: ]* Z. k4 J, }8 E7 Q6 C/ d                                                 }
1 N, D: P6 Z: d6 p, a1 R0 q# G                          1 h* V+ c  b4 V8 c; S& k$ m% L
                                    if(sub_speed == 1)
3 \/ ]1 X5 s9 H; D% n; \  Y                                            {
7 m- V3 Y, @& o" C                                                  high++;, o9 J3 o: O7 S  p) G
                                                  if(high == 30)
5 v8 g  d) H8 q0 s% {                                                      EA=0;
7 P5 \  N7 M* b; {" l0 p8 F# ^  \                                           while(sub_speed != 0)% I0 B* q+ x2 a% M4 @/ U
                                                   {}5 E# Q* }: t  {/ |3 {& ?9 g
                                         }) ~; m+ a* l8 \; X( t
               
& \6 q: [# y, E/ D0 i8 t               
# J$ \+ J- t; [3 [* o2 T2 p  x                                         if(add_speed == 1)
5 j3 d( v% \; T* @% p. Z                                            {
7 u5 \0 {7 G0 O: h) g                                                  high--;
! A9 g% k! i* T" C3 t8 R                                                  if(high == 5)& T0 V) v0 s# {; E( W
                                                      high = 5;
7 e: W. V( Q- V                                           while(add_speed != 0)
! C' b3 a2 U0 M+ ^) V                                                   {}+ w% F5 ]. K9 k8 x, p" ?
                                        }
9 E3 T8 ^4 V. ]5 f                 }5 H  b; q! }) d; t; j) q! a, l1 s/ K

4 ?* B- l3 K6 A7 p7 c, B$ Q0 r
; v/ h- b5 s0 d/ o9 N* q  R. {
        /******************************************************************/
" W& C8 @  U  y( ~0 W+ o/ m1 i/ C; M" n6 i1 \. j( }

* `' R) G  f8 b+ i/ k) [
7 G+ C( t0 ^: R6 G6 r3 m
9 b& P, Z4 K7 G3 ?. k, f; \2 b8 V" E
        /***************************主函数*********************************/
' R* t  u1 L& p                void main()
. Y; O) G, @2 n* D6 c3 U                {
4 w* ?  S, ]. S% `                     P2 = 0x00;* a$ V, F3 V) \; s9 C4 N) f
                         3 t: J3 ?6 C1 Z0 Q- \4 [
                         ET0 = 1;
$ E4 R  E. s' w8 H$ f                         ET1 = 1;5 [" k+ `0 M7 w5 y6 P2 n4 d
                         TMOD = 0x11;" D% ~. O3 }) }6 `7 c3 B' @
3 L) q# ]7 n, n! L1 [7 O; I

% e$ V% O6 K% Y* Z% g                         TH0 = 0xec;( ]6 c8 q! I% Q
                         TL0 = 0x78;- D& {; Q4 p6 l/ n

1 r8 ]5 T$ B# `& E+ [( t% ~' ^6 V
' V  d  ]% e( H" K# D
                         TH1 = 0x3c;' i4 ?, ~' X1 l. Q9 l$ z% U
                         TL1 = 0xb0;         //15536- z1 Y1 Z5 l# B% T% Q
                         TR0 = 1;5 r! P* A* s, M- k! K! _
                         TR1 = 1;
7 w- y( d" q* @6 c7 s; t        6 N% P7 Z: t: O0 t/ e# Y8 S
                 init();            //液晶显示初始化程序
7 v% X3 `+ F+ T7 q* p# t                                                                                  ( w( s$ g* z+ E" W9 k
                         while(1)/ c; }( ?6 Y) Z7 I$ r
                         {     
- L' E/ o( o1 T) U. {; `. w                                             1 `1 ~7 P2 c; ^# t1 s+ h9 R
                        wc51r(0x84);
& M3 X  Y2 M8 N9 Y8 ?                        wc51ddr('H');
. Z$ ~8 v2 T* U- o, N1 w2 z. N                        wc51ddr('e');; }+ d+ E& V7 y# S
                        wc51ddr('l');
$ j0 L; B- M' p9 H) x0 S: w- B. D                        wc51ddr('l');
0 [! w9 O* G0 V% i+ v                        wc51ddr('o');, t) x) G9 r0 b

' c9 J8 B# }  m& B
# m$ O1 h' Z" |" O
                                                                                         
% |2 c* R$ q# v& g1 t; X8 [                                if(test == 0)
0 m1 \2 s8 D7 }+ B( P0 z9 f                      num_medium++;
1 a# ], G  a9 |7 d: }, u. i$ ?                                datamade();/ f& F$ E0 O. U! n4 Z- g' ^' G& t
                                motor_control();
  l. |+ Q5 R9 j8 e                        
6 x  i4 k$ [# p5 e) y8 O; l…………限于本文篇幅 余下代码请从论坛下载附件…………0 Z2 R) I( {2 Z  {* H; Q. ~
游客,如果您要查看本帖隐藏内容请回复

, N5 Z- I( K6 N/ P% m. D9 D
7 z  f$ K2 N  k

该用户从未签到

2#
发表于 2019-1-7 16:52 | 只看该作者
看看楼主的代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-9 09:53 , Processed in 0.187500 second(s), 27 queries , Gzip On.

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

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

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