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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
单片机使用LCD1602接收串口数据
  }0 n' l- s, q
2 u! X5 F& Z" A
. ^6 `( v! Q% A2 g
/*
* o8 M4 c/ q7 C3 g. p. a晶振12MHz,波特率1200,
* z  S$ w0 a* @8 G& Y2 I' T& s程序启动后单片机主动发出Hello Server,
) j! {, f1 ^$ {; E. ?PC使用串口助手应答单片机,
- o, ?& {4 w. L. `, v+ \9 n单片机收到数据后,不做任何修改返回PC。
! g2 M: T' G1 Y5 e6 ~' r使用LCD1602显示单片机接受到的数据
+ G7 [6 m3 S( P+ q$ Y6 e' w*/9 b3 J% e; F: T& K4 j9 C. d
#include<reg51.h>
! J2 r- ~; r8 _" p5 v#define uchar unsigned char
1 q8 O1 Y0 m, m0 J+ H5 k  s#define uint unsigned int& o9 ~4 Q9 Z$ M" t, s4 s
uchar code data1[]="Hello Server";
+ T: Z& |& f' t& S+ ~sbit EN = P3 ^ 4;                //液晶使能端
6 L$ n7 \2 G' {* ^sbit RS = P3 ^ 5;                        //液晶数据命令选择端# d- f1 R/ z5 s- ?7 R
sbit RW = P3 ^ 6;                                //读/写选择端(H/L)% S$ c* x& ~; t8 }; t

+ D7 D. |$ l; Huchar num;$ x' e- A8 o! Q  z% Q2 R" @' P" K
uchar count=0;" x' m, c( o0 ?6 |* `) r* n/ f! p% C
char a;- F. t& b6 w7 M
char old_CNT;
2 n5 H% f& H  xchar CNT = 0;
3 `# {" {- r( W6 ~% ubit flag;  L" R* k# A( f- f
char temp[16];
9 V- g, h0 Q7 A' E! L) N! p( ?: \6 }//作用:延时 z ms
& _' q' {5 f. H& M! `3 ~6 e//参数:z" ~/ s7 g1 X- V* F- }
//返回值:
6 l- h4 ]5 i* P3 xvoid delay(uint z)
9 f  b6 V$ k; A, Q0 ]* [{, p- b) e) n4 ?4 j2 ?) r
        uint x, y;- Q' H; Q/ V: U% R- S
        for (x = z; x>0; x--)
, [3 l& S; H2 ~9 |/ Q6 V8 _& [$ Y        for (y = 110; y>0; y--);& @( N1 J5 _+ F! M" |! P8 V
}; Z- q; X- }! S3 M  K; x

% G$ g& {' p$ {& j9 p$ E3 F//作用:写命令" M6 |  b, p6 \: c7 `
//参数:
- e; F* ^5 c# \" z( I) `//返回值:' W: k  w, }/ m
void write_com(uchar com): |# z' M' m, A
{- K/ V0 e! ?# k8 _
        RS = 0;        //命令选择
$ V$ r; t6 |; S2 [9 |% n        RW = 0;
7 U4 y% n/ x: E" U8 R0 j/ \        P0 = com;
! e6 Z: L( k/ W7 y4 j# G        delay(5);
& K3 W4 W3 J7 A" T# N1 X% j        EN = 1;        //使能E开
0 [! c, \9 `& e        delay(5);
, P  K, j* f8 T; F6 I7 B- j; {        EN = 0;        //使能E关
0 I+ ?- m: }) a4 ?        delay(5);) f' [0 e& x% O+ x4 F1 l. l( {
}
0 ]6 d: o) i2 d4 a" T5 Q; K" `2 `7 `0 A, r1 T6 F4 y
//作用:写数据; A, j+ d  r$ H# c; k' ]4 ^
//参数:
, k$ l: M: P3 g0 L" L- d4 c//返回值:& Y; o1 E; v! a/ |' X& B7 N( K* ?+ a) ]
void write_date(uchar date)
' o7 N$ p% \0 G' C9 u+ H# M8 _{( j, C% C+ I2 \& T7 |" J6 {1 w8 X
        RS = 1;        //数据选择5 [" @) c- m$ M' J) @: q, n
        RW = 0;" E7 l, x/ D. F, ]
        P0 = date;. M4 L4 g  `5 R3 E/ r6 `
        delay(5);
0 d; S3 W: E. j3 E( ]! s. u        EN = 1;        //使能E开0 ]! c, M6 @1 r
        delay(5);* H! g2 @/ r" l& s% D
        EN = 0;        //使能E关0 |# H  v* d, n& k% n5 o0 E+ K$ T
}
. v; w# R- t" g% C3 e/ T7 O. e/ {! o! M- S. d! {, N6 n
//作用:LCD初始化
1 X. n, H) E: _//参数:
% u- O) e8 l  U5 L% a& e9 a; j% m4 m7 }//返回值:" W8 b6 t7 @0 ?( i3 W% W2 C8 _1 }
void init_LCD()
: P8 X4 V3 Z, Q/ h. Q{. m+ u" }0 i, v3 ^7 U8 V& j& |
        EN = 0;5 @# H! [. O. C8 a, _; m! }) M$ F  X* u
        write_com(0x38);        //设置16x2显示,5x7点阵,8位数据接口% e! ~0 M+ `* i, Y) g( H4 t6 T
        write_com(0x0c);        //设置开显示,不显示光标
+ i- |8 B- I0 S5 \/ w- o        write_com(0x06);        //写一个字符后,地址指针加14 z, E1 b0 }2 K6 S) J1 F2 [% B
        write_com(0x01);        //显示清0,数据指针清0$ N" X5 p+ j6 v- ], v# _
        write_com(0x80);: g$ S+ D: H- q5 F) E) Y  Y
}9 \- @; H  ?! }% U
//作用:串口中断初始化
/ c7 B7 [* t" @) N//参数:
& m6 \; C2 P/ x. h) q$ M6 J2 F//返回值:4 M- v2 Y$ z$ y- I; U/ m1 Z1 T
void init_Serial()2 G- l. B; j0 i6 S7 Q5 L
{) B  W, s' i) N# E* B; T4 [- R' r
    SCON=0X50;        //工作方式1,允许接收
