维修网

 找回密码
 注册

QQ登录

只需一步,快速开始

微信扫码 , 快速开始

查看: 158|回复: 0

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

[复制链接]

classn_11

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

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

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

x
单片机控制温度,继电器输出程序出错高手请进来看一下
+ [' d, ]' C3 O出错位置在 “按键操作子程序”                         gotoxy(1,1); //设置显示位置, e4 a) u* _; {/ l# v
  p- T8 [6 p5 s5 j

+ u8 x6 ~/ h. a$ e
' l2 j( @, R& r" S
% X: m2 d$ [8 _6 q4 I, B" ]8 m#include ( k- C3 ~4 Y! X7 A' B) p
#include . I/ c% S: M: R3 \1 l
#include
, X( I5 ]& Z3 V% R2 l, |#include 7 f# Y: n. g9 k
        , u% K( m- N2 L) V) v  p. `
#define uchar unsigned char: \( S, q% _# W+ i8 h
#define uint unsigned int
" y" H6 x2 L- e8 W! t5 I0 G% J  A7 Z
sfr DQ = 0x80; //DS18B20连接在单片机的P0口0 H% i% q1 d) f1 i6 ?- A0 }. e
sbit LIGHT = P2^7; //灯报警标志P2^7口
4 w$ N/ Z/ e3 n9 Csbit P3_6=P3^6; //引脚定义,继电器控制端
2 I0 x1 @2 B' T! I8 q
$ c# @' o6 \9 v* Tuchar PLUS = 0x01;
3 a6 X- r1 `2 L: O( a) H, Muchar MINUS = 0xFE;9 D  K0 a. u! l( q
uchar temp1;; X+ D& Y+ N0 m+ A; _' j: q6 U
unsigned char xx;! K2 ~$ r( ~- m3 W
bit mode=0,work=0;5 d; M, G; J4 W) D- @/ t" t
int ALARM_TH = 0x32; //报警温度上限值,50摄氏度: U+ D5 ]6 ?0 M
int ALARM_TL = 0x00; //报警温度下限值,0摄氏度
5 E  E/ s& \- ^8 \int temp_minus,temp_plus,temp,xiaoshu,xiaoshu1,xiaoshu2;4 h' M# F& [' q5 b( V+ ]7 e
int temp_value = 0; //DS18B20 读出的温度值
4 h: B' }  k, r/ m7 _$ Q
8 _% p6 W) h/ Wvoid Temp_write(uchar wbyte); //写DS18B20 一个字节# K( R0 h% L7 c+ {, P! N) s/ v
void Temp_bcd(void); % b) t+ ^+ D8 t" [. }& r
void Temp_convert(void); //温度转换开始命令! A+ X5 x* _' K. `& U& @
void delay15us(uchar n); //延时15us倍数的程序5 S5 t; G' y2 {
int Temp_read(void); //读DS18B20 一个字节
3 q$ F4 ]- d8 u' ovoid read_temp(void); //读出温度值子程序$ X5 j. |! F8 g% `, C* E
void Temp_reset(void); , Y2 \% ~0 j+ Z& ?5 ~
extern int abs(int val); //温度值为零下时取绝对值1 p: v+ }. ?2 [% J
void display_temperature(void);
( V) C, F! t9 S7 Vvoid send_temperature(void);- ]2 l3 k! m. a# p7 t3 m
void date_time(void);; E, X- m% V" p6 D
void com_initialize(void);) C: w/ r; L9 P+ m

6 a: c" ^5 p& d5 s! _  ^6 K/ j- Pvoid delay1ms(unsigned int x); //函数声明4 ]9 Z% a" n. c3 L
void set_adj(void); //函数声明9 \% S' W' w. v+ ]
void inc_key(void); //函数声明
! H' z. [; f$ k4 i4 G0 Y% ~void dec_key(void); //函数声明
  T; r/ x/ t. Q- g, Y* d2 x
