找回密码
 注册
关于网站域名变更的通知
查看: 208|回复: 2
打印 上一主题 下一主题

关于单片机+ds18b02的一些小问题,等级判定应该怎么解决?

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-11-15 10:52 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
温度已经能正常显示了,但是蜂鸣器和led灯一直不合适,这个逻辑应该怎么改6 X& J. x; Y# Y+ n$ ~
3 {  W3 {7 q7 }) f. v3 T
以下是主程序的代码,根据开发板的程序修改出来的,显示完全没问题,就是判定等级的逻辑不合适,我觉得我写的逻辑应该没啥大问题,但是根据读取的温度来判定等级就是不合适,判定逻辑应该没什么大问题,请大佬帮我看看2 k3 ~# s2 z5 c/ W7 m/ a

1 f" d! r) j: `* j1 l单片机源程序如下:
6 q8 H2 j: E- q$ O* W0 T3 X#include<common.h>
& D7 I% d! k4 d- s! j( J8 X#include<l1602.h>. A3 \  v3 @2 ^# C  J
#include<temp.h>0 i: c. x6 i/ ~! |( F
sbit led1=P3^0;8 ?% M8 G8 g% }7 m& d: d
sbit dz=P3^3;//蜂鸣器# ^, [3 Q% m. A; a5 i5 `
uchar buf[20];* r' e( z& u" E0 M6 ?  t0 e9 d
u8 s;! Z4 x& f0 E% T
void LcdDisplay(int temp);
  _: Q8 z; g9 q5 Uvoid level(int temp);
