EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
智能风扇调速系统 总体设计框图 系统电路设计总体设计方框图所示,控制器采用单片机AT89S52,温度传感器采用DS18B20,用2位LED数码管以串口传送数据实现温度显示。 总体设计方框图 主控制器 单片机AT89S52具有低电压供电和体积小等特点,四个端就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。 状态显示 显示风扇调速系统处于的工作状态,状态有三种分别是 低速状态、中速状态和高速状态,此系统以发光二极管指示作演示。 LED显示 本系统共使用的三个共阳极七段数码管分别显示,当前的温度和设定定时的倒计时时间。温度以标准摄氏度为单位。时间以分钟为单位。数码管采用单片机P0口并行数据输出,P2口数据扫描控制显示,三极管8550做数码管的驱动。 键盘控制 有一组键盘控制倒计时温度的设定加与减。另一组控制系统处于的三种状态,分别对应的是低速状态、中速状态和高速状态,此系统以发光二极管指示作演示。还有一个开关按键是控制系统是处于自动状态和手动状态的开关。 温度传感器 DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。DS18B20的性能特点如下: ●独特的单线接口仅需要一个端口引脚进行通信; ●多个DS18B20可以并联在惟一的三线上,实现多点组网功能; ●无须外部器件; ●可通过数据线供电,电压范围为3.0~5.5V; ●零待机功耗; ●温度以9或12位数字; ●用户可定义报警设置; ●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件; ●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作; 系统复位 系统单片机采用的是上电复位,当复位键按下时,系统会变为,开始的初始状态。 时钟振荡 系统单片机使用的是外部时钟振荡,振荡频率为标准的11.0592MHZ。
- N$ o$ b0 W* Q: F' H6 T; Q![]() ![]() ![]() ![]() ![]() ![]()
' ^& I* q& S. [ \- s' Q" O | | | | | % P, _0 l1 [8 q* l3 _: x
| | | | |
% e% y, x, w+ _4 W: L5 { | | | | | 1 y0 o8 U0 X$ p
| | | | * Z& o1 q+ m( `! p
| . m* O' T3 z) |9 Z! r: m
| | | | / B( q8 x' N( g: |$ t$ e7 a# Y
| & |4 j% a$ i+ x2 S' `: z; F
| | | |
+ Z5 j, E7 @6 n% o( ^1 ~( I3 w2 p | , G9 H3 T& X6 Y/ x/ C: R6 N
| | | |
! T, J S& j7 N8 }! P Q | : N8 n5 r2 Y+ B3 o' ]1 m
| | | |
* L2 R- b: m/ E% g1 G c- k* s | % j) |2 E# K3 c
| | | |
# m- B1 L' f+ a) B! x: G# U | 8 p( B# H9 V# X6 H/ X1 @% b# z( F
| | | | | |
) N2 T6 [, `8 y# x1 L( f | | | | | + w$ ~# n ]6 I+ X3 c9 k* s
| | | | |
- ~' e/ T* `6 W2 e3 I | | | | |
. m, d& r1 O! s- [8 J7 Z3 |- w0 U | | | | |
3 X4 w# T2 H; \+ C7 X& S( ]7 V9 z | | | | |
6 z1 F2 V" W( c) F9 l | | | | |
/ h; w& `; {3 ~7 z; `. P | | | | | ?6 B& d/ a! Y
| | | | 9 b' a1 `3 p7 ]" h" J' Y( T2 [, R
| v- ~5 N+ X' T3 Q8 u9 ?2 C
|
3 C# x' d6 o- h5 R# ]- {* {元件清单 | | | | | | | | |
. q7 d- y- ]- s' [ | | | |
K, j; X+ s3 t Q H |
$ R" f( Q E; f8 a3 S | | | | | % _1 t7 ?: m7 O/ m8 U9 C
| | |
' z- ?5 G, ~% j- }) S X+ T1 G: ]1 ~( f | |
3 M" P/ O3 r' {! s/ { | | | |
7 [; Z/ ?; z: |* V, ]1 A | # \' C4 I6 q7 H& k3 {9 o8 c
| | | | ( H& }1 S. i. r& c! w4 @$ X' ]0 e+ e
| 4 }# ^& z% _3 H& z. t! N1 ?" G
| | | | " ^/ u3 K( Z" J! T
|
/ k0 S# }: I" Z; w! J6 B1 R) b | | | |
/ |) Q$ W, f/ m" H. b, A' O( C | . {, J; P- z z) v& v2 A
| | | | |
% X! p% E, f9 }! S: | | | | | |
4 f6 a# N4 ~' v. J3 Q W+ \: h | | | | | ( H% D$ G1 Y U" V) t8 A: @0 |
| | | | |
- q' u9 d0 y- R4 |+ g% c! u% V. h# c | | | | |
( \6 y; ^+ h4 \0 N9 k3 A: d, S | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
8 Y0 V+ d+ E7 k/ B) x5 M" K | 1 @+ Z0 @* w) m* b& q' P( [
| | | | |
4 M( M( l" L9 Y2 y8 Z3 l- t' X | | | |
3 ]( J; P, x4 \! C Q( y |
3 @$ d) z( s+ H+ t" G | | | |
0 \; G7 \# ?3 @# k | " Q8 D8 E: z1 Y9 K! h5 i! I
| | | | |
. @4 A# Z+ i$ H/ n, [ | | | | |
5 g' t% b9 N2 N6 j | | |
' d j; F6 | g. ?9 q. W |
& N- F# c% \, g |
+ U1 _' O7 T- h/ E& ? | | | 7 ]/ e9 s3 N, C) v
|
" ^$ H$ O& ` L4 E/ i! Y | $ L" ?% W, m9 l; Y* ^
|
$ e) V4 `. Q$ l' I | : ]* ~( k1 ?8 y6 y9 f2 P
|
" B" J! B0 F0 a | * f) u: w7 \ a% r
|
0 O/ Z _0 h2 {6 q- c0 w4 i | 4 c4 b& ^- |' y* g; ~! A
|
: D2 } l8 |0 F% c, A- A4 }+ u |
/ D" j: {) m) [, S8 V' t$ a |
& A* c( E1 P1 o |
% X) v; h* D. Q# l: @- u | : z" @7 k3 D: k* A, S5 U; U
|
+ \3 n# s( w- e& m3 j: S |
- B* `" V* C4 y, d0 Y8 | |
- A$ z. U a! J5 ]% ` |
+ J% I. V) v' Z | ; o7 T7 }! f+ S* n6 N3 \
| * U0 m& ~! N5 v! Y+ L4 z2 e
|
, y+ I8 Y. [1 ]5 S | % ]- _# v5 ^. X" K$ |
|
8 M; p: F+ ^$ i9 Y( Q2 ^ |
9 ]; K+ n$ ~" ? k' l l | % i7 C* w$ w9 w0 S& m2 j) b) }
| 6 l8 y6 U) R; Z6 `: \$ a
|
7 z \! k% R0 X8 s3 h( I | 2 I# W0 T j* u/ z/ G
| 5 Y: V1 }3 _4 D0 z6 ]3 ]2 J
|
7 j/ ~5 b6 h* d5 | |
8 }% P3 Y; v: z; D x* j6 H | + p8 r/ D7 {: @4 k0 h& y% p
| : f8 u5 W+ g' v+ Y' a _& b
|
风扇调速系统使用说明书 - 接通交流220伏电源,电源指示灯亮。
- 按下启动电源开关,系统开始运行。
- 当手动/自动按键弹起时,为手动状态,温度显示为当前温度,时间显示为零,加,减键不起作用。
- 分别按下,低速至高速按键,相应的指示灯亮。
- 当手动/自动按键按下时,为自动状态,温度显示为当前温度,时间显示为零,加,减键起作用。每次加1或减1 。系统处于倒计时状态。
- 分别按下,低速至高速按键,相应的指示灯亮。
- 当系统处于自动状态时,如果温度大于30度,低速灯自动点亮。如果温度大于32度,中速灯自动点亮。如果温度大于34度,高速灯自动点亮。
; J+ R! W5 V- k/ Z z3 E
7 j( g' ^; O2 a! F* Galtium Designer画的原理图如下:(51hei附件中可下载工程文件)
- v1 j9 c/ r2 b) G, _% e x% ^4 g! N. b![]()
; f- e; L. ^7 o$ _5 ?
1 {3 C. V5 `/ r* ]风扇调速最终程序:(部分代码200行)" h! I$ x% r9 x8 y' U- t, ^
8 C5 f8 C) n- ^ g# y. r #include' N; w, \' o; v C( m) R5 |
code unsigned char seg7code[11]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,) p r" x, L# y% Q/ T
0x82,0xf8,0x80,0x90,0x40}; //显示段码$ o7 G2 I1 o: F: K
" S- |% {8 t* e9 L
sbit TMDAT =P3^1; //DS18B20 的数据输入/输出脚DQ,根据情况设定4 }2 m; {, A$ U! D2 ^& |2 K
; k* j3 Y+ `6 S% K; d, p4 x
sbit P2_7=P2^7;
2 M' O# R8 x& _7 z0 r" g$ F sbit P2_6=P2^6;2 {4 _7 j" c) M& g5 ?
sbit P2_5=P2^5;
+ m4 z8 n6 k9 o& a0 [5 b7 q4 F4 ~
% R5 i3 ?) P( G% N6 t sbit jia=P2^4;9 J" g: p1 }! J/ g0 m" c
sbit jian=P2^3;
& l! i7 G$ q9 a1 ^9 D sbit di=P2^2;! G4 j3 i; X& }# v' B
sbit zh=P2^1;
+ K b `& W; T1 @) w0 h0 x8 n2 E sbit ga=P2^0;. U' r# I; J8 o+ e
) U& \. _( G, m7 F: p3 v Y
unsigned int z=0;& f D- V$ H4 ~% b
sbit q=P1^7;
# h5 \5 H+ ~4 J/ y- x' Q & r2 }9 D# O7 A( c2 E
unsigned int sdata;//测量到的温度的整数部分# y4 v+ j+ k7 I! W0 b
//unsigned char xiaoshu1;//小数第一位
5 E+ v9 P) Y7 V- M" ]+ a //unsigned char xiaoshu2;//小数第二位
1 G3 Q% H' t- b* x //unsigned char xiaoshu;//两位小数7 K+ ~) s' v$ |- S! n
# h5 m" O7 W1 ~9 F5 T" I9 U( M$ _
bit fg=1; //温度正负标志& i( d3 S" J" v# s- f R7 ^! L* c
. g6 Q' `7 X. L: T# r //////////*显示延时程序*///////////////
. k/ M& U2 o, i) X8 v( G5 a- D. W
void Delay(unsigned int tc)6 r h- W: } X; ~( f$ m! E
{while( tc != 0 )! r, H1 N% ~0 m) c
{unsigned int i;; K {. ~* I/ a# }$ A8 W
for(i=0; i<80; i++);9 c( t5 C' b2 B" ^
tc--;}
$ C/ K3 U8 C. ^" n1 z }) f* k; \' R2 d) D
: m1 |- C I' G
////////////延时部分///////////////* [( b Z. s" [: U+ l
( L n, p5 o, P6 t7 p$ g* G
void yanshi (unsigned int count)
3 ^8 J R2 _6 z9 R' Y9 [! ?0 c9 l {& |2 K$ _3 d$ f
unsigned char i;
+ i) ?! ~! X' `' z while(count--)% \* q1 ?4 ~" H4 r( z, U
{for(i=0;i<115;i++);}4 Y- d9 J" b) m* V3 l
}
4 ^. l& i" _1 a" W. Y, B( d5 [1 @. P6 v7 A( c# @4 _" |+ @1 \$ q
1 b8 x/ `& R9 d; C5 } j
/////////////发送复位///////////////
, d' f% K. [- x! O0 @1 I* C) [1 S7 g! P# C/ i3 R" u# _# F# Q7 }/ k
void fashong (void)6 ~4 P* W0 P0 Z3 ^
{" L5 u z/ V! `; ?4 T
unsigned char i;
* W# `1 y. F m% c; @- ^- }$ D8 | TMDAT = 0; for(i=0;i<103;i++);
i' {6 c" X E& ]8 K% P TMDAT = 1; for(i=0;i<4;i++);1 x9 P8 m2 B& k! ?" P$ P& G* D x
}8 x2 H- X! z$ c5 s0 Y; `9 P* A
4 U9 O/ v p: g
2 y2 x2 j, R6 c& ~# d
bit tmrbit (void) //读一位//
v0 x( [9 C) B% T4 Q { {5 G0 V* l" X" Q+ _
unsigned int i;
! p. x+ H- o& x2 [ bit dat;# T# O2 A% N" W! [
TMDAT = 0;) I/ h* o3 T5 Q) k3 j# ~
i++;
% b; @, x0 M- ]! Q! a TMDAT = 1;. u3 Y. _, p8 H4 s3 z- M
i++; i++; //微量延时 //
4 m* V) _7 Y- N0 @ dat = TMDAT;
3 o( b5 l1 H$ p0 b5 A4 l: x for(i=0;i<8;i++);
2 Q; H9 ?1 U6 }+ o, o return (dat);
% l$ b; N& d7 l' D: H O }
* T! w1 t9 l- e3 d9 c& t
: I# Z/ g" W2 r3 ]' ~ unsigned char tmrbyte (void) //读一个字节
2 s ~! S4 ~- U/ N% V T {
9 J7 r4 a( U7 G0 a unsigned char i,j,dat;
: A1 |9 ]4 f4 A1 P. W X dat = 0;5 Q/ {3 H" j: \
for (i=1;i<=8;i++)4 ^' h3 m3 [; V
{ j = tmrbit(); dat = (j << 7) | (dat >> 1); }
6 K ]4 x ]1 B* w& g" D# H return (dat);
# j8 a8 S% F5 f, G0 ^6 } }8 B1 i( Q L6 S- D0 @$ E
4 R; ?, ?1 \9 t, h& G- i, M void tmwbyte (unsigned char dat) //写一个字节
' x& @1 M, t" l! f9 O {+ P; c5 l$ E; h& J8 K' W
unsigned char j,i;
e( N2 I/ Y+ o# o/ v( c bit testb;5 k, N$ X8 P+ {$ Z2 b8 }" s
for (j=1;j<=8;j++)
: H. @* }3 b: j7 C& w1 |1 d { testb = dat & 0x01;+ ]0 W2 b3 T/ {$ A' w3 r
dat = dat >> 1;" y0 ^9 z/ g0 l6 I
if (testb)5 G( g2 a: j$ e; |! j
{ TMDAT = 0; //写05 n. c; v1 F! {9 \
i++; i++;! c4 }* R, M$ T4 N' G( k
TMDAT = 1;( v/ g" G4 X! u1 C# O
for(i=0;i<8;i++); }
8 h8 B2 h% X: p5 \- [ else
: m) I1 M& m! P F: o { TMDAT = 0; //写0
" N; O& L! D/ o for(i=0;i<8;i++);
, n" H; u5 A% V0 a3 v) ]9 V TMDAT = 1;4 h7 s3 O y9 w+ ]2 v0 z! c
i++; i++;}1 E: i ]/ h% ] A
}' } u% N, Y9 ?: c' m7 p: K+ {
}
1 ?3 B; D8 m/ u0 @ y8 ?4 |- r: ]# o' Y) g) U9 W2 v
void tmstart (void) //发送ds1820 开始转换
3 E/ |$ Q; g3 g! x, i$ `- i {
4 C1 i6 |8 H' E" d7 \3 s fashong(); //复位' s! S. P1 e( T" x' l
yanshi(1); //延时
1 R( V3 y. W0 `$ R/ R, O/ C tmwbyte(0xcc); //跳过序列号命令9 }' |2 k8 U8 l" t' j8 _
tmwbyte(0x44); //发转换命令 44H,5 @' L- c1 O6 Q3 W% b; Q
} ' E5 E d) F& L# I3 h
void tmrtemp (void) //读取温度8 w& n/ n9 Y% H. }
{$ E6 M0 V8 R2 k% X9 e# h7 E/ {* P
unsigned char a,b;
1 u" Q& {& @) ] fashong (); //复位: ?% I# D6 h% Q; \8 J
yanshi (1); //延时
. c/ q+ R, ~) P& J tmwbyte (0xcc); //跳过序列号命令& ? ]; g! } _, D0 O7 v( Z% S
tmwbyte (0xbe); //发送读取命令
1 P5 q5 Q1 ]; c0 |+ S0 x2 \7 f a = tmrbyte (); //读取低位温度$ @& _) w+ Z6 E# }2 k3 n6 @
b = tmrbyte (); //读取高位温度! \9 ]1 a8 a' y- p" _. P% v/ c. m
if(b>0x7f) //最高位为1 时温度是负! y7 K2 @& A2 e1 ~; D
{a=~a; b=~b+1; //补码转换,取反加一' G( Y* }3 T! D9 {6 r2 g: n9 r
fg=0; //读取温度为负时fg=0
/ ?. q6 [+ ]% V$ _- c* l }
$ Z, q8 H' h* ^9 b6 s4 t: b sdata = a/16+b*16; //整数部分
) G" p& `6 n( Q1 I/ q3 F //xiaoshu1 = (a&0x0f)*10/16; //小数第一位
# }+ S; @/ |- B @: v) h; `" l //xiaoshu2 = (a&0x0f)*100/16%10;//小数$ H2 v) b* P: w8 @0 y
//xiaoshu=xiaoshu1*10+xiaoshu2; //小数
+ u7 [& W0 ?1 ^+ a6 o( ? }
/ y. j9 q( p! x6 C1 G void DS18B20PRO(void)+ c" \( W5 b; a
{8 [1 g5 c% E& i1 q2 r7 U6 o& a
tmstart();
# P- p5 T* f3 s1 A6 A3 o$ d1 z; n0 e //yanshi(5); //如果是不断地读取的话可以不延) p9 U6 ? ^' n2 Y- ?/ u0 l/ ?
tmrtemp(); //读取温度,执行完毕温度将存于
^; \9 o% t: e ? }
' G" q) L6 {8 B2 P) g void Led()
8 [% u7 m7 k7 g) F6 C A/ `/ y {5 X% L2 D' ?$ x' O
if(fg==1) //温度为正时显示的数据
- A! D6 m$ v* f' x5 D {, y# T, k, l$ z# c& o# i
P2_7=0;( S1 m Y7 e7 G; j! B. l
P0=seg7code[sdata/10]; //输出十位
3 }4 t( Y+ U, g( s Delay(8); P2=P2|0xf0;
A: Y) ], \: ^9 A/ v
, v* s0 P$ f+ ?; O/ R P2_6=0;
/ F2 i3 }/ a* O P0=seg7code[sdata%10]|0x80; //输出个位% O" H8 H2 O0 M2 o4 R5 `
Delay(8); P2=P2|0xf0;6 {1 W% t/ G% {3 M
( X5 ~8 H6 l3 M+ q3 |, n P2_5=0;+ Y) }$ z" @: P K$ A+ U
P0=seg7code[z%10]|0x80; //输出延时位 ) X) j3 t$ N5 b w
Delay(4); P2=P2|0xf0;6 v8 ~% v/ \: A6 G( s! T1 P- {4 Z
9 {6 L; O/ Y l+ b if(sdata>30)
) a# j& \0 p0 @! } {P1=0xfe;}4 ]0 [) n8 r1 B3 X
if(sdata>32)
* D( i7 i) |" c) J0 r! h5 L0 [/ [ {P1=0xfd;}) }3 ?; r6 E. h7 Z1 d1 Y" ]
if(sdata>34)7 X! _! o7 K; J! E1 @
{P1=0xfb;}
3 U; ]* g! s# M% m2 p6 n- u
" V4 k) |6 n5 S# D* e+ O }" D9 i- O7 r6 X8 Z- S
}: Q' { J+ d( p# `
* F$ h- I3 l2 B void buzidong()/ ?* I% U9 U3 |' O
{
1 C7 ~/ O; ] W3 ?/ x& `. K; @1 m
7 k2 T: e' x' |- L void DS18B20PRO();, Y, f( e' E9 D& f. Q O
void Led();. y& f. a& i" J* R7 [. |
: h$ ?0 H M- L% [0 C4 t DS18B20PRO(); y8 I2 g1 J k4 I( l
Led();4 z# d$ X; A6 z$ Z
if(di==0)
' l# n& t& c! _! C$ A6 _, L {Delay(200) 1=0xfe;}
0 w6 N5 m: W! Z$ L$ U% A5 y% Z if(zh==0) o4 c! i7 o+ N7 z. L
{Delay(200) 1=0xfd;}
( |& G3 J5 F6 H% _3 ~ if(ga==0)2 L2 O3 q' V% h+ W" D" i
{Delay(200) 1=0xfb;}4 e0 _/ X4 f. w/ s* K
8 n* u3 v7 w: y- F* s% ?1 ~4 @, B }9 u! H* j4 I2 y3 a2 _
void zidong()2 B8 |( d M0 v# Z: K# A
{
7 ^: g# ~* s% t while(z--)4 `$ e3 R" s/ n* E
{. L7 ^6 T6 D* o. o9 X3 u- W( F* Y; B/ l
void DS18B20PRO();1 O: b8 H! m* Y8 N) M
void Led();
& g2 l: B2 g1 ?( R- B" y6 e
8 |- g# H3 n; F7 u# D: D; {! _ unsigned char i,k;5 r0 D' a" E5 u- a
//for(y=30;y>0;y--)8 M0 y0 k! Z0 w4 v/ l
for(i=12;i>0;i--)" j3 \) O- x' o" _' K. N, X
//for(j=80;j>0;j--)
: ? p# z2 X3 H0 H$ w, }1 X for(k=248;k>0;k--)
' E0 s! I1 z7 W9 A5 }' K. u( f {
" i! Z% m: H$ {* f if(jia==0)5 Y5 _" q2 y0 g+ V2 G7 V
{Delay(200);z++;}
& D4 A4 b6 i; f8 {2 {* B( B if(jian==0)
; E) v2 Y5 c7 _3 ?' E9 p5 c7 R- m+ V {Delay(200);z--;}
& I9 u% R9 y& Y4 L
( B9 B( f# V3 Z+ o" p. o DS18B20PRO();7 h& _8 j- }# X1 ?3 y, ~- P! k6 [
Led();8 m$ s5 @: _1 Y6 l2 `
if(di==0)
2 g. l) S3 E3 R8 y% X! r9 U( b+ I {Delay(200);P1=0xfe;}
% K4 H9 G7 Z- ]3 }% j- u if(zh==0)4 a/ d$ O; C7 k0 Y P
{Delay(200);P1=0xfd;}. E# e* u ^6 k+ E* ?2 s
if(ga==0)
$ }5 s! \! J# I6 {7 f3 } {Delay(200);P1=0xfb;}- {; v/ H4 b9 {& M0 l
# d2 m) c' Z7 Z6 Q. x$ b /*
2 o4 B' ~$ p' |, J if((di==0)||(sdata>30))( Q; `- T4 X6 V$ c
{Delay(200);P1=0xfe;}+ t# L4 @ }) [: J2 \' b9 q: [
( A k! Q8 {* e% t k! M; q* w3 t' B9 k) ?7 W/ S
|