维修网

 找回密码
 注册

QQ登录

只需一步,快速开始

微信扫码 , 快速开始

查看: 154|回复: 0

单片机控制温度,继电器输出程序出错高手请进来看一下

[复制链接]

classn_11

发表于 2010-1-22 21:17:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
单片机控制温度,继电器输出程序出错高手请进来看一下
) W* T: ?+ E5 B  t- V+ [" x' \出错位置在 “按键操作子程序”                         gotoxy(1,1); //设置显示位置7 h+ X: k- l/ D& a2 E+ L0 C

9 Y( g- \3 ~) c* q) B1 J# t1 E8 O. r0 D1 }4 d

: ]8 o9 }5 [7 U* X5 b+ w1 N8 c5 x
0 m$ z  {  F. m0 Z8 s  @& a* M#include
0 x0 j% j. A$ R8 a2 t#include ' V2 H0 @6 _0 q
#include / a' e8 {0 s( W
#include
+ U+ D3 W8 H. e% i& g  d* ]        # C9 W+ j! H$ m  X( {
#define uchar unsigned char4 c7 k, m# I' C. D' y" G) o
#define uint unsigned int : D+ ?0 x) H' ?+ N( g8 r# C

7 e* J/ t$ y: O  W  _sfr DQ = 0x80; //DS18B20连接在单片机的P0口
6 c3 g) p; h, ]6 I/ Csbit LIGHT = P2^7; //灯报警标志P2^7口
; C$ d! p& Q: {sbit P3_6=P3^6; //引脚定义,继电器控制端   e- F0 ?0 y/ ^+ h2 p" y

9 `! P& n: Q- muchar PLUS = 0x01;
# p2 I; w. {5 O  d8 h4 v/ fuchar MINUS = 0xFE;3 w+ l: r- n2 i8 T( S  ?
uchar temp1;
( ?5 {9 q0 g, p  b  ~unsigned char xx;
) Z: R; {9 }6 @7 b% T- A2 T bit mode=0,work=0;9 v& F; C2 p1 p! J; u1 V
int ALARM_TH = 0x32; //报警温度上限值,50摄氏度) i3 F$ g8 T: e& T* G. M- C
int ALARM_TL = 0x00; //报警温度下限值,0摄氏度; E. z7 W$ {* m
int temp_minus,temp_plus,temp,xiaoshu,xiaoshu1,xiaoshu2;
) w0 s  N+ U) C3 l1 G8 {6 J. fint temp_value = 0; //DS18B20 读出的温度值" l3 a7 I5 p* f. V6 l; i6 D* N
" W) q9 }, T1 X- o' Y/ V7 g+ A7 _
void Temp_write(uchar wbyte); //写DS18B20 一个字节
, b4 e8 U0 }* R9 o5 Tvoid Temp_bcd(void);
: d1 I, `( R& |1 A: L4 d2 mvoid Temp_convert(void); //温度转换开始命令
) Z* C. K$ e# Y" H+ {  kvoid delay15us(uchar n); //延时15us倍数的程序
& C8 R9 S6 b* d3 `- r3 Mint Temp_read(void); //读DS18B20 一个字节
* Z! ]( \. Y" O" r7 q; i, ?2 g% M* ]void read_temp(void); //读出温度值子程序2 F2 N& e+ M: u7 J
void Temp_reset(void); 7 N2 \+ j3 {9 Z  [
extern int abs(int val); //温度值为零下时取绝对值
8 y5 m( ~4 e) _: H  h- S& gvoid display_temperature(void);
5 u: W6 L1 Y- {; p  O- Fvoid send_temperature(void);
- |/ z+ B- s5 l: ?* G- u2 q* ^void date_time(void);
/ ^( }, Q0 C- ^* H  ~& ?void com_initialize(void);
% \/ ?; H. ?4 q8 c9 Q$ D- R$ R" l% _5 W( E" O, j5 |* Q2 n
void delay1ms(unsigned int x); //函数声明) [7 J" O- P3 i4 K: v4 u. ?2 ]
void set_adj(void); //函数声明1 r; X2 j3 ~5 c
void inc_key(void); //函数声明
8 {- A; I2 \$ r! I  h6 V: o- R' I4 k# `void dec_key(void); //函数声明
9 O* P( [* w, `
0 H& X( _7 i3 V% Q9 p5 i1 r//****************************************************************************4 X( i7 w3 ]2 O" g
void delay1ms(unsigned int x) //delay x*1ms
% z& Z) g0 I7 N, }" S3 ]{
5 n. j$ V0 A/ E. X unsigned char j;. q" N1 f3 V2 }, i
while((x--)!=0)
, d" P& k% M' s, ^, ]* Y- } {for(j=0;j                         gotoxy(1,1); //设置显示位置
5 j$ @5 z3 m# q" Y) o( ] display_LCD_string("Init_T: "); //显示初使温度
+ w! D' t+ i4 t5 ~# Q* Y' o3 R2 l9 C$ ~ display_LCD_number(10);
- B, e# y( s; o& L$ [! ~3 z& ^                         write_LCD_data(223);+ j+ D2 ~! S6 h) F7 V! b
display_LCD_string("C"); # D' `, r$ e* W  \1 @, a
                         break;
, B* N! t, `2 O' }$ a  D2 o }. c/ T) n* _" G$ y6 I0 x
                         default:break;
9 _% X* J" Y. z4 o5 k                         }
2 {( ~  ?- D, B8 a                 }         1 `/ b9 u" B$ {  Z& q( b1 E
}1 F! n' Z5 `8 `% b
}  q% v1 R- e; m8 S* i1 u8 O
//*****************************************************************************void set_adj(void) //模式设置子函数
% ?" R0 q$ D) b" b3 _( P+ k( m{ mode="!mode;
& x* T; x; e  }0 v* @" delay1ms(5000);
. U% V" ^0 t2 D' I: J9 a if(mode==0)
, G9 r$ G% {& g" C {P3_6=0; //启动制冷( T/ r0 H$ F6 z5 w
init_LCD();6 @) J8 Z* n& ?' [
         gotoxy(1,1);
' F% s# R/ Z: T& y4 @) P display_LCD_string("Pre_temp:"); 3 Y" x# h  C1 J' P4 [# j, q- y
         display_LCD_number(temp1);
% }7 ^* q; _2 @& ?6 W write_LCD_data(223);
9 t" T  f8 g( Z' S$ C display_LCD_string("C"); # K1 m% L9 F; J' I
delay1ms(5000); 6 }8 R7 I) S1 T& [8 L7 s
         }# E! \0 L, F3 `" k, t; {* n  W
if(mode==1)7 f6 k* x( k9 V+ ?
         {init_LCD();
" B$ y! y0 _1 F1 ]/ w8 q% ~          gotoxy(1,1);# _& j. n. o" B5 @4 a$ b
display_LCD_string("Please Set:");
) j; H$ ?; j  G; |" E/ } delay1ms(5000);
6 ^# C" Y7 Z& `5 {) O+ I& U         }, n9 ]. r0 d# }7 v
}
7 W' S9 [) R. w+ C- m0 m! v# h//****************************************************************************
- C4 E: D' R- ?" ]7 c8 i! J/ n  [8 jvoid inc_key(void) //按键加法子函数
: m$ T3 |; H' n" c. Y  V{
) n2 C1 I2 }8 d$ R& a if(mode==1)! q# D8 d/ p$ F$ I4 X
{temp1++;
* j2 R4 K9 H! [3 p) r: K init_LCD();
( `& ?& a8 E2 i gotoxy(1,1);: h+ N( L+ X/ C
display_LCD_string("Set_T: "); " b6 a5 U( {3 }  a" _$ l
        display_LCD_number(temp1);- p! Q6 H7 A" e. K; D- [7 |4 j
write_LCD_data(223);: n; a3 @9 t5 n' s' n, X/ ^
display_LCD_string("C");& M% _/ P& {# L( f9 B2 @
        delay1ms(9000);
5 L& h, }% p$ U- O8 _, G
1 T  {. f! T% f& o# p" ?+ ` }
/ [/ i2 F# d. P/ f  X: o' u# J& O}
5 l( h# H( E- X% y# I//****************************************************************************+ C  ?* _& b  R2 J0 A
void dec_key(void) //按键减法子函数
0 L: c4 D' l4 d{ ! F' k6 ]1 w) n: Z' a( L
if(mode==1)" m7 a0 O  p/ l& _' I% m6 o$ l; o
{temp1--;  i+ n8 M9 d/ d# G7 x
         init_LCD();6 B9 o6 l' L. `$ j
         //clear_LCD(); $ L# T9 `/ V& j" P+ |2 g1 S
gotoxy(1,1);" h: L1 w9 g; v
display_LCD_string("Set_T: "); ; n$ P+ f6 \6 p+ p7 A4 }0 n7 K
         display_LCD_number(temp1);
" Q/ a* h, o8 w2 c& Y7 O write_LCD_data(223);
/ H% V% \6 H8 N! K: J display_LCD_string("C");
( _$ Q+ U) w5 R7 U4 S7 i- y% H; @6 \3 y         delay1ms(9000);4 s4 c' Z# a1 r) v) [; i- B
}" N: q3 p" @$ ~" z" M
         * _& l$ @% S8 L+ J1 [: G, _/ W
}) g% n1 b. W7 [; T+ i4 Y
//****************************************************************************$ B' t) r6 q7 {' j2 r
void delay15us(uchar n)   `  S4 [: n+ D+ \' D
{
6 n& ]" a2 U5 |& A7 \. k/ g do
- ^. E% U7 U! A. l9 q { _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
( W# w/ O+ Y& Y$ V0 \& ~ _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
. }2 T* j4 h8 b0 F, x3 h' J --n;
# U1 ^. I3 r1 V! H) G  e# Z }while(n);
5 k" u, D6 O: X8 F$ y6 h return;
0 w* h8 k$ R, Q3 S* o' ?}) ?9 n- Z2 {* l/ N1 G
//****************************************************************************0 C& P( [' |- L$ e4 m+ ]" Q
*温度检测子程序
7 l* b* f; O4 O//****************************************************************************' j4 D6 _. ^' _2 n& o
void Temp_reset(void)& P+ |/ [$ ~0 D( M, [6 R" O
{( w; G& R8 Z. ~7 O$ B" C! n& i7 k
uchar="uchar" i;  w) w$ A3 |2 p( v' P9 ~( Y2 O% H
        bit flag="flag" = 0; //flag为初始化完成(1)标志
  u! }0 X/ n8 T" ]: B3 a while(~flag)+ r) _! p) c' `8 ^. E
{
0 V2 m* \/ ?# f" r DQ="DQ" = MINUS; //主机拉低单线480us
# y, ]" f- `* J& z  G' J: V delay15us(40); //产生复位脉冲- ]% y4 B- d+ G/ R" Y
DQ="DQ" = PLUS; //上拉电阻拉高单线60us
: s- x  k' L8 G0 f- _! Q8 F delay15us(4); //延时60us# }+ @" P% D' X& r8 c
5 }0 |5 k; M6 W; J4 w. z
while(DQ & PLUS) //等待DS18B20应答,拉低总线
, ]& \" U' Q9 t, T7 a; H  Q ;3 V/ g7 h5 t" q+ Y+ _8 m5 x
while(~(DQ | MINUS)) //DQ线被拉低以产生应答信号/ P3 \) R+ x) \7 Z) x/ I6 i
{4 o1 w6 p5 {, S1 f) O8 @6 m
flag="flag" = 1; //初始化完成
( z6 t; w  D1 J- e         for(i = 0; i="i" > 1); //每读一位,即右移一位,将新读的位放入最高位
; O7 A  }' G8 u2 B$ |2 y6 Y }, v4 [  e( z( V
_nop_(); //读时隙间隔至少1us2 ~) V+ g- G" p& ~1 q
return(rbyte);3 x8 b( M2 S  t5 w! V1 }- F. h3 L
}
' p5 M" v4 }+ T* _* B( d//*****************************************************************************
; }' n& U; \  A1 Fvoid read_temp(void)" w+ B, ~- k) ?
{2 A, S9 T' o5 L7 m+ [
uchar temp_lsb,temp_msb;
, x0 _" A0 y; U) ^: J, M3 i0 T Temp_reset(); //复位DS18B206 p) P1 w  Y8 J! U: b: r
Temp_write(0xcc); //跳过读64位ROM序列号命令,用于单线接系统 [Skip ROM] [CCH]
/ Q! ^4 w8 r9 o* C9 u+ _ Temp_write(0xbe); //读暂存器 [Read Scratchpad] [BEH]
. c: N+ z: t* c4 G& z7 e temp_lsb = Temp_read(); //读出低字节! m. m9 H" c6 _0 h0 E1 l5 y
temp_msb = Temp_read(); //读出高字节
$ W  ]- s; @3 m9 z temp_value = (((uint)temp_msb)
( N$ O) S9 [% U3 S8 U#include
+ `+ p7 c8 E, T# r2 W8 u% {char code int2charLCD[]="0123456789";
: Y! ]" u2 n7 [void write_LCD_command(unsigned command) //将命令写入LCM模块
+ n' [) ?9 @8 Y9 ]5 r( Y* p{
& D# R' b3 F, l' A- {; y, L5 orw=WRITE;
& Y5 q3 `$ }( \rs=COMMAND;
) `' E( T* c: c5 yenable=ENABLE;
# ~- \+ r$ J$ g" ?. `% GP1=command;4 }( b5 w( ?: ]/ C0 Q
delay1ms(2);
3 E2 h6 z; c  V2 venable=DISABLE;
: j% ^/ c! T5 _9 {& D8 vrw=1;
4 F- B3 c( ?5 B}
' p5 j+ I' u3 G0 b# `; gvoid write_LCD_data(unsigned LCDdata) //将数据写入LCM模块
% b  i% f# z; j" Z{
9 q4 H3 e& K: e* hrw=WRITE;
0 v3 k% Q1 s9 n5 C/ rrs=DATA;; J  B8 X. M2 _6 v( u+ P4 r8 `
enable=ENABLE;! p: s+ ~+ S. l
P1=LCDdata;
) M2 c% L% |9 Udelay1ms(2);& d* x  t! U9 ~+ `& E# u( I
enable=DISABLE;
( N/ q; h+ e) c* Y6 T2 W+ Xrw=1;
. {) c" N0 v4 `, Z0 I}; s: p& o% v, }9 r% A
void init_LCD(void) //对LCM模块进行初始化! a  e: g! q. L4 S0 w2 r
{  \- `% r( q& r
        write_LCD_command(TwoLine_8bit); // 0x38        
# Y9 {' ]9 H# V5 a2 \/ y* V1 Q( \" A        write_LCD_command(CURSOR_OFF);         // 0x0C0 e9 L3 Y# p6 G% o% b, n& `
        write_LCD_command(CURSOR_RIGHT); // 0x06
$ F7 l# q% j, g- o, j4 q( d}, L2 w' T3 n, T* r' R! h
void clear_LCD() //清除LCM的显示屏
; c. D! R% e! R' z/ P{
6 [, e. p) E0 @& |1 Z2 J        write_LCD_command(CLEAR);         // Ox01,清屏+ h5 e! d" \( c7 O
        write_LCD_command(CURSOR_HOME);         // ox02,光标返回原点
" Q$ W9 m* r2 h# d}
5 T$ l" E0 N& u3 {! }  Svoid display_LCD_string(char *p) //对LCM模块显示字符串5 K& T1 [1 [7 ^5 `8 n+ _/ v
{
  i5 ?- q- C  G2 L" D        while(*p)
" N' p) t) r  Z0 s9 u4 l) s0 r        {- t+ u% w0 c0 P1 v1 i; y+ {, |
                write_LCD_data(*p);! O, a+ a# t( s1 c; g4 R4 I; G0 L$ N
                p++;
" u2 {! ]" W9 u! ~7 \8 M- i# |        }& P6 Q4 M. K$ E4 s; `
}, Y5 S) A. S( a/ A, d
void display_LCD_number(char number) //对LCM模块显示数字6 N/ i! M4 Q1 l. T
{8 B1 f; c, x* }* Y
        unsigned char x,y;
- `6 o3 n  a3 |! s& {7 `        x=number/10;
) t) z% m. @/ b( F( g        y=number%10;
% a% I( ^, L4 g9 a3 o3 m1 t$ z3 d        write_LCD_data(int2charLCD[x]);0 _$ {! y$ I. q% v+ w" h
        write_LCD_data(int2charLCD[y]);1 X1 C$ L9 I6 ^
}
' U  Y" x" d  ^$ j. m( \void gotoxy(unsigned x,unsigned y) //设置光标位置
( y: A4 T% F, N1 A  z{
+ c: f0 h% ?8 x        if(x==1) ' I" j* s6 j8 ^. X; P8 P
                write_LCD_command(GOTO_LINE_1+y);, Q- _+ T& J7 X& y. M
        else 9 f$ f% d" y) [8 u5 Z1 x* Q
        write_LCD_command(GOTO_LINE_2+y);3 ~( K( Z9 [$ a  X
}

手机扫码浏览
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|申请友链|手机版|小黑屋|最新贴|维修网 ( 粤ICP备09047344号

GMT+8, 2024-5-13 10:53 , Processed in 0.253598 second(s), 30 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表