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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
基于proteus的直流电机仿真 带单片机源代码
, B. f) k+ }5 `' K$ y( _
/ F1 C: u/ t* G* m/ A7 S

3 z" o; X+ e& V: q. ^3 E基于proteus的直流电机仿真
  X' X* A1 B% \, A+ q 6 l* p$ g& [; ?
2 ?, ?" `* v$ R4 T% X
单片机源代码:
* |: b) Q* Q" z
        #include <reg51.h>7 f! }6 a0 H4 `2 L6 T
  C. _6 Y/ @# r

3 H& S* F5 D1 B0 S6 u/ ~    #define uchar unsigned char2 \8 q1 {1 |9 x3 K
    #define uint unsigned int; C; ]$ `: r& |# Z  d

, i' \7 m3 x1 K4 Z
- [6 P% ^9 N- s0 z9 s- A  ?
        sbit open = P2^0;              //启动电机按键
1 D" i3 m- T% |& b        sbit close = P2^1;                 //关闭电机按键; u9 K. x# ~4 c$ `! t7 S2 T% J0 B
        sbit swap = P2^2;               //正反转按键
) j; r5 b; \$ Q" f( @# {$ ^' `        sbit sub_speed = P2^3;                //减速按键# s7 d! z: |" Z+ o) T, ~* g5 Q3 T
        sbit add_speed = P2^4;                //加速按键
; G) J; Q: n' H8 O        , D/ |6 G  ~, q9 a2 F" e/ \
        sbit PWM1 = P3^0;                  