' ~6 z4 |; }) ~* [- m3 f2 Q7 R//****************************************************************************5 `7 {3 X# _% `4 P
void delay1ms(unsigned int x) //delay x*1ms
1 n8 A  {3 q3 {$ M{ ' Q0 I3 N. X1 z! x: I, O9 L6 f
unsigned char j;
+ w% V+ ?6 a$ [/ b while((x--)!=0)" a0 U; ?# b3 p) S6 N
{for(j=0;j                         gotoxy(1,1); //设置显示位置
, w) r. ^- ?, _# J display_LCD_string("Init_T: "); //显示初使温度 9 g* w& j# f8 |& [# ?- ]' p5 K0 h
display_LCD_number(10); - l/ L$ X# w- X% h8 H0 b2 W  G; W0 @
                         write_LCD_data(223);3 h: A4 u" I( U* y
display_LCD_string("C");
- A( N* |+ ]# w                         break;
% ?" v$ _" R3 n* b4 Q$ ^2 H }- B. |& W+ R' O4 x' z! N
                         default:break;
1 h7 U4 e7 o7 j: U% F+ Q) _: m                         }
* u1 K( [4 z0 ^/ C                 }         + p2 y% t% m5 g8 B0 z& s
}, A6 H1 `/ M) }3 i8 p; c; {! t
}
$ j! F$ [$ @9 ]) J: c% R  J9 x//*****************************************************************************void set_adj(void) //模式设置子函数! r3 x+ o' g/ s& l
{ mode="!mode;4 ]& E1 k' P9 B& ~: n) M2 d
" delay1ms(5000);* J% e$ T* I+ ^. @: F/ H0 q
if(mode==0)/ M: d( c. O. I( E8 D# D
{P3_6=0; //启动制冷0 h7 H& T6 a, C+ u5 H
init_LCD();
0 Q+ Y, @. _% m! S         gotoxy(1,1);
9 \! i! @/ Z8 L' w display_LCD_string("Pre_temp:");
& z9 S' i. m: C# k7 Y4 k2 u         display_LCD_number(temp1);" i8 D2 r1 r. ]
write_LCD_data(223);
  x0 Z& e1 S( O+ b display_LCD_string("C");   e8 n5 c0 C. t. \* n- P
delay1ms(5000); 8 r3 _' t! N6 R, ?# g6 N
         }
' h; E+ e8 O( _3 W if(mode==1)
  L* v9 s  b! k  Q" W         {init_LCD();
8 M# U' _1 @" \/ \6 _          gotoxy(1,1);$ B' y/ A- S& x+ M' e! ^
display_LCD_string("Please Set:");
9 s% ^* @5 A* c% H% z! c( o+ j' y delay1ms(5000);
( {# P' \: C) }! t7 {  L6 C         }8 t4 t" [: h2 c  u9 V& ~3 M$ f
}
0 X' b4 G. Z9 ]//****************************************************************************
' ?( b# O2 I( h7 R) nvoid inc_key(void) //按键加法子函数" L* ?& g# x, r. N
{ % G, w1 l2 ^/ B1 m4 m" ?0 w1 t# Q
if(mode==1)$ k- l& ?: F* ?2 |1 L& L
{temp1++;
& O1 @- a; y' _7 J; |$ Y" W( t init_LCD();% g9 E! n5 U/ I( V$ f( @
gotoxy(1,1);
  C$ S7 k  z/ [ display_LCD_string("Set_T: ");
, ^5 ]6 o% A; z+ B        display_LCD_number(temp1);  y7 C2 b' p( _3 x
write_LCD_data(223);
" ^) b; f" V, y8 T display_LCD_string("C");1 D$ X9 {% j- H% K( J# m; B% v
        delay1ms(9000);+ ]7 U4 p" P) S  r
; f: ?# U5 f; |
}0 B1 {# `0 ^6 {/ T. I
}% |* ^. {, e: b# x1 ]* |, B! v
//****************************************************************************
, t3 e/ v. C2 q2 E  n4 A: X1 Evoid dec_key(void) //按键减法子函数
( e0 y& L/ S' ~9 s6 y{ # b- ?' Y5 U& V7 A& Z" z
if(mode==1)
) a- E) ~$ \& a- | {temp1--;
9 U1 K) @' A1 A& V1 h3 ?0 c- r) B         init_LCD();, b- Q& D5 F+ k0 [
         //clear_LCD(); 3 p8 J; w! A, ~4 c
gotoxy(1,1);4 t$ A' x' o" Z) t
display_LCD_string("Set_T: "); , R; b0 o/ }6 s' c0 |
         display_LCD_number(temp1);
. r- R7 e/ D' w write_LCD_data(223);
( R4 @+ }& F7 i2 ~* y display_LCD_string("C");8 J3 ]5 B) U+ O+ w' V6 P
         delay1ms(9000);4 h% l, E, Y1 Q: Q( [3 t5 R0 Y
}
5 m0 ^& k# I9 y  h3 z         
, `" k' {6 K/ j% W0 L: z" {# H}
" C+ }4 W9 e  O//****************************************************************************6 n' Q  _, \3 N) S4 q; A
void delay15us(uchar n)
. q5 b( y9 b# Y  T{' w2 o/ M2 q4 Z- a% C3 i6 H
do
- Y/ z" u5 A  [# \9 q { _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
$ |% Q9 q4 w' m9 Z! c! G6 M _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
! o4 ]8 F5 h# G  D6 X! [2 D --n;
' ]5 J2 ~* a" e4 `, G. \ }while(n);& `; P3 a) k1 V0 }
return;
+ c3 D6 e- F8 g}
" ~& c7 y6 s9 y2 K+ ?3 ~$ B% c//****************************************************************************, `+ s+ i, h+ |& l
*温度检测子程序
; Z" N( m0 I( b; U$ q' f; t1 B! T0 a//****************************************************************************
! Q8 z7 t+ n) Dvoid Temp_reset(void)
8 p& z$ m# E) f# X  J1 Y{* _' t6 c: r- b5 W% S' ~- n9 ^3 @
uchar="uchar" i;6 q3 ~& w# p0 g4 l% `
        bit flag="flag" = 0; //flag为初始化完成(1)标志4 G) w2 f! Y/ D9 B0 a
