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。. `2 M2 y2 r f' H! D! J; E! U
![]() ![]() ![]() ![]() ![]() ![]()
5 x% W% j2 M7 Y0 ]: _. L0 s | | | | | * l% F) L0 i; U' E& K! g2 r% N
| | | | | * N/ O3 K7 m: T7 B. M/ E
| | | | |
; g# r+ {* G- \2 ]3 A5 B5 b | | | |
- f+ W8 x1 G( G& K! y/ H. C; r |
; l0 k2 ?' F) o/ g' M- s o9 k | | | |
, |) i' d2 S+ B4 h5 l | 4 [" i/ G+ [9 ~
| | | | + j' E! W# O2 G0 y# p) d
| 9 Y7 |( \7 e6 n# j1 ]; j# X7 U
| | | | . ~3 |# c v) E8 O: S
|
& ]2 t2 L% ]. o# z | | | |
2 p# k$ B1 J* K e+ s |
$ \3 B9 c! }( a& i& u6 h3 R5 E | | | |
' T4 w* o2 o4 d |
0 J" r. ?) l$ B2 R6 Y | | | | | | % A. q& v5 c5 q
| | | | | * S& M+ G% g" w& F4 T, r) o0 J. g
| | | | |
7 |# b; L) \8 J6 m3 |6 w! r, i/ U1 {+ v | | | | |
6 U- R' M1 k) e1 I: X | | | | |
" F8 R) C4 |0 U0 h | | | | |
1 B9 x% M D$ z; A8 g( a a' O7 ] | | | | |
; L( O( m! j9 O: V0 X | | | | | % _: z& V0 u* ?! ~0 `, U
| | | |
/ s5 i% S$ g$ n l& g | + K+ Z- _" N8 V/ @6 o
|
" i' Y& v7 p- W% C1 o$ |# T, F元件清单 | | | | | | | | | 4 W% U; m6 p+ ?6 Q$ `
| | | | 9 S+ y: L, J$ J; K
|
: j5 d8 f4 u( ]% h1 d, N2 T | | | | |
8 p. N% g( ^, s | | |
6 E2 D. l" A; N# l | |
$ u9 [7 a" L; [" f( h5 O, H0 C+ d! N: i" \ | | | |
& r/ n( W( T: |: U) z6 \ |
# q5 J7 m( b/ t( m c5 l; A$ {8 m | | | | 0 _# ^$ t1 k5 @8 u& T- e! D
|
& l) z8 C& G( ~% z; e: r" I | | | |
( f9 b! \8 T! y | / y. ]! j; j+ E" ~' y
| | | | $ }) e8 _; Q9 u) a
|
( C; U; K9 O x | | | | | ' H) F, z% k- e* h% a' @
| | | | |
6 p* D6 _) @' N- N) i Y | | | | |
5 U9 j+ ~# v: M( W* B5 _ | | | | | / G$ F: y, z: s" J" w
| | | | |
: E* x! m5 U9 u l" ` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * x. W# T7 }; V8 W; |: ?, f% l
| 7 r+ ]; t/ ^6 ^- _* ~
| | | | |
+ R$ i* [5 Z1 E | | | | 8 U5 F1 s3 C, _7 z1 W1 x
| % s: O" m9 c& @' D: Z& a. o
| | | |
/ ^. s3 D/ z$ f$ _, } [6 u | ! X! D* \4 E" C8 w" t6 Z% E4 n
| | | | | 0 R% G4 n4 d2 m8 k
| | | | |
+ V, u- S5 ]6 l; i) b( P+ Y! S | | | : M8 h% L& z( i3 d$ V8 {5 {! |. f
|
% b- l5 x% W1 z3 i) P) W, D | 4 C1 s. f( h$ ~3 F$ f
| | |
; h. p. T) Z: |5 Q: r5 |/ O/ r7 M5 K/ V! W |
) h% M2 F, r$ g' d0 G# e |
. W7 W0 l8 d8 T2 h5 L+ {0 r | ; }4 V; V" L+ |" h* w& S1 S ?
|
! V# H9 X8 w5 v6 _" v, c |
& w4 @) d0 }9 Z$ s" I) h# y8 X |
5 {+ [% Q1 F/ e |
7 ~% E- X( e# K7 g+ ~% R |
& k9 L& T1 y' m3 c) @: l4 L$ {7 r | 3 ~! e& \/ W5 n; g' N$ c. r# N
| 0 J' P. N8 e, C9 ]
| 9 u" a$ V6 b: ^( E
|
8 T: j( R4 ^1 G5 j( p: Z | ! J( i9 q& v7 Y' t
| 9 R- S0 R; ^6 l: M# J, a7 o2 W( p
|
* ^2 @4 U8 X. u" h |
5 }4 @; Z3 T9 ^ | ( f' X8 t2 h: p! W
| 6 V! e0 f0 o+ s8 D" }% p. W
|
% g# ?3 Z/ i6 u | ; ~2 r0 C" Y1 z6 J; ]% }
|
8 m0 \; n, `/ h- a- Z& Y$ `. Z, w |
; y i3 a7 }- U8 p# ]" e |
4 j1 A: q, H+ x5 e, W! D1 P- m |
: w) \" ^3 b2 u! q | 1 Q! q" L) m4 E+ M3 _
|
4 A7 x$ b! s9 X+ V: d8 h/ n | 0 X7 {! o% c+ H' `
|
$ A K1 P2 d9 @; X |
+ B2 e$ a7 i0 u4 R9 ^3 S |
6 T1 r+ i% b. {! f/ x | 6 V+ ~8 Q% x" J3 C/ o) @7 l2 t: u5 q
|
( z( O, i8 j( O& i J' c. K! U8 K |
风扇调速系统使用说明书 - 接通交流220伏电源,电源指示灯亮。
- 按下启动电源开关,系统开始运行。
- 当手动/自动按键弹起时,为手动状态,温度显示为当前温度,时间显示为零,加,减键不起作用。
- 分别按下,低速至高速按键,相应的指示灯亮。
- 当手动/自动按键按下时,为自动状态,温度显示为当前温度,时间显示为零,加,减键起作用。每次加1或减1 。系统处于倒计时状态。
- 分别按下,低速至高速按键,相应的指示灯亮。
- 当系统处于自动状态时,如果温度大于30度,低速灯自动点亮。如果温度大于32度,中速灯自动点亮。如果温度大于34度,高速灯自动点亮。
( E, z4 q; Z/ f2 j' j$ ~) u% P1 D
% }# ?7 g6 d/ d
altium Designer画的原理图如下:(51hei附件中可下载工程文件)
4 C! H! V1 W2 [- y5 e+ M![]()
# Y9 j7 `3 P8 Y6 h; \: C+ t0 \+ n: u! P: Q, o
风扇调速最终程序:(部分代码200行)$ z" |! h, ~1 L; F3 X) |2 b. q
" r3 u& _8 |/ K) L# r D- W #include
& |/ S- E: W" o1 i: j$ n7 j code unsigned char seg7code[11]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,
6 U% Q/ S _. N5 }5 f 0x82,0xf8,0x80,0x90,0x40}; //显示段码
7 U* h9 Q- P6 y @6 |+ \6 Y3 U9 n- n3 @. t9 y* u& @
sbit TMDAT =P3^1; //DS18B20 的数据输入/输出脚DQ,根据情况设定8 {: C9 J& h o, e' Y
/ p' V; c* L" e6 D/ C sbit P2_7=P2^7;& [- K5 H5 D; y' K# c. f! {
sbit P2_6=P2^6;8 h8 n1 _ m A$ w
sbit P2_5=P2^5;
6 r1 o$ A" _& J# J; ^5 A
: C! S; n3 E V! b# G6 k, s- ] sbit jia=P2^4;
0 z; t! B: s4 t6 `( Y" O sbit jian=P2^3;
. x. m5 f& Y5 q: R sbit di=P2^2;# y3 I5 K# N9 q0 y7 ]0 I% n# U
sbit zh=P2^1;( f; R2 P6 a& K8 P' z
sbit ga=P2^0;2 D5 R5 S, w" f% J u
% U& T( T" @8 ?
unsigned int z=0;
+ \3 n/ w: N# c sbit q=P1^7;
Y# s; D3 x- y/ s k: R9 U 9 O3 k( @1 q$ g4 D* m4 X
unsigned int sdata;//测量到的温度的整数部分/ r$ g9 P4 S% Z$ W- Q! n
//unsigned char xiaoshu1;//小数第一位" p5 I& n1 f0 q" c: d$ k! o1 q
//unsigned char xiaoshu2;//小数第二位' E5 b0 f: K5 c* ~* w
//unsigned char xiaoshu;//两位小数6 e8 u0 J% l! o* F& M7 Q
) o8 w9 ^# r7 u0 O8 X" p
bit fg=1; //温度正负标志
; L, }, o* _- Y2 b: t3 W' _* G; F2 t; r, q( @
//////////*显示延时程序*///////////////# H( C% b- ]" s* T) {$ V! s& p- Y
J) \1 l) `1 p2 a. y$ g/ E
void Delay(unsigned int tc)
) ~3 O2 C, ]& h {while( tc != 0 )
3 I2 R, _7 v) { {unsigned int i;
1 K2 d( e6 ^. e0 D for(i=0; i<80; i++);
, f/ e9 n# f7 T0 y% b$ C, q tc--;}1 m/ k4 `& K/ U( O
}) H2 H: J% J7 w1 ]& @; K* Y- j, H
- I5 f) @$ f5 E- k& i7 Y7 M7 G
////////////延时部分///////////////
9 W2 }- w% x* n3 o' O" Y+ R/ B+ a2 r/ y
void yanshi (unsigned int count)7 y+ j0 D% _. x' V9 b
{
& W9 H" ^& ~7 ?- G0 ~6 q3 d unsigned char i;
3 V3 o& u+ n. A; z: s while(count--)
" N Y. d0 j1 p& `5 B2 { {for(i=0;i<115;i++);}0 @1 l3 [ |( _3 J
}
. r V! m, t8 N. Y; l+ H' E8 M; X0 u- J! r& n0 Q2 e: J! x5 ]
/ Z) v7 `- o T7 a! w# }. T
/////////////发送复位///////////////
2 q1 s& z# l5 [8 V' i$ C, W( x ]7 R/ N* m, s
void fashong (void)) Y1 @. a% L, ?6 V3 Q! s
{. b0 H: t( V5 b- D
unsigned char i;
" \9 F9 b% k& r% C7 \% d5 w TMDAT = 0; for(i=0;i<103;i++);% E9 c$ N7 [/ }6 m' m, d; [5 b2 v
TMDAT = 1; for(i=0;i<4;i++);4 b2 _6 @0 f+ L8 H5 C# w; N
}
: W+ U/ d7 K5 C' C9 {
% _+ Z4 b2 a; D8 d6 q7 S3 A5 M* M, k b6 B) S% _
bit tmrbit (void) //读一位//' G& Z9 Z, t2 Q, }3 J
{
/ ~/ _/ Y% a7 M4 w0 s& K* \ unsigned int i;
& K% a3 r6 G. V1 ^9 P6 |! t5 U bit dat;' J" _( U6 Z7 _) d. {0 y- h
TMDAT = 0;9 r% |7 P! D/ }6 X8 A8 P. H" e# j1 w; h
i++;4 f- t% k4 c1 `0 ?- x1 h
TMDAT = 1;
/ {* A' z6 V5 g0 N! j {9 Q" Q4 X i++; i++; //微量延时 //
, @ R4 k0 i) w# ], a dat = TMDAT;& t/ X; H- @+ V+ j" n$ Z
for(i=0;i<8;i++);3 D0 S% \4 S* T6 A- t( ]' x( X
return (dat);& X$ a) s6 m: R: E+ z+ N: Y
}
" E' {8 }% d" H& W- Q% A4 l. y" }
# q0 ?% }1 x. @* A: j; {4 j; V unsigned char tmrbyte (void) //读一个字节
' v7 {3 Q1 H, G# y3 G {8 @) J! h; q' |$ {
unsigned char i,j,dat;4 s p b5 W3 h, [9 f! J
dat = 0;6 _( k+ k( o: }9 t
for (i=1;i<=8;i++)
- \: [8 _3 O! L* J& n; w { j = tmrbit(); dat = (j << 7) | (dat >> 1); }
! L: ]* s4 n/ U X; R return (dat);: C' u, u# G8 X4 ^8 {4 V
} b! o! I# J9 v( f: N# ?& u& c/ E
& f7 b3 O9 H3 V& X) Y( A8 ] void tmwbyte (unsigned char dat) //写一个字节8 j" ^& {0 }0 E. Z( c, Y0 [
{3 {' G4 |7 |- z9 d" O
unsigned char j,i;
# |8 O) a$ T& q bit testb;+ i5 j9 }' i y2 e: `
for (j=1;j<=8;j++)
; ]3 g* }1 C% s& i9 s( L. U6 h { testb = dat & 0x01;8 R; }3 O& M3 c4 r
dat = dat >> 1;* d. j8 n* \/ `0 K/ h% h
if (testb). S w& b" O! r/ K9 ]8 k
{ TMDAT = 0; //写0
& V3 r9 h1 q0 L5 y3 {# R i++; i++;+ J' [8 C! o; W! o/ s' \0 Z
TMDAT = 1; l5 ]" b3 B+ Y- q6 O
for(i=0;i<8;i++); }
( i4 S6 H* S$ \4 r0 ]- L else
1 l8 b+ a$ Z. F( P5 O { TMDAT = 0; //写0" ]" D$ D" d# S+ w. h
for(i=0;i<8;i++);
& s" Y! K8 ~) Q3 O TMDAT = 1;4 H7 E; x" @) K z8 y9 D+ |
i++; i++;}
, u3 S+ ~5 j% ` }
( l+ a( R- l+ ~, N& t }
0 ~& p4 R; ?. v& y' D* B) i( k) K5 O
. T4 H0 M( `8 C9 N" t& K( e void tmstart (void) //发送ds1820 开始转换8 p6 E3 k( ^% |
{
( V+ O/ k. b) q- w9 W. S fashong(); //复位$ Q& E4 B/ x" c' B
yanshi(1); //延时" C2 Z4 n# C' t! x# ~, l: c
tmwbyte(0xcc); //跳过序列号命令
! x6 }9 E$ q+ ~, s1 Z tmwbyte(0x44); //发转换命令 44H,$ z: \5 D% q3 n# X& R$ f' d9 z; [
}
3 z% h1 a2 ^; O void tmrtemp (void) //读取温度0 O: T E* H* @+ m" o s% X5 y2 H _! p
{- `& | z. Q) ~& z
unsigned char a,b;
0 ] @" S& T4 R- T( [2 z. t7 \ Q fashong (); //复位' g P7 w4 ~# n( D7 M; X, t
yanshi (1); //延时3 ^- ~ r3 g& |: @
tmwbyte (0xcc); //跳过序列号命令. l9 f u$ Q% }% \8 s) ~
tmwbyte (0xbe); //发送读取命令
' D ?7 u1 V e# k! K) G a = tmrbyte (); //读取低位温度
- j" I% s; {0 t7 u& T4 { b = tmrbyte (); //读取高位温度
- Q; f( v9 q1 H+ s8 \7 u if(b>0x7f) //最高位为1 时温度是负7 l- }% D" Q1 F$ q
{a=~a; b=~b+1; //补码转换,取反加一, h9 B9 o" w# E3 V7 _; k" \; F- p
fg=0; //读取温度为负时fg=0
( T7 [8 q: i$ } Y, z" C, u }# y5 s( F b. d8 D; v% _# ^% O. ~
sdata = a/16+b*16; //整数部分1 I, ^1 F# B# y# ^
//xiaoshu1 = (a&0x0f)*10/16; //小数第一位7 S$ f6 I( z1 @1 V$ [
//xiaoshu2 = (a&0x0f)*100/16%10;//小数 N+ W) Z8 H+ D3 G# Z8 l
//xiaoshu=xiaoshu1*10+xiaoshu2; //小数1 X+ C5 u( J0 ?$ Y5 j4 z# ?# ^; a3 l
}( c' x; i. A, ^- L6 i/ P
void DS18B20PRO(void). D& h. v: z0 h. B0 Q8 |% @
{
$ Q) ^+ z! d9 V6 p3 V tmstart();
9 C# s5 ?) [* F1 p //yanshi(5); //如果是不断地读取的话可以不延
" V2 ?0 r6 D, }' ?: P tmrtemp(); //读取温度,执行完毕温度将存于
0 u" p \4 N! V/ h7 I! _& R( V0 ]" V } d/ D& W8 c" O. P& L4 M; [9 B8 a
void Led()# @2 F2 ?; B6 O7 u: G b
{; k+ ^$ d# E# o
if(fg==1) //温度为正时显示的数据
/ W8 G& t2 t. A6 k3 E {
" b8 b. u" @% A1 R# e P2_7=0; y \' w7 R2 E" d& e
P0=seg7code[sdata/10]; //输出十位
, Z( m+ q9 |) v3 n3 V% L) b Delay(8); P2=P2|0xf0;
) ?! S% h, q* [( [; o2 f$ _. u- E" p4 Y2 [9 h
P2_6=0;; x/ H: l/ f% D- R- C" R# S$ U
P0=seg7code[sdata%10]|0x80; //输出个位
! Y) P# K0 f2 A4 O3 e5 T! { Delay(8); P2=P2|0xf0;: @, V$ j4 v; Q" R+ ?3 p* X
% V% |5 N2 y+ k l5 g$ H# F- i
P2_5=0;; b1 ]) k5 C* ?! H' `4 y$ L. Y
P0=seg7code[z%10]|0x80; //输出延时位 ! E V' V- H" C. @
Delay(4); P2=P2|0xf0;
" Z, y! [$ d1 l6 q/ Q. Q. H; W% Z* p" L) K$ b; E( q
if(sdata>30)" N3 f7 O9 T' V$ {7 O4 G6 J
{P1=0xfe;}' {# @8 I( V5 K3 ~- A/ l
if(sdata>32)
) S( w' _! N/ j6 w, y2 x {P1=0xfd;}1 s; Y5 u" A. C7 o0 O/ j; f7 J2 ]
if(sdata>34)) K# ^" k8 P4 C/ Y
{P1=0xfb;}
3 ~0 }, d! p6 R2 q* p/ Z2 V+ J( R$ U1 Z. \( H6 l
}) l0 E3 G9 e/ K& o4 V8 N: l
}0 F: R( G# J4 V4 }" E
8 k2 `& k, v2 ^4 @4 B6 E/ n% F! \7 C void buzidong()
, F0 a5 r m/ P" U% \ {6 ^- S, ~- f' | n9 U
! r' R) I, W# e) Q% H( {, z/ U void DS18B20PRO();, ] E/ V% S2 ?$ j2 }$ d" k' {
void Led();/ c! P; t! q, Q# ^8 n
- H6 g! w k1 ]2 p. h8 L
DS18B20PRO();7 \0 A {: @ ^8 n$ `) z8 l* k
Led();
8 o' C3 u/ |4 z, U$ i$ C" Y if(di==0)- Y% g! J4 o Q( z3 L0 m5 B1 }
{Delay(200) 1=0xfe;}
( o% }' N% `% z* m" {' [ if(zh==0)7 B6 C" a4 m7 R% G2 l
{Delay(200) 1=0xfd;}9 T# b% v) j* l2 U% X3 O
if(ga==0)
5 U: i' y+ a9 V: {& m& n W {Delay(200) 1=0xfb;}9 V0 y9 s0 w* Q7 c7 G5 y
4 j! [+ ]+ F2 R3 U: O }$ H4 e5 T8 w; C1 N0 p
void zidong()
) r1 x7 J8 h( K4 h. J {
* U( m y2 x( M while(z--)
7 [6 p5 D( Y/ _) M- I3 f* _ {& z( |2 ?) z; `. K, j
void DS18B20PRO();: U+ g+ @9 p7 [9 L& x
void Led();
3 h5 |+ j9 `( O4 K
p; e. m. c w# c unsigned char i,k;
2 ]+ a/ ~6 F3 d' r# O //for(y=30;y>0;y--)
/ Q1 y% e7 ?3 ?7 M8 U for(i=12;i>0;i--)* R, n* B( K5 Y ?" d" N
//for(j=80;j>0;j--)
9 R& d; u+ L; B3 J1 \4 D+ U for(k=248;k>0;k--): T1 R: E& d. }: ^2 t1 j
{
8 R% _! u m- a B# L c if(jia==0)
# L; n; l) T4 H7 W {Delay(200);z++;}
5 `) V4 V& p _0 Q if(jian==0): D" E- b- B$ {. t* j
{Delay(200);z--;}
2 K3 z3 `. Q p7 B" w
& B. c, |# h8 R w& x DS18B20PRO();
5 b# ?; n& ^2 w9 m1 T5 r: L Led();$ v% E" q. T* N: N, m; _ s5 `
if(di==0)
* s+ `4 [; `7 L# `$ {' n) ^ {Delay(200);P1=0xfe;}
% H; ^( q0 P; V3 c" o if(zh==0)3 Y, m k1 f2 S1 d; M X* x2 }& M6 L
{Delay(200);P1=0xfd;}2 N& K4 G; f- ?% |5 A9 b0 _* C; W
if(ga==0)
4 u$ p9 y! Q) R& S3 A% a# `: a {Delay(200);P1=0xfb;}
$ _/ s, u/ b1 `7 i0 j' ?# |
; N4 U5 @; g2 G" k5 s9 @# q( m5 n1 T /*
% B4 i# A' E( ~ if((di==0)||(sdata>30))% Q4 l k% K1 M$ @1 t) n* F
{Delay(200);P1=0xfe;}4 P* c% P- W2 g& o2 E
d4 g5 q g' Y4 i9 a, }' a: u
) U) U. Z4 X) \+ _8 d8 d, | n |