维修网

 找回密码
 注册

QQ登录

只需一步,快速开始

微信扫码 , 快速开始

查看: 155|回复: 0

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

[复制链接]

classn_11

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

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

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

x
单片机控制温度,继电器输出程序出错高手请进来看一下) p( v; k; y$ O" Y: N8 Z7 m! I
出错位置在 “按键操作子程序”                         gotoxy(1,1); //设置显示位置  h  [1 j" G5 ^) S
6 Z* P  B7 Y  ]1 a' q7 W5 f) O
$ d4 E5 s7 ^# N9 `: C1 n& L
% j4 H. |7 H! x- t8 r7 h; A

4 O) |( I9 g9 ^# K3 J6 }#include . d- ?/ v( F3 n% j
#include # c5 ]8 Z" {# [, S& `2 m- r
#include
; a4 v* G# p. G) K+ a: M# T) v, L#include
7 n, P$ O' u1 h8 j        ( r/ \- P/ D, p3 `! R* U* q9 U
#define uchar unsigned char
" E* H6 k1 s& s" S2 r( l' m- l#define uint unsigned int 6 e# B4 C' k+ D+ {( X4 Y
$ z* [* W4 k5 N: ?, y3 m0 y
sfr DQ = 0x80; //DS18B20连接在单片机的P0口+ H3 x' h8 c6 t  Z
sbit LIGHT = P2^7; //灯报警标志P2^7口! |- [6 d7 p) l+ G. j  C5 p
sbit P3_6=P3^6; //引脚定义,继电器控制端
5 r/ f3 E5 S4 ?  L( P: |+ e0 x
' i$ B9 m0 Q/ T: n+ Quchar PLUS = 0x01;
' J3 r% [. V" _9 x1 |* Z5 wuchar MINUS = 0xFE;
! \( z9 J2 p' ^' w: euchar temp1;0 ~9 ~$ j6 d" K/ e3 M; B' }
unsigned char xx;
% p5 j( F: q, b6 U/ q bit mode=0,work=0;
0 D# s8 N5 c& Qint ALARM_TH = 0x32; //报警温度上限值,50摄氏度0 M( \$ h7 s% X& O2 K5 K" r; {
int ALARM_TL = 0x00; //报警温度下限值,0摄氏度
8 c9 n  y) a' Q5 gint temp_minus,temp_plus,temp,xiaoshu,xiaoshu1,xiaoshu2;
" x& H4 U" K* @* p$ v8 |8 ^3 U5 tint temp_value = 0; //DS18B20 读出的温度值
( \# p0 X0 a; b$ n# t$ a
1 J: V5 s! R& ]3 Rvoid Temp_write(uchar wbyte); //写DS18B20 一个字节! P1 Y3 r" J# |$ b# `
void Temp_bcd(void); ! V: M' x1 \) ~' B
void Temp_convert(void); //温度转换开始命令! Y- t2 Q" ^4 m) r
void delay15us(uchar n); //延时15us倍数的程序
$ `7 p/ c, c$ n; t( T% pint Temp_read(void); //读DS18B20 一个字节
# @5 i) _: \3 F* U  Evoid read_temp(void); //读出温度值子程序! U5 x+ F# X' g$ v  J, u: ~/ v' g) L
void Temp_reset(void);
$ H- z5 `' T5 D3 z7 [# M- {. Jextern int abs(int val); //温度值为零下时取绝对值6 Z5 T+ J6 h  }+ U9 y/ x/ V, g; R
void display_temperature(void);3 {) E4 T$ y' Z3 Y0 }. b9 h
void send_temperature(void);
) H  B6 V! L) Z; s& F3 Qvoid date_time(void);! K, h' Z" Q+ U
void com_initialize(void);
( H! M7 i! \! p! i) z' |: h+ b# C  Y; E  i# X  ^
void delay1ms(unsigned int x); //函数声明8 J) M6 O. a4 x' a- y6 R4 A
void set_adj(void); //函数声明
! T4 w% i' v9 Z3 d( g/ pvoid inc_key(void); //函数声明- t" \1 p4 s9 _
void dec_key(void); //函数声明 ! Z- m+ Z2 C1 |& s1 t/ Q+ o

1 n  Y& N  Y0 W  O//****************************************************************************
  _& Q9 d* K7 X2 H' fvoid delay1ms(unsigned int x) //delay x*1ms + T' k- s# B! u  C2 }) ?9 U
{
# d1 ]- z9 _9 \9 c unsigned char j;/ R: ]/ \. n& W7 n/ F* f- R
while((x--)!=0)
8 p' G0 [4 r- E; J5 m {for(j=0;j                         gotoxy(1,1); //设置显示位置0 x: L4 f% \4 A4 N# }! l
display_LCD_string("Init_T: "); //显示初使温度
) b/ X: N/ f6 E. O  D display_LCD_number(10); 9 r- H" ]6 |4 y
                         write_LCD_data(223);
' e& |: A: E3 E) W- e& C7 o display_LCD_string("C"); & F; ?9 l1 Z5 U1 G7 W7 M
                         break;5 D9 K) f) E/ R' c( L5 v
}4 o4 G' F& e+ y* V4 j4 n4 P; g+ L
                         default:break;' h$ K( l" \' j% e$ d* t7 T
                         }8 P+ A& \! Z! S% W8 ?/ F
                 }         % c+ \. L+ }# ^2 @* a! J1 l& R# W
}7 m) H& X) ^, X: a3 i8 J
}, d2 m9 D. ^4 D, p$ C. S* I" B- r
//*****************************************************************************void set_adj(void) //模式设置子函数5 A" v( R& g9 V
{ mode="!mode;
3 j$ n  z2 }9 r+ m1 S, \" delay1ms(5000);! \  n/ d2 M$ t! P# a* x4 C
if(mode==0)
- ]& |5 c) H: v8 q  g% U. n {P3_6=0; //启动制冷2 I& }& a* w0 t1 _& {. R: Y
init_LCD();9 ?7 O& g# q! `; B7 {( G3 b1 k  |- @
         gotoxy(1,1);
+ ]6 U% f0 E+ y. u display_LCD_string("Pre_temp:");
4 L. N6 ^; t' o/ u5 s4 w; e7 Q# I         display_LCD_number(temp1);. m/ T( I- |  ~9 k2 Q+ R, O3 p2 u
write_LCD_data(223);
  ?  X1 E) B/ A8 I- I display_LCD_string("C"); % ^- s- H+ f% E3 l
