|
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 D4 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 m9 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 D7 z f$ K2 N k
|
|