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。
; {' }1 {# x% c![]() ![]() ![]() ![]() ![]() ![]()
, t" M- K7 }0 K$ ^/ v, X | | | | |
4 w" [' T6 Z7 L% L | | | | |
$ _- e1 B8 ~$ N7 z t2 g | | | | | + g5 K3 ~. b+ G0 d: v" k
| | | | 1 X' c6 {. L2 k9 L
| / S, s! p9 w6 g- S3 b) r1 L
| | | |
; J( K8 Y. M0 s6 `1 F" _1 c |
) m- M9 C- ?5 I! k: }% A L | | | | % c& v; E1 R! n5 D5 o
|
' [# X; q! v3 {% d2 i5 k | | | | |
; N2 F$ e1 B' s | + M# Z0 P7 X0 n5 n5 l# E
| | | |
. Y) j1 k" T" R |
2 c& H5 M6 O+ Y | | | | 7 o5 z: E! _. C6 w5 [: N+ `
| 1 S( U+ }* y. O9 `& N
| | | | | |
. O3 L6 {: W) m" r7 J! h) Q | | | | | 1 I7 a$ k% \+ _7 F; h @
| | | | | & f% S" D' a) g9 C% _! J
| | | | | $ Z2 V# M8 c. G1 y/ X; m5 o
| | | | | " r* ^2 \: ]" k, u+ G N
| | | | |
4 o1 t6 z) i. c. A2 D | | | | | 2 j1 Y. C. f5 M+ I @+ f0 _3 Y
| | | | | 6 G, z( {8 v) J" Y) B0 Q
| | | |
. w( e3 Q7 S2 b# N | 3 R3 w3 o( U: _: B7 C+ j
| & [" g2 r7 _. [% Q5 A p3 g% m% t
元件清单 | | | | | | | | | ( g f; l `' k, R/ Q/ \ c( O/ P
| | | | 9 V9 I& ` B/ [8 u2 s
|
- H* `8 c) I0 E( T | | | | |
2 w& E1 _, y: y% s | | | 3 B5 T+ }0 D+ Z! W" h
| | 3 i4 y* e1 |# ^6 w5 b6 r |
| | | |
: J2 s% n [( @1 g |
. G5 W! j9 A6 T# c+ Y! Q | | | |
" |2 S- X- O' F/ n' S, x |
y ^0 t$ a( E | | | | . z- H9 F7 e7 E4 c. Q7 p! ^5 j5 X; h
|
1 O+ K$ b6 _* l! r | | | |
2 [$ f$ K7 k0 I7 `: i4 e |
5 `/ N* m7 m( Z! {6 s! Q | | | | |
# Z! ^% R0 u! M$ M | | | | | 7 j) n" J; x4 X7 e! d5 R
| | | | | ; W! q0 g- ?9 u2 n" D& a% h5 v
| | | | | ( J+ l3 r$ H& h w, W8 U
| | | | | 6 o/ L- ~# Y* P! L
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | ! J+ ~% M, R% Y& H ?5 S) y* O" Z
|
+ q; R, `- U0 N4 V | | | | |
7 U$ Y" I) o l& Y" ?: z | | | |
( L( }( F0 e9 ?3 o* s s1 a$ l! c- M | 8 ]% W7 s3 e. w0 y* [
| | | |
$ x' e. L: l) V) S! P, C! l6 g |
1 c+ P7 M m8 g% I | | | | | & i2 b$ d+ \, Z4 D9 }. K% D6 a
| | | | | & n8 T* N6 K8 N7 b, r' D
| | | 6 U2 ^/ ^: D: M+ X4 q1 h
| " i' Q" M4 ^; Y! @9 W, F; u
| 6 U; H: ?9 e/ g0 X
| | |
: G9 w8 R0 D* _/ t5 v |
0 c* X; Q2 I2 `# y | ' F% j& z- u6 ?% n! B
|
1 o# U* f6 R5 z0 F | B* F* p3 j3 A- \
| 0 e Y) e9 w. A' h/ D2 g/ }* M" j
| x- P4 L" h. Z: L& P* \
|
* m4 S. z) h" ~/ C% m- X; { | , Y) W$ d/ x, z3 z1 V2 H
|
" w7 H( t& F) \- h2 e9 H. r5 X$ \ |
) j+ y$ G1 k. t( D | , @# c" p& l- r8 ~/ Z0 G
|
4 D( D' K6 [3 V6 _ m- O- |5 {2 Y1 K | # [* j' b' |7 v/ f8 K+ }- c
|
" l2 z1 N4 G5 z | + o& K" ?6 H8 N) T1 s
|
6 j) Z" Q( K* j1 F+ N+ C4 O% k | % s3 N3 J1 l/ z4 w
| 8 G0 i/ X8 ^6 a! r+ p9 ^" R
| % p% y' T. {+ o9 B8 b% x
|
6 O5 n( Y/ z5 A6 s: \* \ | & r; K& U' I( C+ A
| , O, v8 Y3 y8 P3 c# f# ^. ~
|
7 L7 R$ V1 G# B# O) J7 |; T9 I- B% C, l | 6 f" S7 z& s6 |3 [4 k
| 1 P- o3 g+ S9 k
|
6 a2 L- { T6 V, p' y7 W | " e- I. U" X3 N8 g9 {
| + Y) g- a; d" L$ W2 [
|
0 o, h! {) |! I9 k7 T |
+ h0 V1 u. f. e$ ~7 q, F& a9 y; A | 9 k+ q; B: ?- v: w4 B
| , \. T, [' p& M/ c
|
风扇调速系统使用说明书 - 接通交流220伏电源,电源指示灯亮。
- 按下启动电源开关,系统开始运行。
- 当手动/自动按键弹起时,为手动状态,温度显示为当前温度,时间显示为零,加,减键不起作用。
- 分别按下,低速至高速按键,相应的指示灯亮。
- 当手动/自动按键按下时,为自动状态,温度显示为当前温度,时间显示为零,加,减键起作用。每次加1或减1 。系统处于倒计时状态。
- 分别按下,低速至高速按键,相应的指示灯亮。
- 当系统处于自动状态时,如果温度大于30度,低速灯自动点亮。如果温度大于32度,中速灯自动点亮。如果温度大于34度,高速灯自动点亮。
! n5 E1 l: h; J1 m" q4 U- ~
# f+ p7 x% { i. a; z# ?9 C7 `3 W
altium Designer画的原理图如下:(51hei附件中可下载工程文件)% y% k% F7 h/ d' D1 W
, [& h6 K5 h5 L2 }
. A n) q( q1 s; a" x$ l3 H( O
风扇调速最终程序:(部分代码200行)
$ f. x: s, P; `2 K6 z; W# Q6 |) P9 D- e( p
#include
5 F/ ]8 o p3 ^' a9 \ |0 _. _ code unsigned char seg7code[11]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0 R3 R0 k, Y% c" ^" f) W8 N- A) J5 L 0x82,0xf8,0x80,0x90,0x40}; //显示段码5 o% Q; Q2 i, l. T9 s
% e2 o' x. E3 K
sbit TMDAT =P3^1; //DS18B20 的数据输入/输出脚DQ,根据情况设定
3 @6 {) p1 e% T7 ~4 q2 B. V
2 L- j3 p0 ~1 p3 J sbit P2_7=P2^7;
" k7 v- G' C f0 u0 _) r sbit P2_6=P2^6;
: k+ s; n8 ?8 E# I$ M* f1 A sbit P2_5=P2^5;; T' B! A6 H0 [% f' I; E+ u) |% T
$ K9 N2 d8 h9 ]6 M
sbit jia=P2^4;
* q9 V6 G4 V2 J sbit jian=P2^3;
; D* k. d' o* ?4 |0 q" c1 v sbit di=P2^2;8 c, e6 V( t" v
sbit zh=P2^1;
2 v9 W, o" d- V1 | sbit ga=P2^0;
3 _; I1 J( | P# E# g& q
]1 k0 n5 \3 B! e. Y5 d unsigned int z=0;( Z$ x3 n+ z+ [8 j
sbit q=P1^7;. M* G( e- l6 o/ M# J1 @/ A. u
8 Y6 N$ [! `, v# ?- H unsigned int sdata;//测量到的温度的整数部分9 y% {) o% ~: Z8 m' r9 P
//unsigned char xiaoshu1;//小数第一位
- m. y+ }" U4 Z //unsigned char xiaoshu2;//小数第二位5 c) I) l! T1 ~
//unsigned char xiaoshu;//两位小数
1 ?7 ?2 q' \& Y
. ^4 M9 j# Q' \ bit fg=1; //温度正负标志+ `3 U$ p; h: V& F% S! e" F6 Q
! l% `$ {4 y7 p; _ //////////*显示延时程序*///////////////* T% ^- r/ r- W( G
# d4 W m8 K4 B. a1 ~$ ?
void Delay(unsigned int tc)- |' C) Z. Z" [, Y" r$ U4 T
{while( tc != 0 )
9 Q3 U" e/ Y: F1 ~3 @/ ^8 t6 ?; O8 R8 x: v {unsigned int i;' h; j3 v. s9 q& K' z4 L- l1 n9 z
for(i=0; i<80; i++);( ]: x3 T" ]; B
tc--;}
V! X' J" N- N5 B3 E }
; H( @ I0 L7 U; s1 k2 K2 b' X) l# L' E6 I, w. T+ e
////////////延时部分///////////////
) v5 g6 v. i- r4 l7 Z7 Q: a" n# k1 x7 d* z
void yanshi (unsigned int count)0 l& ]2 R; o4 p6 o4 U: {3 ]9 S
{
" n. P s+ k: @' O$ |+ F unsigned char i;
5 }$ G) P+ a/ T, y2 [. `3 G while(count--)7 B, X3 ]2 x5 H( d U+ Y4 ]
{for(i=0;i<115;i++);}* {3 P6 ?0 z7 |8 Q, Y% X
}9 f( \( x- ?) y1 W
# X0 e+ G+ S v' u6 A5 f; a0 r) [
; a( e& v" T: q# h* Z" {& N1 c
/////////////发送复位///////////////9 M) E2 @1 ^# v6 h: s' Z: l
5 ?- t7 _* V$ x$ D9 {4 y3 j void fashong (void); q; s @3 }) T4 a z# O
{
O0 s9 k0 m2 N/ @' ~3 I0 j unsigned char i;
- I$ O( o' o$ o TMDAT = 0; for(i=0;i<103;i++);5 W0 R% W8 i2 M. c) Y1 C. ^
TMDAT = 1; for(i=0;i<4;i++);
0 S; c. {+ |/ U. r }/ W7 w% H1 e; w
Q( A! X5 b1 M+ O' X" x/ K$ }0 Q: y( @1 v, q) ]/ C
bit tmrbit (void) //读一位//! d' W3 K1 o- v5 Z3 H4 F8 E
{ 7 x& q( J/ l* z+ P0 x4 k
unsigned int i;% ]$ I$ I6 T' Z% _
bit dat;. }+ y8 E V8 k! Y+ [3 D5 q
TMDAT = 0;
% u' A+ M) x0 V+ {3 A7 {) w i++;
7 L9 u4 J. G. N( R TMDAT = 1;/ R8 @' `: v* ~' j
i++; i++; //微量延时 //
4 y8 m6 {& O* m; Z L dat = TMDAT;
7 n, F$ z: O1 X. m5 s' X$ r for(i=0;i<8;i++);- S+ ?7 j( e% b; V$ r2 I6 T
return (dat);4 U3 g% T# D/ T# X
}
$ x+ T0 n) ]; Y2 H1 h* `/ g9 `. T" R; Y" d
unsigned char tmrbyte (void) //读一个字节
) O0 s( [4 L# V# {8 w2 D$ i8 v {
9 ^0 ^2 n' e. |. ~ unsigned char i,j,dat;
$ q* ~( a: v3 m dat = 0;9 H/ Q7 e9 k! O* J
for (i=1;i<=8;i++)( K0 s# K7 e8 }
{ j = tmrbit(); dat = (j << 7) | (dat >> 1); }
) L N; K% o. m2 B) D5 Z/ F2 ~ return (dat);4 O) N- G, p0 C5 j, I
}
2 K3 T# Q$ m! S. d! l h8 d; \
void tmwbyte (unsigned char dat) //写一个字节
" _* N5 e% f1 e H) w {4 Z. o# C& i# {4 L5 _
unsigned char j,i;
0 J' Y9 H8 i8 {+ o' O4 U# q bit testb;+ o, x, C) k8 i" q
for (j=1;j<=8;j++)7 z/ h/ k2 J9 M( s, o$ l' T
{ testb = dat & 0x01;2 U1 L: c" N4 V3 x8 e8 V9 |% h* a
dat = dat >> 1;- X" C- Y4 q/ e1 s5 a8 C" q- `9 R) ^
if (testb); B% Q+ \8 J+ S
{ TMDAT = 0; //写0
3 r3 E- y$ \+ Z M i++; i++;
5 z; ]+ T1 y9 e! E0 E8 ? TMDAT = 1;) e8 `( j5 \6 \! d
for(i=0;i<8;i++); }! v4 |2 K9 C4 Z: `5 @2 C" J
else7 C+ i1 ?: G v
{ TMDAT = 0; //写0
. B# \( B8 H K5 n% ? u4 l% z0 D% D for(i=0;i<8;i++);: X3 g9 C) a1 u- f. w9 {1 d" H% f8 l
TMDAT = 1;" b9 c# f" s, S) H Z; N7 s
i++; i++;}4 d$ w' d( e" g$ K! i
}) h* ?. T) A' V2 l/ b
}5 k9 K A' I8 m! l; [$ }4 k9 [
3 c: _1 R) W2 D+ a' {0 V8 V void tmstart (void) //发送ds1820 开始转换# j1 m' }7 L9 _0 U* ]
{( F. s; ?( r7 w! K. P! Y
fashong(); //复位+ e5 C0 ^1 J, a% |! I: \
yanshi(1); //延时0 O4 W, c V, x
tmwbyte(0xcc); //跳过序列号命令& K1 ] R0 V' @- P* f- F
tmwbyte(0x44); //发转换命令 44H,
" O6 I' ` Q% x% B) L } ' S% Q% M( g& }: x% n( E
void tmrtemp (void) //读取温度/ j$ P. o6 p8 s2 G' H
{3 P5 y% e7 K" b" R8 J& \. C+ a: B6 H$ S0 X
unsigned char a,b;
3 j0 F) Z2 l# r fashong (); //复位+ v, g8 x+ Q, H6 R$ S9 r$ N
yanshi (1); //延时
" z2 S, U. W1 J4 E7 z7 c4 d tmwbyte (0xcc); //跳过序列号命令' t" z; _, K- O3 x
tmwbyte (0xbe); //发送读取命令' |+ Z( w3 ]+ I8 a* y) z% G S/ c
a = tmrbyte (); //读取低位温度
1 \6 V/ ?1 K% g$ L1 L b = tmrbyte (); //读取高位温度1 k; V4 z! D J
if(b>0x7f) //最高位为1 时温度是负
' E4 h$ l: ^3 f( {9 |7 K7 r: Y2 W {a=~a; b=~b+1; //补码转换,取反加一
1 u6 x+ B% e. B7 j) o fg=0; //读取温度为负时fg=0, z. O9 m( {2 b
}
) a: D _. x% f3 ^ p7 T sdata = a/16+b*16; //整数部分
, ?+ a6 t- Q/ W' } //xiaoshu1 = (a&0x0f)*10/16; //小数第一位
( E2 Z/ P; G( h, X# x$ L: e3 l //xiaoshu2 = (a&0x0f)*100/16%10;//小数% s, d" _0 b* O) ~
//xiaoshu=xiaoshu1*10+xiaoshu2; //小数, ^: ]& {* }- N5 [0 \3 I( a
}
; P. b3 {8 \$ \- e+ q) E void DS18B20PRO(void) F: C9 j! Q0 G5 ^; B
{7 {* n. r- p" [5 [ M
tmstart();
" f" V- t; j8 c0 n6 F! J# x+ K3 f" E //yanshi(5); //如果是不断地读取的话可以不延7 j7 M; U' |( }6 M
tmrtemp(); //读取温度,执行完毕温度将存于
. k, p. h0 B3 s% X. p }7 U, h; g1 P! }) |5 [4 E
void Led(); Z4 D! K" i6 a) e) ?. C
{5 R+ O% I h2 i6 B9 q
if(fg==1) //温度为正时显示的数据( x3 J8 m6 o; ~+ b4 N+ u
{
1 z& z( h2 E1 k4 H& _ P2_7=0;( s( r6 w- E: z3 A7 f) V8 p
P0=seg7code[sdata/10]; //输出十位
# E( m, p3 o4 g0 C | Delay(8); P2=P2|0xf0;
( q9 V. g) u. Y+ @0 m* H
) D8 n P* i/ n! O P2_6=0;* z0 W+ k, h: e
P0=seg7code[sdata%10]|0x80; //输出个位
c% L- {, ~& {1 L Delay(8); P2=P2|0xf0;
3 C5 j v0 z( y" _0 {! y4 s: q# x/ n' E0 c
P2_5=0;
5 g9 l5 J4 t2 }" Y. v P0=seg7code[z%10]|0x80; //输出延时位
0 s9 n8 F9 V4 o- b3 j Delay(4); P2=P2|0xf0;( f0 T/ i$ F6 s; H
) m0 f' c) V9 q5 U if(sdata>30)
- r( f' x* D. w/ X' l }" P {P1=0xfe;}
& O9 i/ a6 {/ e/ J if(sdata>32)
: J" e9 _! f% d0 U {P1=0xfd;}
! g; d/ D- G" A; b% p9 T* Z$ z if(sdata>34)$ |9 @; f. V' W9 |
{P1=0xfb;}$ b1 V, E# l9 d; a6 l
4 B* N/ J1 M8 u+ O/ O8 ~ }8 @* D" J- q! l U* g
}4 Y: t5 O9 V' r
) V) [3 d3 _ T# C1 N
void buzidong()1 M6 S: A0 K7 K9 ^1 n" Q% I
{) w! d( t; J* ]
. j9 O+ y2 H* ]4 V' T void DS18B20PRO();
1 X" F6 D' v' F/ ]8 m void Led();7 B; g* T) ^2 e7 I7 Y1 A
+ Y' S4 n+ Y+ R: \7 J2 _ DS18B20PRO();( p. X' W, h" [1 J3 i3 f+ Q
Led();
' j9 S& {0 J+ f& l if(di==0). _( x& S# W" t% O" M
{Delay(200) 1=0xfe;}
" X5 D3 X4 |8 O- z# W if(zh==0) r( J. U0 i. P9 j# {5 x
{Delay(200) 1=0xfd;}' ?! `/ J3 U* q( K: E
if(ga==0)
9 y+ f( ^7 [) n {Delay(200) 1=0xfb;}+ H/ D! k R4 r7 B' L
& p6 c$ A# j# E" ?: u
}
' l/ Q$ k2 ]9 Q: \! z) B( v void zidong()
: S- _7 x+ v- O {
# X. u5 F6 X1 t+ x" O' v while(z--)
1 w$ [, I) Z/ S1 F1 o3 { {
6 c8 c7 h! r" z" N0 F void DS18B20PRO();2 D* _# l3 e' x# q( }" W8 B
void Led();& n; D, }7 L5 ?6 V% R
6 B# l- d, L7 Q- j, S: [! S
unsigned char i,k;" W, O: v: e/ {$ k( P* G
//for(y=30;y>0;y--)+ s1 l4 B- y. d! g c' k0 j5 K x
for(i=12;i>0;i--)5 I5 L4 K/ u0 J7 c2 i
//for(j=80;j>0;j--)
- o% b7 C- }0 t% }* S1 D- Y* Z for(k=248;k>0;k--)( o! B5 |! n7 N
{
" x3 O1 e" w8 D4 V6 D! n# T+ } if(jia==0)3 d+ V. _- B. J+ U
{Delay(200);z++;}
6 R# t" {! b; @& b/ v6 Y if(jian==0)
8 k0 N7 }6 m1 K" ~- j& p {Delay(200);z--;}
2 {2 O6 D2 c6 b( M
/ p7 C$ |: b# H( v) n/ f0 G8 y6 c DS18B20PRO();
" f* i4 x* j; j8 I' D' ` Led();
3 p+ N# d' [( o( P if(di==0)" C8 Y& Z/ e) {* p
{Delay(200);P1=0xfe;}7 A$ z. A1 {2 G/ h. e
if(zh==0)4 n0 b% ~, Z0 E* s
{Delay(200);P1=0xfd;}
/ {% p: B. w+ W l2 I3 T, L! u if(ga==0)$ W% y6 c! N& J8 ?
{Delay(200);P1=0xfb;}
, @& V, b- [' L) {: _- _; _& O: Q$ G E' A. q. _
/** f5 I4 C: a: K: P
if((di==0)||(sdata>30))& h/ U" c) J4 [$ v
{Delay(200);P1=0xfe;}5 b* R- r& ]/ h. Q1 M/ J7 m
: h2 X/ [3 w* M& G9 Q
+ {' @# }8 X# h; _+ Y2 D" O0 @
|