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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
温度已经能正常显示了,但是蜂鸣器和led灯一直不合适,这个逻辑应该怎么改7 ]& ~9 ]7 C0 p% \

0 m! @+ z7 A, o+ Q4 R1 B& Q; _3 M2 E以下是主程序的代码,根据开发板的程序修改出来的,显示完全没问题,就是判定等级的逻辑不合适,我觉得我写的逻辑应该没啥大问题,但是根据读取的温度来判定等级就是不合适,判定逻辑应该没什么大问题,请大佬帮我看看
# d* v7 z% I2 }
8 l" u0 f5 w2 w) D2 g+ B单片机源程序如下:, t% \; I! p0 f1 N, u: S
#include<common.h>$ n+ h! C% x; F' P
#include<l1602.h>
' }. y8 S& f' q4 {/ W: t#include<temp.h>
/ {. E3 ]6 ]: F7 a, ?5 c  }  V4 L% ~sbit led1=P3^0;9 {. j- s; K- H( q
sbit dz=P3^3;//蜂鸣器4 X8 c: y; B$ P2 P
uchar buf[20];8 r; \! J8 P% C& ^3 ~
u8 s;5 S# n% f$ l5 r! ]
void LcdDisplay(int temp);- R& J5 v; ^7 q" N: _
void level(int temp);# [: Q' _/ v& a8 h) D9 C& }- X
void Delay500ms()  [url=]//@12.000MHz[/url]1 h. \3 `9 _( t( E& ^! Y
{
5 p$ b( v/ X- q6 d. M7 V! Uunsigned char i, j, k;
4 }. [/ N3 s& q8 a" ]8 Y! L9 ~* x8 i2 w  L
i = 23;3 r, v. i8 t- r  x
j = 205;
+ w* x9 J7 {6 V1 Ak = 120;
9 S4 U; x+ ^6 q& R1 K% ~( ]do1 j# m0 }  E  ]2 X7 G5 S* T
{
* M- }8 S' n% }7 x. v6 E2 _  do
) }: K) P' T8 z* J5 v6 R  {! A! ^- c" p/ C$ b9 b# L+ ]
   while (--k);
; T; P2 L; ~. v7 K  } while (--j);7 ~& I/ `/ ~1 p4 M( ]7 u
} while (--i);: [" k$ i, G, q/ D: R
}  w) T. J& D8 k# k
void main()) A6 C  }( Q/ P3 c- ^
{
' w1 a, E9 o+ Y& xint x1;
" m: S. Z! b* m" N1 }float x;) j4 B! g, a$ g: h! D  d% R
led1=1;dz=1;& }; n$ ?3 v$ h( z$ n
LCD1602_Init();//初始化液晶
9 b) E1 [5 V! |% bdelay(10);' M* A' z2 K' D8 Q* e# E) c' n- |
// LCD_Clear();//清屏  {1 T3 W3 _! J3 @' j
// Delay500ms();) k6 ?5 p' P8 O9 M! F* v
SetRowCol(0,0);! p5 ?# r9 P1 [/ x8 h1 ^
DispString("Temp:       C");
" r! M; J0 V' j& k6 I  SetRowCol(0,0);
. |, K+ U( X* k+ O: W/ d) tDispString("Temp:       C");
$ A& X: L& M6 Z# [( U( @while(1)
2 _& _  X0 }# _  E1 j{
, A2 F& {- `  {3 K  dz=1;- w8 D+ o$ U" T* Z
  LcdDisplay(Ds18b20ReadTemp());
3 a" j3 b4 b5 W: U1 W  Delay1ms(1000);//1秒一次
" z9 H: ~+ L8 y. e  x1=Ds18b20ReadTemp();
( x5 A4 P" q. M: u  x=(Ds18b20ReadTemp())*0.0625*100+0.5;  y' N, Y. k% v: S/ ?
// x=22;! u8 W+ b* [  C0 \
     " y' A4 H3 w- `2 [
/***************************等级判定***************************/4 T+ ^$ W# v8 i' w! t
  if(x>=20&&x<=30)
. Y# ^( I! M* a2 y      {. i8 d4 @! l9 g) l
      SetRowCol(1,14);( n7 I$ |: |! x; ^$ Q
      DispString((u8*)"L");
" m2 m; ]6 X% r$ |* G. h      //LCD_Write_Char(14,1,'L');  n% ]" v& ?. a2 _/ i4 \8 I  |
      Delay1ms(1000);
& s5 ^+ X5 P5 y& R      led1=~led1;# u6 L( I* ^6 r% _. V5 x. ^$ {
      Delay1ms(1000);
' I% z+ u; v: N( _1 d      dz=0;% n: ]; Y5 g$ y7 y7 ~3 M3 W: b
      }
. y" d0 W1 O- Y5 W9 X      else if(x>30&&x<=40)
( K+ U/ U$ f0 F( i  E0 t      {
" y2 C7 X7 j8 f6 g//      LCD_Write_Char(14,1,'N');
# Q6 ?# T7 T$ B% x& H( S# o- ~6 Z- I) ?, {//      Delay1ms(1000);
$ Z* v/ @2 N" L6 o/ \      led1=~led1;- p& x# r$ |$ Y- ]" x! x
      Delay1ms(1000);
5 @4 Z, V4 C' P! P( P      dz=~dz;
7 r  D! k  F  H9 C. ]      }* n- ?' X7 |$ ^1 r
      else if(x>40&&x<=50)( K' g4 G4 _$ q' Q9 X5 j$ m0 c* I
      {" g& E2 A' u9 r, l8 [  R/ R. a
//      LCD_Write_Char(14,1,'H');: t6 W+ {: W8 e# h
//      Delay1ms(1000);
+ ~6 b' Z4 T: I/ I5 |! L6 Y  a3 n      led1=~led1;
, v7 ]$ W! W0 @      Delay1ms(1000);. R/ s1 A5 s4 Y
      dz=~dz;5 L6 s! u$ ^; i+ |
      }, b3 N8 X' \0 D+ i% B6 h! c
      else
& `. i5 t: |! j7 w6 n- R      {' y+ a8 V' N2 a: f9 z% v) z, e
//      LCD_Write_String(0,1,"                ");
! y  s' a) K* V      led1=led1;
+ g5 ^7 N& O2 u2 k- p3 P3 J      dz=dz;' D9 d+ h1 L. P
2 S' H1 n4 z9 n  H) Z( v( o' g
      }
  W# U9 R! P8 O2 @/ w7 j2 }7 _}9 i7 `$ _# ]# p. A
  
3 k8 {6 Z# ?5 L+ Q. i: ?/ f' j  : ?* V0 m& N9 E7 d3 v
/******************************************************************/
7 i  Y& ^5 i" s2 w; b  Q4 ^1 a; a. }) [3 ?; S/ V1 ]9 y# q
}
- \; Z+ A) V% Q4 C) H% {void LcdDisplay( int temp)   //lcd显示) o* y; z6 Z* z% e9 t7 h3 F9 [
{
% H( J. ^' V/ I4 P9 X! N; {9 l9 U   float tp;2 K- b1 |0 _3 T: |9 f
   unsigned char datas[] = {0, 0, 0, 0, 0}; //定义数组
" X% f  A. \  Z5 V1 V1 q( @/ {  u: b- ^9 l. B; q( q  u' h' p! I) y
if(temp< 0)    //当温度值为负数
" }. }! y# }: n" }3 V   {
) D$ ^/ W( T- A% P! o   LCD_Write_Char(5,0,'-');//因为读取的温度是实际温度的补码,所以减1,再取反求出原码
0 w* I( Z. Y$ S0 o8 K* j- @   temp=temp-1;8 T  |3 Y/ I" X) c& G
   temp=~temp;/ g* v4 {/ k0 {. Y! P
   tp=temp;. d+ K- l  o& ~4 m5 v1 `  z
   temp=tp*0.0625*100;* @6 t" N) Q9 U! F5 i: z
  }
3 h5 ]/ r) Q# ^6 i! y9 D2 I& o# A  
, B' H& Y% l' J+ R6 `" ^: qelse- W3 a; n2 Q, p
  {
1 G$ z% n: N9 K  [& C4 }   LCD_Write_Char(5,0,'+');
( x! J9 k  k4 q# e   tp=temp;. D/ z+ B! M, d5 A
   temp=tp*0.0625*100;& s- T+ ~$ N/ q$ G! r8 _0 u
  }, N0 v* `# O% K* E5 H, a
datas[0] = temp / 10000;
2 p0 B& r" U% {' E- Ddatas[1] = temp % 10000 / 1000;
2 a& [: f- {% \. k8 M, Udatas[2] = temp % 1000 / 100;$ z) \0 S( d1 T) t) A& S8 [/ a$ l
datas[3] = temp % 100 / 10;
# h) ^9 e; H: Z7 h$ Adatas[4] = temp % 10;
1 a4 v1 B1 A- y- B' _& FLCD_Write_Char(6,0,datas[0]+0x30);
- |# I6 j5 d+ K: }: QLCD_Write_Char(7,0,datas[1]+0x30);
* M& [  X2 b/ ]LCD_Write_Char(8,0,datas[2]+0x30);
- r+ Y( `0 q) G) O9 v% u! R+ p8 ?LCD_Write_Char(9,0,'.');
8 s+ _2 I1 E9 k  K! x  qLCD_Write_Char(10,0,datas[3]+0x30);
7 d; A$ U9 N( C: a  X" ~: n( h: j- ^/ YLCD_Write_Char(11,0,datas[4]+0x30);; p9 F/ O6 F; c2 D& U% m: t$ T" |* M0 [0 u
}
6 t8 L! Z( X' v* D0 C. k/ N( Y- j$ ]" s
  I1 g( @3 b1 ?$ L1 w7 q
! O0 h6 r1 E! t& u5 }- g7 s; x
8 J; Y* T0 `- d8 l$ B( l* K
以上是主程序,以下是18b20最后的读取温度程序7 b8 G! f1 W. H, }
$ A  W2 W- g* s3 P# h" U! R
int Ds18b20ReadTemp()
/ M4 M5 Y! T0 y9 w$ l{2 j/ F  v3 G: t% A! R. I
int temp=0;
) Y+ A: ]# O2 l* E9 H( a0 r1 uunsigned char tmh,tml;3 `8 t' s" I8 R5 e
Ds18b20ChangTemp();     //先写入转换命令
$ L) O) _! J  m8 Z0 d2 mDs18b20ReadTempCom();   //然后等待转换完后发送读取温度命令( F, k- D2 ^7 l2 V! S
tml=Ds18b20ReadByte();  //读取温度值共16位,先读低字节
; @' o5 k5 f8 Jtmh=Ds18b20ReadByte();  //再读高字节9 J: j# P% M  Z+ w& H9 |$ R
temp=tmh;  A& `0 N* k2 d- i: t; @  n# L
temp<<=8;7 S3 n; M- S  ]
temp|=tml;7 ^$ V4 e, T- H& z, S7 O
return temp;
2 K0 D: p, |1 E0 [; _( M& C}
5 F/ G; X3 @8 u# b* l  x

该用户从未签到

2#
发表于 2021-11-15 13:44 | 只看该作者
* {: L) d1 {. j0 Q6 c
先确定你的分级是啥样的,不同等级时蜂鸣器和LED的显示是什么个状态,然后再去实现7 ]9 _, C+ m+ u/ X

该用户从未签到

3#
发表于 2021-11-15 14:20 | 只看该作者

9 r% m! s  H! A! F' T: m你这C语言学的,如果在调用之前定义,就不用声明,如果在调用之后定义,就需要声明一下,然后就可以在调用之后去定义这个函数。8 B% s  u) K' _: a, E
还有,你都没有搞清楚声明和定义的意思
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-13 20:00 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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