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

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

[复制链接]

该用户从未签到

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

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. \

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-9 14:10 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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