维修网

 找回密码
 注册

QQ登录

只需一步,快速开始

微信扫码 , 快速开始

查看: 156|回复: 0

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

[复制链接]

classn_11

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

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

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

x
单片机控制温度,继电器输出程序出错高手请进来看一下
, o0 _$ n' g5 w$ U5 A, m: b6 G出错位置在 “按键操作子程序”                         gotoxy(1,1); //设置显示位置4 G3 E' \" `. M: W% `
" U  ?7 l6 C( m) ^/ e1 E6 A1 ~
  `+ t9 b% k9 @3 I( C

( }. O& f2 J! d0 R9 D! K0 n& ?$ i, h: L/ _- @. F) a' J& B
#include
3 m- z; e  }! I" k1 s#include
8 T6 K+ ]" F4 F5 _4 x. e9 q#include
% l5 I0 |; a, ?; u. Y#include 4 Y4 h6 S: l; m9 j4 {7 o
        ' J' G, M8 K, k' x/ ?0 a% S
#define uchar unsigned char0 m8 a6 Y: r- p& s6 a( @6 q$ a. H
#define uint unsigned int 9 T& _/ y6 K- f& d- A0 q1 i

2 R! ^$ r; n& U3 \# Gsfr DQ = 0x80; //DS18B20连接在单片机的P0口. G. @! L0 C& d" d# }
sbit LIGHT = P2^7; //灯报警标志P2^7口
. E% N! Q9 `7 [; S8 X) h& esbit P3_6=P3^6; //引脚定义,继电器控制端
+ k; P  X5 p, X! j! ~" ?; `) J
( j+ {# M5 j  l4 Cuchar PLUS = 0x01;
) \! `( f$ h" \, cuchar MINUS = 0xFE;
7 Z9 `6 Q# q& F! ^6 o& V/ \0 Iuchar temp1;$ X( C9 ^5 ~8 N: R& X' Y
unsigned char xx;
5 G# u7 h& ~; r4 j$ i1 `1 w bit mode=0,work=0;5 d* P" \& H; h
int ALARM_TH = 0x32; //报警温度上限值,50摄氏度
0 R" a1 m- h; [+ G( S- }* X: Iint ALARM_TL = 0x00; //报警温度下限值,0摄氏度
8 d8 ]$ y' Z3 ]' Iint temp_minus,temp_plus,temp,xiaoshu,xiaoshu1,xiaoshu2;! a- v7 o6 o# H, v* t2 A
int temp_value = 0; //DS18B20 读出的温度值
( s/ K. U! E5 W% @. O' g( j8 K) [' B0 r! e! x# K
void Temp_write(uchar wbyte); //写DS18B20 一个字节
) }. Z1 P; e- _" _/ X: a, n9 |! Lvoid Temp_bcd(void);
5 E  }% H2 |$ h4 H1 q  {& {$ `void Temp_convert(void); //温度转换开始命令- N0 w: L6 y; j$ b: n) U: b
void delay15us(uchar n); //延时15us倍数的程序
# K9 X2 H  D1 c9 H2 Pint Temp_read(void); //读DS18B20 一个字节/ y0 s. F1 @/ F- n# {8 k
void read_temp(void); //读出温度值子程序
6 n9 m+ S/ _' J2 [& g2 j1 z, Avoid Temp_reset(void); * C3 h: {2 L5 W. z
extern int abs(int val); //温度值为零下时取绝对值
2 c9 R! H3 |4 e# C& lvoid display_temperature(void);
: S) K/ `% T# k; {. f7 Svoid send_temperature(void);3 u* Q" v! n9 C2 @
void date_time(void);  w4 K  D% d: R/ z' p
void com_initialize(void);3 m& E! z+ Q# z
# {  K$ q4 f- n: F9 s; u
void delay1ms(unsigned int x); //函数声明
; [; E/ d8 Z2 M8 K7 Bvoid set_adj(void); //函数声明2 F# N8 N8 |5 Z: F/ @1 t
void inc_key(void); //函数声明9 w; Q% P) P5 N. C2 C/ U
void dec_key(void); //函数声明 2 G. n' I6 X" }0 i- S. B
( l5 ]# X  M: o( C
//****************************************************************************
: A2 Z" \( f6 E  tvoid delay1ms(unsigned int x) //delay x*1ms
' }: h4 V! p4 ^$ n/ Q{
8 o* R/ q4 i( D( K6 |% x# m, ^ unsigned char j;
- ~0 P+ V# X. f  _: A- P while((x--)!=0)
, x8 G/ }" o4 d; D! m; u {for(j=0;j                         gotoxy(1,1); //设置显示位置% Q  z) j/ S; o3 a; k8 }; B
display_LCD_string("Init_T: "); //显示初使温度
9 Y3 k' V7 |0 ~9 `; V display_LCD_number(10); 9 E8 K7 @* S3 p! x) B& t7 M1 Q6 N  @  P; h* t
                         write_LCD_data(223);# I5 `' w& y! q
display_LCD_string("C");
: c' ?  ~1 I- w' H) c* D                         break;
4 o1 `3 [  w$ o- U7 e' V0 B/ m- y/ c }* S* X3 l  O0 W4 q
                         default:break;
8 g: M( N) u* v7 [                         }
! G5 f+ ?- r. a: _7 x+ Q% U) C                 }         4 [0 l2 B" F6 r
}
% c$ ^' Z! y+ b9 _  U/ h}% N! [) D0 J9 N# n# v' o& b
//*****************************************************************************void set_adj(void) //模式设置子函数" r& E' ~3 |8 @3 a  A. I) G
{ mode="!mode;" T1 k8 S4 D8 q/ w
" delay1ms(5000);& O! _; K6 @5 ?4 Y0 [+ x+ K. o
if(mode==0)
: w( s3 |8 [* N& }2 V {P3_6=0; //启动制冷
5 }/ `. ?8 B* N0 ~ init_LCD();
7 z( S, J' k, V7 ?* M         gotoxy(1,1);
& T' @+ a& y' C- y display_LCD_string("Pre_temp:"); , |; r& `! T+ H9 `" Q( a, o
         display_LCD_number(temp1);
  J8 Q$ s( u, `6 R$ J8 ^ write_LCD_data(223);
' c6 s* g- m) J. g9 ? display_LCD_string("C"); 5 r- k6 m. [6 N: W' k5 i1 i: C
delay1ms(5000);
" N* e" Q2 x1 `+ h4 i5 ?) C; n$ i         }7 B- T. R* G0 P! t  ~1 A
if(mode==1)2 ]3 x- P$ g7 N4 C* `2 U
         {init_LCD();
, T$ v' d/ M/ R7 @* w! Y          gotoxy(1,1);' q/ A9 z  t: P9 w
display_LCD_string("Please Set:");
& y  ]5 }! g/ Y; h$ d/ L. ?9 P delay1ms(5000); 1 Q9 D# i+ i0 v. s0 M
         }
0 h+ p) h- @1 V}
" w1 B6 F! G) h  F//****************************************************************************
8 y: X; E" M* r6 I* Mvoid inc_key(void) //按键加法子函数
3 z* {3 o( `! ~+ t9 b7 F$ w{ 6 Q! G5 L/ g& C4 s, c3 A- X+ D$ C4 o
if(mode==1)
" v+ L& R0 d# b6 q! b5 V( ] {temp1++;
% H4 t% `% c8 y& i2 I8 x5 u& T init_LCD();( v7 ^" {" F. o9 A- P6 z
gotoxy(1,1);. u5 T9 W. p( c9 B3 n
display_LCD_string("Set_T: ");
3 G7 o2 r* I9 l4 R& N4 [5 F( k4 ~        display_LCD_number(temp1);7 ]. r6 C' s- L
write_LCD_data(223);
# ^8 |# v- y" J( a7 d" c6 p; [8 t1 T display_LCD_string("C");
7 h. s2 @. I) [$ y' T* H         delay1ms(9000);& b/ V6 V7 w( x8 @7 D! L

" @' Q7 `/ D1 f/ I- M }
. N" U, s- \# x: Z, e7 V9 {}
9 O) Z1 _4 _- c6 w/ ^- k, N//****************************************************************************
( K# ~. z! Q5 y+ Z6 M5 rvoid dec_key(void) //按键减法子函数. d# A" @" [; f7 u
{
$ Q. o. d% U- i3 g2 I if(mode==1)
# a- D, R- {/ h6 C {temp1--;7 h. V# Y2 \( X
         init_LCD();' I' S; N/ M2 O* C
         //clear_LCD(); # `/ G" N* x" ~
gotoxy(1,1);
$ r5 o" j1 ^  K; | display_LCD_string("Set_T: "); $ C5 T" x* F2 m1 G
         display_LCD_number(temp1);
: o3 G3 n$ o' w3 o- w" \' X write_LCD_data(223);
5 Z" \1 \- C! H8 u9 U2 B) q display_LCD_string("C");
) T7 H0 F( K! O" ]         delay1ms(9000);
3 R( y) f  j$ J9 {& r }$ ~/ Q" i% z- J1 b, q1 a
         + D. E1 J- Q" `
}
5 \# ]# f$ c0 I4 c1 @6 h3 K; o$ x//****************************************************************************
( J2 _% t, Z: X4 O) T' R* q! bvoid delay15us(uchar n) 7 i" g, d! C$ M8 m) H+ L
{. H/ _, W" x% U6 q: W! T5 ~8 w
do( ?$ Q6 Q) l5 y7 ]
{ _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();8 m' L+ H- C4 M$ d4 ^
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
$ j' v" {8 ~: O$ x3 h --n;, Y3 F: R: s: j2 Q  E8 u
}while(n);! Y" C2 b+ D8 l3 P: v( U4 f' ~
return;* t, f3 }( g9 K4 K' i( J
}
4 _5 U" X6 P8 ]* [//****************************************************************************
" M& \2 z. \, D; x*温度检测子程序
+ S. U' P/ I+ n' z! n. G6 a' L//****************************************************************************7 _0 T5 [* l! F0 u9 S3 I! l8 p
void Temp_reset(void)# S- W9 h3 y/ U- A0 ^0 |
{
* S- }6 p: r* O% P uchar="uchar" i;& n4 e+ a+ [, O9 R% ?6 A" o
        bit flag="flag" = 0; //flag为初始化完成(1)标志
/ b6 I4 z$ ?. J8 W/ R. x' i; A while(~flag)' y( w  ^/ c1 v/ D0 P
{
2 [: B' G( m/ K7 @: ]1 j DQ="DQ" = MINUS; //主机拉低单线480us
, A6 {8 J+ K! V* }1 @ delay15us(40); //产生复位脉冲
" H- S/ R& s9 |. X DQ="DQ" = PLUS; //上拉电阻拉高单线60us" l+ v% T- u, W8 }' U7 C  \
delay15us(4); //延时60us, M8 U9 X% {5 [% B2 o* D" Q, }  U

' z' Z/ j7 x" m/ y% s while(DQ & PLUS) //等待DS18B20应答,拉低总线
7 @- y8 ^9 K: @- O& ] ;0 _. h5 f- n- z( x$ [+ y7 o/ L
while(~(DQ | MINUS)) //DQ线被拉低以产生应答信号7 `# W. ^# A1 L& a
{0 m1 j5 [; A. L( `+ E4 x0 Z
flag="flag" = 1; //初始化完成
8 a, I' L8 E. p; G# M# v! m         for(i = 0; i="i" > 1); //每读一位,即右移一位,将新读的位放入最高位9 A$ }  ?% X$ a2 i* b
}
8 R5 F& z. ~" q* w) c# m6 a, J _nop_(); //读时隙间隔至少1us
: F8 ^; s* |3 t; N0 }9 w return(rbyte);: k6 |4 e5 A( F+ k6 }
}2 c1 E' v5 [; ~2 }- v
//*****************************************************************************
3 D% q+ E( L  ?. tvoid read_temp(void)
# n& F: c5 v- y6 |* f7 a" w{
5 a9 |! R( k& L! h' { uchar temp_lsb,temp_msb;) X# Q6 P5 s1 W( \. F# ~
Temp_reset(); //复位DS18B20
$ j# X. t5 Z9 \/ X; m4 M Temp_write(0xcc); //跳过读64位ROM序列号命令,用于单线接系统 [Skip ROM] [CCH]
0 X3 N. S& W7 f; k4 b, v Temp_write(0xbe); //读暂存器 [Read Scratchpad] [BEH]
, D8 L; y2 F: C$ _7 I0 F temp_lsb = Temp_read(); //读出低字节
0 y  @) R( b3 D$ }$ A8 `# T temp_msb = Temp_read(); //读出高字节
6 j5 c# @8 _9 a6 A* T4 _7 Y( c1 b0 n4 @ temp_value = (((uint)temp_msb) ! q6 h, F. d/ b7 d
#include
5 _. W" G3 S% O! @9 {0 y# C/ wchar code int2charLCD[]="0123456789";
7 g9 f7 A! [) I# N# C, Vvoid write_LCD_command(unsigned command) //将命令写入LCM模块' P- o& z. q; d/ K" M
{
$ S0 `" A( E8 \rw=WRITE;$ T$ t, O7 q) L7 ^; ~  b; H  ^8 P* Z
rs=COMMAND;
4 n2 M. ~; S/ H; |enable=ENABLE;7 t' B8 H5 v$ X- S
P1=command;; D2 N8 W, u9 H6 x4 X
delay1ms(2);
- q- @4 F% i/ a2 m; nenable=DISABLE;
. b: @0 ^. i: ^+ C7 ?4 Vrw=1;
% w3 X7 M: u1 V! f% G  i* \}
7 K" A* e" f, S8 M6 ]) mvoid write_LCD_data(unsigned LCDdata) //将数据写入LCM模块
3 [# V1 i* O; o! I9 q{) D! L& k1 \. u% q% x
rw=WRITE;
0 ^3 v/ A# n, x. ?& ors=DATA;
; l; |  B1 Z- `4 ^2 a& ~enable=ENABLE;
" B6 A) M/ k4 b+ d: `6 m6 y: mP1=LCDdata;1 h1 d& v) y' c
delay1ms(2);
: _' Y# v7 s& U' I- ]enable=DISABLE;% Y* @  M7 t5 O+ f" G; V5 k4 D
rw=1;! `2 v: f5 U$ T* R9 H' U
}- K! Z0 _- j8 m  d$ p! p- [
void init_LCD(void) //对LCM模块进行初始化
- u9 k- F1 d# x1 E7 a9 ~{
2 E. ?* l. _7 V+ ^- d7 C. ?        write_LCD_command(TwoLine_8bit); // 0x38         ( N$ u8 z' H# N5 d" k
        write_LCD_command(CURSOR_OFF);         // 0x0C
! y' B% V; r- ^# a4 |: s! |+ V        write_LCD_command(CURSOR_RIGHT); // 0x061 I/ R1 N3 C. v" r1 V1 d% J) U
}+ r: Q  Y$ l8 G# b
void clear_LCD() //清除LCM的显示屏& p! |# {0 X3 _% w
{9 w3 W5 D5 E7 g5 o5 u( y
        write_LCD_command(CLEAR);         // Ox01,清屏" N+ T; o" A+ v0 V5 g$ B7 B9 s; M
        write_LCD_command(CURSOR_HOME);         // ox02,光标返回原点' y' \- d0 o: l
}* v0 Z3 p; e# K6 ]  J
void display_LCD_string(char *p) //对LCM模块显示字符串
- x, ~1 W2 }2 p; v{
& f- ~! [' R7 M  u        while(*p)
" T( l  ^/ T8 [' e# q8 B        {
9 K7 ?# V, V9 C& V                write_LCD_data(*p);5 g. b, k# S, N. o# X- n+ l
                p++;4 U3 U; _! [1 ]$ p; L. P  V
        }0 s. b' q' n2 {9 B4 Z# ?% x
}
+ h; v* l6 L  K) M8 C$ P# lvoid display_LCD_number(char number) //对LCM模块显示数字
8 z2 I; g2 J/ J: S6 R{1 T+ h9 }6 h, q7 X# H
        unsigned char x,y;9 Y+ t8 f0 ]! u( r# Q4 X/ f$ X3 s0 X
        x=number/10;. w+ g# I* x0 f
        y=number%10;& b' i: _9 \& M& I0 K8 d% B
        write_LCD_data(int2charLCD[x]);6 ~( V! R; y" j$ H' M( x: {
        write_LCD_data(int2charLCD[y]);
; {5 }1 R. q! B2 i: q}6 p# ~% W8 G9 K! c
void gotoxy(unsigned x,unsigned y) //设置光标位置$ ?7 I0 `7 s* z" K/ k; k( j
{
6 B" n) b7 A/ q1 g( t2 N        if(x==1) / Q! O8 B& H8 q+ [1 h
                write_LCD_command(GOTO_LINE_1+y);9 w7 L9 q9 s* u! G1 P- {8 t0 V
        else 3 X' E& ^* N/ j; l  Q
        write_LCD_command(GOTO_LINE_2+y);9 L: W$ Z& g" Q+ Y! f4 f
}

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

本版积分规则

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

GMT+8, 2024-5-19 00:40 , Processed in 0.484600 second(s), 30 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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