|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机智能窗帘控制设计(源码+AD画的PCB与原理图)
6 V8 r5 w$ C. P6 u. g- ~0 x: P9 r, G1 W9 C6 ~& T- F
. s! H7 A& C* D% S
给论坛的朋友们分享一个基于51单片机的智能窗帘控制系统(带51单片机源码+ad软件画的原理图和pcb工程文件),这是我的毕业设计,大家多多指教. F+ n& Z: R1 s6 D! e" p7 L
! x1 P3 n6 k: T, ]& I智能窗帘的原理图(ad画的 需要用ad打开):* W1 Y- A3 m+ M T
; W5 J* I! t" i. H/ [
* Y, C# {9 I& I9 i- N, l智能窗帘的pcb工程文件:
7 X3 c/ i2 J' u. B0 @3 { S- S
; T9 y$ f i/ }# {$ ]* s1 N
- \ `( Y& r1 J/ ^, s; y% Q) u
单片机窗帘主程序:( ]7 i" z" V9 g5 q8 ^
#include <reg51.h>//51头文件
# S' l& z4 p6 t$ k7 F/ O#include<INTRINS.h>( t) p5 G% B9 L" Q" b' V
#define uchar unsigned char
1 w6 \" c# L5 B& b$ c+ Q#define uint unsigned int //变量宏定义' ]$ D6 [ N Z4 g. @) g( Y
#define ulong unsigned long //变量宏定义
5 S$ s2 c4 k# X' Y$ ^0 _7 ?uchar count,s1num,shi2=0,fen2=0,shi3=10,fen3=10;//全局变量7 ^0 R8 x/ U8 S5 J$ `0 l( R
uchar miao,fen,shi;//时间变量
( a$ a( A( e3 O1 W* Quchar c,v,l,i;! i( p2 F% K s
% T1 {6 I' Z3 w) G' C" P5 _ulong AD_ad1,AD_ad2;
0 K5 s. Y" c5 Yfloat JiZhun_AD=2.5; * f) ~0 q% ]- J/ {3 ^ D( A7 p" e
float AD_Data=0.0;* c% o1 W2 K4 i# P
ulong AD_ad=0;& W* u- I# G) p9 M5 O2 ~
uchar dianji;# p2 ~. ] V; |/ p. M! i
$ _/ m9 v. m! X; X; E$ D8 e& Dsbit rs = P0^5;//数据,命令选择端(H/L)
) H4 J) h# V, ~: {( _. ~sbit rw = P0^6;//读,写选择端(H/L)
4 }, {) f7 H2 i/ c4 lsbit e = P0^7;//使能信号
3 g9 h* I9 I- }* h4 b( r
I2 W" B- E1 y/ z- Nsbit CLOCK = P1^1; //lcd
* P1 |4 J3 o$ t+ i6 Usbit D_IN = P1^2; //lcd
, t3 b( q7 c3 S& ]' I8 ?# t+ ?; q$ lsbit D_OUT = P1^3; //lcd & h5 R4 a" p& |2 e4 J' S
sbit _CS = P1^4; //lcd
5 I- g$ G6 T7 o7 G
$ e$ ?7 \8 o# f2 Q8 j7 F! l/ Z! E; Qsbit menu = P1^0; //按键//P1^3
4 Z6 m+ ?- Q; a+ Q1 L! U$ usbit add = P1^7; //按键//P1^40 H! X5 x4 o5 b1 l q* _
sbit cut = P1^5; //按键6 X3 s8 [3 I; z0 ^. U9 j6 w
sbit yes = P1^6; //按键( h2 I" y( f, X4 J( H# _/ C# K- H
* X; C+ p/ B8 Ssbit ma = P3^0; //步进电机
' C, @( [, C& z4 V) R4 c# e3 {sbit mb = P3^1; //步进电机
) E: C2 ]0 a6 b8 E& w- Csbit mc = P3^2; //步进电机
4 o& g) o2 ` Y: h% Ssbit md = P3^3; //步进电机8 |- [9 d J U* Y
sbit led1 = P3^4; //LED18 ^+ Z8 \% n; [. p
sbit led2 = P3^5; //LED2. y. M5 m | \( {: y! f8 S
sbit spek = P3^6; //SPEK
! Y& I2 v: n/ I. M. T: q3 \! E6 a1 e$ O! w
uchar code table[]="shut-00:00|ray:0";8 i6 o: e2 k. d* N
uchar code table1[]="open-00:00|00:00";//数据字符表) ~; R1 M' [" |/ i% C4 ~
uchar data display[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
" a3 N: K, V. c1 a& y1 u //显示单元后台数据,1分2时现在时间,5分6时关闭时间,3分4时打开时间,7亮度级数 //
% u$ i% z/ X- E5 S9 N6 j$ E$ p( q6 ~2 M//****************延时*****************
9 G1 Z9 [" D+ i/ Q' S* l. z5 gvoid delay(uint z)
2 v. v' R6 V3 F3 i7 s{
# h6 B% Q: @1 e- b7 O uint x,y;
/ S2 z2 n% A) ]% ]1 | for(x=z;x>0;x--)
5 p0 X( b# x. F; M7 S for(y=110;y>0;y--) ;' N2 L# W+ w$ _3 J P9 P
}
% H8 K: T$ J. T+ L' `- T//****************写液晶指令*****************) u5 i( f D+ P8 Q4 G
void write_com(uchar com)1 s$ \. @: ^& r' ?; }! D
{
: x; @4 y6 E" O1 j l; U7 S rs=0;* E& a* u& m/ Y& ^' i$ u" q0 H l
e=0;& t/ r; o" C2 [- O4 g! P# |
P2=com;
8 [9 x) a- N* T6 b2 N6 M delay(5);
- ^! v7 h5 h* @, N" X; n e=1;) n! ?8 l' |7 n
delay(5);7 d6 ^. J6 o2 W3 i* ?+ r! y
e=0;7 o/ ]. j# m. `; m* U5 f- [
}: N- V& k' w2 B
//****************液晶数据*****************
* D v- F6 L$ O/ d/ e- w+ Ivoid write_date(uchar date)
- B$ Z1 h# B; Z; v{
K$ u. x# e1 E rs=1;! f' ^7 w% S# P V& @2 O0 b& D
e=0;% D, N ~& K4 p7 b# ~8 x
P2=date;5 X) o- m# ], u1 _7 x6 U2 n
delay(5);
2 q$ d5 u' a7 s, p! N4 O' Z e=1;
" Q/ v' F! p1 N) E" t' r- t delay(5);; ~ F9 S4 ^ v0 k) z' ~
e=0;) _, |/ d8 c1 B
}$ @7 v+ P) ] S% k- `$ A
//****************初始化液晶定时器************
O% s( ], W0 I( Nvoid init() //
~, r; y; g8 `. \. U1 g+ @% r{3 |/ S" C: ^3 a. [0 Y
uchar num;
8 P8 A" w# `( j& D6 [ rs=0;
+ k9 S# H7 L7 N- o/ N- @3 ^ rw=0;' q& k9 I9 i. `5 W7 \: D
e=0;//锁存关闭( h' f5 w; ^/ e% Y; X1 W
write_com(0x38);! `& w. {; G4 i3 ~) n) p) g
delay(5);2 r4 |" H* s# o7 I" i" z3 `1 ^& |
write_com(0x0c);//
9 D" d+ b! x; O! W- Q delay(5);
' z l. R6 s( | write_com(0x06);
/ |' b) R' X4 u' y, l delay(5);
) f* n3 l' G2 i9 e, K write_com(0x01);2 Z9 @2 n' K7 [5 Z
write_com(0x80);//第一行开始写
3 C( I1 B0 m9 g* g# X for(num=0;num<16;num++)
0 u4 E0 f' j% o8 F& \/ }7 G5 | {- U, v, P, C* H& R6 S
write_date(table[num]);
# I2 m! [# }9 _8 |' I( @. x delay(20);/ Z% W5 ?8 E Y
}
6 G# ]" U: |, {3 }& o0 n5 ~ write_com(0x80+0x40);//第二行前一部分,也就是时间开始写
: P3 L* ?1 H7 O/ f, @$ t for(num=0;num<16;num++)" C- h7 C* y( e, x. ?5 r
{. f) @: p3 g* n
write_date(table1[num]);
4 W, f9 Z' C' L, \4 G e delay(20);: _; I1 S4 e0 |$ q; Y6 C
}# ~7 M( d" L: d
TMOD=0x01;//定时器0的方式16 G( h7 ^. G# {6 W2 J
TH0=(65536-50000)/256;//求模% c) i2 E/ S" k/ b1 b
TL0=(65536-50000)%256;//取余- ~# `, L2 E( D3 N( t+ x4 s
EA=1;//开总中断
1 G& D# v) u9 ~ ET0=1;//开定时器中断
+ |8 S6 ` L* i: S, D2 y2 S/ U9 R TR0=1;//启动定时器
% ?- Z* z+ r( o: j, `1 V5 e6 [}2 V/ C! t. a5 N$ H |- d, U' y
//****************地址数据变量**************8 x9 a, f4 U" A) Y) a& u. R" X: n# r
void write_sfm(uchar add, uchar date)
) [3 a# O, w! u! [* ^- g( c{, L7 ^8 Q6 G9 Y; Y, @/ P8 [; Q: I
uchar shi,ge;
2 B( ^* W& D# [# u) s shi=date/10;
! ?' U; ^0 J3 q0 F2 M ge=date%10;
! t- V% u, |% L H, D write_com(0x80+0x40+add);
1 |' X8 t, \: w0 g/ O. a write_date(0x30+shi);% X0 T" x& k' f6 \1 v
write_date(0x30+ge);
% b$ P) _3 `9 v' _7 T: y }& A+ U' U s; X5 X; c M3 Z8 b2 q
void write_sfn(uchar add, uchar date) I( e; {1 y# Z5 I7 j: u9 q
{
" e& W2 Q5 X1 x7 m Q( V F+ ] ]: r uchar si,g;
) B h b' ?0 k; Y. ]3 n: f si=date/10;
( Y7 ~7 g2 {5 d' C4 r$ J7 {: | g=date%10;
p% f, \# H# _6 A1 |) s' Z write_com(0x80+add);8 E, C9 S0 q4 Q- V8 i0 X
write_date(0x30+si);
# ?4 j% z y3 i write_date(0x30+g);% v( {8 P( o1 r* `* n2 p' B% Q
}7 ^5 u5 a: T5 W- K- `! T+ H
* q* {/ v2 n* W& _6 C0 Y% K//****************按键函数*****************
& R! O2 i$ ~) [- P6 \void key()5 [* `- u8 C/ S5 S
{
4 p* D5 i( ]5 @ if(c==8)c=0;
6 M$ s# R X1 Z s5 U* R8 S+ \ if(menu==0)
4 h3 K/ [6 L! U0 F0 [2 O* t {
) v; P( i$ a- g6 F% ]* u delay(50);
" j: a$ T& Q g$ ~9 Y+ M) E if(menu==0)& O( X' l% P( U
{
2 E& @5 u+ T: J( i9 g c++;spek=0;delay(50);3 d3 b. }) z3 d6 b7 n
while(menu==0);spek=1;
) u, ^- E1 T9 t) w* M N0 L% H' \ }, M6 u3 }8 O+ x* [* {2 @3 l+ Q& r
} v9 C1 [( l9 f4 Y! r8 u9 C3 e
if(add==0)
; i/ H4 P! w$ N; i2 {3 E$ O7 i {4 d Y7 B/ Y( X1 C% }7 \
spek=0;delay(50);
# n6 y: [& w8 M. g while(add==0);
6 E* l4 i2 T8 D, K: x7 X) B spek=1;
7 I X ^+ u3 G0 u" C$ G% M display[c]++;
2 k% {- ?* q: N/ s; m) ^2 n write_sfm(14,display[1]);//分针位置
% U+ M1 r; x! b- i9 \- W- L write_sfm(11,display[2]);//时针位置
4 U6 u0 E, u. f7 L }7 \; c* f( b* u" b- Q E
if(cut==0)
" |7 j3 i7 x5 p/ x8 d* J {
: e1 y* f. z$ b& g/ u spek=0;delay(50);( w/ w; j/ M/ Z- f p' ~
while(cut==0);! g% A7 q5 g! F9 _
spek=1;3 h! r8 T0 b' ?+ z& N6 O
display[c]--;
A, \! P$ j8 s( A; o }: b& q7 e2 ]: |# f% F; A* s- g+ J
if(yes==0)
% o2 @( L) C" `4 w( D' X8 z( g {% n6 c' s( N+ M- f+ G1 t
spek=0;delay(50);
$ y/ r- D, P$ e. P) [, F! Q while(yes==0);
* L3 a( y7 J$ G7 ~ spek=1;0 T2 j& y6 @/ }$ ?% _" Q/ N) }* r
c=0;
* B; U$ e6 i0 [+ Y) ~3 l" [7 C }
3 D" V, o: M, l* r- b4 |9 J write_sfm(14,display[1]);//现在分针位置
h) }1 K2 U% [/ Y* M* R2 a/ u% } write_sfm(11,display[2]);//现在时针位置
& b: W1 ?& G! j- { write_sfm(8,display[3]);//打开分针位置( i" s- T! E4 c4 W
write_sfm(5,display[4]);//打开分针位置
0 K# C% w3 F7 {0 l# v# M1 q write_sfn(8,display[5]);//关闭分针位置
( o# }4 w1 ~' L/ Q: {4 p f, ]. @ write_sfn(5,display[6]);//关闭分针位置- t( k) w& r5 Q$ n% R5 }
write_com(0x80+15); //亮度级数) P+ N& B* z; B+ x( @
write_date(0x30+display[7]);//亮度级数位置 * i% X' `4 u- |8 z V
}
, h5 J4 M J7 \4 R* E+ U4 K//****************步进电机函数*****************
0 G$ n/ D0 k2 k& @) O) pvoid motorzen()
* {- l+ i8 E+ R, s{ 7 w8 F8 z5 m: g+ f; H
while(v)
- t1 o0 w" x" G5 Z- _ {6 p/ b) e+ e, Y/ }' ]% o
led1=0; 3 a9 w' c4 e- O; g; S
ma=1,mb=0;mc=0;md=0;delay(3);5 h' Z. b$ M5 i+ n
ma=0,mb=1;mc=0;md=0;delay(3);, u N$ o: Q: `
ma=0,mb=0;mc=1;md=0;delay(3);4 _6 R' ` o, [0 K
ma=0,mb=0;mc=0;md=1;delay(3);
5 F2 v0 P# S4 T) N1 u5 u }7 }$ W; t5 e8 u; ^$ I6 i" ?, Z( `
led1=1; 9 n' Z- k& T) b$ Z$ b: h
}
2 K6 { S* A4 B' Pvoid motoRFan()8 L5 t c' |% A$ m
{ * e# H) ^6 S7 j; c5 U
while(v&l)0 [+ c# }8 H6 M% w( J; D0 Y
{
^9 }6 n+ Y3 z1 E" r+ B* T; w4 ^! j led2=0;
5 U6 |% `& }/ G6 X5 m! \ ma=0,mb=0;mc=0;md=1;delay(3);' @! W- w* s8 P4 H R
ma=0,mb=0;mc=1;md=0;delay(3);7 z: K% s9 @& q: r0 f# R
ma=0,mb=1;mc=0;md=0;delay(3);/ o- y, g2 z4 x4 _, t
ma=1,mb=0;mc=0;md=0;delay(3);
4 Q6 j' ~$ t! g R$ p }
' U" n( G- [; t2 u6 \ led2=1;/ }. H, B* s9 D8 B- k
}& @ w2 M5 t/ }* F' ?
- Q* m3 j! F2 L
//****************A/D*****************
2 x( h5 @, L- C& }uint read1543(uchar port)
, e8 ?. R- n0 o, v0 J' o { 5 K2 F/ h; i) Q( j" J
uint ad;1 t4 `& s+ W/ o
uint i;
, V- u0 Q3 b: P uchar al=0,ah=0;3 g( d6 @* v1 ?1 {, A0 O% K( D
CLOCK=0;
0 |9 V8 t$ v( w% I' B8 t& Q0 v+ N _CS=0;
K/ o5 \" R* x( O4 n, n1 K port<<=4;* |) [" d5 O# n. {5 l7 G2 S
for (i=0;i<4;i++) //将四位通道地址送1543
2 ^, t% Q1 v: ^! ~ c* b {" Q0 @, g& w5 n8 T! R' |3 p
D_IN=(bit)(port&0x80);CLOCK=1;CLOCK=0;
" Z& z9 T( `) _4 p8 ?2 z' o port<<=1;
7 S" A( b! w: Q0 C3 K; N9 k }- [5 |9 f2 d% v1 M
for (i=0;i<6;i++) //填6个CLOCK信号$ p% n* D) H2 v) b) j% Y: s
{; z, z$ X! d- B! k/ B( @
CLOCK=1;CLOCK=0;
& q: I% @5 _1 | }1 y, n) j" y3 h- j9 x8 E
_CS=1;5 \6 r9 e) B0 ~
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
4 Q& x+ w" _6 b$ p _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();, U5 Q; M U- q {& |
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
, M( M" g4 T) ?7 u* h/ k9 f9 R _nop_();_nop_();_nop_();$ f8 @ G* e. o' d
_CS=0; //等待AD转换结束
' }+ S/ c7 _$ C X7 S$ C3 { _nop_();_nop_();_nop_();
; f) W& Y+ D# G! n1 ofor (i=0;i<2;i++) //D9,D8. o0 H( C0 l$ F9 F( K3 D
{ $ Q3 r) n6 J: t! t
D_OUT=1;CLOCK=1;ah<<=1; . y& D# K' t9 L; k) _
if (D_OUT) ah +=0x01;1 B- m2 B, }1 _; K# x
CLOCK=0;6 M' d& U& u, k. E3 |
} - }1 x5 t5 ~ I' m7 }* ]0 _) S
for (i=0;i<8;i++) //取出D7--D0
1 d- w; ~) ?! H6 K2 l {
" L- Z! b* T/ X9 F D_OUT=1;CLOCK=1;al <<= 1; - m! F( Y- V/ S0 \$ V! y5 ~, y
if (D_OUT) ' ]) V5 H' h- d
al +=0x01;7 ]$ X9 v ]1 C i% T! Y
CLOCK=0;
5 x8 r: i- R7 r7 I } " s6 p0 f I! B A: c! ]% j5 j
_CS=1; 4 s3 n3 T" o/ d* y9 K3 G' H' u1 W
ad = (uint)ah;; L. f g. U* W' o I
ad <<= 8;
0 _ U* v* g Q& \' {, Had +=(uint)al; //
( |* w9 M0 @0 s& X+ ^ c ereturn(ad);
e9 R+ }2 w7 a& w: Q( n}
0 T1 V- d8 h9 Z: {$ }/ q; w
]& D# o) o) A" [//****************亮度测试*****************
9 Q J/ n2 k" h, dvoid liangdu()
2 o: \9 a5 [7 c: R& y! T* W{; R( T. K- P3 z J, [
i++;! u$ Q4 Y3 T4 O" F* @# r
if(i==30)
* {+ [/ x) u- o4 ?% ~) w {' D0 @. u1 p9 l- P4 D
i=0;" B% c& y; g; l6 R6 b) R+ I! T" s
AD_ad1 = read1543(0); // (通道0电压正端)
9 s0 t `: T, o6 _5 i' a/ y AD_Data = ((float)AD_ad1)*JiZhun_AD*2/1024+0.005;//0.15经过实测需要加0.15减少误差 + W- q: ^7 \: M9 v
AD_ad =(AD_Data*100); : r, K1 q" A: B" R: @8 U- ~ X/ }
if(display[7]>AD_ad%100/10)+ p# y9 ~- ~& o, W1 @
{' \' W; X$ v5 x( F) E( w, I, O
if(dianji==0)
" U% l' f$ y3 Y6 \3 ?0 o# } {
) W+ U- u, m% e4 ? spek=0;delay(50);spek=1;. k- W( |; q! E: ^+ ?9 H
motorzen();0 d u1 y9 _/ g5 f" t) t
dianji=1;1 K1 H8 q: O: w( K' q0 l2 W, h
}
( h( w. U, j: V. _9 x1 z }
: g9 o- e9 H6 O else2 S# z2 Z3 m8 ~ h4 f# ` f) a8 P
{
8 P9 n+ z: a' g/ {# a# \ U if(dianji==1)6 A- k) y. x% u5 ?5 t) M
{7 J0 Y+ n( l9 u0 r
spek=0;delay(50);spek=1;( w% U- Q' \( m8 p
motorfan();
5 l% f) O8 t& |% a dianji=0;
* F& c" G, d& k; K4 p }( a: J# w4 o6 i y! _) T
}
' V p6 o4 P7 ^ }
3 K' B5 ]/ h8 |. ? }
7 s( C" ]& L7 M# Q. _$ s6 _//****************主函数*****************
5 ^( i* h: H+ \void main(): K) r& v6 s2 D( I
{
6 N: r7 c6 W5 @/ O6 R( d. I spek=0;delay(50);spek=1; |! b1 K- [& o. M% s
display[4]=8;
# U) q' y# ^- f. B; J6 v7 Q display[6]=20;
2 N( i% F8 Y: E9 r. n display[7]=50;( C/ X0 d0 ~! m8 Z
spek=1;9 M4 U" W0 Z1 v$ g5 A4 T4 M: ~
init();! _. T% U/ ~4 \) ~- {
while(1)- x P6 e* r3 F! G |* ?4 z
{
2 n; M; [2 R( Q5 H O' f key();liangdu();
+ r: J( l+ Q; {+ i$ D9 v$ f# S if(display[2]==display[4])//时间判断关闭窗帘. V2 Z- Z" z) I3 J. v
{: v5 g& y0 @# F. w6 H! r7 j
if(display[1]==display[3])//与打开时间一致动作
0 s2 p+ f, Z: p7 y {
& f" X' B. E" l. R9 N if(miao<5)
: J0 |9 Q' m7 V% g {
- N p( T3 w3 f! l% D6 L v=10;
4 s3 v a. m$ J5 ]: T spek=0;delay(50);spek=1;
, {3 Y1 s1 b7 T6 G N motorzen();
$ p; i6 [" t0 ~. D. w" r }& J- b c$ v9 K& Z
}+ ^# d) @2 P2 c _
}
z5 ~3 e! x, M& W" N! h' K+ X if(display[2]==display[6])//时间判断关闭窗帘( }5 V7 I. g- x, d+ U1 W, s9 z
{
r/ T1 v% n) C if(display[1]==display[5])//与打开时间一致动作" e1 W- p# R: H6 k9 Y( i
{: n7 h2 c% k+ t# F
if(miao<5)
4 M) ~) K! C3 `) O5 e7 k6 y- ~* z {
2 Y1 P4 a& G" I v=10;4 d3 i# V3 Z/ @- T! d
spek=0;delay(50);spek=1;, I# r4 O& ~- Q- p; w
motorfan();
) A3 }+ m1 [ ~ }
. D2 \% v* e% l3 j1 w }5 \/ _0 R0 ~8 `7 i7 [7 o
}
9 \# n E- U: b9 R }
6 i& w0 q. K0 S4 o1 V) J X}
# h( h1 G% U& l. K0 R0 q3 o
" [0 p6 D( _" m( ?- g/ J3 Vvoid timer0() interrupt 1 //定时器0中断服程序8 ^/ \# U3 v" l l6 x, a3 L. R% S8 M
{
; O( _/ D1 Z- ~ TH0=(65536-50000)/256;//求模
0 @ L c# u9 d9 P* v0 a TL0=(65536-50000)%256;//求佘
- X& n7 b) I, x2 F* t- A count++;//变量
, J! x/ I( v; o" o, u7 O if(count==20)//此处为时间基准调节,20为走一秒
" o/ y$ M0 L( u4 J
& K3 O! J$ i' x# U, l
+ g. {% ]0 j' G+ c, j+ b& [4 ^…………余下代码请下载附件…………5 W. C! r, N2 m/ T2 E
+ t$ z G E0 q下载:
: B0 {' N2 [, l6 N% q& W$ P2 _. ]9 O+ w3 Y' @' v6 ^
9 k9 u' n% b, S$ a: N5 g1 H) E" ^ O
|
|