|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机控制晾衣架步进电机正反转 proteus仿真及源码4 [) R4 X' w7 D% B, w/ c8 t* j
. `9 B6 }( L# H9 O. m
& ?' y+ z! o' C& S/ U9 x单片机控制步进电机正反转 I# f1 g# R& t; u
设计原理:采用51单片机最小系统,通过达林顿管(ULN2003)来控制一个5线4相异步电机的正转和反转
5 I3 q, O5 v) n- h$ t! X从而达到晾衣架升降的目的
' g8 p9 N+ c3 B2 Y6 n) f1 P本系统还有衣服的重量自动检测的功能,采用模数转换器ADC0832,对重量传感器进行重量采集
: `0 k5 m: ]; h7 I% m9 @将采集到的信号转换为数字信号送至单片机处理,并最终显示在LCD1602液晶显示器上; Q) U. z6 G7 s# o, l
系统会自动的根据衣物的重量控制晾衣架的起落- t( O4 M, r9 @% n5 Q0 G
, X7 G+ q1 S4 y/ t. I% r
- k. J) m P7 ~. K- K6 F8 w
! i$ D. x& D0 U% R, Z, m+ c1 w
8 K) l6 u* C. ?# o: o& \# o- z, X* E7 z9 A0 E
单片机源程序:5 L4 {/ P) B+ X3 L6 B0 C
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器0 M b U" V/ n8 b
#include "adc0832.h"% a$ H7 q0 }5 h4 u1 Z
#include "lcd1602.h"
8 \# d; _5 f" E* l! ?4 F7 n$ m#include "delay.h"% ]6 ?* {( h* Z" e) O) t
#include<intrins.h>
/ ^& { a0 P$ B$ y% ]" e& q+ z' l#include <string.h>
! W; y4 Z0 D8 X* X#define uchar unsigned char
- T4 B2 E3 Z p#define uint unsigned int0 i! t% i! V7 }& P5 Q; x ^
uchar flag=0;
7 B3 s/ N1 l) f. p0 u
- p4 k0 T1 A. c0 g0 r# P9 R9 D3 B4 S; V0 l9 Z& a0 q# a% V
0 Y* M8 O( B( @' S+ u& E5 a& b- g2 k S$ V
unsigned char code F_Rotation[8]={0x08,0x18,0x10,0x30,0x20,0x60,0x40,0x48}; //顺时针转表格0 y) R2 T8 B) }+ P. I' n* W, J4 l. k
unsigned char code B_Rotation[8]={0x48,0x40,0x60,0x20,0x30,0x10,0x18,0x08}; //逆时针转表格
8 r4 i c* { M! i; c5 E) ^/******************************************/
( a; ] }- w# V& E( ~% _/* 延时子程序 */ " H8 F- s- p* H8 H6 l
/******************************************/ 8 o- r! }% N$ q5 ~6 _
void Delay1ms(unsigned int count)
) O- ^: q9 G2 j5 t" v# h{" U) Z# _/ X0 ]% {' L
unsigned int i,j;
4 H+ i3 `$ b; S3 O/ c/ ? for(i=0;i<count;i++)2 {2 u6 u, @) `" U5 s4 j
for(j=0;j<120;j++);. C7 p* g9 R& N
}
3 }0 r2 E) O5 L4 G2 W! y& Z
{: p$ P+ o: ?. \4 i7 w4 K; n6 ^! j* b; O' s! m
; T$ ]6 \& I3 m( F' U4 ~5 j5 E! h3 A% V$ [0 x+ y: y* t) x
//步进电机正转函数
3 W; |* p" p: a3 h" _" Ovoid SETP_MOTOR_FFW(uchar n)& a1 b6 D$ W+ c4 O
{
/ \1 a! u3 P# @; h9 P& M uchar i,j;: e7 E& }# [% ?% ~% J
for(i=0;i<5*n;i++)
. D5 ]3 a) u* M2 i* G. v( M {( E# u; \! p) Z X; s
for(j=0;j<8;j++)
/ |& C5 e9 U9 Q. u {/ [+ ^* v' A# q5 x2 i, y
# ` m: l( w0 X" i P3 = F_Rotation[j];
6 K# j6 b' |% ^! C Delay1ms(25);
3 k* ?, g7 B& g7 O% D+ B
+ M$ K1 o7 V. `3 ^, F! S }7 g6 @2 q4 ]! K$ n4 Z$ w
}0 w! b+ ~' U" V8 G! O1 y
}8 C7 J3 i* [% }7 h7 `8 g$ ?5 z
1 j) g& [0 g" |
6 `0 G4 Q/ G7 l+ L5 k0 w& N
3 S/ C) n( f. j- [* t: E" F5 ]6 \' S* a1 n: x. u
//步进电机反转函数7 j. W: {) N2 p& U" b
, d9 |* S/ C! x8 U$ q; k, U* c# `
5 w; q1 h$ h; _# m4 Y* e$ hvoid SETP_MOTOR_REV(uchar n)( ]! T- L( o0 F
{, [9 Z. o; `! v2 |9 _' ?
uchar i,j;
: R$ K* Z( D2 f0 C for(i=0;i<5*n;i++)
( I" {% M: P f d6 F$ x {
* j" A8 P. S6 G1 R& I1 I( ~ for(j=0;j<8;j++)8 t& m5 j* |, b9 N" O
{
6 H. n- I% x' T; j5 E l1 r
7 {: M" o' i, { P3 = B_Rotation[j];, ^' _8 W4 x+ a/ ?6 s
Delay1ms(25);
8 I. Q1 m5 H4 b4 e% X9 Q; s }
/ x0 O# M& a) h) l& _# m }( p$ l- ]" o/ ?2 Z- b; _9 f" w$ \
# q2 B: ?4 v# m' f8 p* t}7 L! Q) i7 q7 y: \: s5 l! N
: [8 X% Z! g3 P+ }. D0 @
; D9 A5 H7 L" o+ L1 g0 x+ K/ @. o) X- ^7 A* x; j5 p; c3 G
* w1 f7 ~! P6 ]$ p# F4 T& m" ]void adc0832_cl(uchar q)5 H* y6 v: Y! K$ b* E* f
{- f" ? P# D0 r- V# N
q=q*100/255; //对采集到的AD值进行0-100的量化 ) p# Y6 T5 ^ k U2 d
LCD_Write_String(4,0,"Weight");
" D% W2 e% t* M! @ write_com(0xC0+5);' K8 N: x. _/ Z: _ e) y% J, _ }
write_dat(q/100+0x30); //百位
" x0 n! E! ?5 I- l( J write_dat(q%100/10+0x30); //十位' w9 n4 R2 P( N$ F3 E6 e- V
write_dat(q%10+0x30); //个位1 @ B( D/ \/ K: l- Z
; h6 a4 j4 A* X8 w6 D/ w3 w1 J. A8 O
if( q>70 && flag==1)
$ J3 ]( M! _6 ~2 W2 R# b1 @9 D9 a2 `! O% {$ s
, i+ L0 K; \$ ?' |. T2 ~
{SETP_MOTOR_REV(2); flag=0; }7 Y+ Y( _- ~4 }5 I P, ]8 e5 G
" t5 R- P* D1 O2 c, @" d2 N) z; Z8 R! c
if(q<30 && flag==0)5 V5 u2 h; l% {6 A% ~2 X$ v
{SETP_MOTOR_FFW(2); flag=1; }
7 K$ e& {2 \1 L0 q. ^! s
" h; a s/ ?$ u, J- x" v) _ ; i5 U' G. m/ g4 s5 a7 F5 z
0 v$ m8 C* Z3 X# X A7 Z$ q9 Z
}
% s9 e$ V7 F% b* t
% d8 c1 y& }0 n% W; J7 C6 i4 c- V* J1 Y. p& z4 \
+ m H8 U5 V$ `1 `0 `" `
! b4 B8 u+ `. K& _, ]' H$ I
0 _+ H* \5 Q. Y$ P* ?' \3 j: l2 P2 w# B
* y& y B9 o, v
+ u, x2 w! M. h& O! O+ U1 @6 u* Q; U4 S- o) l$ X( \
* c8 @. b' G9 H
5 Q$ L: ^5 O- Z. L- m3 Y- L( |
* P% L2 W5 Z. d4 r0 h M
4 y2 G: R! m* R( s
. D1 U3 g$ r. K. xvoid main()
1 x! f' Z" p* K0 P% G{
# T; M/ F, z3 H7 elcd1602_init(); //液晶初始化+ w4 |7 {* X' F8 @# U9 K
while(1): ]0 H4 S5 q/ V% Y
{
) M6 q! _, x8 ^0 b% z2 s' Y2 e% h- p2 p; h" j4 o4 W) E
8 }; ]' ] J( n/ ?5 t…………限于本文篇幅 余下代码请从论坛下载附件…………$ m) {+ |; G3 c% ^& W
5 Y! G4 k$ o( S/ Y* L' |! d j6 t1 R# V8 g& q; S% W0 x% n% A
|
评分
-
查看全部评分
|