while(~flag)& V% O  O" u* @# @) @$ a+ P
{
% q4 N! ?8 \0 Z DQ="DQ" = MINUS; //主机拉低单线480us 3 O" f* b; Q* x. p
delay15us(40); //产生复位脉冲, z* n* l3 Y! p6 ~: [
DQ="DQ" = PLUS; //上拉电阻拉高单线60us0 ~, [. A7 D" l! }! P3 p
delay15us(4); //延时60us
5 l! z0 }/ F# Z$ m( Y. F( O+ H& [5 r, j0 z" M% o: o* C
while(DQ & PLUS) //等待DS18B20应答,拉低总线
4 G1 z3 _7 K5 G% j" X ;! w" z( q7 B* _2 c# {
while(~(DQ | MINUS)) //DQ线被拉低以产生应答信号! e5 N$ J8 ]; J- r
{- W0 O2 [/ z* u( k. q$ h
flag="flag" = 1; //初始化完成% F; ]2 v2 b- @' p( R7 ?
         for(i = 0; i="i" > 1); //每读一位,即右移一位,将新读的位放入最高位- S" e- C. `% \0 v$ v  M( B, m* ^5 Y
}, F. l& W2 N7 p1 E- h  ^3 D
_nop_(); //读时隙间隔至少1us5 T3 }- E1 |8 S% P# j+ I
return(rbyte);2 p% W; n- m4 H6 Y% ?; P
}1 m! S4 C+ L) y0 c3 j' r6 g* l$ N. K
//*****************************************************************************
7 \$ J: {( f+ yvoid read_temp(void)
5 E2 R9 f1 J6 a8 `. Q{
/ Y* {' X# b$ Y& ~2 x uchar temp_lsb,temp_msb;
8 V* @2 @6 e5 U0 S0 d; T1 H Temp_reset(); //复位DS18B20
+ l# {$ }* ?/ P) T3 }, o* x Temp_write(0xcc); //跳过读64位ROM序列号命令,用于单线接系统 [Skip ROM] [CCH]9 G8 m3 p6 U, j* f; c* M+ F( x
Temp_write(0xbe); //读暂存器 [Read Scratchpad] [BEH]
% h9 u6 A( n" v  x$ b# G* j temp_lsb = Temp_read(); //读出低字节5 `& v6 |: r7 R0 `
temp_msb = Temp_read(); //读出高字节7 G" j1 Y8 q6 y7 l' O
temp_value = (((uint)temp_msb)
" n0 d7 r$ W# T! @, w" t8 c+ z3 a& ?#include
, T- s6 }  [1 A9 a4 wchar code int2charLCD[]="0123456789";7 S  m9 g  A7 U9 J" n( z
void write_LCD_command(unsigned command) //将命令写入LCM模块
, B) K7 d2 s+ K( ?{
9 R; B& C6 g" c4 K0 Z! X3 Urw=WRITE;8 M. Q$ L- Y! ~! q' @
rs=COMMAND;, u2 V  J0 U6 r0 S# e( G$ H
enable=ENABLE;" i. n; g2 Q  U
P1=command;# w: y2 D% H/ {: a. |0 m
delay1ms(2);
3 H7 \9 @) K: L: K) k, g( lenable=DISABLE;4 u5 A  f$ g" ?3 P
rw=1;
! }' E, y( Q* n* v% ]- M  h}
6 h2 d2 M% Z1 l0 mvoid write_LCD_data(unsigned LCDdata) //将数据写入LCM模块
; U8 A1 {+ Y: ~$ d; y{
, |/ q6 ~) H6 nrw=WRITE;
6 D9 J8 r6 [# b) T+ ^9 ars=DATA;4 Y' u3 C1 Q) @" s" q
enable=ENABLE;0 }* k2 @+ k/ q% @! e- @3 m
P1=LCDdata;
. Y- f$ R% t+ V  R- K7 P: Fdelay1ms(2);/ m/ k# Z: q7 Y1 D" Q
enable=DISABLE;$ ]/ L% a& ]0 C. F- b. p# }* z4 O
rw=1;% |" h. C8 X- E; N4 o& `* o
}
+ `7 V# h+ [& T, \" Jvoid init_LCD(void) //对LCM模块进行初始化2 j' A+ }  Z, P0 ~1 v7 C) _6 L( j  }. ~
{
8 h) m. W4 Y/ v# Y% {! Z4 Z" ?6 y3 A        write_LCD_command(TwoLine_8bit); // 0x38        
" g, H6 h1 B3 N        write_LCD_command(CURSOR_OFF);         // 0x0C4 E; _% j6 ?% e% [* B6 [5 h4 R9 \
        write_LCD_command(CURSOR_RIGHT); // 0x069 S- E4 X: s2 N" x
}! O" ~9 u) J" Q8 k5 P9 a$ m
void clear_LCD() //清除LCM的显示屏
/ i% Z) M  y* l1 X3 p0 A{
0 D  m. R7 ?/ E        write_LCD_command(CLEAR);         // Ox01,清屏
$ a! B7 P. v/ d! r        write_LCD_command(CURSOR_HOME);         // ox02,光标返回原点
9 l" Z! a7 O6 `7 b1 I8 H. Z0 {}
( V$ A' H3 _4 Hvoid display_LCD_string(char *p) //对LCM模块显示字符串! A7 L: G9 }5 y: q1 i
{
$ T* s- C. `6 U3 X        while(*p)
& X  D0 k: ^- u' G" B* v        {8 H, m& _8 l. C: |8 j1 D
                write_LCD_data(*p);
1 G& |. U; Y% @+ Z                p++;
/ l" d0 Y8 Q- \1 l: o: G        }
: f; s* L4 l  g. h}
7 [( S  a2 p0 l* x, Cvoid display_LCD_number(char number) //对LCM模块显示数字
; U6 `% H9 p6 s& y5 Y: i' \. t5 V{; G6 H( E% V7 ~* o
        unsigned char x,y;
3 B! q9 T" Q7 k8 @) R$ a& j        x=number/10;
+ t* O! C7 m; ^  S        y=number%10;
: {* C% p) m4 J( E, z        write_LCD_data(int2charLCD[x]);
. r: U2 ~# E$ K. z& `        write_LCD_data(int2charLCD[y]);" `2 |2 F2 k1 i' _; w
}8 _! |6 h  j5 O
void gotoxy(unsigned x,unsigned y) //设置光标位置2 N7 P7 L+ D% Q
{1 G( V4 a, O4 R) A( @9 t0 W, q9 c
        if(x==1)   Q, @% r4 H$ n& l# e9 q
                write_LCD_command(GOTO_LINE_1+y);
8 A& K, T) C# g4 H" P2 G        else + S  N. f+ \: _" u1 T; L0 L4 I8 I
        write_LCD_command(GOTO_LINE_2+y);
& _8 v5 u7 p' y' }- a% D}

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

本版积分规则

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

GMT+8, 2024-6-18 07:53 , Processed in 0.472636 second(s), 31 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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