delay1ms(5000); 8 G: b& @9 _* a; C
         }- H" z! ]$ Q: b! r
if(mode==1)
) B' |; [# ?) ]         {init_LCD();
& z/ }* [' X2 l8 @1 |2 s          gotoxy(1,1);
' K2 O5 h1 ~1 A: i5 ]0 i9 G display_LCD_string("Please Set:");
) |/ G( z6 [& m! | delay1ms(5000); ' T& h( f9 a' g0 R- r
         }
: Q  m8 c& d9 T" @2 C}
8 s4 \, Q+ U( t, A//****************************************************************************" J8 ]( p/ F# m
void inc_key(void) //按键加法子函数
0 R. b. A! l9 k$ I) S. y{ ! O* P% |* U0 J3 g8 W3 i
if(mode==1)
( ~6 T! u$ B$ l4 L: s% V {temp1++;% A/ T+ O, e. V$ I5 v
init_LCD();: m0 B( A7 I0 a' e' }
gotoxy(1,1);2 q$ d" n9 G: W9 ?
display_LCD_string("Set_T: "); ; Y* M1 b! {$ e+ ]/ Y
        display_LCD_number(temp1);
) q3 B1 i$ ~6 U" U' D9 P/ t write_LCD_data(223);6 V- y6 S9 {1 l0 _
display_LCD_string("C");
6 w* ?* l7 r1 D         delay1ms(9000);! Z5 ^5 o4 {1 E2 {, ~2 y% Y

& Z9 B! |8 |5 T8 r }
: ]) B8 h' p3 f/ @* U}- p* Z, f4 }6 q2 O" k
//****************************************************************************1 x! V( D- M1 |; l" V  Z
void dec_key(void) //按键减法子函数( b: f9 g/ Y* `. \+ K! h9 i3 {+ ^
{
  Z- I7 k% q  e# ~ if(mode==1)
- t' C1 L* q. K0 s2 B& } {temp1--;3 K2 R* f* b- l7 T' R% w$ q
         init_LCD();& j, f& q) c- O2 ]" I* f' B
         //clear_LCD(); 5 z% I' ]% T* x  k$ `/ r) ~
gotoxy(1,1);
2 {" q& ]( h6 E4 C, s7 \ display_LCD_string("Set_T: ");
* ^1 G' f0 k2 K         display_LCD_number(temp1);( |7 }; M  |( {# o2 Z/ K
write_LCD_data(223);+ i* D7 n* A  x
display_LCD_string("C");
7 D2 g% i- ]. B- A  d! ]) K% ^& T         delay1ms(9000);" y1 Y/ W% E( n7 v& f/ ^9 \8 A
}+ D% B) K. |. B" k2 i
         
