找回密码
 注册
关于网站域名变更的通知
查看: 413|回复: 2
打印 上一主题 下一主题

单片机使用LCD1602接收串口数据

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-12-3 13:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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 _

该用户从未签到

2#
发表于 2018-12-3 14:13 | 只看该作者
学习一下  参考

该用户从未签到

3#
发表于 2019-2-26 11:38 | 只看该作者
看看楼主的代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-4 02:43 , Processed in 0.078125 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表