% I. e! ~9 P( u$ N  m3 O" P7 O        //SM0 = 0;
5 U% C5 g" o4 p9 N        //SM1 = 1;% D! A2 c, g( b; H, _
        //REN = 1;7 u5 g+ t) Q- J7 S, s: ^
    TMOD=0X20;        //定时器 工作方式2
+ e9 r, u. e, P% V    TH1=TL1=230;//波特率为1200
# S. ^7 [/ h" k" M6 U( C6 W    EA=1;                                        //开总中断
0 U  H5 H* h' p3 u) W7 E$ G    TR1=1;                                //T1启动& I: _! z7 ^& b* h( ?
    SBUF=data1[count];
$ Q1 H  r4 t0 K* \6 |& M0 d    ES=1;                                    //开串口) U$ a6 g6 Z2 R! r4 I8 b0 u/ y
}* }8 J1 e9 |6 s: W' [( j4 v+ d
//作用:串口中断服务程序( J) ^% H" O" u& g* Z9 K
//参数:
( t; x7 C- w. N; X: [//返回值:9 k) }2 j# [% ^; j
void S_proc() interrupt 4
" ?1 G1 F/ [- n4 ~  F  y' V6 H{- N! }) C! `: K& X  n
    if(TI)                //发送结束- W6 Z2 {% }7 E8 W7 Y
    {
- K7 y8 s: Q- N& G- v, d5 C        TI=0;
1 S. f+ x! Z1 ^7 L5 H3 U3 m. U        if(count<12)  M  _+ t; E3 l7 p* p1 v* ]' U
        {
+ K  N; M. _% e0 X            SBUF=data1[++count];
& S3 R" e8 z0 v        }" h  u, _. V* y, C( v  E
    }- W( C3 Z; B3 L1 h$ u- L
    else                //接收结束1 n5 d8 R3 y% G# C! j( }4 N
    {
0 |' j9 L: s! d* y( r" `8 W7 M        RI=0;9 e) S4 P8 U" s8 \/ O
        a=SBUF;                //存数据
- A: u4 |" K8 ?+ R* U/ H        SBUF=a;                //发送数据
$ P# d3 w4 S: H0 r1 r; I+ m" Q        while(!TI);        //等待发送完成  ^$ V5 ?& H) K. L6 _
                                TI=0;8 n4 C: G' P, y
                                temp[CNT++]=a;* C# A( s: g3 X, B$ p
                                flag = 1;' |- G2 h  @# M% K/ t9 T) H& E, Z( C
    }, J. ]9 l$ k4 d3 U$ G5 f0 q
}
4 G$ ~5 \* M0 w( b$ p2 w2 A* H0 I//作用:主函数: B6 m& d. O) ?1 s$ ?
//参数:( \% x# S( |/ u: D, W# q
//返回值:/ J/ H1 N5 C/ x& B  y# d% E9 ?
void main()
7 r& w$ g3 e0 Q! }6 ~# `+ k{
8 r& h! v! y6 B: s5 k- P8 I1 n  L, k                int i;# c2 F$ C# Z% b1 V- r
                init_Serial();% N! }: s) G9 J2 {( x
                init_LCD();
/ B* a  R( i0 O! m  V) S    while(1)
0 U( n* p6 u# f$ Z- W3 w) a                {
6 g' Y' G. R# v. b# S, S' q                                // LCD显示
2 i2 D0 t" ?2 H" h% Z                                write_com(0x80);6 c6 e6 F7 w0 ]6 E% I3 U
                                if(flag)
1 i( u2 C7 d9 o+ v  E" q                                {0 ]" J5 C8 c+ T9 }/ K
                                                //write_com(0x01);
3 r1 G$ v" x: s                                                for(i=0; i<CNT; i++)/ H/ Z( {4 T! c9 A8 G+ @8 B
                                                {
( J0 `& [8 @( q1 e% a8 {; J                                                                write_date(temp);
8 @. H9 k6 g: O5 h# d( C                                                                // temp = ' '; temp != '\0'
! d) n0 b. ]" ^! Z                                                                delay(5);. f5 x' V) ?! g  r
                                                }# H: g4 u7 ]& D# b  {! [
                                }) ?' ?( R2 z' a) X+ O, S9 s
                                old_CNT = CNT;
4 p& y* B' y6 B# i, g) s( j; @                                delay(100);
/ `5 r8 F. ~* s8 I7 a6 X# H                                if(old_CNT == CNT)
( m! {1 E: H& M; x                                {% Z$ h# q; L$ A% J7 w
                                                CNT = 0;  Z! c5 |6 p6 d" m# z9 [  t( d
                                                flag = 0;
$ p8 J" E2 Z8 m# Q4 X                                }" m1 ?( B4 k) ~! M
                }$ {& n3 f" x" @# W
}
* Q) _& b/ C& o, ?  }( x! _
游客,如果您要查看本帖隐藏内容请回复

* Z: K$ z! }, t; M

. h; |0 ^9 E; Q: t. l2 V/ ?8 F6 |; C

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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