|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机使用LCD1602接收串口数据4 J9 a3 J+ m7 i8 c# v/ A$ v
; b! q6 ` z" j( I& p0 Y2 v
/ E2 b8 ]( z; g5 R; `3 F
/*
3 h0 r) D& F2 A+ L# ?& I5 q! w7 J晶振12MHz,波特率1200,* Y- G1 U$ H* i8 C' [4 c9 R1 u) K
程序启动后单片机主动发出Hello Server,7 q* x5 Q% ^2 D* M
PC使用串口助手应答单片机,
; ?# w1 }* O6 H1 k: T3 U: h单片机收到数据后,不做任何修改返回PC。
+ P& W! A+ R4 ^% u使用LCD1602显示单片机接受到的数据; y1 z t% N) O/ ^: [3 i2 M+ X
*/
0 |# G. W1 X2 [; p8 h* s7 u#include<reg51.h>. |* f j3 f% d2 b9 v) I
#define uchar unsigned char
( q0 {$ r0 x, |#define uint unsigned int0 Z0 U' K! S/ |- d( }
uchar code data1[]="Hello Server";
0 T2 Q: R! y' p4 w: M! g nsbit EN = P3 ^ 4; //液晶使能端
+ X/ S+ e; `0 f0 G7 {sbit RS = P3 ^ 5; //液晶数据命令选择端
2 _. @* Z h' \" k- Q7 j( R% bsbit RW = P3 ^ 6; //读/写选择端(H/L)
0 n6 h& `2 ` O
6 z( u& v& t: \- |! i$ a& muchar num; E; B0 F2 Z; F0 u
uchar count=0;, B: t0 d6 ]! h p6 l* @
char a;
# d u) ]& k& M+ @" Schar old_CNT;; P' t* {; N' ^' _& R0 W
char CNT = 0;& }5 q- h% ?8 f
bit flag;
) n$ a' l( E" h8 ^) `char temp[16];
. |- p! T2 j" j# u4 M9 _( D. I2 s//作用:延时 z ms
3 j: L" a4 \7 u; T9 D//参数:z9 X5 [' }1 ?2 W, A0 A2 y9 @
//返回值:
- @" r. F' {1 D% X7 L" |void delay(uint z)/ f5 W" o' {! [/ u# Q( z
{0 |' z1 ^, L) G! E
uint x, y;3 h4 N) y, I9 [
for (x = z; x>0; x--)) G* H" ?! ~) C9 ^
for (y = 110; y>0; y--);
, e/ r8 Q# R; N}( J- ?5 T& Y6 w' i; K' p( W/ l
. A3 |/ V: X2 i, U9 M* Y
//作用:写命令
% z' o% t# O9 d x3 G7 M: n! _//参数:
4 W& d# w, s0 F, ~4 v//返回值:
& _5 X* U, J' ]& Q- Q$ gvoid write_com(uchar com)7 Y9 I4 R d! T/ \0 T
{
; L( M) T0 ?" `4 w% V; r RS = 0; //命令选择7 i4 H! Y2 _7 b
RW = 0;7 U+ X0 V; p, b' P( X* @% \6 P$ D' J7 X
P0 = com;
" ]- f0 C9 T/ T* v5 j; p& w0 ^/ |- f delay(5);3 W& G' O) P2 {; }0 i. E0 E. |! {
EN = 1; //使能E开
" A% M2 N( w: _; ]( l delay(5);
. g7 H: ^8 [& G3 a; b# K% \ EN = 0; //使能E关
0 h. q" k1 _8 z. Z5 C, v1 j delay(5);' Q! m8 U4 Q8 Z4 X6 A3 ?; S% Q
}
( v; L1 O# i5 g6 b: {
/ ?4 N+ O* E- V' _, I' r5 S//作用:写数据( w$ I. a- \, L* e5 L2 y/ o
//参数:/ Z9 L, i* l- S, X" R
//返回值:) n; t% |- ^0 d& G( ~+ r }/ S
void write_date(uchar date)
1 F' B; O2 }4 u, e! x6 @{5 s- @6 E4 o3 I# R' \) Q) q2 p- O
RS = 1; //数据选择7 C( [! o# N6 O3 t( K: X8 d5 S
RW = 0;/ h9 I" H6 d1 s; x+ d$ Z3 Q* C, Z* _
P0 = date;
' z3 i6 c# u* W+ O. M" }% \; L4 o delay(5);# u6 ^. A) U: E: B; S
EN = 1; //使能E开! E+ I7 e( y; D! p o1 L
delay(5);
6 v. ~% f/ i. n0 q1 u: Y EN = 0; //使能E关
; U9 l0 b/ Y( E! e \}! V8 t% U7 N* n; n" }' U
& C% L3 z4 L7 V5 {& O% S
//作用:LCD初始化
& c1 V- Q+ ?' }8 v; u. `8 p7 i* J6 |//参数: L" _/ s9 o: C7 W# Y n6 V9 \4 y. i
//返回值:
" _! o/ s/ \- b2 y0 b$ Avoid init_LCD()
" w/ R' H3 ~1 m% Q- X# \% y1 |. X{! T+ y2 ]; i: E$ q* e
EN = 0;8 ~5 P: i% y$ I6 [4 f2 F/ B
write_com(0x38); //设置16x2显示,5x7点阵,8位数据接口6 Y: j6 O; n4 _/ s
write_com(0x0c); //设置开显示,不显示光标
) G* q# o3 {# p; V2 A write_com(0x06); //写一个字符后,地址指针加1
7 A/ `& d9 t: f" r+ F+ _3 ^ write_com(0x01); //显示清0,数据指针清0
! D0 k5 _. O- D9 I write_com(0x80);; Z( J1 F9 M3 T/ A9 C
}/ K3 ^# _8 v. J5 `. f3 K3 V+ a
//作用:串口中断初始化, h' c" ?* \+ ^6 z4 k! R }
//参数:
. c; {! V# |9 V//返回值:0 H. A$ f. e5 g! R( H# a
void init_Serial()
8 e3 ]4 a2 O% l% C6 `( J{
6 t& B" w# \) l- _& t SCON=0X50; //工作方式1,允许接收
p% `+ Y0 F$ H) ?3 m- W t |% M( d //SM0 = 0;
& J! ]1 w4 O5 ~* |4 U% M //SM1 = 1;9 }9 Y; N) L6 t5 T5 A3 A2 ]
//REN = 1;: R1 T0 Z# h" n0 \' M6 p0 s* d5 g! U7 \
TMOD=0X20; //定时器 工作方式2
! c7 C) B8 E f+ S6 p TH1=TL1=230;//波特率为1200& K5 u' R Q; y, K5 a0 ~
EA=1; //开总中断; I! R; o- k) q$ Z2 {4 w4 c
TR1=1; //T1启动
$ P3 |! c3 W$ ]% Y SBUF=data1[count];
- c$ m% ?; S( X' @+ ?: H ES=1; //开串口
! r6 F7 g4 [( D r& w" \9 X}0 U9 U& h" v# ?6 D T
//作用:串口中断服务程序
& W; B/ H/ v- m; s* ~8 A2 [//参数:! }9 O a) z- z }2 T% z, ~5 F8 e; C
//返回值:3 B' I7 L7 I+ w5 X3 o
void S_proc() interrupt 4" w! A! s8 F+ w/ P+ w6 g* z9 V
{
$ k$ ?) O; \1 q, M' [9 e if(TI) //发送结束& h0 ` z7 C* z/ r# h2 n# C: P
{
' \) X4 @% _& L4 ~ r& c( _ TI=0; v- r: V5 B9 V1 y
if(count<12)
G$ x, w% t: r7 O+ y- \ {/ c- ]6 M' |/ A; p: `
SBUF=data1[++count];
0 ]) C! l$ n+ h% V- U }
: Q5 u4 m" A S }
) p/ L; p% F, j' Q. u else //接收结束6 x* C4 T4 s# H" [6 T0 _
{+ x. y9 `2 O; ^" B# {
RI=0;
c6 C1 h! E& m% `0 F a=SBUF; //存数据
9 M& M+ }: B" s$ B SBUF=a; //发送数据
% R+ A2 C. ?# Y4 j4 s4 y while(!TI); //等待发送完成5 b7 {0 o+ E- M9 [7 |$ @
TI=0;
- ^, x/ H5 i# Y3 m4 `1 t8 W temp[CNT++]=a;
4 h( T1 A" w% e6 }2 r2 ~* V flag = 1;' H6 v$ s; p1 e P% \) @
}
2 }% j3 p3 |5 ?" R7 G}% I, D2 l0 V" G# j4 [! T+ b
//作用:主函数
7 Z4 G: f8 {0 o1 N4 l1 @//参数:
, ]9 B$ k# o+ Q//返回值:
, ?$ Z5 e0 b& s1 s+ p: Nvoid main()
2 j) V5 n- s y! r" S{ _ ]6 v+ b4 Q& K; [" k
int i;, O; v, n) h- V6 ]3 U. J7 Q8 n
init_Serial();
o2 Z. D: l7 ?, L1 Y; c0 G init_LCD();
1 N T, f) u1 D% N" M while(1)) G5 R, W+ T2 N4 F
{
) \' ^$ X7 t( l; o! u // LCD显示
\6 D# N1 \, W write_com(0x80); Z% _1 K, g. O; F9 u: E- W
if(flag)
" N: H& e+ H: w! T8 K, x& ? {
6 W0 {$ V/ M5 \6 L+ I( C U* a0 j //write_com(0x01);: h4 e8 Y) v7 Z G
for(i=0; i<CNT; i++)! x5 J2 u) c' U4 L: Z, c7 x
{
8 ~9 u% e5 Y; K. ?# T5 W& B write_date(temp);
/ v1 c* G8 Z; P# }7 e7 ]/ [ // temp = ' '; temp != '\0'
6 L F% e; M! E delay(5);
2 q+ y1 U. V1 _6 }4 X/ z }- _0 V d- m# T4 |$ G1 S
}/ k( w8 U4 _7 ]
old_CNT = CNT;
3 Q7 `+ S: Q/ X9 |- W delay(100);+ j' W* U8 T& {4 v8 _
if(old_CNT == CNT)
+ z8 p8 u( F- e+ u8 C x {
1 _. P, T- \9 d) @' c CNT = 0;9 b3 u3 u- n! f% d2 s% |5 i8 Z: M
flag = 0;
0 l* z) X: ~+ r5 c8 \) w }
. j2 y0 \1 }' W7 a7 L }& E( u2 Z3 ^4 X* G, Q* {5 S
}
$ U8 Y: g, Y' {& P, t
( u i' U+ {* D
3 f* N" W9 i$ [5 {6 S. \ |
|