$ ^6 l" g6 a  ~  M; E7 y}+ a  z5 R% F( X0 w& v" W
//****************************************************************************$ }( I1 m( P# P! o3 }
void delay15us(uchar n) 5 x9 Y/ o  c; \  H. a8 L- z
{
3 E% z5 v0 q! ]/ Q; p. R do2 J: X( c9 {; A' l$ j# i; P
{ _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();  U8 K5 e, V  d. d5 i+ }% P
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();+ p7 {" D- x* T! Z% U- r  [
--n;
% p4 [2 J  j3 c }while(n);! w3 c6 p% m& y1 l& |
return;
+ @: O+ w8 }  f" h6 J" u}+ \5 U! @9 ^; b
//****************************************************************************
$ T+ S+ G4 s+ s; n& q*温度检测子程序
2 |! Y5 S" Z' S//****************************************************************************' o9 u2 O. u2 M
void Temp_reset(void)
4 B0 i: E4 t+ A7 S) U- z% P. b{
* \% E& _  x2 u' G6 r uchar="uchar" i;
5 `8 Y2 s$ W8 H, S' a4 h6 n        bit flag="flag" = 0; //flag为初始化完成(1)标志- E3 b/ l# l5 W; U) O- A. S
while(~flag)
) Y9 t( d+ \8 m4 t' M {
6 z& ^+ w* W9 N+ B: Y DQ="DQ" = MINUS; //主机拉低单线480us
3 s- s8 S( z8 W' L0 w: [, L) j& U% s delay15us(40); //产生复位脉冲
8 }8 n8 y' e* _ DQ="DQ" = PLUS; //上拉电阻拉高单线60us
& a0 q- T9 F8 P) L" P! ~ delay15us(4); //延时60us" b% Z' H8 E1 ^4 ?) `9 O: c0 @
! `9 G$ `# \* v9 Q3 x- ^4 H" J
while(DQ & PLUS) //等待DS18B20应答,拉低总线1 z* H6 p0 W3 l1 Y4 Q; M- l; \4 w
;+ d1 |) a( ^) z9 h! E$ j
while(~(DQ | MINUS)) //DQ线被拉低以产生应答信号
; G# K  f$ N  @% D2 I- d5 B {8 j0 S6 R3 i/ C0 Z. `) L- A
flag="flag" = 1; //初始化完成% {' K' u! i3 K
         for(i = 0; i="i" > 1); //每读一位,即右移一位,将新读的位放入最高位6 D5 s8 F2 d0 `8 o4 V
}/ x5 O! g! q+ e- s9 G
_nop_(); //读时隙间隔至少1us7 Q+ M) ~2 |2 z1 p+ n
return(rbyte);
6 d- Q+ O; V! O5 V& R, R# [1 G; U0 L}7 j3 @; y  f3 z  c, @" B: \
//*****************************************************************************9 a$ Q, D$ J# \1 L( ~
void read_temp(void)+ B9 p, t1 b3 u# d8 G
{
" e- z2 \' r+ q& c  U uchar temp_lsb,temp_msb;7 C+ ~. ], @0 Z3 E
Temp_reset(); //复位DS18B20
3 p! o6 }7 c# ~ Temp_write(0xcc); //跳过读64位ROM序列号命令,用于单线接系统 [Skip ROM] [CCH]: q9 a& S; }. v# ]! Q
Temp_write(0xbe); //读暂存器 [Read Scratchpad] [BEH]  K( }+ {( B0 L
temp_lsb = Temp_read(); //读出低字节7 H6 L5 X0 u: P6 t2 |" P. {. V+ U
temp_msb = Temp_read(); //读出高字节
# n  x& i+ P( c0 P( D* b# \ temp_value = (((uint)temp_msb)
/ b9 u$ \9 Q- y: N/ U0 _; N#include * D# w  p" u7 @5 D: f
char code int2charLCD[]="0123456789";
4 S" W6 u8 k( `$ p9 dvoid write_LCD_command(unsigned command) //将命令写入LCM模块
. p& ?/ Q( @1 I& h8 w4 z) h{
( f$ Q$ g) [1 U: S2 V' Lrw=WRITE;
" M* I  ~* K* `6 N6 drs=COMMAND;8 H3 z. \* }3 u% V+ @5 r/ H
enable=ENABLE;* U0 K+ f: {( D$ t
P1=command;
* q6 I% z9 ^0 s  ?% Rdelay1ms(2);, o2 j1 b& i7 t, j# p
enable=DISABLE;! c4 |4 E1 y& U4 S
rw=1;
) ~+ `2 j4 R, M* J}
1 M! K7 T; \; N  e" }  l0 evoid write_LCD_data(unsigned LCDdata) //将数据写入LCM模块
+ O3 X/ `, W; V$ K% f4 f{. ^# v& \* e: w" ^6 v- ]
rw=WRITE;
% B; }% e6 ~, ^' X* Drs=DATA;
) N% F# a1 b2 |6 C9 _enable=ENABLE;3 Y1 @0 r% U% s0 M" L
P1=LCDdata;
+ U) D. t+ t8 s5 I  qdelay1ms(2);2 B; A. o+ ?. c" |* G/ }
enable=DISABLE;: H) u! x3 t$ B' k* U
rw=1;
; q5 c5 J. x" _1 A- J# \5 _}
: V: b! Z/ u0 i: M9 }3 svoid init_LCD(void) //对LCM模块进行初始化8 c8 J8 B2 I& J/ }* Z2 o
{6 b' s! K$ [" u- r
        write_LCD_command(TwoLine_8bit); // 0x38        
7 J" k3 h- p, B$ O7 F+ ~$ w        write_LCD_command(CURSOR_OFF);         // 0x0C2 b3 s* d* [, S
        write_LCD_command(CURSOR_RIGHT); // 0x06
5 d( S5 u5 v& c0 l2 s& _}
5 Z1 R! ^8 k9 R. d+ p9 Yvoid clear_LCD() //清除LCM的显示屏
8 q& K( s. ?) ?8 x8 y/ G{* L4 \6 ]$ D) F8 |; g5 w
        write_LCD_command(CLEAR);         // Ox01,清屏
