|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机水温控制LCD显示加VB上位机温度曲线绘制6 {8 ~! x: U6 V% d
3 {( M" M, b7 z: ^7 _% [" K" M
`1 E+ y. a. j* R" N4 ~实现功能,1L水由1KW电炉加热,要求水温在一定范围内人工设定,并能随着环境温度改变自动调节,以维持设定的温度不变。& U* |5 | }% m& `# H
矩阵键盘输入设定温度,LCD1602显示温度值,VB上位机绘制温度曲线! K) ^4 ^$ h. }2 \: J) B/ N
, o" t1 }' [. K% e9 z% P8 l' B, f- b/ C: J2 a7 p. ^( D7 T
! I5 E3 X+ M2 C w8 c
0 f9 P' i d. Y# [" m. X \; H9 o5 Z
/ G: \% V. w7 N5 K, H& T0 j( Z+ g/*******************************************************************************# w& a7 H* Q V3 k6 ?4 {( ]
* 实验名 :温度显示实验
- \ z0 R7 y# A5 z r* 使用的IO : $ r, `4 d5 X% \
* 实验效果 :1602显示温度% m4 Z# j9 G6 @" x6 ~
* 注意 :% L6 M& }2 h# \8 @
*******************************************************************************/0 R# w& Q5 d/ R: ?. e9 }
6 Q- {# `% T4 j
$ P3 n0 M) W4 J8 G. H5 J#include<reg51.h>& q% h( L0 T0 P
#include "uart.h"
7 d5 p- w" K" q ?4 p#include"lcd.h"
, U! g7 `9 i2 h1 J I#include "juzhen.h"- `" I" h2 O3 ]
#include"temp.h"
/ j( v. p' E* G2 D% wvoid LcdDisplay(int);7 R/ s+ `: s/ N( O
void show_zi();
' K" Y, s- w" c1 H" W, L. ]0 A/*******************************************************************************5 \& h8 h7 l0 m9 s7 c
* 函数名 : main7 B0 P+ F2 l& n. H& j4 K7 L
* 函数功能 : 主函数
B+ z! P6 Z+ K2 z" n( P* 输入 : 无
" @8 M4 J/ s8 a0 O( c* 输出 : 无
; `6 F. J2 f2 F1 g' O: n, p$ h*******************************************************************************/
3 o6 R7 c9 q* S3 X. k7 Mextern int key_value;% s1 ?# Z0 X) I
: T- F, t% Z3 L& ~7 w6 w
9 n& f6 i7 V lvoid main()% n5 n- @: n" H& a' w5 l
{+ A/ z/ s' @: `& {3 |: a( A
UsartConfiguration();
, v" h4 \6 _' o LcdInit(); //初始化LCD, a$ r" K- V ~* F1 Q; i- h K
show_zi();' u/ J, Z8 d/ l' ]! ?
while(1)
% ]) r* P6 u, I! Z8 o& @" V( \ {+ F. \; k3 {- `6 B' N
LcdDisplay(Ds18b20ReadTemp());
: i' b: o; ]' S4 ? //Delay1ms(1000);//1s钟刷一次0 B( W' |( \7 P0 C3 w+ R
key_touch();3 K+ F8 N7 \3 `
LcdDisplay_input();
/ M/ G3 D: x7 _1 _9 f( l( k compare_temp();% q- j3 s+ `' g0 k- u
}9 _$ h/ x7 ?, g: U
}( j% p8 U% }* ?
& k% V; n& k" C$ l7 u5 E+ X
# W. `1 s8 B- y
/*******************************************************************************
2 ]3 u1 _. u X* 函数名 : LcdDisplay()
. C, P. ~ G" A2 c4 Z0 V X+ V* 函数功能 : LCD显示读取到的温度
3 h6 Q' G8 ~: c9 w* U* 输入 : v" e: H" g9 Y5 ~; X8 f) B' k
* 输出 : 无 A$ B& e$ H; E3 q
*******************************************************************************/$ x( \; U2 l3 f# _, `
unsigned char dates[] = {0, 0, 0, 0, 0}; //定义数组
4 j! @1 g- |3 h; [void LcdDisplay(int temp) //lcd显示+ y" P, b+ C! M) |1 ^6 \( L
{8 A" F$ q4 @" \# A- N' J( Y& g2 ?* k+ L
9 T/ z0 C# S u$ Z: i : C1 c4 }# g! b0 \6 [/ G
float tp;& H6 n. ^& e( x/ s- Z1 S
4 a& h6 P! B5 [, d$ L, g6 [
// if(temp< 0) //当温度值为负数& k8 F- z- Q {& g, G, D' \2 [ A
// {9 V+ e& y z* ?* J
// LcdWriteCom(0x80); //写地址 80表示初始地址
T) B$ T7 N/ N- P9 o& w// LcdWriteData('-'); //显示负0 Y6 l' \8 u+ c' [$ `$ ] Z! ~
// //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
- J) K4 n: O/ r2 S0 \// temp=temp-1;
% M- M r, s2 W// temp=~temp;7 d& m/ p' q* B& V2 z& W
// tp=temp;+ A* Z T+ B, x! R$ ^9 c
// temp=tp*0.0625*100+0.5;
! I/ h1 F6 J9 m q8 \// //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点( v( Y! }0 o9 o: x
// //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就0 v) {1 j: ?) r# j
// //算加上0.5,还是在小数点后面。
* |/ G: D) V" H, _$ e//
" J) r& n- h' H// }# g( ]3 k4 S" B& k# z' t! ^' Z- s0 M
// else
2 w7 x5 T) e! j% |, K1 U* P //{ # n$ X% @8 B0 H. O; x* {
LcdWriteCom(0x85); //写地址 80表示初始地址
, X0 F- ?. o5 Z LcdWriteData('+'); //显示正/ u* W5 V+ @5 g
tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
& ?8 C* Y' P! d' D" j) v //如果温度是正的那么,那么正数的原码就是补码它本身
4 x. }4 ~' H4 w temp=tp*0.0625*100+0.5; 6 Y# J% Q5 _* e: R- [3 b; _3 L
//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点1 {, x# P: ?) u' h0 }
//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就. T! |! P% R; K! R1 x% `0 K
//算加上0.5,还是在小数点后面。
& Q: g! y$ N; D! k //}
' o% O. b/ D4 n% I+ x dates[0] = temp / 10000;/ |( M- P- l8 m2 ` u# j9 A W
dates[1] = temp % 10000 / 1000;
1 f# \4 G4 ~" u- [/ I, n- I dates[2] = temp % 1000 / 100;
9 I" L5 h* q* r9 i, ]$ ~7 A. W dates[3] = temp % 100 / 10;+ }) c# C+ Q9 [# `$ @4 E: g; j5 e0 M; _
dates[4] = temp % 10;
, v& T) d2 i4 z8 r; x% B % j9 i% b2 R# v3 o5 a$ P- `3 v7 f
LcdWriteCom(0x86); //写地址 80表示初始地址& U; [- W0 ~3 O: X# n
LcdWriteData('0'+dates[0]); //百位
0 \, q3 K1 A& m0 W9 W
: l2 H$ T/ h" K% R* s. T
! ?( M$ }; q. K; g$ T h2 o# `1 R+ {3 r
R; [5 @; t8 s: M) S
LcdWriteCom(0x87); //写地址 80表示初始地址
6 i2 V& l+ a! c+ }; R4 L LcdWriteData('0'+dates[1]); //十位
( Y, f }' v. e6 ^ SBUF = '0'+dates[1]; //将接收到的数据放入到发送寄存器, c) \+ l, T+ g1 j& O
while (!TI); //等待发送数据完成
7 O$ x* u0 K2 V9 h7 J TI = 0;! X9 A& z3 C6 l" P9 L7 t
9 F! _9 e( R) y& a; s' a
" L. S0 }+ K6 V5 M' @' F LcdWriteCom(0x88); //写地址 80表示初始地址
3 x0 x! |# z) N7 k* Q: S# n) K; g LcdWriteData('0'+dates[2]); //个位
$ k* p3 }! d0 Q# G SBUF = '0'+dates[2]; //将接收到的数据放入到发送寄存器
* S; F6 `6 ^& x. ~) m while (!TI); //等待发送数据完成: [* p5 Q6 Z& c/ y
TI = 0;
3 A4 B9 D# ~1 }/ \$ T* |: _8 U
& `1 j5 U$ h- q/ V! y; R! l X( G- a+ Y/ x
LcdWriteCom(0x89); //写地址 80表示初始地址1 I8 }; f$ |- X, J0 Q7 C
LcdWriteData('.'); //显示 ‘.’
0 Z- A0 Y \# d$ G
) C9 u: S y5 F# s0 q1 P5 g$ g+ v& ^* h* |3 H/ I
LcdWriteCom(0x8A); //写地址 80表示初始地址$ h! o; e- r7 t) R! P
LcdWriteData('0'+dates[3]); //显示小数点
' [& ^6 J: @+ G& S2 s3 T2 j
A. Y. c' N; m! m7 m# N) i
A/ V. f5 ~! L- \ LcdWriteCom(0x8B); //写地址 80表示初始地址
3 `7 Y6 `$ f% d, Z4 q. W: } LcdWriteData('0'+dates[4]); //显示小数点
* f& S; j6 b- A. w1 t" M
7 l3 H* x" \ O
8 W5 r) I: j4 I LcdWriteCom(0x8C); //写地址 80表示初始地址0 C- [# p0 G4 H3 r
LcdWriteData('C'); 3 }# G3 ~- q# F$ v/ w" v
}
1 j6 d: i$ }* y. k% K; V0 U+ w6 [ void show_zi()" L) e, y% a" u" {: A
{8 h* q; @7 w* w) j! f% c
char temp[6]={"Temp:"};
3 s5 W4 X! E( `" N* N0 X( z char temp2[6]={"Hope:"};
! P) a1 b* G7 k. c" g int i;
3 n3 M8 E+ k z for(i=0;i<6;i++)
X9 f( _: ~4 z% k m# E {8 `% }6 Y% i U+ n+ p H# L9 `
LcdWriteCom(0x80+i); //写地址 80表示初始地址
# R) E. x6 h7 X3 g LcdWriteData(temp);
; i. i0 u5 W, n$ f! v/ m ?. i }/ H) o6 Z3 j6 O9 [* h# S
for(i=0;i<6;i++), S, `4 ]2 m" s
{
4 m# U+ d- b$ X( z! x LcdWriteCom(0xC0+i); //写地址 80表示初始地址
1 F; p* Y2 p f- H G$ v1 g# ?/ g LcdWriteData(temp2);
* t7 d5 w- I. J6 V7 o }
# n$ e+ E8 W( v/ n! }' d }
* z6 U; b) ~0 f+ y/ I上位机源码和下位机源码:5 v% U V; t; r7 O) G
5 P' @, B5 R$ ?+ {9 n& d/ A! A$ R2 O8 z: Z8 s$ S
|
|