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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
单片机使用LCD1602接收串口数据
' l/ ~; ~- B: L# a8 E9 `/ k% O& R5 L

$ w6 ^6 @& [3 V- F6 p: v1 m8 |/ j1 e+ U4 X/*
  k) x$ c) V4 y3 {# {$ N; X! I! R- d晶振12MHz,波特率1200,
. @4 H0 M! _! x3 k2 `- T( s程序启动后单片机主动发出Hello Server,+ ]4 G7 A. d- I+ F) s3 l, l2 l
PC使用串口助手应答单片机,
8 I, I$ i8 ?$ K% Q8 |: G单片机收到数据后,不做任何修改返回PC。  |% Y9 h( j; Q! @
使用LCD1602显示单片机接受到的数据2 O# ]1 Z; ^9 i# Y: C! {
*/6 Y1 `5 q: N5 I) r' R) n
#include<reg51.h>2 V4 H; O/ _: q2 q! u* n' b
#define uchar unsigned char& u4 |9 J; v% s0 I) \: x1 P& M
#define uint unsigned int
* B% W& T1 ]+ I+ c; Ouchar code data1[]="Hello Server";# u. J& w% n1 F9 K* W* m
sbit EN = P3 ^ 4;                //液晶使能端
4 r) q+ `7 z) ?& ~3 Osbit RS = P3 ^ 5;                        //液晶数据命令选择端
5 J& t2 s9 Y2 P6 b+ x% b+ P$ nsbit RW = P3 ^ 6;                                //读/写选择端(H/L)
2 C1 h$ |8 p' [9 o% P+ h& E
% Q! u5 ]* t4 H/ muchar num;! |' `6 g3 i+ y
uchar count=0;
0 \3 C6 B" g( |char a;
; }1 A4 ~7 B! M: E2 j# A$ xchar old_CNT;
: s% p2 y0 |" ~% k$ _3 V8 ?; q) \char CNT = 0;1 b+ A5 e, E) V/ }( j- s1 O& \# Q
bit flag;$ ?( U* u9 P; \/ ^' s4 M" o/ |
char temp[16];2 A# S( F; ^; P3 ?1 V
//作用:延时 z ms/ j% L. L1 _! J6 P3 S9 w  K: k2 L- S
//参数:z
! T# \* [' e5 n2 d# }, M//返回值:
3 k1 l! c9 _# i% n1 s- Gvoid delay(uint z)/ A8 [" ]+ W& k( j6 c
{
+ u" r  b4 p5 x4 H- Y+ q$ W& @1 }        uint x, y;
  b  F* d; B/ T: _3 ~8 g        for (x = z; x>0; x--)
& W7 U+ U+ g8 R* {- G0 K        for (y = 110; y>0; y--);
: L- L7 V9 ?; h7 Z& K9 b6 g}& r/ q3 @+ A7 B4 A! j" |

1 k% Y& r9 [3 t0 m! @( ]& l//作用:写命令/ h% `2 }9 S1 E+ G, R5 }+ S# T: _. M
//参数:# c% M  R7 R" e( f) b) h: O; m9 c0 w& S
//返回值:
( s  ]% V- ]- J9 M$ Rvoid write_com(uchar com)" D2 e; Y! c1 e
{
5 }3 O" i9 Y% s        RS = 0;        //命令选择) L9 {6 ~0 j$ G
        RW = 0;
$ o. r1 h! I3 |: S; Z        P0 = com;
. T( a& g4 [! K- `% j# `0 K5 c        delay(5);
: b2 J/ K* z5 b$ L" O        EN = 1;        //使能E开
$ [3 C- N% ^+ n7 t3 H0 X        delay(5);: J9 a* L5 F8 O% j# Y
        EN = 0;        //使能E关
3 v. J! c5 T( p9 X4 h6 }( j        delay(5);
; s( G  j6 z+ m; u2 {) t6 z}
2 A4 i8 B; q, D8 j' h1 @
. N) i* f" C* ]0 R% `5 F6 ^- l//作用:写数据/ O0 j3 Y' U0 z6 [$ Z
//参数:  r" r% {5 H0 {2 D  |$ G. S! L
//返回值:
# W7 T! }" c' F' r/ g6 {void write_date(uchar date)" J* L( ^0 C( H7 }! _
{
: [. ~, P$ q. m        RS = 1;        //数据选择
* _- a% R- a1 ~2 A6 E        RW = 0;
2 n+ E3 j' o6 o8 T        P0 = date;& D# Y3 M$ b3 P& u4 @
        delay(5);* e6 @8 h) l# F5 V
        EN = 1;        //使能E开
; H7 l" a- Y, Y        delay(5);
2 J: U8 t5 f) O& s2 r8 o. F( G1 E        EN = 0;        //使能E关
: k, I2 T1 s& i, x9 F  Y7 `" W}% e) L' e  B8 T+ U8 G
: z3 c: ]. O2 V  D5 c
//作用:LCD初始化
' S. b- j9 b/ J7 ^+ y//参数:
( ^: H3 o3 C2 B. q# _* W4 V' U//返回值:& _( _* M/ K4 }, q$ ]6 ]
void init_LCD()+ B8 ]. c5 p8 k4 P5 C( H* r1 P
{
3 P4 ]7 a! b. D/ w( a0 S        EN = 0;
* N" Z0 Y& t4 X; u8 \3 [- u        write_com(0x38);        //设置16x2显示,5x7点阵,8位数据接口' G2 v2 {) ?" d- Z/ e
        write_com(0x0c);        //设置开显示,不显示光标
5 q% w) T, |' _- O) \/ M, \" J3 o# ~        write_com(0x06);        //写一个字符后,地址指针加18 ]$ H$ {- S" _) m
        write_com(0x01);        //显示清0,数据指针清0
; b; V# [, L$ M+ b, a* N        write_com(0x80);
- t+ {5 ?, W6 G. a$ L5 `}/ N) }0 i8 o" @8 u
//作用:串口中断初始化
/ e% [$ z8 n; d1 X* q1 Z6 E$ R//参数:
: q! o2 `  `2 x* y& y//返回值:
( x$ F( @7 n1 n' h" p5 h$ \void init_Serial(); E0 C% E5 a* ]$ ?1 }
{' m" G% n! \% O" |/ M5 K$ u
    SCON=0X50;        //工作方式1,允许接收
  Q* V- H" S  N6 c7 t        //SM0 = 0;. B% \9 L2 Y1 T+ L  u8 |8 G
        //SM1 = 1;
3 N* p; u; ]! A) {1 q        //REN = 1;
3 ~4 U7 h8 d/ r3 j/ ~$ R7 Q    TMOD=0X20;        //定时器 工作方式2; I1 L. e, S: h* X; F  a7 R
    TH1=TL1=230;//波特率为1200% }- f/ {3 i$ m" b: k7 B
    EA=1;                                        //开总中断
8 @+ D" \- Q: q( `( i    TR1=1;                                //T1启动
) D' P) h+ e1 z$ Y) w; V4 k    SBUF=data1[count];
0 S) l, X) I/ B! L1 @    ES=1;                                    //开串口
# c  E: `$ f% @8 o5 ~- l3 Y  }}/ U' W# z  D1 y8 y; ?+ C
//作用:串口中断服务程序
# F2 Y9 I; n" d$ W//参数:# G$ L$ n$ h8 w3 g) K# d# V7 r4 w
//返回值:
' ]! _' U! Z; K6 r! J  d+ P* z  t" Tvoid S_proc() interrupt 4
, c( B7 ~8 K  m: d& x{
/ Y5 S2 a" @4 r" g2 q    if(TI)                //发送结束$ w, }* G1 g6 O- c; B* q
    {  j6 b  C" Y% K* N4 q
        TI=0;5 g4 ]& w& t: J) s
        if(count<12)
+ E7 g! y7 r7 y* o! n        {4 s' t" u* N$ ?2 Y0 ]) o' u
            SBUF=data1[++count];
0 o  o$ Q/ q! D: Y6 I        }7 U/ N$ u9 s6 l. \+ Q+ ?6 n& A; n
    }1 f2 I# F: y6 E! H) B
    else                //接收结束' q* z4 P/ c) R9 T/ S' \: w
    {( v- y  e. z8 l3 x% N. v
        RI=0;; o: U5 ~4 s8 M! G
        a=SBUF;                //存数据
& r7 g9 C: e0 m6 J! y        SBUF=a;                //发送数据7 S* W' l9 {8 a; S# O9 D% Z
        while(!TI);        //等待发送完成, n, q3 J1 p6 H* m* \
                                TI=0;5 J) V2 }5 M, `! x+ k, K+ q9 S
                                temp[CNT++]=a;
! f' y0 I' n4 p1 u                                flag = 1;
4 {  s+ w% B# Z# v    }# v+ r$ P% a% i/ x
}
( @+ s6 v$ H# R. A3 }7 P  B//作用:主函数* P/ _# k. F  P6 |4 o
//参数:
( T* t2 z4 ~, A0 M( a0 v  u//返回值:
5 S. U# @" M( K  O  F. wvoid main()/ \, F' w8 I) X6 z# q) [; g3 t; k' ^* z
{
; T8 ~+ i. C1 c- x* l                int i;
; U, R6 N$ x  c2 N) m+ o, c                init_Serial();
3 O$ C; ]1 e3 K9 c) z* W9 t                init_LCD();* |- [1 K; _, s) Q' M) P% ?
    while(1)
3 p8 @( Y2 C) T5 ~3 }& \1 Y  R                {6 D5 B  t8 X, ?! |+ M. y( |
                                // LCD显示
4 d& K  I; p  @1 Z                                write_com(0x80);
4 S5 k. z/ T! l/ e8 K7 }                                if(flag)
# Y1 i8 O5 Z1 y, m0 [  o                                {
. d. f5 ~' g4 x% [; I( p' M, s& f7 i                                                //write_com(0x01);
* B' z  m7 j9 S: j" s# P$ H                                                for(i=0; i<CNT; i++)
$ S/ p8 m% z7 v$ Y/ Y% q2 F                                                {/ i' H2 o$ @: O
                                                                write_date(temp);
+ c6 D! {. b. U) x                                                                // temp = ' '; temp != '\0'4 m  u4 I4 Y8 Q% R! u7 n( K
                                                                delay(5);, I- [% Y! d0 D4 \. H3 c( N! a
                                                }# b/ J+ l, E% T5 T( e7 o+ z, \9 x
                                }- o- E% B- l& w. ^, \& ?( y; f
                                old_CNT = CNT;( s: f: ]1 s6 t, b, a
                                delay(100);
$ @# J: _3 ^# M. j; w8 U                                if(old_CNT == CNT)
( ]& Q. F7 ^- _) J                                {: z6 z1 {* y- n  ~  \; F
                                                CNT = 0;
) Y% {4 O0 a; x, o" q                                                flag = 0;
# i8 n& ]) V) G1 {                                }" p* m* f! L9 x' ?
                }
$ g( t$ I$ ?5 d  \& b$ L$ D0 F) u}0 F5 H$ I: |; E! o& d) y, K
游客,如果您要查看本帖隐藏内容请回复
2 A+ T, d6 X% J/ V  e6 Q

9 }9 R  y9 @) u+ f0 |; \

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-28 21:59 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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