: k# t8 v* ^9 m: E7 Y        sbit PWM2 = P3^1;                  ; u9 b# {: j6 X& W  y3 f/ Y) D
    /*液晶显示*/" R( a: W- V; a' Y4 z
    sbit E=P3^7;/ P# E" y  w8 g& s
    sbit RW = P3^6;8 J( W( {( U; x2 m
    sbit RS = P3^5;. k+ j9 |; m  M/ V- ^  V
        sbit test = P3^4;
4 Y2 T! p0 D) ~1 {( p- _; p   
7 d9 @* W8 S' U( \9 x        $ T/ R- @& w0 d( U% t' n: ?1 ]
        int time = 0;7 x& M. l: g  `9 R3 Y
        int high = 20;- s. D% \4 a9 r/ T- [1 W& r" W
        int period = 30;* \& k1 C) j  ~5 h3 E
        int change = 0;  H4 r) U2 m' O& Q1 M( C. |
        int flag = 0;) t& ?/ n0 a& u7 I0 T0 f/ Q  A
        int num_medium = 0;
- f  @0 {+ T+ \# b' l' t( l        int num_display = 0;
" l3 W0 M  O2 o. g        int count_speed = 0;5 y3 |/ i5 I' S8 E5 M: ~8 q
        uchar wword[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};   / P; Z: X# o! y, i/ j& r$ j, E; g

+ d) M" E) l& e! R0 d
; t% H2 b- W  M* b6 c* x

6 |) {) i- T. d! e, k8 ?+ K9 |

- g/ ]( @& u' {
0 c4 ^  q- B# S

, R7 {9 A  O) w& n+ j% w            
+ \% l  s- d6 m% [/ P        /*延时t毫秒*/5 @- e: A. g- K8 P7 \! a1 t
     void delay(uchar t)# R) R! U) h% n* _; ?
     {
& c/ ^5 a! S6 |1 b; j! |           uint i;
& e) o3 U" v' z( l7 ?           while(t)
5 U1 D! p$ e3 F8 n7 K; A' Y1 \             {
) r# V- i, y; |( r# e                    /*对于11.0592MHz时钟,延时1ms*/
- f2 S9 j, ]% x& ^5 [* p$ \                        for(i=0;i<125;i++);) y  k3 a: i/ K6 y4 H* h. ~
                        t--;& p* b8 U* A  E' B6 [% K5 s
                 }
/ t& L/ e7 K+ l8 }% S$ @* x         }
* }" p( r- n! T' j1 Z' ?+ d: ?8 f$ {+ q8 t

+ U% n. k  J6 \6 I  S$ c" e* F   //写命令函数LCD
7 x- A0 i; D, @6 z          void wc51r(uchar j)
  P, n7 l) i! L' h4 N, z           {
( Y0 A4 F9 a2 q* X              //fbusy();8 x4 A3 j2 Q  Z. U+ F
                  RS=0;$ g5 L% _3 Y% W/ i
                  RW=0;
8 Q' T" i; f1 V6 C* @! O          P1=j;2 b, N1 u# G' ]6 Q
                  E=1;
  @% c! A3 K# m3 S  H; s6 i2 o                  E=0;& y7 O- N' z1 d5 s' |8 e6 }
                 delay(3);8 B! [9 \- A6 L4 y) E/ v
           }
" I/ j/ ^8 ~3 q' z: o. r0 ]( i
! }. y+ o4 j0 g$ l

7 F6 N- D, m7 f+ y
/ {  y3 _" P, `

4 |1 E3 u& `% Y! Z3 z7 j1 f           //写数据函数LCD- Z3 B( |7 f5 f; w9 m8 E0 k
           void wc51ddr(uchar j)
  N& \3 R9 [# {2 ~1 j% W3 d            {
8 K9 e& B( c' `                  ) }' H: [7 \* \# f# E, T$ [" h5 W
                  RS=1;' X& _* `2 Z; m6 ~( H( `
                  RW=0;+ F* V- _2 H$ ]8 a4 c2 d% O5 B
          P1=j;  {  Z" m& \2 S& \) _
                  E=1;# v8 z/ U& Y3 T7 c0 E: |7 Y3 M0 Z5 A
                  E=0;" B. G* O) A. c" A6 n" d
                  delay(2);; R: @- `9 Q6 X' o! U
                }1 F$ l2 F  d* g, `# |

% b' ]: R+ K" V, ?/ _

2 u* X4 y$ Q! x8 H* @* v9 _; H, E- M. \  x$ b. S

5 ]+ l/ d8 ^8 m+ J           //初始化函数LCD% m3 g( a1 P* v( v% L: R! R5 {, y4 j
            void init()
, G0 n9 {& s. X* n0 ^                 { 4 W2 p) X: [- a/ @1 `# H
                   wc51r(0x01);  //清屏
' ]$ F  [; v  \) j6 k1 W" R               wc51r(0x38);  //使用8位数据,显示两行,使用5*7的字型
4 _+ s6 t9 o# }: X/ |3 X               wc51r(0x0c);  //显示器件,光标开,字符不闪烁! |6 w8 W  A% j5 `7 \% J+ t
               wc51r(0x06);  //字符不动,光标自动右移一格
# m$ p1 o8 B9 L8 F" u                 }. d. }& e4 H2 g/ b( Z, G( E( U
$ M9 t, I+ H& M, E$ ?3 j. |/ S

1 }: J: M. T- z: w; Q        4 [. Q' \5 Z" k: H
      /***********T0中断服务程序************PWM波的生成**********/! b; e2 m; i/ g% Y* [* ?$ c3 _0 X
                void time0_int(void) interrupt 1
9 [3 ~& B2 w: y" r- S. C' D                {) g  |2 D' }+ v
                        
5 m4 v' E/ C* q! q                        time++;
* }; K* J7 i: U& D7 _                        TH0 = 0xec;
8 F$ n; ~, U) K                        TL0 = 0x78;           //60536  K* O' F: V5 S5 T* o( @
        - @; A. N' z% o4 N( ?- O; ~
                         if(change == 0)                  //正转' v" d: j) E& ^3 x; i
                                  {! _" J! [( ]8 p; y& ?3 U+ h$ L: m2 d
                                                 PWM2 = 1;                                                9 d1 V7 o, F8 C) b7 ?( \% F/ D
                                         if(time == high)           //high初始值20+ X9 ^  y6 [, |) x" L
                                               PWM1=0;
+ w# j$ ^* W) V6 e; V                                          else if(time == period)           // period初始值30
: ?; y. |  X; T4 \8 F6 o                                             { ; Y  z  C. a4 S- P0 Z3 e- T
                                            PWM1 = 1;
0 Q5 O8 }) z; W8 F1 k( Y! j% Q                                                    time = 0;/ u' p2 F% h6 _6 j. O0 C
                                          }
1 v: T' B$ {& y  q1 w# ], A                                                     6 I9 @6 x& {2 l. Q
                                   }. k+ {# o8 K0 C* Y5 O2 f- h
                . J6 B( ^: T5 a* n; g& j/ }
                         else                                  //反转% t+ Y9 [* l! I0 N
                                {     PWM1 = 1;               
: G5 h+ p7 B, ]! z( V" r                                    if(time == high)4 F8 _5 l& k. J% X
                                        PWM2=0;# ~" r& R( k) y1 X
                                    else if(time == period)1 S  ?. C0 l9 \1 _# v1 }/ O; h
                                      { . a( U: g* G6 ?) {) J; w2 U
                                    PWM2 = 1;) g% [$ x4 ~' f# ^+ R
                                            time = 0;1 G, ]% `  V9 X% H. B9 B. Q! P
                                  }8 D8 b& {  H# D9 V% R; }0 d- `7 Z; V# E
                    }. Y( b2 l" d: n: j4 B
                                                  4 S5 X4 ]: J; {- D
                }
9 t, K* z% n& e/ h* f1 P/ X/ e                /*************************************************************/- M; z$ i4 x$ |6 }
  t6 c! e  {1 Y/ u+ L$ [& c
- l0 d! r* k5 I# u+ A0 m- u
! K$ Z6 U8 y2 w( Q3 D( r# T

: F: ^& v3 I% M1 L6 b       /****T1中断服务程序********单位时间(S)方波的个数*************/& ~  R# s5 ]+ E5 E: _) t
                void time1_int(void) interrupt 3 ! G: t2 R( ^" ]6 ]( x
                 {   " b  `' V* X0 u, c) I
                      count_speed++;                   //count_speed初始为0) }7 P& q) m0 F5 E7 g
                          if(count_speed == 20)
) M& c. {, E+ B4 B                             {   count_speed = 0;
2 x$ M' a5 M6 l2 ]" w0 Z0 O  {5 t                                     num_display = num_medium;
. u) q' }6 A& n. ^6 `2 A7 y                                         num_medium = 0;# o0 [$ ?3 |  r8 w. W4 e9 l/ v" c4 `6 f
                                 }
9 |* g" U  r( Z3 d" a7 w/ B7 \                                                            3 D9 _" w3 \& A! e0 h+ M2 a  a
                 }) c" y' g; c) [0 F; H0 W' ^; F
           /*************************************************************/# E5 h, Y( n& {' ^5 v

) c9 {2 r' m- ]1 Y! N9 T: R
# \% _5 H3 u# s5 k8 t, W
5 F* S5 ], Y4 O8 B

1 e. ?2 Y+ V. ~0 @  X9 q
5 A) o# q9 e! k. Z0 r2 f
" R  b0 V8 Y( a$ V7 L) H0 T
      /************************速度显示的数据处理********************/7 t& |# ]8 o( m
                void datamade()
/ D. e- u& _- `1 A4 ]9 D                    {  uint data MM,NN;
  L" b9 P4 u( V4 C4 H8 l        # {( t- p9 R- K% p) a8 A
                            wc51r(0xc2);& F; S7 g7 s1 x. H+ Q% `6 w' w
                wc51ddr('S');
6 a5 R4 X) T) M/ e4 K4 p  q8 c                        wc51ddr('p');
; P! X+ ~* k. C: V$ \* n* V                        wc51ddr('e');
! G* I% F) {( i                        wc51ddr('e');5 B9 y' h+ d: T/ ]
                        wc51ddr('d');% F* k( K, o8 c  j; V
                wc51ddr(0x3a);; b$ H4 f/ m8 I8 v
                   NN = num_display%100;! S' u* w3 r# b) N) e4 h' Y4 w
                           MM = num_display/100;
% ^' t4 E1 \* A. n+ i/ }                           wc51ddr(wword[MM]);# Y3 g/ V4 ^1 l8 _: n7 }
        
% H5 v/ J+ Y1 @& X9 Q  P                           MM = NN/10;
. Y* S, P$ R! X- c5 g! C  {, C                   NN = NN%10;! _) N/ \0 R( x9 M( p+ X
                           wc51ddr(wword[MM]);
6 W; F2 g, q, ]# ]) f& `! q                           wc51ddr(wword[NN]);
, b5 v* F0 M2 a% g. l2 ~/ F. s                                                                    
9 h) N$ O( [  E4 `! U                        }* |9 _5 C+ e1 O( [  b! E
        /*****************************************************************/
9 Z0 h9 K/ T! U3 @; O6 M  V5 I& `$ Q' M& W- V

1 a! y) k$ _; a" f    /**********通过按键实现对电机开关、调速、转向的控制***************/- Y# P$ G. d0 D- P
                 void motor_control()$ W. P8 j% E# T. A( l" f
                 {
. ^* g. C. w3 r8 V  e* d                            if(open == 1)
% D2 ?( P( A, S+ }  R! u                                       EA = 1;
* _6 u  E& y$ T# U' s/ l0 I                2 V6 D8 D' e$ l
                                   if(close == 1)
, {' p1 f8 {3 Q                                            EA = 0;
+ [: F2 t; X# p- R                # Y# Q) M/ ^& `1 O0 h2 f" c
                                   if(swap == 1)
  @3 K7 p; ^# s9 B8 c: e9 U                                            {; g5 E- t, r4 b5 [' L
                                                   change = ~change;
( p- P% t5 P/ M$ o# g$ M                                                   while(swap != 0)
- w) u4 }; U7 Q7 f3 X) A                                                   {}7 K. v& `0 R6 d
                                                   
  B2 \8 n9 J( Z. q: V* p  q1 w" B1 p                                                 }& F$ |# C7 \9 u* K6 v4 f, u
                          
. f9 z3 f5 g4 l# D. }) E                                    if(sub_speed == 1)
% ]1 ]; J% `9 x- \1 R5 u                                            { + c0 N2 C  z/ @  U
                                                  high++;
1 p9 i4 {$ F( y; Y% C                                                  if(high == 30)& m+ R: w) U$ c' j7 G4 y& h7 f
                                                      EA=0;
$ ~$ j7 E/ L4 Z% i+ {                                           while(sub_speed != 0)
; g9 Y9 i0 [6 M" D/ D+ ^6 r) a                                                   {}) K/ ?$ Y0 Y3 ?- G  Y& j! s
                                         }
  k1 z  [' T; {8 c" {. H                1 ?4 x5 i4 r/ p1 y
               
! t1 U4 \+ m7 r& U! k6 e  U* p, {) R                                         if(add_speed == 1)4 j& k9 q8 g) ]$ \0 _6 g) R
                                            { 3 m  l5 v! ~7 G
                                                  high--;& {0 j- V! U  @+ i3 \
                                                  if(high == 5)9 J, E% n0 b7 w6 W' e+ S8 D
                                                      high = 5;
7 a% G1 w/ U2 `1 d3 ^$ ^- M                                           while(add_speed != 0)
2 ~' V, |  ^$ p# n, [9 z2 ]                                                   {}: \. Z# w7 o& d; O$ h
                                        }' v0 e/ T6 M) z; ^2 F
                 }
) C& H9 ]+ ^9 g+ y: @
, m/ Z) {+ x* O. B2 r9 v

( N2 `+ W$ C7 {0 l        /******************************************************************/8 D& |0 M- E, _, T0 [

+ @& J6 q' }; s7 D5 H

! ]- ]6 U5 m+ w) j, e% c9 ]0 [2 o. \" l

9 N' b# n' I) u$ t3 T# J2 }        /***************************主函数*********************************/, ]+ W" A% Z* f) H$ Y1 [0 b
                void main()
, d8 k+ B0 v4 e/ J) R                {7 b/ [  b/ N( F% T; ~' l% {& j6 E: ~2 d
                     P2 = 0x00;' ^. f0 D8 \9 a6 i
                         + n/ K! X/ Z% m% z" @! a" v  f
                         ET0 = 1;, |% R: t, T7 u2 x' u
                         ET1 = 1;
0 A% d6 k' t* l" S8 C                         TMOD = 0x11;
3 T$ R: }0 R- V: t; Y$ V' G* x" F' b2 |$ K

& ]4 d  X. `' I; b1 l- v3 W! p* F: G                         TH0 = 0xec;
+ w. L+ [2 Y. [+ B! f                         TL0 = 0x78;
, J7 w! Z6 T9 j( O& X  `
% @" O1 c8 d+ t9 v' y3 L
* n) b: ^3 Y# z, `  w" j
                         TH1 = 0x3c;
  K8 M3 B2 F9 B- b                         TL1 = 0xb0;         //15536) b! H2 X+ V% e! M) m* h$ n0 ~5 [
                         TR0 = 1;% A$ }; ~- d" r" x& k
                         TR1 = 1;7 n" M$ {. N5 X+ f
        
5 d! A6 O; l0 B9 N# ?                 init();            //液晶显示初始化程序
% J  N; [3 M* v3 J5 z3 {: Z                                                                                  2 _. _' M) d! L5 t
                         while(1)
* ~0 E0 Y/ |2 R' N% C8 T. ?                         {     6 ^: \" \9 r* b' ?; C
                                             7 K% q' `9 {6 _: I; H  ?3 X
                        wc51r(0x84);
* s5 U, p- h7 A% d& O                        wc51ddr('H');- M% `% Z% _. _1 g: j' e  I
                        wc51ddr('e');
* l7 y0 |9 H! {' R1 I                        wc51ddr('l');
; {, h' R( x; `+ a                        wc51ddr('l');
. G2 S; O( E9 [. I4 {" Q                        wc51ddr('o');
2 Z  _0 x( n! p$ ~/ d, q8 q/ I! a/ @
/ d; \9 F6 i8 ]+ M

$ @. ^: a  Y" C* L' @/ n                                                                                         
* W3 U( R: q# V                                if(test == 0)
) y4 P( ?* i7 ?8 X                      num_medium++;
/ m1 a5 @, ^" k# R* J& h2 e5 a                                datamade();
* z; A; C; U2 E# S3 f2 w& A/ V                                motor_control();
! M% ], t5 V+ }; Y; W                        
$ z9 g: o  d" F& X…………限于本文篇幅 余下代码请从论坛下载附件…………
6 m) M! B4 a0 U- c# b8 C0 F' Y+ S! k
游客,如果您要查看本帖隐藏内容请回复
  T, v- R7 J, q

8 J5 j5 o! s& `& u# i

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-3 14:17 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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