; K: |; g1 ?/ m5 k7 {void Delay500ms()  [url=]//@12.000MHz[/url]
+ S, k  v' L/ p! M, e{
& T% Z' S# ~0 m6 }unsigned char i, j, k;
% I+ q  c0 Z$ h: p6 W# \- |6 T$ A- K. b
i = 23;; v! j9 t7 K: d0 e: g
j = 205;
0 @# h- _5 r# f0 J/ Ik = 120;
9 r$ J" ^) ?( E% ?do
4 q* b  y' C1 d{. |1 k* e4 H! w8 T) h
  do
6 L4 T1 Q8 ?7 p  {0 \6 c0 ^$ K) \2 `/ c- g0 {( i
   while (--k);
; U3 U0 R8 I" d6 V1 `: O  `$ ?  } while (--j);4 V! a) j" K) _2 {
} while (--i);% O0 G$ }; A, @) N0 B: @  o* r
}' s/ Z2 ^7 s0 h/ q
void main()
. Y/ J& r+ I, c0 `{1 J" H0 {+ M% Z: h. t
int x1;7 P( j9 c5 L# z; ]5 C$ t/ f
float x;8 u- I; i2 v' _; V6 \5 [; T5 p
led1=1;dz=1;
& p2 q' j9 N6 G* l. T% k7 l) SLCD1602_Init();//初始化液晶7 i) e2 z& |# b8 ?
delay(10);& w/ F) I' y! X9 t  f
// LCD_Clear();//清屏* q# n* }7 N, L/ ~6 p4 j7 c6 z
// Delay500ms();
! b5 A8 k0 [  T/ y/ xSetRowCol(0,0);% j. c+ h8 X* G8 y' p, Q
DispString("Temp:       C");% I7 k) K* _' H- h: E
  SetRowCol(0,0);
% X) K4 H. ^0 b. YDispString("Temp:       C");
0 W) s9 a9 E% b# b. Hwhile(1)
1 j; L. A* K( t+ O( I5 z" s7 G{
7 J/ h7 T, B: P. A( o  x( d  dz=1;
' f2 I9 t3 Q; q+ R/ l; \1 I7 f  LcdDisplay(Ds18b20ReadTemp());/ F) W; d5 f  R5 w
  Delay1ms(1000);//1秒一次- u8 p' R7 i! I0 @* i
  x1=Ds18b20ReadTemp();; M7 @/ x8 ~1 o# w+ C: b: R5 B
  x=(Ds18b20ReadTemp())*0.0625*100+0.5;
& d" X& k+ y, D2 V// x=22;
2 d7 h0 [7 a6 U3 ~. m4 z     
7 B; I9 f1 X4 E& _3 E/***************************等级判定***************************/
1 Y8 r0 u8 S0 Q. w& E  if(x>=20&&x<=30)
6 ~7 S7 M: G5 H# ]2 Q  E' n" B      {7 x* e( I7 C9 ?; V
      SetRowCol(1,14);2 Q  ~2 F+ ]0 w- u8 x% N2 K( R; e4 d
      DispString((u8*)"L");# Z% v5 ]: P( {4 {# a  u
      //LCD_Write_Char(14,1,'L');
0 Z4 F8 R3 ?$ b) ?( h/ ]      Delay1ms(1000);
; r8 R! U, p( U) \( Z2 \      led1=~led1;) H6 a& q! v8 a
      Delay1ms(1000);1 z$ P8 P/ K/ R* S
      dz=0;9 i1 h% z, w( H. r6 `8 ]1 \' D" O
      }
/ {( h( n; p/ u+ }9 X      else if(x>30&&x<=40)
2 C" g2 n6 e" A0 l3 a      {
" N6 @, H" _5 n0 x! z7 S# @2 ]//      LCD_Write_Char(14,1,'N');- \  _9 j, I# ]' F- S
//      Delay1ms(1000);
4 s' k; ~5 D$ e2 X9 D/ z      led1=~led1;
# _8 n8 i6 i* L7 _2 @( Q' R* i      Delay1ms(1000);
$ [, q& n1 O4 Q2 U4 P      dz=~dz;
3 j5 L, L# N" d! e! U! ]4 n4 l! V      }
9 h2 o9 [8 X9 h. e      else if(x>40&&x<=50)4 t2 ~( x+ c- @0 u
      {% X4 z1 [/ {7 ^/ L
//      LCD_Write_Char(14,1,'H');
2 R5 f4 }( |# W4 L9 _7 y# `! R//      Delay1ms(1000);4 Y. D6 d. J  P+ i) K  W
      led1=~led1;% y- s1 W' w6 s) \. y" y
      Delay1ms(1000);+ Y# {* S. L; \0 `% a/ ?7 s2 \
      dz=~dz;
$ [0 a. d. J. F2 K' U9 Y) B0 X+ z* Q      }- @* _5 |' l- c, Q  ~4 a+ o# [
      else  o+ X) i# }% U" ~
      {
9 }' g4 m& f& W0 u- q# ?//      LCD_Write_String(0,1,"                ");# m9 @  b3 i& s5 O7 D6 G5 Z, n1 x
      led1=led1;; Q; v) i/ K' v6 N) W; O0 r9 e
      dz=dz;
0 `: B6 d- Q8 o7 a# `* S/ S% m  y$ F( n
      }' x! ~! c1 \" Q/ d( X; v( }3 h9 N& D
}
( O+ }; J2 @6 f& L  \  ; `3 H: m7 ^/ A; j. K
    N! E$ {1 m0 Q0 d
/******************************************************************/
' O+ |9 y/ B* x' Z- |& E
3 {2 a; m4 o, q9 j- P$ L}
1 F" \6 b* ^8 M; Evoid LcdDisplay( int temp)   //lcd显示4 j. ?( [- ]3 m4 t5 W
{+ f3 w8 `2 j# K, w
   float tp;, X* M. y) V# C% ^. X: P5 U4 A0 m6 G/ T
   unsigned char datas[] = {0, 0, 0, 0, 0}; //定义数组
2 {0 e7 I% q" [# l7 y, {3 T% ^0 t3 \3 ~) H
if(temp< 0)    //当温度值为负数
; ^3 H- e! `9 ?9 A0 x8 R5 s+ M   {
1 |0 o+ T) @. Z# D0 h- _   LCD_Write_Char(5,0,'-');//因为读取的温度是实际温度的补码,所以减1,再取反求出原码
1 ]- s# k" ?6 @& e   temp=temp-1;/ z, h9 P  u# c/ o# e/ ~0 f
   temp=~temp;: r0 }9 }; m$ i1 K& \6 n
   tp=temp;
" t. g  S4 Z/ ]1 ^. d  W' o   temp=tp*0.0625*100;) k0 p0 o$ ~' ~6 z' N* p" W3 s
  }6 w. R6 r5 N7 W: T7 z3 i$ ~
  - T9 o6 Y/ h5 X
else3 r) n6 @2 G0 {/ u0 w
  {2 R* o* q# Q2 G; j; i7 x
   LCD_Write_Char(5,0,'+');7 T& S4 T/ u  [  b0 a. j4 a
   tp=temp;0 i( h  ^4 M1 W! L0 l. H/ ?8 p
   temp=tp*0.0625*100;
5 c0 x1 j9 X/ T/ U' s9 X  }
1 |0 X$ E' R2 |  m5 B* tdatas[0] = temp / 10000;
* r4 R& O6 G; g8 `  f# Pdatas[1] = temp % 10000 / 1000;" \* S' B& l6 l( Z. l: `
datas[2] = temp % 1000 / 100;
1 x* s( N2 W/ l2 k4 xdatas[3] = temp % 100 / 10;" K% K) ~7 y/ x+ d
datas[4] = temp % 10;
/ @  g/ G2 X/ z  L. Q$ nLCD_Write_Char(6,0,datas[0]+0x30);
3 E8 ?1 k- K9 [' L' M; qLCD_Write_Char(7,0,datas[1]+0x30);. R3 J- _# F4 l3 _
LCD_Write_Char(8,0,datas[2]+0x30);. m* D5 u% W8 C( w$ j
LCD_Write_Char(9,0,'.');3 W! F) {9 Z  `9 q* \  L6 }5 ]" U/ T
LCD_Write_Char(10,0,datas[3]+0x30);1 K& F% X$ y; R* q& b
LCD_Write_Char(11,0,datas[4]+0x30);5 Y0 K& c8 j) H' _6 t1 H; o2 M
}! C2 o7 ~6 m/ x+ K' V( D

: ]/ }& L& N) D. |9 L. ?6 `$ \; ]1 f; M

' m% z; P3 _7 y; V* J% Q4 }2 M. X9 A% z- [8 L% H
以上是主程序,以下是18b20最后的读取温度程序
# ?: L/ b* B, o5 v3 J1 w9 s/ d
  Y' p# x! y# Iint Ds18b20ReadTemp()" m! ?, ?  v) ?9 j. O0 t
{. w8 k' `7 p& ]( y# |
int temp=0;
/ B6 f( C; G9 B; s, i! i3 Tunsigned char tmh,tml;) L/ W( e# w6 m' f
Ds18b20ChangTemp();     //先写入转换命令" V& M7 F0 j0 n/ g' [
Ds18b20ReadTempCom();   //然后等待转换完后发送读取温度命令- F, l8 i! U) g2 b
tml=Ds18b20ReadByte();  //读取温度值共16位,先读低字节
1 U. h( \" g: v; x  C) ?# E" F4 w. Ctmh=Ds18b20ReadByte();  //再读高字节9 q3 H* O9 `0 \$ a2 {7 W; X; T( r
temp=tmh;6 c  U0 e% F& C# G# |, a/ {. `
temp<<=8;
9 y8 n; M2 a& G; ~  }4 M' E" [  wtemp|=tml;4 K/ L  [! I6 `' n4 M/ H
return temp;8 ^$ i  Y9 m; ?/ O: f: z2 {
}
/ a  x7 F' d5 ]

该用户从未签到

2#
发表于 2021-11-15 13:44 | 只看该作者
9 n- Y& t) \/ b, d' i6 {; s9 `
先确定你的分级是啥样的,不同等级时蜂鸣器和LED的显示是什么个状态,然后再去实现
3 ^( E) K5 H+ j4 Q' w1 A, t7 ^

该用户从未签到

3#
发表于 2021-11-15 14:20 | 只看该作者
9 c! V' e6 {2 Y" W  X* R! k- N
你这C语言学的,如果在调用之前定义,就不用声明,如果在调用之后定义,就需要声明一下,然后就可以在调用之后去定义这个函数。
3 n5 t( F8 J+ R% k5 @. j还有,你都没有搞清楚声明和定义的意思
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-19 18:55 , Processed in 0.125000 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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