|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机使用LCD1602接收串口数据
' l/ ~; ~- B: L# a8 E9 `/ k% O& R5 L
$ w6 ^6 @& [3 V- F6 p: v1 m8 |/ j1 e+ U4 X/*
k) x$ c) V4 y3 {# {$ N; X! I! R- d晶振12MHz,波特率1200,
. @4 H0 M! _! x3 k2 `- T( s程序启动后单片机主动发出Hello Server,+ ]4 G7 A. d- I+ F) s3 l, l2 l
PC使用串口助手应答单片机,
8 I, I$ i8 ?$ K% Q8 |: G单片机收到数据后,不做任何修改返回PC。 |% Y9 h( j; Q! @
使用LCD1602显示单片机接受到的数据2 O# ]1 Z; ^9 i# Y: C! {
*/6 Y1 `5 q: N5 I) r' R) n
#include<reg51.h>2 V4 H; O/ _: q2 q! u* n' b
#define uchar unsigned char& u4 |9 J; v% s0 I) \: x1 P& M
#define uint unsigned int
* B% W& T1 ]+ I+ c; Ouchar code data1[]="Hello Server";# u. J& w% n1 F9 K* W* m
sbit EN = P3 ^ 4; //液晶使能端
4 r) q+ `7 z) ?& ~3 Osbit RS = P3 ^ 5; //液晶数据命令选择端
5 J& t2 s9 Y2 P6 b+ x% b+ P$ nsbit RW = P3 ^ 6; //读/写选择端(H/L)
2 C1 h$ |8 p' [9 o% P+ h& E
% Q! u5 ]* t4 H/ muchar num;! |' `6 g3 i+ y
uchar count=0;
0 \3 C6 B" g( |char a;
; }1 A4 ~7 B! M: E2 j# A$ xchar old_CNT;
: s% p2 y0 |" ~% k$ _3 V8 ?; q) \char CNT = 0;1 b+ A5 e, E) V/ }( j- s1 O& \# Q
bit flag;$ ?( U* u9 P; \/ ^' s4 M" o/ |
char temp[16];2 A# S( F; ^; P3 ?1 V
//作用:延时 z ms/ j% L. L1 _! J6 P3 S9 w K: k2 L- S
//参数:z
! T# \* [' e5 n2 d# }, M//返回值:
3 k1 l! c9 _# i% n1 s- Gvoid delay(uint z)/ A8 [" ]+ W& k( j6 c
{
+ u" r b4 p5 x4 H- Y+ q$ W& @1 } uint x, y;
b F* d; B/ T: _3 ~8 g for (x = z; x>0; x--)
& W7 U+ U+ g8 R* {- G0 K for (y = 110; y>0; y--);
: L- L7 V9 ?; h7 Z& K9 b6 g}& r/ q3 @+ A7 B4 A! j" |
1 k% Y& r9 [3 t0 m! @( ]& l//作用:写命令/ h% `2 }9 S1 E+ G, R5 }+ S# T: _. M
//参数:# c% M R7 R" e( f) b) h: O; m9 c0 w& S
//返回值:
( s ]% V- ]- J9 M$ Rvoid write_com(uchar com)" D2 e; Y! c1 e
{
5 }3 O" i9 Y% s RS = 0; //命令选择) L9 {6 ~0 j$ G
RW = 0;
$ o. r1 h! I3 |: S; Z P0 = com;
. T( a& g4 [! K- `% j# `0 K5 c delay(5);
: b2 J/ K* z5 b$ L" O EN = 1; //使能E开
$ [3 C- N% ^+ n7 t3 H0 X delay(5);: J9 a* L5 F8 O% j# Y
EN = 0; //使能E关
3 v. J! c5 T( p9 X4 h6 }( j delay(5);
; s( G j6 z+ m; u2 {) t6 z}
2 A4 i8 B; q, D8 j' h1 @
. N) i* f" C* ]0 R% `5 F6 ^- l//作用:写数据/ O0 j3 Y' U0 z6 [$ Z
//参数: r" r% {5 H0 {2 D |$ G. S! L
//返回值:
# W7 T! }" c' F' r/ g6 {void write_date(uchar date)" J* L( ^0 C( H7 }! _
{
: [. ~, P$ q. m RS = 1; //数据选择
* _- a% R- a1 ~2 A6 E RW = 0;
2 n+ E3 j' o6 o8 T P0 = date;& D# Y3 M$ b3 P& u4 @
delay(5);* e6 @8 h) l# F5 V
EN = 1; //使能E开
; H7 l" a- Y, Y delay(5);
2 J: U8 t5 f) O& s2 r8 o. F( G1 E EN = 0; //使能E关
: k, I2 T1 s& i, x9 F Y7 `" W}% e) L' e B8 T+ U8 G
: z3 c: ]. O2 V D5 c
//作用:LCD初始化
' S. b- j9 b/ J7 ^+ y//参数:
( ^: H3 o3 C2 B. q# _* W4 V' U//返回值:& _( _* M/ K4 }, q$ ]6 ]
void init_LCD()+ B8 ]. c5 p8 k4 P5 C( H* r1 P
{
3 P4 ]7 a! b. D/ w( a0 S EN = 0;
* N" Z0 Y& t4 X; u8 \3 [- u write_com(0x38); //设置16x2显示,5x7点阵,8位数据接口' G2 v2 {) ?" d- Z/ e
write_com(0x0c); //设置开显示,不显示光标
5 q% w) T, |' _- O) \/ M, \" J3 o# ~ write_com(0x06); //写一个字符后,地址指针加18 ]$ H$ {- S" _) m
write_com(0x01); //显示清0,数据指针清0
; b; V# [, L$ M+ b, a* N write_com(0x80);
- t+ {5 ?, W6 G. a$ L5 `}/ N) }0 i8 o" @8 u
//作用:串口中断初始化
/ e% [$ z8 n; d1 X* q1 Z6 E$ R//参数:
: q! o2 ` `2 x* y& y//返回值:
( x$ F( @7 n1 n' h" p5 h$ \void init_Serial(); E0 C% E5 a* ]$ ?1 }
{' m" G% n! \% O" |/ M5 K$ u
SCON=0X50; //工作方式1,允许接收
Q* V- H" S N6 c7 t //SM0 = 0;. B% \9 L2 Y1 T+ L u8 |8 G
//SM1 = 1;
3 N* p; u; ]! A) {1 q //REN = 1;
3 ~4 U7 h8 d/ r3 j/ ~$ R7 Q TMOD=0X20; //定时器 工作方式2; I1 L. e, S: h* X; F a7 R
TH1=TL1=230;//波特率为1200% }- f/ {3 i$ m" b: k7 B
EA=1; //开总中断
8 @+ D" \- Q: q( `( i TR1=1; //T1启动
) D' P) h+ e1 z$ Y) w; V4 k SBUF=data1[count];
0 S) l, X) I/ B! L1 @ ES=1; //开串口
# c E: `$ f% @8 o5 ~- l3 Y }}/ U' W# z D1 y8 y; ?+ C
//作用:串口中断服务程序
# F2 Y9 I; n" d$ W//参数:# G$ L$ n$ h8 w3 g) K# d# V7 r4 w
//返回值:
' ]! _' U! Z; K6 r! J d+ P* z t" Tvoid S_proc() interrupt 4
, c( B7 ~8 K m: d& x{
/ Y5 S2 a" @4 r" g2 q if(TI) //发送结束$ w, }* G1 g6 O- c; B* q
{ j6 b C" Y% K* N4 q
TI=0;5 g4 ]& w& t: J) s
if(count<12)
+ E7 g! y7 r7 y* o! n {4 s' t" u* N$ ?2 Y0 ]) o' u
SBUF=data1[++count];
0 o o$ Q/ q! D: Y6 I }7 U/ N$ u9 s6 l. \+ Q+ ?6 n& A; n
}1 f2 I# F: y6 E! H) B
else //接收结束' q* z4 P/ c) R9 T/ S' \: w
{( v- y e. z8 l3 x% N. v
RI=0;; o: U5 ~4 s8 M! G
a=SBUF; //存数据
& r7 g9 C: e0 m6 J! y SBUF=a; //发送数据7 S* W' l9 {8 a; S# O9 D% Z
while(!TI); //等待发送完成, n, q3 J1 p6 H* m* \
TI=0;5 J) V2 }5 M, `! x+ k, K+ q9 S
temp[CNT++]=a;
! f' y0 I' n4 p1 u flag = 1;
4 { s+ w% B# Z# v }# v+ r$ P% a% i/ x
}
( @+ s6 v$ H# R. A3 }7 P B//作用:主函数* P/ _# k. F P6 |4 o
//参数:
( T* t2 z4 ~, A0 M( a0 v u//返回值:
5 S. U# @" M( K O F. wvoid main()/ \, F' w8 I) X6 z# q) [; g3 t; k' ^* z
{
; T8 ~+ i. C1 c- x* l int i;
; U, R6 N$ x c2 N) m+ o, c init_Serial();
3 O$ C; ]1 e3 K9 c) z* W9 t init_LCD();* |- [1 K; _, s) Q' M) P% ?
while(1)
3 p8 @( Y2 C) T5 ~3 }& \1 Y R {6 D5 B t8 X, ?! |+ M. y( |
// LCD显示
4 d& K I; p @1 Z write_com(0x80);
4 S5 k. z/ T! l/ e8 K7 } if(flag)
# Y1 i8 O5 Z1 y, m0 [ o {
. d. f5 ~' g4 x% [; I( p' M, s& f7 i //write_com(0x01);
* B' z m7 j9 S: j" s# P$ H for(i=0; i<CNT; i++)
$ S/ p8 m% z7 v$ Y/ Y% q2 F {/ i' H2 o$ @: O
write_date(temp);
+ c6 D! {. b. U) x // temp = ' '; temp != '\0'4 m u4 I4 Y8 Q% R! u7 n( K
delay(5);, I- [% Y! d0 D4 \. H3 c( N! a
}# b/ J+ l, E% T5 T( e7 o+ z, \9 x
}- o- E% B- l& w. ^, \& ?( y; f
old_CNT = CNT;( s: f: ]1 s6 t, b, a
delay(100);
$ @# J: _3 ^# M. j; w8 U if(old_CNT == CNT)
( ]& Q. F7 ^- _) J {: z6 z1 {* y- n ~ \; F
CNT = 0;
) Y% {4 O0 a; x, o" q flag = 0;
# i8 n& ]) V) G1 { }" p* m* f! L9 x' ?
}
$ g( t$ I$ ?5 d \& b$ L$ D0 F) u}0 F5 H$ I: |; E! o& d) y, K
2 A+ T, d6 X% J/ V e6 Q
9 }9 R y9 @) u+ f0 |; \ |
|