维修网

 找回密码
 注册

QQ登录

只需一步,快速开始

微信扫码 , 快速开始

查看: 174|回复: 0

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

[复制链接]

该用户从未签到

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

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

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

x
单片机控制温度,继电器输出程序出错高手请进来看一下
' E2 v- s2 W9 e. E出错位置在 “按键操作子程序”                         gotoxy(1,1); //设置显示位置* d1 f  n1 ?) ~' T$ l4 I$ {9 O
3 m0 @, }9 x* G* ?% q4 V
5 F, h- _- M8 f( d. o2 N

* r1 F* C* i- v7 ?5 X( m8 e( j$ P/ C. _' H( k* E+ b
#include
/ C6 p6 _) f1 A: [4 s#include
9 u) A1 e6 {8 Z" D! q7 \, g% R#include
$ g( p/ U. M& a4 M#include 7 w1 T0 M7 k( B3 g( ?# ?
       
8 H6 s) x. t) J#define uchar unsigned char6 l: x3 ?$ l; V
#define uint unsigned int ! `/ s: H4 U1 `
0 ]' g8 ~" \% E3 u+ [9 y& M! W/ }/ o
sfr DQ = 0x80; //DS18B20连接在单片机的P0口
5 m3 I# T2 R; u1 b9 d- H! isbit LIGHT = P2^7; //灯报警标志P2^7口
" v( Q! Y9 m1 o* @sbit P3_6=P3^6; //引脚定义,继电器控制端 + d; m2 @4 f9 n2 F! e3 E1 k: p
! q6 c- ]$ Y5 W
uchar PLUS = 0x01;
8 M# ]) h  A( |, y" r+ @) _uchar MINUS = 0xFE;  T' t& `( f- t% h9 C* S" r; E
uchar temp1;( M8 S$ ]+ d$ O- p" P! P
unsigned char xx;0 O% E2 m& c' f9 _) w$ K" Z. C6 c
bit mode=0,work=0;3 }- @0 d' L9 a" u$ ]
int ALARM_TH = 0x32; //报警温度上限值,50摄氏度
% {! h# g5 K+ Q( r7 p$ uint ALARM_TL = 0x00; //报警温度下限值,0摄氏度  L9 B3 N) b$ h2 x' m
int temp_minus,temp_plus,temp,xiaoshu,xiaoshu1,xiaoshu2;
  y9 L( j3 s% C2 n8 q, aint temp_value = 0; //DS18B20 读出的温度值
7 r4 q; u1 p0 e; y) r3 @" x4 j; Q
. q! Y9 P" ~/ yvoid Temp_write(uchar wbyte); //写DS18B20 一个字节
* f* T2 Q0 ]8 y3 ^' X/ Uvoid Temp_bcd(void); 4 b: V  \. E% v0 a5 e
void Temp_convert(void); //温度转换开始命令
: Z* O. t  ~- \( ?void delay15us(uchar n); //延时15us倍数的程序8 k/ m. F8 E% K9 C- |" i
int Temp_read(void); //读DS18B20 一个字节; c" P6 q- R2 A3 [1 V% y
void read_temp(void); //读出温度值子程序+ y7 }, b" ?2 ]2 ?( k! H
void Temp_reset(void);
. j8 E1 y8 E2 yextern int abs(int val); //温度值为零下时取绝对值3 F5 }5 h( a9 h3 Y
void display_temperature(void);
1 d: w% N' m2 b0 O  Pvoid send_temperature(void);
9 A: Z; ~. e2 L( {: Ivoid date_time(void);1 C# \) y# x' G- C: f# o
void com_initialize(void);; ^8 W( S( R6 n
- {/ M; D5 m! m4 V! ^7 C
void delay1ms(unsigned int x); //函数声明. U  Q/ o: |6 x" o' \
void set_adj(void); //函数声明' v) j4 S& i$ {1 ^: }7 ]5 D
void inc_key(void); //函数声明1 [+ J6 m0 q$ O
void dec_key(void); //函数声明
5 v2 D" A: N5 F3 b! y7 h+ Y' H2 z$ N5 ~0 ?, W4 h
//****************************************************************************- S: o( h# T+ G
void delay1ms(unsigned int x) //delay x*1ms
# G3 E! `' C! K( s$ |{ 9 Y; j* u5 L# {; `' x
unsigned char j;
) C( o6 R  L# A) D0 L while((x--)!=0)
" O. l( _+ i& \ {for(j=0;j                         gotoxy(1,1); //设置显示位置
' l  [3 @  m9 A display_LCD_string("Init_T: "); //显示初使温度 # X4 a( O- Y( n- V1 o
display_LCD_number(10);   S( z6 ], @: w. n2 t# G5 k5 d: T
                         write_LCD_data(223);1 L. {& e2 l' |( A( Y4 I8 P
display_LCD_string("C");   x( |  K: l9 w: i0 \+ a, |+ x- l+ l
                         break;
; g8 D7 a( t/ R$ d2 g }
6 c" K3 r  n3 x( ]! D* E& i                         default:break;5 d2 N9 _* J1 p* I: o7 b
                         }
8 `7 M# {8 V/ J2 j                 }         . S' y0 F- y$ K" O- m$ D  |3 t% V
}
0 ?/ ^8 A6 U7 H8 S& z) q}
4 r: ]$ m& W) m, c//*****************************************************************************void set_adj(void) //模式设置子函数! D( G7 ~- M  |' ?# m$ j4 ]+ B
{ mode="!mode;
6 }; V  g6 B6 S- i) O2 Q& u2 t" delay1ms(5000);
- J& E+ y6 z! J' v/ e0 _ if(mode==0)" ^$ Y2 Z" o/ Z$ H+ t1 o; T
{P3_6=0; //启动制冷9 ^# }' @4 O$ X8 T
init_LCD();
1 M" G/ l- i$ p& [7 \/ m         gotoxy(1,1);& Z( N3 p+ o6 q1 p0 `3 m
display_LCD_string("Pre_temp:");
: B5 v- U2 l7 \8 i3 g$ B3 A         display_LCD_number(temp1);; F5 w% w" j; o3 ~' [
write_LCD_data(223);
; k  k) H/ k" h7 ] display_LCD_string("C"); 5 P, T7 A% T: Q4 a% p1 H$ R
delay1ms(5000);
4 u0 X/ e4 e4 v8 W2 k         }# M8 t% C" |5 m, o
if(mode==1)
1 k( F0 T- ^8 W' L         {init_LCD();
+ Q3 l5 z  L8 r0 f3 t% A) }          gotoxy(1,1);
" `# d  C8 S3 r" D( x8 K display_LCD_string("Please Set:");, z- L3 j% P9 D9 T1 j" K! O" b
delay1ms(5000); # |- M  o1 u- E+ P& W9 u7 V( r8 u. m
         }7 @# E0 ~# c; t# h5 N6 O
}
: |' k& ]% r5 r; v( t4 `9 n//****************************************************************************- G+ p6 Y: k; F' d+ ]
void inc_key(void) //按键加法子函数
# @3 e3 J4 T( V5 e' e2 d{ , r, ]5 u, @5 \$ t7 c
if(mode==1)
% e. o* G' a! Z {temp1++;0 J; L' |" E8 V# Y* g
init_LCD();- A3 c' R6 T+ u7 f8 [% T( U
gotoxy(1,1);
) H: F" D( s* U2 E: t display_LCD_string("Set_T: ");
% f9 s* `0 [) W* V) r/ w        display_LCD_number(temp1);
2 g  C6 ^+ K3 b: {4 T write_LCD_data(223);) N+ A2 j1 S# D$ e
display_LCD_string("C");
6 J9 }& Y* o* V         delay1ms(9000);7 m8 S4 T, ?% v
' h0 q! K9 @& \" f
}
1 g# b" m! w9 ?. d9 }$ n}" I( F" ~2 _+ m, t9 s
//****************************************************************************
! ]" t6 G/ N  P8 V/ `; svoid dec_key(void) //按键减法子函数  e* D3 m; S! R" ]
{
: A5 [. B1 u( P/ @+ [( g if(mode==1)% w8 X: C0 g- L" F* I  ~& N
{temp1--;
# d/ K8 _1 B& p- ?9 [  v         init_LCD();
$ `* L1 x& ^5 W, e         //clear_LCD(); 3 z9 ~5 x" n; _2 a9 N7 x0 t
gotoxy(1,1);
4 r! v# J1 J3 n display_LCD_string("Set_T: ");
! W8 d; K9 q' f1 J         display_LCD_number(temp1);
% x' v1 `: p& s/ ~9 g  q9 _/ P write_LCD_data(223);& ^8 W5 K4 Y" a; u# P) [2 H9 T, C1 ]
display_LCD_string("C");# a4 s. Y! _9 S
         delay1ms(9000);, N3 d0 {. n& d; Z; ^. M: u: R2 k
}1 a- B' K4 L+ V8 B# @, U5 t
         ; A  w1 i/ |9 L# T* x' Z/ l
}( N$ t0 _) R+ }5 h: Y
//****************************************************************************3 \; X% {: R6 ~1 k' b
void delay15us(uchar n)
5 r, Y) C( `. j{, `- Q; f( n8 h2 |
do
0 \1 E: l8 p3 q8 [4 t1 H { _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();" r; e3 G6 n  _5 L& M+ M! m8 r
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
; q% h( D0 z4 [5 Y --n;- _6 O% C9 O6 C) o2 v
}while(n);' I. @' ]2 ?8 {/ r
return;" ^1 o' [! K' q- T
}
) g: Z& t( h0 b. \: u2 ~//****************************************************************************/ A" F2 E1 \. V& ]: a
*温度检测子程序
6 J$ h2 k8 O+ d//****************************************************************************
; {  \' ]# [+ _1 Q$ R: vvoid Temp_reset(void)7 n) D* I! q$ s. J: E, W2 s
{- ?( F) Y, e. e) D4 N  u
uchar="uchar" i;: y  D) \& _/ T4 M; J
        bit flag="flag" = 0; //flag为初始化完成(1)标志
) z/ k! Q9 z2 d. z$ p while(~flag)
# u( Y6 d7 O, M {0 v( U* n9 x3 a' b% \$ S
DQ="DQ" = MINUS; //主机拉低单线480us ) e2 K3 v4 h+ V' u3 Q$ R
delay15us(40); //产生复位脉冲/ ^7 i# ~0 F+ }& j" h- [, Z
DQ="DQ" = PLUS; //上拉电阻拉高单线60us4 X* U/ N9 v) Y( }* J$ l1 F0 T/ _
delay15us(4); //延时60us& a+ q) \- U+ N

* a8 E, b% |" m% p, F, S while(DQ & PLUS) //等待DS18B20应答,拉低总线3 n2 Q4 N$ |8 k
;
6 ~8 r8 ]1 V. i% B/ |3 _! n while(~(DQ | MINUS)) //DQ线被拉低以产生应答信号2 D. o' @; d5 U$ e8 @0 t! z7 Q( l  ]
{6 D- c2 ?# |! G# ]5 W9 L, i- ?
flag="flag" = 1; //初始化完成! `$ l/ A" i' t: n
         for(i = 0; i="i" > 1); //每读一位,即右移一位,将新读的位放入最高位
0 d# i" D+ M7 m }
3 n# m2 `6 Q: [/ v7 b; j% w' |9 E _nop_(); //读时隙间隔至少1us( Z. [2 O4 S% f/ D6 I9 y
return(rbyte);; l# q; z! X  e$ L" t
}
) i( E, G, n2 B2 g2 K//*****************************************************************************
7 x# A2 r8 f8 _$ Lvoid read_temp(void)
+ R* L  W! K/ T' K{; t6 e' o9 b! \' ]# e
uchar temp_lsb,temp_msb;
6 @: R7 b  l8 d% T, }0 L Temp_reset(); //复位DS18B204 Z3 L7 X- A" X7 [% Z  _
Temp_write(0xcc); //跳过读64位ROM序列号命令,用于单线接系统 [Skip ROM] [CCH]
% z, M$ }2 M) ] Temp_write(0xbe); //读暂存器 [Read Scratchpad] [BEH]% }, p8 f* O4 `" S) ]) F: x" L9 }
temp_lsb = Temp_read(); //读出低字节
4 n8 a1 J8 W: v. B$ A; m' d temp_msb = Temp_read(); //读出高字节
' K: S" [0 i+ f' ~, i4 A temp_value = (((uint)temp_msb)
3 d6 S1 p2 R+ u7 D: p#include   x% S3 t2 Y% B! c
char code int2charLCD[]="0123456789";" O/ F; o, ~% L3 R
void write_LCD_command(unsigned command) //将命令写入LCM模块
/ b- S# s, z& |. H$ @{# }4 p8 i2 K9 i9 u! z. h% `# E9 y
rw=WRITE;
3 O9 X) P. x  a: T2 e. |' Rrs=COMMAND;
' M# T3 N1 g: F  w1 k4 v) Venable=ENABLE;
8 Y  T+ d4 O5 P; F& Z0 TP1=command;+ ]  Q5 q& y$ t: D6 P7 f
delay1ms(2);. U$ `. b1 @+ |, S' U
enable=DISABLE;
6 v* L' k6 A! g6 f2 Frw=1;
& {, m! @4 L5 U( ?# ~}) K1 L: y4 t3 x
void write_LCD_data(unsigned LCDdata) //将数据写入LCM模块& P- M5 J9 t8 l- B7 S6 w
{0 @) d6 b9 B2 f4 w, W4 I/ X  c
rw=WRITE;6 v; ~7 G8 w) {" q1 b: H0 X
rs=DATA;
' |# x. ?' T% h& w. Z3 Genable=ENABLE;6 h4 o6 P! [/ e2 I
P1=LCDdata;) T1 }# v4 s3 H! h
delay1ms(2);
% u2 y; y. f1 Menable=DISABLE;$ R" R" f' l9 M" U
rw=1;6 I% f$ W% G, M
}
+ S  }* ]" A1 i- V- r8 Avoid init_LCD(void) //对LCM模块进行初始化5 L- n/ r! H$ H$ q
{
# T4 X( x( n8 S  c/ ^/ N* x        write_LCD_command(TwoLine_8bit); // 0x38         # B' E  @1 f6 c3 B7 F, G
        write_LCD_command(CURSOR_OFF);         // 0x0C
6 R8 e, I+ K7 K5 e        write_LCD_command(CURSOR_RIGHT); // 0x06( \- g# u* `) b5 T/ ^' p; u' r$ e
}
) U, i/ X8 x( H: l5 z# q8 Fvoid clear_LCD() //清除LCM的显示屏1 X; c/ N( d8 S9 J' y
{
- y: u$ Q8 v3 u9 u2 o        write_LCD_command(CLEAR);         // Ox01,清屏6 N* ]8 `6 l# a$ I7 N( o$ A: V8 w
        write_LCD_command(CURSOR_HOME);         // ox02,光标返回原点( E  I6 b4 O. Z- d/ O" t7 v. m; i
}, a4 @% O# o  O6 l$ m
void display_LCD_string(char *p) //对LCM模块显示字符串
! d& N! R1 n( @! x$ x{
  J3 z7 k2 F1 T* M8 t        while(*p)
1 S. Q" d/ W) L* }7 R        {* I0 Z: r* ]0 i
                write_LCD_data(*p);8 o" }' h" L8 T' {* x, e
                p++;
4 ^8 R% d  b1 f1 g1 e8 e" A        }2 e# S' }' L5 S  {; l: d
}* ]$ t+ o  }4 D; x
void display_LCD_number(char number) //对LCM模块显示数字
* I7 u# h5 W2 ~5 G0 t. [3 ]4 M{+ T$ ]6 k, J, H
        unsigned char x,y;
2 Q+ f; O# I! y9 [; `        x=number/10;! z% c% \& l  A% H' z; N3 C2 l# l% p
        y=number%10;
5 i5 u" h6 Q2 z& U  S        write_LCD_data(int2charLCD[x]);
9 D3 C4 o' _9 P( M' L1 {! {/ j# U        write_LCD_data(int2charLCD[y]);; Q! v. J& d1 F/ i1 A
}$ }; w! A/ M% S' `
void gotoxy(unsigned x,unsigned y) //设置光标位置
8 @: p- G* @. p2 ^7 U0 L9 k% \+ n8 i{" t2 d* |/ U/ o) y0 i0 ^. _) ?) G
        if(x==1)
7 Z0 c  r/ y, j9 y- V                write_LCD_command(GOTO_LINE_1+y);
6 k& O5 T; g$ d- c8 P        else ; i7 R; k9 o. ~) J' F% M. X$ J9 w
        write_LCD_command(GOTO_LINE_2+y);
! o; z: [" J+ ~* k% |}

手机扫码浏览
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新贴|维修网 ( 粤ICP备09047344号

GMT+8, 2025-5-12 04:10 , Processed in 0.488759 second(s), 31 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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