|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机使用LCD1602接收串口数据
}0 n' l- s, q
2 u! X5 F& Z" A. ^6 `( v! Q% A2 g
/*
* o8 M4 c/ q7 C3 g. p. a晶振12MHz,波特率1200,
* z S$ w0 a* @8 G& Y2 I' T& s程序启动后单片机主动发出Hello Server,
) j! {, f1 ^$ {; E. ?PC使用串口助手应答单片机,
- o, ?& {4 w. L. `, v+ \9 n单片机收到数据后,不做任何修改返回PC。
! g2 M: T' G1 Y5 e6 ~' r使用LCD1602显示单片机接受到的数据
+ G7 [6 m3 S( P+ q$ Y6 e' w*/9 b3 J% e; F: T& K4 j9 C. d
#include<reg51.h>
! J2 r- ~; r8 _" p5 v#define uchar unsigned char
1 q8 O1 Y0 m, m0 J+ H5 k s#define uint unsigned int& o9 ~4 Q9 Z$ M" t, s4 s
uchar code data1[]="Hello Server";
+ T: Z& |& f' t& S+ ~sbit EN = P3 ^ 4; //液晶使能端
6 L$ n7 \2 G' {* ^sbit RS = P3 ^ 5; //液晶数据命令选择端# d- f1 R/ z5 s- ?7 R
sbit RW = P3 ^ 6; //读/写选择端(H/L)% S$ c* x& ~; t8 }; t
+ D7 D. |$ l; Huchar num;$ x' e- A8 o! Q z% Q2 R" @' P" K
uchar count=0;" x' m, c( o0 ?6 |* `) r* n/ f! p% C
char a;- F. t& b6 w7 M
char old_CNT;
2 n5 H% f& H xchar CNT = 0;
3 `# {" {- r( W6 ~% ubit flag; L" R* k# A( f- f
char temp[16];
9 V- g, h0 Q7 A' E! L) N! p( ?: \6 }//作用:延时 z ms
& _' q' {5 f. H& M! `3 ~6 e//参数:z" ~/ s7 g1 X- V* F- }
//返回值:
6 l- h4 ]5 i* P3 xvoid delay(uint z)
9 f b6 V$ k; A, Q0 ]* [{, p- b) e) n4 ?4 j2 ?) r
uint x, y;- Q' H; Q/ V: U% R- S
for (x = z; x>0; x--)
, [3 l& S; H2 ~9 |/ Q6 V8 _& [$ Y for (y = 110; y>0; y--);& @( N1 J5 _+ F! M" |! P8 V
}; Z- q; X- }! S3 M K; x
% G$ g& {' p$ {& j9 p$ E3 F//作用:写命令" M6 | b, p6 \: c7 `
//参数:
- e; F* ^5 c# \" z( I) `//返回值:' W: k w, }/ m
void write_com(uchar com): |# z' M' m, A
{- K/ V0 e! ?# k8 _
RS = 0; //命令选择
$ V$ r; t6 |; S2 [9 |% n RW = 0;
7 U4 y% n/ x: E" U8 R0 j/ \ P0 = com;
! e6 Z: L( k/ W7 y4 j# G delay(5);
& K3 W4 W3 J7 A" T# N1 X% j EN = 1; //使能E开
0 [! c, \9 `& e delay(5);
, P K, j* f8 T; F6 I7 B- j; { EN = 0; //使能E关
0 I+ ?- m: }) a4 ? delay(5);) f' [0 e& x% O+ x4 F1 l. l( {
}
0 ]6 d: o) i2 d4 a" T5 Q; K" `2 `7 `0 A, r1 T6 F4 y
//作用:写数据; A, j+ d r$ H# c; k' ]4 ^
//参数:
, k$ l: M: P3 g0 L" L- d4 c//返回值:& Y; o1 E; v! a/ |' X& B7 N( K* ?+ a) ]
void write_date(uchar date)
' o7 N$ p% \0 G' C9 u+ H# M8 _{( j, C% C+ I2 \& T7 |" J6 {1 w8 X
RS = 1; //数据选择5 [" @) c- m$ M' J) @: q, n
RW = 0;" E7 l, x/ D. F, ]
P0 = date;. M4 L4 g `5 R3 E/ r6 `
delay(5);
0 d; S3 W: E. j3 E( ]! s. u EN = 1; //使能E开0 ]! c, M6 @1 r
delay(5);* H! g2 @/ r" l& s% D
EN = 0; //使能E关0 |# H v* d, n& k% n5 o0 E+ K$ T
}
. v; w# R- t" g% C3 e/ T7 O. e/ {! o! M- S. d! {, N6 n
//作用:LCD初始化
1 X. n, H) E: _//参数:
% u- O) e8 l U5 L% a& e9 a; j% m4 m7 }//返回值:" W8 b6 t7 @0 ?( i3 W% W2 C8 _1 }
void init_LCD()
: P8 X4 V3 Z, Q/ h. Q{. m+ u" }0 i, v3 ^7 U8 V& j& |
EN = 0;5 @# H! [. O. C8 a, _; m! }) M$ F X* u
write_com(0x38); //设置16x2显示,5x7点阵,8位数据接口% e! ~0 M+ `* i, Y) g( H4 t6 T
write_com(0x0c); //设置开显示,不显示光标
+ i- |8 B- I0 S5 \/ w- o write_com(0x06); //写一个字符后,地址指针加14 z, E1 b0 }2 K6 S) J1 F2 [% B
write_com(0x01); //显示清0,数据指针清0$ N" X5 p+ j6 v- ], v# _
write_com(0x80);: g$ S+ D: H- q5 F) E) Y Y
}9 \- @; H ?! }% U
//作用:串口中断初始化
/ c7 B7 [* t" @) N//参数:
& m6 \; C2 P/ x. h) q$ M6 J2 F//返回值:4 M- v2 Y$ z$ y- I; U/ m1 Z1 T
void init_Serial()2 G- l. B; j0 i6 S7 Q5 L
{) B W, s' i) N# E* B; T4 [- R' r
SCON=0X50; //工作方式1,允许接收
% I. e! ~9 P( u$ N m3 O" P7 O //SM0 = 0;
5 U% C5 g" o4 p9 N //SM1 = 1;% D! A2 c, g( b; H, _
//REN = 1;7 u5 g+ t) Q- J7 S, s: ^
TMOD=0X20; //定时器 工作方式2
+ e9 r, u. e, P% V TH1=TL1=230;//波特率为1200
# S. ^7 [/ h" k" M6 U( C6 W EA=1; //开总中断
0 U H5 H* h' p3 u) W7 E$ G TR1=1; //T1启动& I: _! z7 ^& b* h( ?
SBUF=data1[count];
$ Q1 H r4 t0 K* \6 |& M0 d ES=1; //开串口) U$ a6 g6 Z2 R! r4 I8 b0 u/ y
}* }8 J1 e9 |6 s: W' [( j4 v+ d
//作用:串口中断服务程序( J) ^% H" O" u& g* Z9 K
//参数:
( t; x7 C- w. N; X: [//返回值:9 k) }2 j# [% ^; j
void S_proc() interrupt 4
" ?1 G1 F/ [- n4 ~ F y' V6 H{- N! }) C! `: K& X n
if(TI) //发送结束- W6 Z2 {% }7 E8 W7 Y
{
- K7 y8 s: Q- N& G- v, d5 C TI=0;
1 S. f+ x! Z1 ^7 L5 H3 U3 m. U if(count<12) M _+ t; E3 l7 p* p1 v* ]' U
{
+ K N; M. _% e0 X SBUF=data1[++count];
& S3 R" e8 z0 v }" h u, _. V* y, C( v E
}- W( C3 Z; B3 L1 h$ u- L
else //接收结束1 n5 d8 R3 y% G# C! j( }4 N
{
0 |' j9 L: s! d* y( r" `8 W7 M RI=0;9 e) S4 P8 U" s8 \/ O
a=SBUF; //存数据
- A: u4 |" K8 ?+ R* U/ H SBUF=a; //发送数据
$ P# d3 w4 S: H0 r1 r; I+ m" Q while(!TI); //等待发送完成 ^$ V5 ?& H) K. L6 _
TI=0;8 n4 C: G' P, y
temp[CNT++]=a;* C# A( s: g3 X, B$ p
flag = 1;' |- G2 h @# M% K/ t9 T) H& E, Z( C
}, J. ]9 l$ k4 d3 U$ G5 f0 q
}
4 G$ ~5 \* M0 w( b$ p2 w2 A* H0 I//作用:主函数: B6 m& d. O) ?1 s$ ?
//参数:( \% x# S( |/ u: D, W# q
//返回值:/ J/ H1 N5 C/ x& B y# d% E9 ?
void main()
7 r& w$ g3 e0 Q! }6 ~# `+ k{
8 r& h! v! y6 B: s5 k- P8 I1 n L, k int i;# c2 F$ C# Z% b1 V- r
init_Serial();% N! }: s) G9 J2 {( x
init_LCD();
/ B* a R( i0 O! m V) S while(1)
0 U( n* p6 u# f$ Z- W3 w) a {
6 g' Y' G. R# v. b# S, S' q // LCD显示
2 i2 D0 t" ?2 H" h% Z write_com(0x80);6 c6 e6 F7 w0 ]6 E% I3 U
if(flag)
1 i( u2 C7 d9 o+ v E" q {0 ]" J5 C8 c+ T9 }/ K
//write_com(0x01);
3 r1 G$ v" x: s for(i=0; i<CNT; i++)/ H/ Z( {4 T! c9 A8 G+ @8 B
{
( J0 `& [8 @( q1 e% a8 {; J write_date(temp);
8 @. H9 k6 g: O5 h# d( C // temp = ' '; temp != '\0'
! d) n0 b. ]" ^! Z delay(5);. f5 x' V) ?! g r
}# H: g4 u7 ]& D# b {! [
}) ?' ?( R2 z' a) X+ O, S9 s
old_CNT = CNT;
4 p& y* B' y6 B# i, g) s( j; @ delay(100);
/ `5 r8 F. ~* s8 I7 a6 X# H if(old_CNT == CNT)
( m! {1 E: H& M; x {% Z$ h# q; L$ A% J7 w
CNT = 0; Z! c5 |6 p6 d" m# z9 [ t( d
flag = 0;
$ p8 J" E2 Z8 m# Q4 X }" m1 ?( B4 k) ~! M
}$ {& n3 f" x" @# W
}
* Q) _& b/ C& o, ? }( x! _
* Z: K$ z! }, t; M
. h; |0 ^9 E; Q: t. l2 V/ ?8 F6 |; C |
|