|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机使用LCD1602接收串口数据8 G2 J# D5 e- y1 E
( }4 M; y* F' X5 B( M8 ~
8 b1 O" `0 Y5 H! S/ l. n
/*1 m O3 P" d! Y8 k" X, z( ^
晶振12MHz,波特率1200,6 n; E, C% \% ]! H4 p" i0 E3 X
程序启动后单片机主动发出Hello Server,) r' H6 ~) E: _: S( B( Q( N
PC使用串口助手应答单片机,# M2 [4 w0 w2 U' }
单片机收到数据后,不做任何修改返回PC。
/ ~. y3 g+ H9 y4 A Z, `0 P使用LCD1602显示单片机接受到的数据
5 O% R/ Q# t! V; e6 v*// E2 y( d" J& y& n7 W9 I2 {
#include<reg51.h>
: T% ]# t/ y- U( D! C#define uchar unsigned char' y7 Z2 {# F6 T6 o7 d
#define uint unsigned int
, L# H5 i4 D2 K( v, auchar code data1[]="Hello Server";
) E4 {$ M9 B) o* I1 K3 O! T6 [sbit EN = P3 ^ 4; //液晶使能端2 _: `& U4 _( w5 L
sbit RS = P3 ^ 5; //液晶数据命令选择端9 T, i% F1 Y5 T. G& ]* S. J
sbit RW = P3 ^ 6; //读/写选择端(H/L)4 B$ C E/ H, `& j- l) }# ^
; a/ G3 ~* r/ ^5 m; Uuchar num;
! z7 H) i2 Z# Q. o" Juchar count=0;+ J# a a0 c) J8 e! ^3 N/ \
char a;
' w) S' X) ]5 \. p! j& Kchar old_CNT;
6 p/ L3 W1 T5 a$ N1 echar CNT = 0;, f7 s1 i" b# Q: v x( Q
bit flag;/ U; X' }3 l$ n
char temp[16];
& y! O9 I5 a/ m# f: P6 l0 k& R3 Z0 q8 M//作用:延时 z ms
! V( q7 I, ]9 \/ _9 Q//参数:z
- T& o0 b8 }7 M1 o//返回值:
' J/ G/ }' {$ h3 X( B5 s! ]+ Uvoid delay(uint z)
' C! Q$ x$ V' V{9 [! f. {9 }/ f/ O2 D+ z& Y
uint x, y;
4 [7 f+ E9 Q( s4 X7 f for (x = z; x>0; x--)! o2 _: Q! z9 U$ h
for (y = 110; y>0; y--);: c; \, M* `6 ~/ d c. n j
}; E0 j4 Q/ b( F) D
* D7 e# ]6 ^: d1 K
//作用:写命令
P m; f) T$ n" s+ i6 H9 }+ _//参数:& y" s2 p/ B% a0 k9 J
//返回值:1 C, G4 _6 R9 G. E# a
void write_com(uchar com)4 c# a* d* v1 m+ T) @, f
{- R2 o% ~3 @% J) q6 g# ^; P
RS = 0; //命令选择8 |9 {+ t" _+ i1 x& M) K2 o
RW = 0;
1 g% n2 c/ ]! r" I P0 = com;
( f( M" [6 C6 f) \% X( y4 F0 R delay(5);8 \/ ~: U* \: o) w u1 g% u
EN = 1; //使能E开
: ~; z9 h" A7 k) z2 g9 [ delay(5);
" @, A8 X! q1 _4 k3 {( M EN = 0; //使能E关
3 o$ \% B c6 i! s delay(5);
, T% n" f W0 n- `}
* {% z) V0 e% t) j6 e$ e* ]# q% R, R/ w
//作用:写数据
! c& Y G7 |) u5 P2 U1 ]//参数:
* S. f- c1 k; @' C3 c# m$ A//返回值:
, i1 ~. a1 ]3 v, T0 {( v/ cvoid write_date(uchar date)
Y' Z, X) W- d3 `8 E0 a{
- U( R$ k% z- P* ?9 L; @ RS = 1; //数据选择. U: l9 Z& V! P% a/ M
RW = 0;
+ K C2 s2 Y6 l: n) z P0 = date;
. i! u4 |9 c1 b- t( s delay(5);
' v" Z- i# H% o( |9 y EN = 1; //使能E开
1 [* d, |: r8 {, Z' W delay(5);
& W4 V4 w) g+ B1 }( X EN = 0; //使能E关
: d1 Q( ]0 t9 p N4 \! ]9 e) j}
" W! I0 l/ z8 _# J+ q9 x& `- C9 |# ?, s
//作用:LCD初始化6 G8 }1 s/ n: M3 d; N5 h# H
//参数:! c' G9 f% |! u
//返回值:3 z: @6 i1 Q( J, c7 p
void init_LCD()
) D, T4 R l3 }8 x. ^& K{
2 t8 C2 C, z/ F9 M$ H EN = 0;
! {& x: E8 g4 W4 E5 s( A write_com(0x38); //设置16x2显示,5x7点阵,8位数据接口
6 k" i0 q( c# K4 ] write_com(0x0c); //设置开显示,不显示光标1 i _) Y6 V; N' S d# d
write_com(0x06); //写一个字符后,地址指针加1/ n# t4 S% w& |" W8 U! m
write_com(0x01); //显示清0,数据指针清0
, }! F% E- k9 L5 }8 U write_com(0x80);
0 f. o# M" \) B0 g) h}; [$ U Z) }5 T! S8 t) R
//作用:串口中断初始化
5 p9 m% _% q3 y7 I//参数: G) K5 J4 J- B* G) l9 k& Z
//返回值:
- G6 Q1 U/ m7 v% c" kvoid init_Serial()! [, r) h+ `3 k6 ]$ J: P$ \% B- U
{3 c0 T" `6 V& l: C7 e9 }7 ]8 y$ G
SCON=0X50; //工作方式1,允许接收
, M1 `* _0 U6 B //SM0 = 0;5 q9 b/ o! a* Z& x }/ D
//SM1 = 1;
1 F5 Z: C: a; E' w+ A. H8 s- l h //REN = 1;
0 {+ F) u2 G+ i5 w TMOD=0X20; //定时器 工作方式28 y2 l# s4 P6 Z
TH1=TL1=230;//波特率为1200
, k o1 ~9 P) R; Y( ^' j$ w3 O EA=1; //开总中断6 m% q, ]. M! p. ~, _0 s' P$ i
TR1=1; //T1启动. O6 U$ G! s8 N" N- u. s6 q
SBUF=data1[count];
6 o) u/ Z. U2 V ES=1; //开串口$ A( L& K% a$ j0 m9 W
}
0 r1 n* W0 B2 ~- f, l//作用:串口中断服务程序
4 a4 e8 k; Y& G# q//参数:1 E% n7 }$ ?3 y. A9 n
//返回值:7 T- N$ l, k$ D
void S_proc() interrupt 45 P3 j0 } F; H2 R& q! t8 }
{
$ @8 ?6 F0 m/ r2 F if(TI) //发送结束
& w: j9 q2 u, X1 T4 m {
5 H$ I: [, M# Y( w0 ] D TI=0;
: @4 u0 Q8 U7 S% \, a if(count<12)
. _7 S. S, B: S' g {1 ]5 N, }# H( q$ m4 f3 h s
SBUF=data1[++count];, w4 ~' w/ o, a! ~" s3 M0 I# l
}
+ g: H; r* Z) d% H, ] }, t9 | N: i) f2 R* h. O
else //接收结束
; h( r( e* s& C5 ?( i) Z% A {
7 q9 i% U. ~4 T, h RI=0;- j0 i. V) w# v+ L
a=SBUF; //存数据3 A4 B7 h7 z# x! O
SBUF=a; //发送数据
: o; W& z* C) t5 L' Z$ b while(!TI); //等待发送完成: d7 J- \: k& \2 t8 G+ P2 m
TI=0;
' i8 O' A2 M- d, n6 w/ Y4 D temp[CNT++]=a;% a3 y; @3 a" w$ w0 s2 Q1 [& A
flag = 1;+ k! J- A% J" d
}* C- }8 i- ? _& k- ?0 t
}
; M( K# y# [& l0 F, V7 r* o8 j//作用:主函数
! H# v, _8 ~( D! H0 z- a; ]//参数:0 m) K/ ^1 V0 m
//返回值:
& `8 N; B5 d1 c. i% Y" Jvoid main()& W M: X/ F- ]. F$ _8 B5 P' p
{
8 A) F6 U/ r; s int i;
7 x1 f3 o4 G. A7 |" B5 x init_Serial();
3 e9 T1 A; Z K+ T5 k0 n9 p init_LCD();1 P1 v' J9 i R; G0 B* o9 I; q
while(1)
$ M: X4 ~" M- h6 Z" @* a {3 W: g; V: J: V; R3 Z! w2 W- n
// LCD显示: J+ N6 j9 W. A1 J' p, D6 B
write_com(0x80);6 v! I3 E4 r2 G3 E, n) P
if(flag). z# g3 ]! ^$ { L' r- B3 |' m! z. G1 o
{2 T# C7 A9 n* Z( H
//write_com(0x01);
( [6 Q- ^& K/ @* ? p, }" F- \& I for(i=0; i<CNT; i++)4 p1 B! P# w5 n4 d7 w0 E {
{
/ s" ?, Z' ]4 g write_date(temp);
4 I7 e: @) n/ b7 k0 L // temp = ' '; temp != '\0'
& j1 L/ b& k7 S. q delay(5);! t5 l9 E! C- j% D
}) v; Q9 h4 Q- K# _; M
}- A% F5 w5 V7 S! w
old_CNT = CNT;
6 {4 ^9 H: C. t4 v' o$ [# r delay(100);9 B, U& J4 }; k, o
if(old_CNT == CNT) e7 \) ` L+ _+ }
{7 e _$ s h# Z) r8 V% v
CNT = 0;, i- o6 F {# S; R
flag = 0;
" F5 U) n) U* s" S7 W6 i7 C3 O4 u }+ A0 o7 e1 ?: G. w! R& r$ d. x3 j6 ]
}
0 ~5 K0 R: Y* \% s}/ C i: a, [5 P% o. B5 c
0 w+ E$ Q: n, y- a! d7 X- h4 a. l4 r( v1 O3 h; f
|
|