|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
基于proteus的直流电机仿真 带单片机源代码% i) o) U4 O, u/ M& D' F/ ~
+ {' f" ~& H2 t, M9 v% @0 @ D/ o. M1 g% z9 c& I1 O7 A, e0 n- d: X& m, R
基于proteus的直流电机仿真; F( j' l" X* H3 X3 k: x
Z) r6 I5 U# t7 f
0 q. A2 X x, B: }' l& S
单片机源代码:
. [& q T- ~* O #include <reg51.h>
l. n* O. C+ C) B
2 i# c$ L2 q0 ?2 c) U# w$ b
D7 K! a; h) h) J4 @- [: e; @8 l #define uchar unsigned char
+ F l, _1 s* T( R2 h #define uint unsigned int8 o5 k# E+ w# P- W+ ] p
5 F, U# h& p. p4 ?, t, K/ r
4 S8 T$ @% R* U' F$ b sbit open = P2^0; //启动电机按键3 f+ I6 t% P2 { |
sbit close = P2^1; //关闭电机按键' ? i+ A S d C/ p7 A% P$ O
sbit swap = P2^2; //正反转按键
5 K: S, c5 M, }" e9 t sbit sub_speed = P2^3; //减速按键2 [8 W# l6 |" ?5 b) |
sbit add_speed = P2^4; //加速按键: j/ a2 _7 _4 n* e' K
# \* y% _8 T x3 J sbit PWM1 = P3^0;
; A( b* x1 g8 H sbit PWM2 = P3^1;
# C: s- M5 o, i: | /*液晶显示*/. V- L6 c* `5 r
sbit E=P3^7;
1 q- U- r+ L% C+ |7 ? }; o' H9 Y sbit RW = P3^6;
% r& Z' H+ [8 c: w* X5 r sbit RS = P3^5;
3 p5 I6 P% N- O6 M# q- Z sbit test = P3^4;
- }5 |& @, ~' U0 b$ U/ G
( Q, \3 S0 I: h$ _1 o) S. F
$ L2 R3 n% |+ W: w* k e int time = 0;
( R2 x, j+ a# }" \* r int high = 20;
9 X; e3 U0 \% K( [& i: z7 `5 \" `. I int period = 30;
k) {% ^7 b8 s; X* a/ k2 k int change = 0;. b3 u' |9 G$ Z( U n
int flag = 0;" g" \# [7 r6 r1 Y; j! Z7 j
int num_medium = 0;
# c$ l1 W" ~' q( X! ]* `* t9 V int num_display = 0;
: ?) p+ V( ^( `1 q int count_speed = 0;
) k' x4 \( P0 [+ `# u( M6 z uchar wword[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; ; n0 \5 a, c6 a( T
% u! K3 g4 g7 y3 G( Q, I
- w! x) A# _3 Z/ ?- L! {
& c+ [5 E( E7 {! `6 z, K! ?# E! U
& J4 b: c! K4 s* j+ M
$ p7 p/ f" ~* Q! y/ b# X% t+ v & ]5 W5 r6 i1 ~6 y# L5 |/ z9 U
/*延时t毫秒*/! I) X1 ]7 X) g, @
void delay(uchar t)
+ ~! o$ _( N5 a" A T {+ N3 ?0 D3 C7 H- g% T; e% L
uint i;4 y1 E( {, p$ z9 o8 i% C7 I
while(t)
" e2 }3 H6 R4 j/ @) {8 A {% C: c3 l9 a* z* d7 s7 M6 i. O
/*对于11.0592MHz时钟,延时1ms*/ b2 w( B5 K! l) d
for(i=0;i<125;i++);
7 F# F: l1 a; {+ ~( B! ~ t--;
6 o' a% p! ^1 z% p }+ x4 c2 _& b. O3 t- y2 a$ C
} Q" {; ]! Z8 e, U
% S. a1 O2 q) y; p o: d# k; m9 ?9 Y1 }- Z& ~# R8 c
//写命令函数LCD
4 W! L a% j% {" \8 c# x void wc51r(uchar j) D/ ^1 C3 i1 L4 V4 t; C
{( T/ x( r k: n$ I
//fbusy();! C" W' J- D1 X
RS=0;; [ d) [' u' X p5 E6 j
RW=0;
0 @, [9 t+ y0 Y7 i4 ^% h P1=j;4 }: m: |; R5 d
E=1;# d% r5 O5 f5 K
E=0;; `$ H5 `9 W, V; Z4 s0 m5 [" d1 N# _
delay(3);5 H7 k6 H* O8 E M% E% w+ }: s X, ^
}2 N S& h! f. [1 i7 k/ l3 o3 c
3 p$ \8 G- D. o/ q* b% T1 q$ F5 c: S
& {! }, k2 Q. n$ c& w9 r
: T+ a4 V& u% l a6 O2 x, o' [9 T. J+ S9 i
//写数据函数LCD5 {4 r/ y) e9 G" D) j2 {
void wc51ddr(uchar j)
1 G) h& w. z3 \% E5 x/ ^. k0 f; U {
4 y1 H7 C) J3 r/ @ H+ n ^4 V
& Q# y3 x6 Y" C3 J4 F RS=1;5 I3 Q: q2 A; k. y3 R C
RW=0;
4 U$ ~' p/ R6 c) B9 R- b1 l2 `' B2 E P1=j;3 v$ a" c7 \ O6 [3 Z) G; { i
E=1;( s) F, }5 f* g/ b: I
E=0;
" k: x3 p/ p/ X4 K: w delay(2);: _# z; t2 L/ c! e" |1 t* E
}
H" V- k$ p- d$ Q7 _/ g+ `1 E+ E+ e9 D
) {2 G: W7 K. U! D! f8 a* S+ e. S! V- f
/ j ~) N% I% w4 ?6 z U, M h% R( @4 R$ c$ T7 @' Q% \/ Y
//初始化函数LCD8 s$ P, c0 @' G: F) ?
void init()2 ~) j9 S9 l" R
{ 0 x9 [, l+ s7 h6 o f
wc51r(0x01); //清屏
, J2 `4 p/ e/ k2 s7 K wc51r(0x38); //使用8位数据,显示两行,使用5*7的字型
1 b1 f1 v, s4 d9 }, l+ x4 X" o: Z$ \ wc51r(0x0c); //显示器件,光标开,字符不闪烁. \+ D7 F& i1 \: o
wc51r(0x06); //字符不动,光标自动右移一格 W# O4 ], g5 F; I
}9 E( A' i( e5 H- Z1 j
- A, ~( M! o. u3 j
3 q% i, g+ z+ A- u: z* O
" i3 ?! U& s" O
/***********T0中断服务程序************PWM波的生成**********/
% k1 f$ F6 E7 _$ F9 S5 t6 E void time0_int(void) interrupt 1 4 n% i6 u. o2 i" s, v+ w& K
{8 R5 w, r0 Z: {5 J
; Q; r/ a6 x4 Z8 p time++;
$ j3 n- i3 p# m- b( u1 ? TH0 = 0xec;6 E. S% D. Q- g2 \6 [9 ?
TL0 = 0x78; //60536. D% ^" N5 l- [8 Q
+ M. Z$ ?: }* d& j. R ^+ }" k if(change == 0) //正转, y: `: C& D6 E. s
{) A7 a8 r5 _1 h$ a0 `6 t, |/ J
PWM2 = 1;
* C; J: g+ L9 l. V! w! Z if(time == high) //high初始值20: i6 G8 l1 i$ c& L' t4 o
PWM1=0;
* V2 y9 f. F K; j8 d. c5 x" l else if(time == period) // period初始值30
9 h8 y4 N: J! n C1 t5 y. p$ w { ( Q' _+ h0 z* a& o* {
PWM1 = 1;
; j3 P) G7 {5 Y5 U/ q* K time = 0;. Z/ g4 t+ U2 Z. m0 C
}
* P8 Q: {1 L; q' e
/ c- J8 M5 I- \# n& ? R }
; b5 {8 u' s1 n/ H) U
V5 f% j& h. b9 Y7 e/ e& y else //反转' m- Y9 W6 l" Y) ]* ?" l
{ PWM1 = 1;
- M) O. z. Z, t) v! {: S+ [ if(time == high)/ }8 ~. V( V8 E6 u/ J
PWM2=0;; Q! a, ^% z% R+ ~3 a, `
else if(time == period)
( d; h' x, i: m' X+ B4 q { 9 s7 Z) ~- Y; m7 h& d9 T2 l1 W
PWM2 = 1;; p ~9 N7 I) ]0 t' f
time = 0;" W+ h4 i5 m0 ?% y
}
- L6 ]9 x+ [4 @7 c: s% m7 E- S }6 P$ O3 a# g {' e$ \
; q+ a- V6 p3 T' k P, I6 o& E. X. o }8 l2 t- h# p& q5 l! D. H! O
/*************************************************************/
, s2 }7 L& c d2 t% e4 s8 D( k) K: j! y% f% a( v+ ^1 c, i4 W2 f; x
: G2 [$ k0 i) r+ c B
7 w$ Y3 T: Q& ^4 B- k: f4 w* x
4 e C; f0 _' a( {) Z+ z /****T1中断服务程序********单位时间(S)方波的个数*************/
U3 h% Q; z: |; ^3 O void time1_int(void) interrupt 3
( J% O3 K5 B2 e2 Q# Z; E { ( [" }+ {3 ]7 m; L( }5 B
count_speed++; //count_speed初始为0
8 v& `) A& `) k if(count_speed == 20)
5 h8 `2 _$ Z$ H, q8 Z, q- e* e6 d; A { count_speed = 0;( v$ q- _ a3 M/ X5 ?, I
num_display = num_medium;
+ l: y) g: [9 D num_medium = 0;' H! f% A* A7 H. J' g
}
7 s0 z7 p3 t! B" ] I' Z $ h. P( P: T( x9 d
}3 q7 d; E7 B! F) U; O
/*************************************************************/+ b$ ?$ m- v3 p2 Z. H
1 h ?% `: H: I8 H+ i5 `0 z, i6 T3 `2 K
' b `- Y" E6 ?6 B
5 k8 I+ [' v: H* L k8 y( E# l% | ]5 B5 f" i
" r0 p2 K% l6 _ Q) i
/************************速度显示的数据处理********************/
. t7 r. o y5 ^$ O3 u \ void datamade()
/ ~, B6 S# k3 j& F+ |6 d: v* N& c; z1 d { uint data MM,NN;
/ }+ b8 x: b9 {, t) F0 q1 N
, f# f1 J8 E9 x wc51r(0xc2);( }$ ^6 i# B0 I1 [& g
wc51ddr('S');/ n D9 x8 j$ i9 j; e6 I
wc51ddr('p');4 o& m4 [2 l% A
wc51ddr('e');
9 p. n! S1 X/ F5 e$ A- Q wc51ddr('e');
: h' f( \2 ^- D3 \ wc51ddr('d');
: S( W# ~9 Z0 ^& u+ V- e wc51ddr(0x3a);" H5 U# o& s0 ^, t
NN = num_display%100;
, ^( Q% ?; l3 B/ y; I6 z MM = num_display/100;
" n0 b+ b3 \0 ~5 y2 a wc51ddr(wword[MM]);
. U6 y5 T' P6 f9 W9 N2 \, O( t: D+ W # t# O4 P( |+ B- ~
MM = NN/10;# E+ Z! d5 U1 |7 [' e5 b. {
NN = NN%10;- g9 d$ h3 T: l: N6 G9 K6 n
wc51ddr(wword[MM]);3 `1 S L9 _; n' \+ J* @; W
wc51ddr(wword[NN]);
. G8 X* Z" X2 q6 d9 l+ J5 R
' t" E* Y1 R$ F. o9 o/ X" V i: V( v }
, U0 U3 v3 A) j- \# |# w /*****************************************************************/
4 R4 W# @) ^! [8 Z" ?/ o: T# I: B) Q3 @$ t# @9 W% O
\/ [) E7 L" n/ H/ Q9 n, T
/**********通过按键实现对电机开关、调速、转向的控制***************/) b' h7 `, c: `- V: r" Q# e
void motor_control()
9 b' f. [% w# j/ G {( z/ [3 J% k# G+ ^+ ]& n
if(open == 1) y- U8 Y1 E6 j3 B( y( v
EA = 1;
0 x" M$ S; g: _2 G 6 n- D) h1 I; k8 ?- n
if(close == 1)
, v4 n7 z+ I9 M! g. ? EA = 0;0 }5 o& a, L) w s8 }. M
0 d0 {6 \/ b9 B% S5 y7 F& }, k( _- K
if(swap == 1): V3 T1 }( S8 J( b, ?8 I
{& t m0 z! U( Y6 B5 Q) Y
change = ~change;
* `& M. E0 Y; L0 E# I; h while(swap != 0)
1 ^# H) X$ R" T( b2 t {}3 C0 I; i+ c( s
4 [8 g0 ?% o$ |+ o }
* S! e% j: x0 Z9 L; Y( R 9 i1 u. i1 c" O; h K9 [+ l( x0 c
if(sub_speed == 1)8 ~$ P" g3 X; Y: [, q$ o5 {8 ?( r
{ 7 @ n' G4 C p. F0 B4 n
high++;
$ H a8 d' I2 K- X- Z$ @2 `+ X if(high == 30)/ q4 C5 l$ T" A0 s" M' l3 B: e r: Q
EA=0;
/ l+ k! T3 t3 x* k2 P while(sub_speed != 0)
! A; O. `1 f1 |; U6 t5 z& P) p) \2 t2 s {}
1 c& d/ h+ _: z8 u; {* j+ l. \/ p }
; X. d: ? i! u3 ]% }- q
1 s& Q# N, K }3 C% Y' e. T) A' {1 Y
8 q) Z9 h% Z+ I% F, S. {# M; z" P if(add_speed == 1)
! [: C, g. f( _+ q7 n {
+ Q1 S5 k" c3 W& R high--;: q4 J- ^9 s/ G$ [
if(high == 5)' l- [7 @6 e5 F& Z* X
high = 5;
1 c& O3 d+ C/ M) F4 z while(add_speed != 0)9 ~5 L4 g( x b9 p& {7 j8 { w, e
{}
/ a9 v8 s6 [8 A' Y+ j }
; X% l- {6 q2 b4 h' j* ^, ] }8 b1 P+ {! x. \' Y
: n% f: X7 w+ o- D$ D: @3 @+ B
) v0 S5 v' v: F& f /******************************************************************/
: c( g' ~4 `& K y$ e3 z/ l) C ~/ K
& S* y) f9 m' H0 Y, a% b
. I$ T' D8 R+ ]6 ?# I9 o! o$ B. u0 Z3 _" m+ L
/***************************主函数*********************************/
% |) \& D2 Q* @0 Y# P void main()
& e! S# L& E; W |3 A; G {
6 ~- Q# K, g# o: Q& l P2 = 0x00;
$ J, @" x/ k$ Y8 b, }( o: X- D" ^
- `, A2 T" ~0 J1 u9 H/ \: n. J: Y1 { ET0 = 1;
* {2 x1 v2 j5 }' K% h0 U# @' t9 h ET1 = 1;
$ O% j" ?/ X9 T# [# m6 h TMOD = 0x11;
8 i3 \* B9 l; C& r$ ?" d
& t( x: }: S3 @- S5 y9 L
" z) ~ w/ k1 _% z TH0 = 0xec;3 V9 \$ {, W6 c9 T
TL0 = 0x78;; M% s2 W" r, h7 [
8 ~$ y9 e3 W0 \
3 f9 \0 }3 Y+ H$ i& _; N$ D TH1 = 0x3c;" Z' ?; D8 p5 K5 _* x$ y/ y
TL1 = 0xb0; //15536# G3 n5 }5 m( j5 o4 |5 u7 B
TR0 = 1;
, h+ X2 t }8 j TR1 = 1;
. Q* e- i; W$ F3 N9 G" t
! \* f0 l- |2 N6 U& g) X; u init(); //液晶显示初始化程序+ x3 G) z( `: \, A. ?7 S. y) I
6 s8 Z5 u; S0 c) n" C" B while(1)
& H( `( S5 X5 R% _1 Q7 F {
- W! [0 L P9 O/ X- _& S4 T X8 }: v O" q) O; y: Z7 |) |
wc51r(0x84);
# g( I7 n- e6 e. g wc51ddr('H');
3 Z! b5 G1 _# @& {# N: n wc51ddr('e');: P" S) I a1 D+ `3 D% H
wc51ddr('l');
o' `9 ~9 E/ K5 a8 r5 [1 J: W, V wc51ddr('l');, ~6 S* f6 ` j1 P! z U
wc51ddr('o');
% f2 k. a5 V, N8 A2 }$ Y/ j% ]! D5 Y ]+ G w
b+ i& Y n' x a& W; o
( p+ k- _# U4 b) B3 U9 t$ P8 r
if(test == 0)" U% C3 z+ p% d, Y$ W
num_medium++;! u$ {6 J' l0 j4 N. z! E6 z
datamade();
1 ^- h" x, k; ]9 o2 z( D motor_control();
$ v- g% d5 A/ e2 F6 l7 {7 a1 Z 9 S; e) J$ k0 W
…………限于本文篇幅 余下代码请从论坛下载附件…………
# B+ E6 p# F5 k: Y6 X& s6 v/ N8 v: S5 f! q4 ?
6 D) S, a+ d2 G" C |
|