|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机使用LCD1602接收串口数据
0 h9 V! S% R! M$ u/ P$ {$ s4 V+ _' N. E" S! h+ I m
3 M8 o G5 K3 }0 t7 O2 h1 u+ a
/*/ M3 S, I7 S8 d# w. n, Z
晶振12MHz,波特率1200,$ C6 e O: X+ W& P W v. d: v
程序启动后单片机主动发出Hello Server,
" E* g4 d) g& l% YPC使用串口助手应答单片机,
]4 ?6 q+ O ]* R9 |% Q. W& f. V单片机收到数据后,不做任何修改返回PC。) x3 E) l" M% P* r8 [3 b( ]) b
使用LCD1602显示单片机接受到的数据/ m1 l ]9 w: _2 l5 T U
*/: K9 y0 J6 A3 B* L
#include<reg51.h>* w6 m4 _$ O4 ~* S" V# i. [
#define uchar unsigned char
( K0 t* P; H* e! b6 a- r* ^#define uint unsigned int7 \" W1 y5 H' H) z5 h- W. t6 ^" s
uchar code data1[]="Hello Server";4 y& ~5 g& U2 t4 o2 R: J+ b
sbit EN = P3 ^ 4; //液晶使能端
. _7 W) _9 e. n8 J$ C/ @sbit RS = P3 ^ 5; //液晶数据命令选择端& X, r# y0 @7 ^) ?
sbit RW = P3 ^ 6; //读/写选择端(H/L)/ J8 L6 {. d9 [9 s( e: d# \0 e' S" a
5 x& `! }; ]( Q- E f1 i" z3 quchar num;% ]0 B0 C; B* r2 Y* M
uchar count=0;' d8 _, A4 ^. w3 A) r0 K- G6 n0 I1 G
char a;$ T& \3 g2 C G4 ^: B% m! m0 R8 p
char old_CNT;" x. H5 s' t( `. X
char CNT = 0;
9 G) R& {4 D2 Zbit flag;; d" h' [* q3 G) H& q
char temp[16];
5 O/ \7 ?$ ?% m5 G//作用:延时 z ms+ p4 \. u. B: ^ L; ^
//参数:z4 f* J! X% Z# h2 T# p8 C3 `
//返回值:1 F8 x8 F* W$ N% W
void delay(uint z)
# z6 s+ m+ }7 R9 ]% p, [- q k{
# N2 g/ T1 L* E& b8 h* I' S8 u1 V, I uint x, y;
! C- \( Z* b& x for (x = z; x>0; x--)
# c O, m6 d8 K# K1 }+ B for (y = 110; y>0; y--);: u' [* \7 @! b' L
}0 V) i% {7 o. h9 s0 V. ] U
# y, Q% z }, ?6 D
//作用:写命令
5 h6 [* g6 w1 K9 ^" c) F/ C//参数:9 v" I; _3 r/ d
//返回值:9 d. D; M* K' u' N& n6 K
void write_com(uchar com)
) ^4 H3 h, Z% t8 I. `{
# E, t R4 W! i RS = 0; //命令选择6 n; |$ k# G( ?/ _( U
RW = 0;
9 y8 C) Z! o U# y% h! v* D0 j P0 = com;
! k8 }) _; o) x9 x. c m, r delay(5);1 J( \+ a- O9 m8 Q5 n" G
EN = 1; //使能E开
$ W9 D' H' m) l/ B8 v8 k delay(5);
: t( E: ?1 b. w( d EN = 0; //使能E关
1 e8 a* V* {" \3 K: U6 S- U% j delay(5);
s# g! b& G0 q( N1 j- O/ ~$ t" N}
% K: [8 B+ C! n0 u6 J# e
0 w; ]* }. a% `" l//作用:写数据9 x* N+ |+ q; ~7 N8 W( H
//参数:+ v8 O% c# n: v' a! Q3 X) y
//返回值:
1 F) V. q6 _' C! _7 ~3 K+ z @# B& svoid write_date(uchar date)
- e1 f$ @4 j6 b2 _1 R{
8 h+ ]; m7 l% Z# k RS = 1; //数据选择
6 o* ]& @; ]/ A% z6 y RW = 0;/ c0 F8 a# C* V+ [
P0 = date;, ]" V$ u$ P* H/ ]
delay(5);3 q: S, }7 b3 k3 t
EN = 1; //使能E开' u! l) j4 d2 R! j, w4 p
delay(5);, d# L9 e, \+ }- Z
EN = 0; //使能E关
7 q' \' z* @" f4 x' M! r}; R7 [3 Y$ ^8 A0 F6 d
: D- b0 R, F3 C7 g//作用:LCD初始化; e j9 e( L( ^% u5 `
//参数:
7 b: r9 {% A7 D& n. i4 ?//返回值:
2 A) U& ~% {. Avoid init_LCD(); O' D' ?: i$ b
{
) B' f$ x( p& X" N! s1 Y, }( @ EN = 0;4 S, I4 ^3 s& W7 P
write_com(0x38); //设置16x2显示,5x7点阵,8位数据接口
; a6 z9 R# t$ ^4 y2 ` b2 q write_com(0x0c); //设置开显示,不显示光标, ?. m% T0 E/ y( z. w8 V
write_com(0x06); //写一个字符后,地址指针加1
2 {6 o9 T7 T$ y [ write_com(0x01); //显示清0,数据指针清03 h, H5 I7 A/ C! ^% A
write_com(0x80);( C: a6 Q" }8 j' m- B' D
}
$ U! h) f8 c0 w* d8 r, G5 M8 s% v//作用:串口中断初始化
5 I/ B2 ^8 q3 m5 R3 U0 X- t//参数:; z: C- F8 i( G
//返回值:
, ~+ i- X) e. E1 J: q# {/ T- Z! dvoid init_Serial()( ^) l7 ^. z% t6 O3 `2 |
{
: h9 F% ?9 d) x SCON=0X50; //工作方式1,允许接收
( u/ _$ {* _" n- u, ] //SM0 = 0;
- `3 F2 B) I* p, @4 ?, j Q //SM1 = 1;
% N' }* h x5 |: B //REN = 1;
( D1 `( w' M& C2 k- e TMOD=0X20; //定时器 工作方式2, X, r* T0 w. e4 D! `
TH1=TL1=230;//波特率为1200
) W5 \9 ]7 _2 b* ^( ?2 T EA=1; //开总中断; {- J! ~/ T+ d3 }0 n& n
TR1=1; //T1启动
$ q; z' V! _& d' Q SBUF=data1[count];
- S: B7 A, R. h+ k! W3 h0 W ES=1; //开串口
* S- u" J' ^4 q' G}( T( X8 n+ G7 X+ T
//作用:串口中断服务程序
& ^/ h/ a) e5 }1 H. Z7 h//参数:
0 M9 M4 A1 F _5 {; n1 d! Y1 x- y//返回值:6 u. P B y9 p$ c' T
void S_proc() interrupt 4, B0 {: ]% v2 w& z
{
& Y7 h2 y. R7 H: [ if(TI) //发送结束
7 \1 K9 j0 l# ^ {
& M4 a& |7 w/ y- S0 X TI=0;
) P" Y& S. ~% q! `: X if(count<12)
% E8 K% O" q/ K) R4 ~( W! x& M {7 L" w9 n5 V- O& x R9 Q8 i! r
SBUF=data1[++count];4 Q- \* r! |7 j1 Q# N4 v0 ~8 F+ J
}& b+ }' i% b6 }3 c2 P
}
7 V' z( t; T8 ` else //接收结束
( Q6 o1 M! }' G5 h! A* ]1 u H {7 |. |6 d' u. q- ~, [
RI=0;
. w& I9 F. N! G F7 j5 [* Y" q a=SBUF; //存数据
2 _# J, j6 {( `4 A! F" ^4 e SBUF=a; //发送数据
0 O& a" j% W$ \+ X while(!TI); //等待发送完成9 c% F6 }& ?/ E d
TI=0;/ |+ N X+ h6 B. B9 ^% C8 U
temp[CNT++]=a;
5 T1 m7 l5 S! h- F) E4 a7 @% { flag = 1;
8 S B3 y- `, c' j$ [( j9 G9 p }3 n+ O0 E; \) ?- V% L7 i/ t
}9 ~* N# g- \: T: t( v4 X2 u
//作用:主函数
1 y, @, u3 t7 |( r! ^/ u//参数:
$ v N% t" I% \3 j9 Y+ @1 }//返回值:
, K1 V& n1 u$ l0 J- F' E" @$ fvoid main()
7 o- ~4 ^% b' e4 C: H$ Z4 j, E{& K! E) Z# ?; U8 O2 {
int i;
+ [; ^2 d }7 h8 m8 u8 a6 r init_Serial();
1 r4 r* L$ \$ r2 F* \& U8 F9 e init_LCD();
$ P) e( c0 e" | while(1)1 N6 I- s/ ]! d% e" R$ r
{- f% c" B- Q. ]9 I$ y* m2 o
// LCD显示
9 ~) _* A. O* ` I write_com(0x80);
2 e9 E# h8 H7 d$ y: N if(flag); m7 f2 a6 {2 _0 M
{
1 w; p3 _* _4 B, K% }/ }: C //write_com(0x01);
5 b/ |' W9 t* j. F) J6 ^* | for(i=0; i<CNT; i++)% Y- f4 H. z Q3 G: H* A" b
{
. ?& I" a3 v2 p' V8 ?* G8 s2 E write_date(temp);* P6 s4 ]/ c. T4 c0 p
// temp = ' '; temp != '\0'* B2 c ~. r. I7 D5 i* E4 d% j" r
delay(5);
" S! J+ y0 p* V' i$ F }
( j0 f4 q# e( O/ i* I; u T" m }
) O) q5 o: ^# x' u* K0 ^ old_CNT = CNT;
" s# g, b% l8 b1 z delay(100);1 z) n0 Q* P( |) g" C
if(old_CNT == CNT)
6 N! Q0 v; b! r5 q {% f9 E5 T6 X# l# `9 {' S0 |) Y, Z
CNT = 0;
$ D- W, i/ E) N7 y1 h flag = 0;; l+ q3 R+ Z C( S
}
( I4 d5 \" a! p; b& S$ M7 h }
1 M# S- l3 m& ~& p: ^5 H1 I8 R}" E, \; }3 V& I% a. s W
3 s" d, w# D& d" |' e$ Q6 a
+ Y/ H8 d9 U- Y4 R7 R9 d7 e4 _ |
|