5 V( `6 g! G, p+ x. A1 Z3 s        write_LCD_command(CURSOR_HOME);         // ox02,光标返回原点/ o3 o; L5 ]9 c& ^3 g1 u' Z' R) a
}
6 {* m5 R  R- ^( \8 ^0 i: X+ E2 W) bvoid display_LCD_string(char *p) //对LCM模块显示字符串4 c) W- h" g9 Y# S) ^( Q3 k2 A
{
% i6 \1 U9 o- g  i$ C        while(*p)% o/ k% g/ E4 ^& z. T. o- d
        {. B! o$ {# F7 O2 w+ t5 t
                write_LCD_data(*p);4 F9 S1 y/ F9 G6 Y
                p++;; P3 }5 ]$ ~2 C) c1 i- c
        }4 o5 e( S" ~) c8 R3 f& f
}8 e* ^! [. ^$ v- M
void display_LCD_number(char number) //对LCM模块显示数字
" v; \$ f+ O8 ^8 }1 ]: P{
; q/ {8 Q3 C% x# e2 j+ n& w        unsigned char x,y;
0 J* j: b1 n+ k/ A) t; H) E        x=number/10;1 L( L/ e! Z7 S# K" p1 p
        y=number%10;0 k/ [: V/ S9 z) s$ e1 s( ^
        write_LCD_data(int2charLCD[x]);
7 F& q& Z( E* Z, O$ ?) n+ _: F        write_LCD_data(int2charLCD[y]);/ X$ n: |; |& C' l% Q
}
& o% p: u; H7 s; S# Wvoid gotoxy(unsigned x,unsigned y) //设置光标位置8 e# K! f) e, u+ ]
{  }  j" T' \/ b3 U3 D
        if(x==1)
' L/ Q- c' @) p% j                write_LCD_command(GOTO_LINE_1+y);! F  u7 L& S4 T# R. X) z
        else
9 D' F! L8 r6 s         write_LCD_command(GOTO_LINE_2+y);
, M4 c2 T3 x, M. O; c; l}

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

本版积分规则

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

GMT+8, 2024-5-17 06:23 , Processed in 0.257611 second(s), 30 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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