维修网

 找回密码
 注册

QQ登录

只需一步,快速开始

微信扫码 , 快速开始

查看: 157|回复: 0

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

[复制链接]

classn_11

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

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

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

x
单片机控制温度,继电器输出程序出错高手请进来看一下
7 k0 |1 U! m) H1 _2 Q4 O6 R出错位置在 “按键操作子程序”                         gotoxy(1,1); //设置显示位置1 N& J& t+ |9 [9 s
( }: S) z) i& \" z
/ [) x( F# M/ y% d8 F5 T

4 O# [; Z7 g# A" U" k& A
6 {" y; U# |# U2 L, ?* K" D' ~#include . u( w/ t& t* o: k/ j# c
#include
& f" C6 x$ Z1 {8 |" N#include / j4 t% Q8 |! Q" D
#include
& }, H! w( g2 K! i( y: x* h1 V        & r: b1 M; O5 `# |0 |7 D7 R9 h
#define uchar unsigned char  u: u6 `4 E: C8 E; [% @
#define uint unsigned int
  O6 k, u2 x# ^" S3 t, R0 c' Q$ j+ f7 X& {
sfr DQ = 0x80; //DS18B20连接在单片机的P0口
5 @- J2 N9 d- p5 e9 Vsbit LIGHT = P2^7; //灯报警标志P2^7口6 i9 A& u/ |7 P) X$ c; v  I9 N
sbit P3_6=P3^6; //引脚定义,继电器控制端
4 q! K+ U' f3 n. y" O  G0 K& B2 c: a
; d! S6 [( i/ Ruchar PLUS = 0x01;1 K% I1 z/ G' Z
uchar MINUS = 0xFE;5 \2 m* X1 U, @! |
uchar temp1;
9 T" y1 I, b7 j2 Funsigned char xx;
' r# p2 c0 V* | bit mode=0,work=0;1 ], O. {& ?; A1 f- i
int ALARM_TH = 0x32; //报警温度上限值,50摄氏度5 R7 [; b) Y& G- c9 o( w! h
int ALARM_TL = 0x00; //报警温度下限值,0摄氏度
# H( {5 X# g! ^5 z# R4 @+ q1 ~- cint temp_minus,temp_plus,temp,xiaoshu,xiaoshu1,xiaoshu2;
/ i. H& o! ?* ^- yint temp_value = 0; //DS18B20 读出的温度值* ]5 y3 B/ @% R5 e. }

6 y' v0 ~: l  h" T' \3 [( Ivoid Temp_write(uchar wbyte); //写DS18B20 一个字节$ L2 d/ D: e. B/ e0 K
void Temp_bcd(void); " C& u% B/ L( A& g; j
void Temp_convert(void); //温度转换开始命令
  ?3 s4 D; P: j* mvoid delay15us(uchar n); //延时15us倍数的程序' I1 P. l( d* _4 \# |" {
int Temp_read(void); //读DS18B20 一个字节1 p: X4 R; q4 c6 ^$ P! C2 p
void read_temp(void); //读出温度值子程序; |: o+ q# Y' d! s7 \9 F
void Temp_reset(void); # \' D8 ^$ m4 V, A- h) T
extern int abs(int val); //温度值为零下时取绝对值
8 }& E* A* I/ M6 cvoid display_temperature(void);
3 i6 ~  F7 S- A, m* S% ^# Xvoid send_temperature(void);$ ~- g. k8 ]& e5 P" s- Q# x% z
void date_time(void);
, M& i$ l# N+ I* Zvoid com_initialize(void);
6 o* C8 J! u0 z. }- s
: l+ e5 l7 j+ X1 K0 g& x( l5 v. c/ _void delay1ms(unsigned int x); //函数声明
- ~4 X$ P& S  \# ?: [! b$ |' uvoid set_adj(void); //函数声明
1 ~) o" B& d, X) avoid inc_key(void); //函数声明" }" O& E0 r1 C* [5 D. P" @
void dec_key(void); //函数声明
. B4 R4 w7 Z( t. p5 {/ v/ D. \$ {  `5 H5 g
//****************************************************************************
$ q9 H+ }# k2 J9 ovoid delay1ms(unsigned int x) //delay x*1ms
0 _' f3 i& L% |# ~% u9 T) @{ # Y) Q8 {7 n- Z! e- \
unsigned char j;0 M; u  D3 Q8 l
while((x--)!=0)7 j8 m/ z, k& F) F2 f& v
{for(j=0;j                         gotoxy(1,1); //设置显示位置8 p* @) S- c% y6 l
display_LCD_string("Init_T: "); //显示初使温度
% P, e, o' r5 A1 C6 E display_LCD_number(10); 0 R: |  n0 e1 H) _* B3 ^; a
                         write_LCD_data(223);
4 H( o: M- Y6 ]/ G; Z display_LCD_string("C"); ( m/ ?/ Q* [0 X+ ?. Z! P% u4 n: n( `
                         break;
) ?2 s  ?1 E2 j3 l7 l }
7 T- z# {2 {4 B6 d3 [2 p+ {                         default:break;
& L6 t) d9 _5 c# `! `2 o, Z! y                         }+ G9 L9 A) q, K# G4 J* p5 ]+ a6 X
                 }         
7 _3 N9 j/ ~' f# u" O }
* `: p1 L- k* S8 ^  M0 O}
6 x1 Q$ ]+ |# @$ H% |" ]2 O$ V) f//*****************************************************************************void set_adj(void) //模式设置子函数
- _, i. D. y6 M1 b{ mode="!mode;- x1 e6 D$ m! k0 {* @/ \9 c
" delay1ms(5000);
" ]! A( v1 g4 L  v! \ if(mode==0)
& U" l2 D5 z+ g) m+ M  |# f- w7 y2 ^ {P3_6=0; //启动制冷6 }$ [: b& c2 U) F& ]( d
init_LCD();  A* j- s% }# Y4 |! G9 ^
         gotoxy(1,1);+ k+ A! ~6 B9 c& J6 T' N( m) F
display_LCD_string("Pre_temp:");
. g8 _/ P# z( P) Z6 ^' ?: H  }         display_LCD_number(temp1);# N3 e' w, z  D. P3 E% Z
write_LCD_data(223);
2 c" E2 l5 V+ X" R" t display_LCD_string("C");
8 I7 @2 K$ f$ {2 A% k% ]- W! _- K delay1ms(5000); " y& ^! P  Q& m/ l" ~$ C# ^
         }' Y2 K3 c/ u$ l% ?& T
if(mode==1)+ b1 H% w7 ~3 Y" v2 ^- X$ `
         {init_LCD();: C* `  g& v$ l6 \
         gotoxy(1,1);% G* O+ F* A: d) h1 Q$ p' ?
display_LCD_string("Please Set:");
- I' K7 d1 M( v7 B* m delay1ms(5000); 6 w% Q% E8 G/ D
         }
9 e: V: m) S# s% ~) r. b& O}
) R) ]+ m4 K$ D+ P$ o0 b//****************************************************************************" B0 t, Z/ D5 ^& J; g4 Y
void inc_key(void) //按键加法子函数3 V- E" M0 w" s: W8 }5 n# G; `' E1 J
{
- ?- Q  ], q3 \* I if(mode==1)
- N% Z4 \! X" o+ L6 ?8 v1 ~: ~. \' W8 d {temp1++;
6 o3 ~: l3 |: M  G( F% Q5 ^ init_LCD();
$ N6 x+ W8 ^5 g& e; ]( X gotoxy(1,1);9 H6 K$ U4 e4 }) \! y% K' |
display_LCD_string("Set_T: ");
" t. e4 L5 q& y: w        display_LCD_number(temp1);7 a8 C2 N, `8 l" T& q! F9 U
write_LCD_data(223);
* c1 `" J; O3 ?  }# Y display_LCD_string("C");
/ D) ?( G  X, S* O5 b! p2 C& Z; v         delay1ms(9000);6 Y+ |5 F! i- ?

6 Z% I1 [. P* ~0 x5 y }* c- D1 w* s( q% G5 A+ H1 s- O
}
( P4 P! S3 O, I( Z' F9 L//****************************************************************************
! n5 c2 e6 b( P4 L7 H/ o; Bvoid dec_key(void) //按键减法子函数
5 {7 j( ]0 ~# ]# v9 s{
7 K, S# ]; }7 N* n8 D, m if(mode==1)6 G* o  n* C  W$ O
{temp1--;& g+ F- E# ?& U# i9 K
         init_LCD();3 O" ^# {: D2 @
         //clear_LCD();
1 q7 O9 s% s1 E* B% E' Q1 R' y3 z gotoxy(1,1);
! z/ ?1 C# S% i- w% q% M display_LCD_string("Set_T: "); 0 G' k; }- {6 X" M2 T) d% W: U
         display_LCD_number(temp1);- }: T! l& v* ?3 S5 e" w. t
write_LCD_data(223);6 U/ T; a0 ^, W1 `, Y" D1 y! C; H" x
display_LCD_string("C");* r# ?2 U+ U. D+ ?2 |8 y
         delay1ms(9000);) J1 l+ R- K" n  A0 f- g% r6 n! P) a
}
/ C# L$ N% d1 e5 a+ h/ i6 y$ q/ ~         
3 g4 F3 I/ @& j; g$ k}# D$ T3 w( v* k6 W, R' m& ?# Q! z- e
//****************************************************************************# T$ ^" u( Z+ t9 @. T; K
void delay15us(uchar n) : b+ X) `; l  ?0 a! V/ v. l& d
{
0 f1 ^7 [; Y, S4 i% S  p/ e! G do
" o# i+ Y9 D; D; o" N7 j& p { _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();, L9 {4 _6 f, ~2 C
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
2 \) F2 @3 b# ]1 e --n;
0 S" H4 J# V9 w, M, } }while(n);. J6 i  F& \- p& |+ @
return;3 u; h, T9 |) z( W9 R
}
# r* \( a8 P* c8 A7 M//****************************************************************************: O0 e  r9 @8 _& V/ J7 ^& E* \" w$ I
*温度检测子程序
; y& T8 x8 G8 b$ J' O5 o//****************************************************************************
- x0 s8 u$ J6 l4 _void Temp_reset(void), A0 c5 r$ t) ?  B
{
+ w& x/ e* q4 T3 W6 t5 u! ] uchar="uchar" i;
' c6 P; o/ j/ ?/ e" q5 ~        bit flag="flag" = 0; //flag为初始化完成(1)标志+ B5 q9 U" a8 G! L2 B) R* k6 u6 C+ f3 ^
while(~flag)
- o( h% s3 v  }! k  z$ m {. R8 j( J0 h- x1 m* ]
DQ="DQ" = MINUS; //主机拉低单线480us * ~1 H, J/ B1 U6 C* M
delay15us(40); //产生复位脉冲
0 l& w" }( ^1 h DQ="DQ" = PLUS; //上拉电阻拉高单线60us% O: Q/ X# l$ R
delay15us(4); //延时60us
8 R5 r1 u# |! c- B3 c& o3 b' p+ K' g6 a8 f/ ~
while(DQ & PLUS) //等待DS18B20应答,拉低总线
$ g: W8 w  X- j2 K- _  K; F ;
; e. P9 {; V- P, {, W' Q* V while(~(DQ | MINUS)) //DQ线被拉低以产生应答信号; v, y1 D6 \9 l+ O1 E
{
3 y0 T6 S2 b2 I. u* T/ e flag="flag" = 1; //初始化完成. N8 k9 G' C( q
         for(i = 0; i="i" > 1); //每读一位,即右移一位,将新读的位放入最高位! M1 G' C2 p3 |& x, p8 [
}
; W& K* ]. _1 N, y& p1 I _nop_(); //读时隙间隔至少1us
5 Y( m) R' j% j' l return(rbyte);# N5 f3 G# \5 a! M+ z  u: e; G
}
4 i) G& Q. w5 o% b2 H% \5 `//****************************************************************************** I  g* M* ?/ c% A* Y4 v
void read_temp(void)
; n' z3 d0 F2 @9 w{
1 `* l* k  q$ s! N' ~0 ^$ A9 X7 i uchar temp_lsb,temp_msb;7 T+ s& g/ G% J; i# D0 c
Temp_reset(); //复位DS18B20
& E4 X  ~1 e; y  ^. R Temp_write(0xcc); //跳过读64位ROM序列号命令,用于单线接系统 [Skip ROM] [CCH]9 u6 c* g! @7 D
Temp_write(0xbe); //读暂存器 [Read Scratchpad] [BEH]
5 i1 J. n# p$ {; g8 g& ? temp_lsb = Temp_read(); //读出低字节
# ]% B5 b8 ~9 z/ m5 G( c: d temp_msb = Temp_read(); //读出高字节
2 Q* W, t, K+ u. ~) f temp_value = (((uint)temp_msb)
2 s0 [( t8 \* x( D#include
& l6 M1 Z0 v) I! D9 rchar code int2charLCD[]="0123456789";9 w5 T( I3 c5 q
void write_LCD_command(unsigned command) //将命令写入LCM模块
8 K5 D% S' _  z5 L, Y( D1 a; G. _, L{
! K' M# w( M7 F/ B: orw=WRITE;/ Y9 u: W- b% r$ k9 {: ~" X
rs=COMMAND;3 _; z! D6 _  d/ d8 e+ X
enable=ENABLE;. ]" D2 W( `& a) L- }* D) U
P1=command;0 f2 B7 q! v6 w: x$ M0 b& s
delay1ms(2);
: r4 G% Y6 z0 Q4 yenable=DISABLE;: G4 w6 O- T* R) h. O
rw=1;
) W4 E, h9 i5 E3 w( {4 G- M4 ^}% y) [: _0 x" h7 E& T4 L$ e
void write_LCD_data(unsigned LCDdata) //将数据写入LCM模块
& q1 Q2 W4 V# G6 g{! d/ x7 {1 m) U2 M4 |- X
rw=WRITE;
7 j- y, r6 _- H! Y- prs=DATA;
3 \- A) C+ m0 v4 Senable=ENABLE;( ]: X/ l- U' d% w, E3 W8 \
P1=LCDdata;/ i0 d6 b/ l3 c
delay1ms(2);# D' c5 u* r, ?/ {8 _0 C
enable=DISABLE;! @* f4 @6 q& K
rw=1;
6 O/ @+ Y; A, o/ T3 h}' n, D# d8 C% @- w
void init_LCD(void) //对LCM模块进行初始化. e2 {! e: f( Q; d
{) P5 \$ H; Z, J
        write_LCD_command(TwoLine_8bit); // 0x38         ( @+ M% N$ q4 a2 c( A% K& D
        write_LCD_command(CURSOR_OFF);         // 0x0C. H( a: T8 q3 e3 e$ I$ s( t
        write_LCD_command(CURSOR_RIGHT); // 0x06# z1 }) a/ B0 b; p  D4 |: U8 `( |
}, f4 j' ?$ w. i0 @' E
void clear_LCD() //清除LCM的显示屏4 F& F6 a  c- V
{
+ |; a6 W" e6 i! B        write_LCD_command(CLEAR);         // Ox01,清屏! X" \0 E0 r( X/ R! X  r5 s
        write_LCD_command(CURSOR_HOME);         // ox02,光标返回原点
* Z4 Z! M* K2 |}
7 z( D  J! p  g: a. D* Ivoid display_LCD_string(char *p) //对LCM模块显示字符串9 A. ~5 B' S3 M
{
, u' g: Z* ~# t' N$ c5 n2 o  c        while(*p)
/ @5 F0 F! m1 x# W1 c" _        {) I& u2 z# s) J! ~2 `* Q
                write_LCD_data(*p);! Q/ g. \( K" D2 ^
                p++;
! T. c& `# b- Q% B6 P: D        }
0 z8 J8 g! B; q+ c: L9 f( f. K}
) g5 B+ ^5 n8 f, `- Y! wvoid display_LCD_number(char number) //对LCM模块显示数字
! |2 i0 T- F7 w6 Z6 t4 N4 J{
: m1 d4 n$ V1 ]" q; N* }, ~2 G3 w        unsigned char x,y;! E# M% S3 s# t! g* k- l) U
        x=number/10;
3 n% B5 q3 h1 Y5 P        y=number%10;
1 o2 @. {, }( ^; L$ Q# ?9 m        write_LCD_data(int2charLCD[x]);
9 U+ K: m) ?5 o2 m, z( z5 @% {        write_LCD_data(int2charLCD[y]);1 U0 @! B3 q! }9 |
}
# v( b7 T$ C( ^) z# vvoid gotoxy(unsigned x,unsigned y) //设置光标位置
; d3 D! T6 S- }! c3 G6 E- V{
# R0 g6 {0 u7 ]. s$ s/ ~& f. n        if(x==1)
3 g6 a5 `5 N  H- C1 T                write_LCD_command(GOTO_LINE_1+y);9 S! G( s' ~* `
        else
0 w+ ~: V  @% S/ ^- a         write_LCD_command(GOTO_LINE_2+y);
5 t; J: Y& H* L! g- o}

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

本版积分规则

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

GMT+8, 2024-6-3 01:16 , Processed in 0.259416 second(s), 30 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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