|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机智能窗帘控制设计(源码+AD画的PCB与原理图)/ p+ F6 Q9 ]: y' b, C6 d
4 [; n: b; n; u( o
4 f1 ?) G" V: t9 H/ ~+ s6 h+ v给论坛的朋友们分享一个基于51单片机的智能窗帘控制系统(带51单片机源码+ad软件画的原理图和pcb工程文件),这是我的毕业设计,大家多多指教." @) f" p3 n7 w) G' R$ `
- _- O+ p3 p0 o9 i, o5 \
智能窗帘的原理图(ad画的 需要用ad打开):" X" L, v3 S% @( b- a7 M# ^
5 S8 h: S$ _! n( l
: R7 I& ~& t) w
智能窗帘的pcb工程文件:
' Z V h7 t' b
5 Q3 @) I7 i( I4 M: ]) p- {( g
$ D& |" j& r3 s/ n单片机窗帘主程序:
. _* [% a1 c0 {: y8 n9 U#include <reg51.h>//51头文件
5 o6 |) h- h E& x0 x#include<INTRINS.h>: Q4 l- d+ H* H7 p8 F" _
#define uchar unsigned char
0 M: |7 j8 ^. W O( n) T: K. w#define uint unsigned int //变量宏定义
( \: p. j/ a2 C( d1 n#define ulong unsigned long //变量宏定义
3 B' _2 z9 [, q6 z" R- @uchar count,s1num,shi2=0,fen2=0,shi3=10,fen3=10;//全局变量
; U" S% V' b" A# `- D0 \: ?uchar miao,fen,shi;//时间变量
" w# v4 n/ c+ e6 Z9 ?" U8 O+ z2 ruchar c,v,l,i;
/ E' m6 `8 ?, \- }# S; A
. x' M! S0 l) t3 \2 ^) Dulong AD_ad1,AD_ad2;
- A, y, z3 P2 B$ p9 _" [0 M0 }float JiZhun_AD=2.5;
. ^ H8 z1 G# E: |' U6 Y) t% Nfloat AD_Data=0.0;) K7 ~5 }8 `8 X9 y; b. `
ulong AD_ad=0;# i, z( v2 b& `5 c N% w) p
uchar dianji;
0 ^. f1 e+ m9 H2 e0 ~
6 F( \' p$ B0 q; x K% y$ w1 isbit rs = P0^5;//数据,命令选择端(H/L) 5 q7 R% @: I/ c: }
sbit rw = P0^6;//读,写选择端(H/L)
& V% x& N4 P" p1 Hsbit e = P0^7;//使能信号
/ M% N! v9 X# z. |& A8 h1 Z5 ^, n7 e6 U9 L( n$ |
sbit CLOCK = P1^1; //lcd, j: b" P. i: @5 i( E; x
sbit D_IN = P1^2; //lcd1 c3 y' E9 D; O8 ^( Y& ?
sbit D_OUT = P1^3; //lcd
. Q. o8 v3 `3 y! E# o, L; Gsbit _CS = P1^4; //lcd : W# ]: T' A+ k' H' E: |! Q% u2 @
' X1 H; Q8 A# U6 Ssbit menu = P1^0; //按键//P1^3
# X5 I5 |! M% i8 i4 @sbit add = P1^7; //按键//P1^4& F3 n: f) G, ]( S+ F8 a) m/ X+ S
sbit cut = P1^5; //按键
" E: k# l! l2 d, xsbit yes = P1^6; //按键( q+ U% \7 Q# I4 C {
; B' a4 U D0 K$ ^2 x( g U; P9 ^$ }
sbit ma = P3^0; //步进电机" @' U/ v& @" W9 R9 `$ Q& o, l6 C
sbit mb = P3^1; //步进电机
+ K! y& m* V' d+ \- ksbit mc = P3^2; //步进电机
2 \* C m( G# f% G4 R& ]sbit md = P3^3; //步进电机6 Z9 z) s+ z& z
sbit led1 = P3^4; //LED1
- J7 g" K; e. p: x" v: f0 [7 Rsbit led2 = P3^5; //LED2/ g: _( N! y. {. Z. D3 T
sbit spek = P3^6; //SPEK* r3 G6 G: m+ g- s7 ^
! H, s$ g1 M6 S+ b; q; ruchar code table[]="shut-00:00|ray:0";+ g3 W( R3 A, e" A: U
uchar code table1[]="open-00:00|00:00";//数据字符表
+ i6 h8 f" J& x, O8 A+ puchar data display[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
! P8 p' _$ l$ D% w! ?7 o( P2 n //显示单元后台数据,1分2时现在时间,5分6时关闭时间,3分4时打开时间,7亮度级数 // & t6 P. p* {' Z% g
//****************延时*****************
! Y" E8 i9 N9 [void delay(uint z)
4 B4 ?: O$ ]+ ^( q j4 O$ v{! s5 x K/ N5 }" n. ^
uint x,y;. k& k# e& M5 R2 ^, h0 k
for(x=z;x>0;x--)
2 b1 Q' L7 [7 ~ [8 @: ] for(y=110;y>0;y--) ;
~2 G8 I3 R$ L* f" A/ o) Z8 @' l; S}
* G8 k( V2 L( s* Y5 ~//****************写液晶指令*****************
' w# x( J f, U1 @1 evoid write_com(uchar com)( G; [- A( V8 O0 c; o2 r* m1 r# a
{% _# i9 t" c# c. Q
rs=0;
8 k2 T6 x; D7 ]; j ?. X B" L e=0;
+ T* A3 i3 ~( C$ {' o6 k o+ E P2=com;
/ l% R, b% ?! P; d6 l& t( K delay(5);
# p5 M! k) S- D, `) G9 x e=1;# \& U! r7 G' I. g5 U3 I! m$ |
delay(5);
4 i. t3 ^2 X" v" O7 D- I/ _% @ e=0;
0 x. v7 D- g; W* f, b}- d3 q/ `# p7 a; w: D
//****************液晶数据*****************
2 @( ~/ C- M1 n9 g* Uvoid write_date(uchar date); g( C: U- I* v, R
{
$ I0 r' ?) F8 R9 e# ?6 j: o( ]" C rs=1;! k, n, [3 j7 C; x% q9 h
e=0;# g4 G3 j( O6 A
P2=date;" u: X) t# e6 f. p9 f2 |# Y) l
delay(5);- n6 g6 U8 i' P( u7 u- j; C J) J+ T
e=1;
. G, s% z6 c$ v n' ^ delay(5);- X9 m% ?) O3 x6 {$ Y
e=0;- o8 ~. C/ A+ Y' H1 w2 v
}0 ?& N# l3 [- P9 ?! T
//****************初始化液晶定时器************
+ i" m; ~$ _* I% gvoid init() // k" G/ y3 | o4 N x
{
2 _5 L% B( R8 N H1 s+ `, P uchar num;) L( P/ c7 W* r& o0 f2 a
rs=0;
, x+ S- {8 N# w5 T rw=0;
1 L& F: O& o+ ^# d e=0;//锁存关闭 ?# K3 t. n4 N5 k' |( w
write_com(0x38);9 `+ y6 j% g- B! y! m8 {
delay(5);
& s D( ^/ [, m8 A, Z write_com(0x0c);//
7 V. t$ g7 a1 [6 c* i A delay(5);% w& j- k1 o3 ^* I
write_com(0x06);
" ^* Z7 g# A4 ] delay(5);
+ O$ D2 O; F; c. X write_com(0x01);8 c3 C8 H* s' H- p6 c
write_com(0x80);//第一行开始写! z6 F; s; ` k4 u# J. W" ]
for(num=0;num<16;num++)3 L- r% F3 o1 N/ V
{) k! }2 x. P0 c4 H- X
write_date(table[num]); \. }/ {5 b+ B9 v
delay(20);5 t2 d. ~; f$ W$ q Z4 E+ }) r
}9 Q8 s7 p6 J' C6 g" @8 V9 v
write_com(0x80+0x40);//第二行前一部分,也就是时间开始写
" M- J' U% q6 \3 } for(num=0;num<16;num++)
; a' n; _1 O# V. x {
, Q' J/ }; E* j5 k" [* k write_date(table1[num]);
4 `3 G I9 x& ?7 E$ _6 J* g6 i delay(20);
3 v6 [5 _* J& X4 M8 { }5 {1 Z( C% B- H) |& F" Y& j
TMOD=0x01;//定时器0的方式1
; N# R( o. K$ R$ k" T, s! W+ Q TH0=(65536-50000)/256;//求模) U8 w* w, e/ ?5 v4 \5 g
TL0=(65536-50000)%256;//取余
! W4 R' y. i6 F EA=1;//开总中断% | m) x/ S. W# i! b8 P: J7 Q
ET0=1;//开定时器中断! x5 X% b1 c$ h; r2 m
TR0=1;//启动定时器
& ?$ r; U9 e6 c; D5 o# D! O+ ^4 z1 n}( C5 O6 W, S' n' B
//****************地址数据变量**************
0 T4 I4 ~ k4 Q3 H* r% S1 evoid write_sfm(uchar add, uchar date)
' b, S, j3 M8 C2 [# \{
, V5 L! z8 b+ s4 c4 c uchar shi,ge;
- J1 G8 M$ |2 u7 y# r shi=date/10;( V# l% D0 N$ d- c- V8 I
ge=date%10;
6 R5 c! z8 R, B9 G) A1 N write_com(0x80+0x40+add); R1 E2 {) G% x* U; J
write_date(0x30+shi);8 Y' w" \$ _( T
write_date(0x30+ge);
2 ^$ t0 p( B+ g: O. P6 O9 } }/ `9 Q6 G4 T L! a: h
void write_sfn(uchar add, uchar date), R- x" T2 k- Z0 q1 C/ d. ]9 C6 B
{
# \$ \' K, U, L( Y7 G& ^ uchar si,g;" h# _; S5 m0 a4 q4 C4 a& s, k
si=date/10;9 u, n4 P, x; E
g=date%10;
6 m; S1 A6 t+ {7 {( h" U write_com(0x80+add);; d% G2 n- N8 m* P( n/ T. F
write_date(0x30+si);
: A2 {' [: E6 {0 m6 {9 t& k write_date(0x30+g);) F4 s* u* A9 W, q
}$ F s0 o" p- I0 B1 g- |6 [; \! f
Y) I4 {! s8 k2 S7 G# Z
//****************按键函数*****************" c; f9 o r, J, \8 {& W4 v
void key()
: I* r; Z! V# E8 P0 v{
% I; K9 y; O% L6 R5 H5 x if(c==8)c=0;+ S, h9 h. y( p1 D& l1 X
if(menu==0)
: }: {( J- o8 [) K {* p8 g/ @4 }( L
delay(50);
' R- x! n/ G$ d& [' J- x if(menu==0)
. }* ]- H) ^, x# ?" ~! ~/ X {2 N: [$ \8 Z2 e# W5 G& ^- z
c++;spek=0;delay(50);- h, f: M @- E8 y
while(menu==0);spek=1;$ q( M7 Z' i2 {, B, x& {1 K
}* o7 ]5 \; {1 d
}
- l6 [: N% N" [+ [% v g if(add==0)& n2 l" i1 p2 ~1 O4 o8 P
{& t8 ?6 Q: i, D& P+ y
spek=0;delay(50);
! q" u4 ~; |3 ^4 R+ _3 U. g8 ` while(add==0);* k; T: y0 S& v1 b8 A# Q# B
spek=1;
. B' x0 G7 L* p9 e/ y7 H. T' F' S* C display[c]++;
6 S! X! l* J" X) |0 ?& s write_sfm(14,display[1]);//分针位置# S6 ?, K$ j9 z$ @( X
write_sfm(11,display[2]);//时针位置 2 Z4 a+ `) \' J% x8 x. Q- F
}
3 ]& `2 f5 `/ p3 E: U if(cut==0)4 k- @/ K; v- k
{
6 P( \( Y8 b' H' T" y2 l spek=0;delay(50);
5 n8 q. Y; M+ y6 W" O2 q- p1 r while(cut==0);
; U3 x# P6 S$ u) E spek=1;# y- x( f0 A% u7 p; A
display[c]--;4 D- n6 n8 B; m2 T
}
4 j" C" q ?8 K if(yes==0)& |) |- t" l" @# G# c* u
{1 B1 I/ a4 }% h0 m$ S9 `5 e
spek=0;delay(50);
8 v) t4 j3 e1 w) t! z5 G while(yes==0);) T# }+ a' x- ]2 g% \9 |
spek=1;
' T1 F2 ^) e& f5 _4 }* w; N3 [ c=0;* [- i5 W5 [" v/ z9 z' g) c& R: w
}
' Y- w6 B! I$ X% ^: E8 i6 M9 C write_sfm(14,display[1]);//现在分针位置. y( |5 C! F' l6 x3 K0 V0 E. ^
write_sfm(11,display[2]);//现在时针位置3 U* f ?: T4 I: Z) J
write_sfm(8,display[3]);//打开分针位置
j. m1 G' W/ O6 n write_sfm(5,display[4]);//打开分针位置
) B/ s- i, ]( U# F$ |/ r write_sfn(8,display[5]);//关闭分针位置; {& |1 e" T0 S
write_sfn(5,display[6]);//关闭分针位置
, U# V' R+ v m x; L: l8 y write_com(0x80+15); //亮度级数# P7 f% q7 n. n: S& Y/ U; d
write_date(0x30+display[7]);//亮度级数位置 & m7 D5 M/ P8 e$ j
}( N* \. l9 r) A9 n P; j* f
//****************步进电机函数*****************
& R1 D* t" q( }( N" Evoid motorzen()
2 L; e: E) z& a T# y6 V T{ 3 J4 b! S; v5 x" ]; k
while(v), ^6 C! A+ I. y) O' T3 J% M
{- ]8 D+ f6 D* d, a5 { w
led1=0; 7 {$ C8 E3 k0 t$ j8 T: \/ J. j
ma=1,mb=0;mc=0;md=0;delay(3);
- m8 z- S0 e. Q* t" w ma=0,mb=1;mc=0;md=0;delay(3);5 P( }8 h, \' O2 }+ Q v7 |! k0 v3 j
ma=0,mb=0;mc=1;md=0;delay(3);3 a M$ \; L( _( T
ma=0,mb=0;mc=0;md=1;delay(3);$ g J( G. G; C9 n7 B! d4 ]( O W) Q
}& q9 h, z( |/ |! {9 z+ C- m/ b" c
led1=1; 8 G, i# w: Z* r& ]4 J. A
}
9 f6 m( B2 ?5 l1 \1 Kvoid motoRFan()1 u; o" R( L7 L9 |4 q
{ 4 C4 T; S* |2 S9 y- k/ X
while(v&l)
3 [% R0 r/ F: \4 W {
- B* v8 h8 ^* b8 u% m" k; b led2=0; u$ J ?5 |. ^+ C" D) e
ma=0,mb=0;mc=0;md=1;delay(3);6 v) Z) \/ Q: v, t1 E# O& S X
ma=0,mb=0;mc=1;md=0;delay(3);
1 u* e9 m3 Y8 Q- b" O0 |7 T ma=0,mb=1;mc=0;md=0;delay(3);- R$ c/ }3 T* v0 M% a
ma=1,mb=0;mc=0;md=0;delay(3);; R3 [, I- G s4 _
}
# b. L- q: m" K4 ^+ a' Y% e- o9 z led2=1;
% E1 K! n- F& ?0 }, Y0 Z9 |& D}4 J+ s6 Y7 N& l3 ^+ i0 j
- N' h7 B" q# w: I# d* d1 u B//****************A/D*****************
& Y9 W- c) T: v; D$ Iuint read1543(uchar port)# y+ y5 U3 n. ~4 u, S" @: L
{
* Z a- K0 ?: [; \ uint ad;- w0 ?8 C$ s% F8 u0 T
uint i;
' Q: T# u# J7 i& F- y9 a uchar al=0,ah=0;
8 m% o( O2 n1 ^ CLOCK=0;
5 j9 d' {3 W4 A( `' F( A3 ] _CS=0;
4 S) \5 @( M7 Z0 U% r port<<=4;5 ^+ H+ x0 a8 ~, O( B
for (i=0;i<4;i++) //将四位通道地址送1543% H) C4 d) w3 k3 y4 ~ d
{
1 z- r4 e& P: ?9 i5 ]# Q: z D_IN=(bit)(port&0x80);CLOCK=1;CLOCK=0;+ A R; s) L4 p5 |
port<<=1;: {' M# e# U9 {1 s2 U; K
}# I' w7 n/ z. C$ v$ @( c; ^
for (i=0;i<6;i++) //填6个CLOCK信号
, E" u* M2 h# K0 E1 I {
/ X6 b8 n& D* K6 Y6 N$ f) y CLOCK=1;CLOCK=0;$ x& e( e% w! @% B! ~' h
}1 L) L4 R% k+ B' j% q6 J: U5 N
_CS=1;
- C& G3 [8 h+ q1 j* l& L& k _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
* Z( C" i' _" H$ @ _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
! N2 G0 P' ~: }$ x6 P! q _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
# Z# K+ q( r1 f1 G7 ^ _nop_();_nop_();_nop_();& e* F: l! U* o- d! N
_CS=0; //等待AD转换结束' J! I. Y( z ]" R _
_nop_();_nop_();_nop_();8 B# p' L7 Y( a: I% ~; K$ @ J3 d
for (i=0;i<2;i++) //D9,D8
) G l( d8 ?! F* ^% U) b/ u { ) N0 [( {# a5 d! w) k
D_OUT=1;CLOCK=1;ah<<=1;
8 {+ l/ l0 K, K if (D_OUT) ah +=0x01;
8 P; \6 f; ?$ W( Z CLOCK=0;
) \9 `; e# x. Z# e: d } v+ @& m7 _2 l& H5 |
for (i=0;i<8;i++) //取出D7--D09 G- H+ W2 c$ K$ }
{ * I8 |+ R& g+ Z
D_OUT=1;CLOCK=1;al <<= 1;
3 D) ?- _8 H0 E/ ~$ G! h; p, t r if (D_OUT)
% @; C3 X7 t* Y; y1 C al +=0x01;
: n7 L* \4 ~# q. S: Y( B CLOCK=0;
) p# T8 K! G7 w9 }% Q# v! n }
1 G, [, @' G6 h_CS=1; ! R* O( I, e# p, B
ad = (uint)ah;# p- `% h* O& a8 j1 W+ K
ad <<= 8;
4 l2 l- V8 B; \1 [; O' N1 V( uad +=(uint)al; //: M& o; F, o' ]% f/ |) {- H
return(ad);* g* C1 Z. _* P% R8 O
}
7 T, }/ l: F+ T
$ j. S2 I- L* B. H7 f: G3 k+ m& ^//****************亮度测试*****************
9 w8 [4 E4 w/ p5 b+ G$ Uvoid liangdu()7 U. e& ~5 ~: C; w$ y
{
2 ~; {% S& k5 W$ F# N i++;" m( [; ], A5 B9 @- x' `( \- {
if(i==30)
- \0 ]5 y6 z6 ?* V) a" [/ f {5 f9 T9 B( X c* V0 _3 m
i=0;
! U+ l) |& E* U. c% k% V- C* Z! } AD_ad1 = read1543(0); // (通道0电压正端)8 g: s$ q; D5 b7 Q: J+ R7 P
AD_Data = ((float)AD_ad1)*JiZhun_AD*2/1024+0.005;//0.15经过实测需要加0.15减少误差 9 n8 ^* b A% V" w: B3 C& P
AD_ad =(AD_Data*100); " ^4 b# Z( I2 z* _; K% C- n1 Z
if(display[7]>AD_ad%100/10) R0 C8 q5 E" w
{
1 D: V; C; ?# m$ z9 o if(dianji==0)
6 a6 B: E5 u+ g, v' S {& E& _2 N7 j/ C8 k. e
spek=0;delay(50);spek=1;7 x3 T, U, C8 R# y }# o- j
motorzen();; K d) w: [; b: J* Q2 v
dianji=1;0 Q8 b' ? u- s. s. y) A2 A& A4 {/ I
}6 v! x0 P, S$ d. {1 o- W
}/ m8 M% u, }- y" F6 ]; z
else" K4 V* @& b, o1 T( h
{( t+ N- E* C0 ]4 F
if(dianji==1)
2 Q' A5 S8 b7 a {6 E! H- y1 ~) ~9 b3 Q
spek=0;delay(50);spek=1;/ }% D# K' R8 Z5 ^, K3 A E. p* T( z. D
motorfan();% C9 O5 K, N) [& N! g. F# r% x
dianji=0;0 i: t* Y! X3 k
}/ D! O& W/ M* e6 C" m, e4 _' l
}! P$ F: E4 p2 c! b
}
) A( ~" d9 C$ n1 A+ B) y+ G: P1 I }7 S8 Y! P; U( X3 J
//****************主函数*****************
: Y6 h. Q7 |: h I& S1 S; {void main()
& b5 O9 w8 L1 `/ P2 P{ F- C/ S+ K! K) K" P7 y5 t9 F
spek=0;delay(50);spek=1;
! q9 C; ]+ _. E( u1 s display[4]=8;
9 D- t9 \" X5 Y2 m( _6 W- T display[6]=20;+ ?% T' {# X r b& i) P
display[7]=50;! Q. B$ D( B7 f# e [& [" B0 x* R
spek=1;
: g* k1 C7 d4 t7 v init();4 a- b! _% z. B& v1 E% _
while(1) X* w( u4 N1 l. U
{
' S- L; Q4 X$ o* j2 E" R key();liangdu();" G+ b5 ^5 I; c; Z% J# L/ p
if(display[2]==display[4])//时间判断关闭窗帘9 ]7 L5 m l! D5 \8 O. i- t: t
{; _7 H2 n7 o* M' A( k
if(display[1]==display[3])//与打开时间一致动作
4 V E% N( i! n5 r* Z( ]. J+ w {2 c. u! G+ ?; x. e7 W P' |# C
if(miao<5)4 V, |' Q4 u, t0 o# b1 W2 p
{4 k* ?2 l( k/ u6 A
v=10;
- Q3 l& D! r5 p+ e6 C: T spek=0;delay(50);spek=1;4 R& h6 e" e* L1 w! h/ n! }) N
motorzen();. B6 A) U5 w5 T" O: V) L5 W
}
& W: ~4 x* [; t% X, l- k+ I }% c# g" t1 g- O" D
}
5 m4 z% }" g/ M4 q1 l) ? if(display[2]==display[6])//时间判断关闭窗帘
F5 D3 x# t9 y% Q, d8 w {2 a/ e( P( f" ?6 E9 `7 F
if(display[1]==display[5])//与打开时间一致动作 c3 A8 R: Z+ }& F4 \8 r
{- |7 z2 H/ b. p" `3 C' R
if(miao<5) j0 r) z: J1 ^& F& a5 h
{
8 L! r. |0 Q4 b& e' b# T v=10;% `( A& m; D0 G6 E4 k. `/ V6 n8 P* z
spek=0;delay(50);spek=1;( F2 P |* t- U* D( B
motorfan();
$ R# J# ^9 ^' ]5 Z3 c7 D7 R5 f }/ u7 H$ s( P0 X8 f8 l: v
}/ {3 d( V8 c4 X: I E
}
6 q3 @/ O% q: V& u3 S, s: h" j }
8 {/ z6 Y6 j0 ?+ F3 R( C, m9 p}
' k! J+ T; i4 d
! n+ K; i7 Y( H' x4 U# t1 Pvoid timer0() interrupt 1 //定时器0中断服程序( j/ Y% L9 t6 D* u. A
{4 }5 l* {4 w! v6 ~) o4 L
TH0=(65536-50000)/256;//求模7 u7 f. g6 W$ H. U* }3 H' J' w9 ?5 m
TL0=(65536-50000)%256;//求佘
# T8 [, Z+ Z- [2 v7 C+ e. l+ [5 S count++;//变量4 W( b$ @: |! c+ q0 {, H+ i6 [
if(count==20)//此处为时间基准调节,20为走一秒
& U( H# U: ^1 s# M* v# G) e
4 R8 b: T& @! O I) @6 c! w( l2 m# W$ [2 {
…………余下代码请下载附件…………
# F2 i) R, h# D' j0 p; Z6 W; V7 i
7 W" ~8 N1 Z8 C3 o. y下载:' ?" A1 c! j" m4 u
/ E# y& v" L# S3 y7 w
' E8 z$ `' ]% W/ O' k8 \
|
|