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

 超声波传感器和stc89c51单片机的c语言代码 

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
超声波传感器和stc89c51单片机的c语言代码
C:
" W! X5 q, O# z0 h1 FSMC1602A(16*2)模拟口线接线方式$ W, F0 J- M) a# ]' ]
连接线图:    ' [: p: a0 Q, L7 L4 h
       ---------------------------------------------------% }: Y; b6 R5 G' m
       |LCM-----51   |    LCM-----51   |    LCM------51      |5 l, C  F  v8 M2 J% w) L* j3 M
       --------------------------------------------------|
1 ~0 s4 F2 ?4 _$ }' @       |DB0-----P2.0 |    DB4-----P2.4 |    RW-------P0.6    |* z1 y& h  {, U0 }* k+ M
       |DB1-----P2.1 |    DB5-----P2.5 |    RS-------P0.7    |$ [. u: h9 t' a% z2 {
       |DB2-----P2.2 |    DB6-----P2.6 |    E--------P0.5    |
+ ^. T' q; a5 V( G8 z# K: u       |DB3-----P2.3 |    DB7-----P2.7 |    VLCD接1K电阻到GND|
, r) ]7 ~9 o! K+ T       ---------------------------------------------------( n3 u) H! ^' l& s8 B& X' x
接线:模块TRIG接 P1.2  ECH0 接P1.1
( ]; e1 A/ h. _7 l/ \6 V7 J1 e1 R9 I; B: {) C: L
本程序源码只供学习参考,不得应用于商业用途

# d5 s; Y0 k( t0 R: n$ l#include <AT89x51.H>        //器件配置文件
9 ?$ `; I+ i, l#include <intrins.h>9 Y- E8 S8 v- l6 i5 ^
#define  RX  P1_1
7 i* @; M' k: G#define  TX  P1_2
8 c2 X# o9 h5 I- ?" p6 F1 p
+ C0 ~) u8 U0 ]8 c3 }- \8 C: O9 c#define LCM_RW  P0_6 //定义LCD引脚
/ M& Z2 [) M/ @& P#define LCM_RS  P0_7
5 P% K4 x1 Z& ]4 O" S( z$ V/ h4 D5 C#define LCM_E   P0_5
7 W, p- t- O# |; V5 ]3 o* q#define LCM_Data  P2
+ G( c$ G3 k1 J5 Y7 N% _. n4 e& h( |- }) O4 Q" E) Y

3 c; j" C+ c! `; k#define Busy    0x80 //用于检测LCM状态字中的Busy标识
5 J$ u/ x- ^3 S  x# |& N$ R9 K4 Q! x( d7 R
void LCMInit(void);
, |; d4 i' k$ ^) m' dvoid DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  t7 v! r3 _4 d: c, xvoid DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
7 C& e7 ^- ~. @void Delay5Ms(void);
$ C9 g3 ^! U2 Gvoid Delay400Ms(void);
+ n2 @$ d; l$ `$ x. a6 Pvoid Decode(unsigned char ScanCode);% {( w5 F1 q+ B" ~7 A
void WriteDataLCM(unsigned char WDLCM);& G. w( ^" E3 ]+ v- l9 i
void WriteCommandLCM(unsigned char WCLCM,BuysC);
) p/ _7 h. o6 D5 r; h" P, G+ k1 Q5 o/ Y# n2 a& B8 |
unsigned char ReadDataLCM(void);
9 A0 W. z6 j& G# Hunsigned char ReadStatusLCM(void);+ F/ x: }$ h/ U- b. e4 Y
unsigned char code mcustudio[] ={" WWW*QXMCU*COM  "};
' [! ]5 w# B4 dunsigned char code email[] =    {"863888999@QQ.COM"};0 [6 L+ M2 Z9 e. \- C
unsigned char code Cls[] =      {"                "};
0 d2 v: N" P- Q4 h' Xunsigned char code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
2 O( E9 E9 w+ t/ e6 u
/ k$ v: j- J: }1 y. B$ F- R, Pstatic unsigned char DisNum = 0; //显示用指针                  
! b1 v) O* n1 K& R: b* s9 N       unsigned int  time=0;
! \. ~! R6 t9 A( J. s% q       unsigned long S=0;
* l* b: g8 g5 ~" d; _       bit      flag =0;" a. G% y0 {: Y5 v
       unsigned char disbuff[4]       ={ 0,0,0,0,};
& Q  f: U8 ^& v# Y
+ d$ c6 `! N# a# V- ?+ S4 t9 ]- Y# P+ g% l- b$ u+ X5 O
//写数据
% T; r' @- k9 A: ~( Jvoid WriteDataLCM(unsigned char WDLCM)
2 i, z$ E9 P/ ]) H1 u" T{
4 R( r" v; B. ?* _. ^* g8 g    ReadStatusLCM(); //检测忙
1 q: X* B) c& `0 l+ R1 t    LCM_Data = WDLCM;
" X" t& x  g. ~, P    LCM_RS = 1;
8 P& I, s! s+ T# H    LCM_RW = 0;
& r& t0 `' ~: n    LCM_E = 0; //若晶振速度太高可以在这后加小的延时
( q7 T6 N7 T! O. u+ A1 e% @- N    LCM_E = 0; //延时4 [0 G9 R( L2 z8 W1 S3 y! n& D
    LCM_E = 1;
( P' H1 o8 y4 P! c. @, E}
2 q+ ]- p8 u, O0 C2 Z0 D* |, k3 b* k- t+ a( N1 l% l
//写指令0 W( m; m; k2 m* g5 H
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
6 o$ U6 ]1 G6 `9 \( `4 g7 B{# K" d! R' g5 n. T
    if (BuysC) ReadStatusLCM(); //根据需要检测忙& S- J, F5 {- ?3 \# u( m8 q
    LCM_Data = WCLCM;
& E/ ~/ J7 G3 i' x  w$ I; L    LCM_RS = 0;0 h0 I  I) A3 N( J' w
    LCM_RW = 0;   ( w: W0 o" t" G; j, q3 \
    LCM_E = 0;0 c7 v0 T! w* L! L% g' R1 F
    LCM_E = 0;
% S3 {& m8 B" Z7 Y: W. {% J% i" @    LCM_E = 1;   0 g  u) W% S3 d% Z- d& E
}
8 ]( A2 @1 X1 h$ Y' h
" Z& w/ l& L8 r! Z! x//读数据/ d6 x3 @8 w! Y. I+ P3 `6 R3 G. }
unsigned char ReadDataLCM(void)2 v. a7 {* ?* @0 c8 w
{5 E  E7 N7 l' u9 X0 c: f
    LCM_RS = 1;
) G( v. C  p  k7 Q4 q& T3 x1 w5 Z    LCM_RW = 1;* g* Q+ Q8 ?! R$ c
    LCM_E = 0;" x1 s, a4 @4 F6 R1 R9 e4 I' q
    LCM_E = 0;# b1 q9 D' j7 N0 j; t2 A  p$ J
    LCM_E = 1;
: v7 j9 I, r0 s" Y8 Y6 R- u  {) t    return(LCM_Data);
" M& v6 \! ?7 m) j) k- d) B7 {}
  D0 ^0 ~! V0 ^! c. W; I
- z- X) Q% i: Q) U//读状态
$ z" {3 _6 k: N. ?% Kunsigned char ReadStatusLCM(void)% Z7 f# ^8 g! G: m, p3 W1 Y7 @5 r
{6 m4 Z  a+ V) b" T. H6 C
    LCM_Data = 0xFF;% G# t+ g: r6 G8 C! }
    LCM_RS = 0;
5 ~4 y0 Z7 E0 E% s% z    LCM_RW = 1;
! k* W* I/ a5 F2 `* j/ g    LCM_E = 0;( C5 U: w) s0 O& u* g) W
    LCM_E = 0;
) T0 J( w3 p! s0 y    LCM_E = 1;
0 Q6 l/ l* q: {2 V# j7 I2 p    while (LCM_Data & Busy); //检测忙信号7 }5 P  ]/ {6 A8 q: _/ s
    return(LCM_Data);
& \: W1 E) d- W, Z4 H* ?}
2 V6 ~( L. j1 P' `) t, W; u1 w0 N" W# E% ?- U; l; ^1 O
void LCMInit(void) //LCM初始化
( L' E2 j5 {; }9 v* x: i! j{
8 i3 d! R! I" q: ~9 v    LCM_Data = 0;1 T0 `0 R6 w2 \; f% }
    WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
' f2 L- P1 E5 u    Delay5Ms();' V6 C% ~1 \2 R: H
    WriteCommandLCM(0x38,0);$ p, W' `. ?) a& s
    Delay5Ms();5 x0 n9 [- j4 d  _3 m6 Q4 \
    WriteCommandLCM(0x38,0);
1 m* F3 o& g3 Z    Delay5Ms();+ M2 C7 g# x  H9 U0 o+ X6 d" |: `  P
" D, ?0 b/ {# z" o8 L6 h5 i( F
    WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号- \& f$ s3 h4 X* H! @8 }
    WriteCommandLCM(0x08,1); //关闭显示
" p, k2 Q9 O) h/ |) o/ ]+ Q    WriteCommandLCM(0x01,1); //显示清屏" s; m) i9 K" {; L" d
    WriteCommandLCM(0x06,1); // 显示光标移动设置4 E4 Z( q: Q3 V6 d
    WriteCommandLCM(0x0F,1); // 显示开及光标设置
: J; }& O0 M3 h, E}" A' `5 _1 M6 Z

4 K7 f% R  g. U8 Z//按指定位置显示一个字符1 U6 x( ^$ G( c# r% O
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData): @- u2 H* t( f$ t/ S) m; N
{1 t1 H4 l) H8 L& g, T. u& U) B
    Y &= 0x1;* \' \4 D1 N: W; s8 n
    X &= 0xF; //限制X不能大于15,Y不能大于1
7 b2 x  ^& \! U9 Q( ]    if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
5 \% ]$ b- k/ H/ f( G% K    X |= 0x80; //算出指令码3 f  P& J0 I! k! a
    WriteCommandLCM(X, 1); //发命令字
7 f& f) Q/ S6 t: O' q; M    WriteDataLCM(DData); //发数据! x6 D1 X) K$ I+ \6 @3 O" f
}
& v1 _1 j) S. r: B2 Q& \9 v& m/ X" P
//按指定位置显示一串字符, H# L9 D, {) F( ]
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
! h+ T# C1 J0 A8 [{
! j3 `8 W$ p0 [/ \    unsigned char ListLength;; h' }% _. q5 T1 \* ^/ _' N1 K+ T2 T- }

7 u- H( y; C; l9 O0 C" h  ListLength = 0;
9 K* D# W7 w  ~( f' D& I    Y &= 0x1;
$ N3 P# H. N- l- X- z    X &= 0xF; //限制X不能大于15,Y不能大于1
! G  L8 \  A2 E4 x    while (DData[ListLength]>0x19) //若到达字串尾则退出, {. ]) c+ _  ]( X+ A: `4 |; Q1 u! ^
        {  ?- b) k! \& {5 c1 r
            if (X <= 0xF) //X坐标应小于0xF
9 P6 P$ W; N) d2 d) X4 U                {
" }% T$ x# G' _% I! w; ^                    DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
) k6 j3 Y$ p# m( Y% X- y( s5 {                    ListLength++;
1 T' R2 U) d! E$ T$ |                    X++;1 l! _$ V2 T( o- Y
                }* `% {& S: S% F& H
        }
. ^2 V9 a5 C! K9 X* a. F}
' D+ e6 [) l  n
1 w  _3 ?" K6 G$ d4 R//5ms延时
+ Q- e/ H0 F' x+ n' j( ]- c9 ^$ c! evoid Delay5Ms(void)
! C- u# ~* u5 q7 U9 `, s6 ?{3 h! P  }# E1 Q4 Q6 p% T
    unsigned int TempCyc = 5552;
# m( a  x+ p# e. f/ t: J    while(TempCyc--);9 H- G" f8 N2 E. s
}
* m" G: Q; c( V8 u" b6 y8 T5 \8 A( [( E  b$ Z9 f
//400ms延时
$ t  q/ V/ z5 B% k! {/ T/ evoid Delay400Ms(void)
- H4 n% m% U, _& a0 H$ G{
1 p- d, I, J$ F! @$ d    unsigned char TempCycA = 5;
. x  r+ r* j5 T+ x3 q    unsigned int TempCycB;
0 c8 O: R& n* B$ b% m    while(TempCycA--)
0 |0 n5 J& `$ v8 ~0 F        {5 @" b+ _" @6 |. j5 |. G7 {
            TempCycB=7269;% g* {8 _' |9 x* l* y- b4 j% `1 V9 B
            while(TempCycB--);
2 A& S: [9 j$ O6 a6 E+ S        };
: v' }) x: X: v; n}
) O( y' g& R" V0 m5 f/********************************************************/1 p5 S4 g5 ]$ H1 z
    void Conut(void)4 U& g) @# ?8 w; A/ A1 V' j5 l
    {
) f" Y7 f/ i: n! o( P1 C     time=TH0*256+TL0;
6 ]& m9 F* l9 f     TH0=0;7 ]" z# w3 W+ ^1 w
     TL0=0;6 [. H7 l: @+ Q  c

: Q: R: b6 m# z8 c0 k" x& E/ a     S=(time*1.7)/100;     //算出来是CM5 E9 W5 D' b/ i6 j8 c/ x+ Y  F
     if((S>=700)||flag==1) //超出测量范围显示“-”
; z) ?* y2 q8 s; \4 M     {     
8 E6 _2 g4 h8 {! }3 C      flag=0;; m  e* \0 T7 G, O

4 ]8 d' w) D  l! |' {- n      DisplayOneChar(0, 1, ASCII[11]);; I; t% s" I) a8 `; Z$ @
      DisplayOneChar(1, 1, ASCII[10]);    //显示点5 a% M9 H9 h! `5 D0 f
      DisplayOneChar(2, 1, ASCII[11]);8 |, K2 X& ~6 r+ [
      DisplayOneChar(3, 1, ASCII[11]);. Y& u) l( x& M" g9 H4 v
      DisplayOneChar(4, 1, ASCII[12]);    //显示M3 B% c' A. c# {8 M/ N* \$ B
     }
% q9 F+ l9 X1 K     else" c. B2 i" I: G2 r
     {
  C3 m) w0 k$ x0 {- \- a      disbuff[0]=S%1000/100;
9 |8 t+ x% V( x9 Q: c8 Z9 K      disbuff[1]=S%1000%100/10;+ k, ^' v! ]5 M7 V: e
      disbuff[2]=S%1000%10 %10;* `  t" w% q7 D$ p  ?; u) ^
      DisplayOneChar(0, 1, ASCII[disbuff[0]]);
2 V1 {: b" ?6 _      DisplayOneChar(1, 1, ASCII[10]);    //显示点' U2 y8 t6 _4 T" D; j/ m
      DisplayOneChar(2, 1, ASCII[disbuff[1]]);! U) g! X# n5 V8 x* X( D7 W
      DisplayOneChar(3, 1, ASCII[disbuff[2]]);
) n9 H' A( Q. c+ h      DisplayOneChar(4, 1, ASCII[12]);    //显示M: d8 ~9 _  F- {+ s+ ~$ I% z- l
     }5 b2 u1 Q  P, t- ?: u, z
    }
% @- R4 V2 R! T4 c! _. E9 z/********************************************************/
5 q* b0 ~; {. l7 O$ g% v; ?     void zd0() interrupt 1          //T0中断用来计数器溢出,超过测距范围4 ?( f; R  q; o% q' _3 g/ h
  {
; \9 U; U7 [+ z9 z3 G    flag=1;                             //中断溢出标志
# }# f. a* K: M. |# C9 u  }, `( T4 n( w( A/ [* d
/********************************************************/
. x3 g' N- L% p5 `     void  StartModule()                  //启动模块
1 c4 E3 @7 }/ g  A9 g% v  {
: T5 z7 D8 S1 R0 t3 [$ u# f9 D      TX=1;                                 //启动一次模块* x$ K4 c, ?& b- H% q# Y. y) a
      _nop_();2 Z% g- c! j( ^0 r) [
      _nop_();; `* \" m$ X8 ^% M; e  j
      _nop_();
5 i( M4 Y: x. ^- ~      _nop_();" l! i& X( d/ z; c$ |
      _nop_();
- D8 \5 e8 e4 [* R( |      _nop_();
8 m; y7 l  q+ a% ]" r8 L/ m      _nop_();
: |& K1 V5 ]% S  q      _nop_();
# K( H* P, b% ^" B" W      _nop_();9 w% ~6 D2 [9 F) m* w
      _nop_();4 ]- M4 F8 \9 s$ R' L) w  \
      _nop_();
, i% |+ T4 W( z  }, A      _nop_();1 A4 r2 o- x* B* z. C" z! q
      _nop_();3 C7 _% D4 B8 y2 Z. g" l
      _nop_();
* s2 c$ r7 V1 m5 S! ?      _nop_();1 f+ a" {# [1 F6 k2 u5 I
      _nop_();
. i% o6 {" X& o6 M, f) R5 V      _nop_();5 Y8 d) W( N0 ^# j3 T6 z
      _nop_();
' }5 ^, A1 e+ y8 O' U3 A5 u      _nop_();
) [: t  X- u* E      _nop_();% ?( ?) J- h: C+ P
      _nop_();* E9 H. [: r7 Z+ H6 o
      TX=0;/ O4 T# @3 b9 ?( a5 v* |. R
  }
" v+ X9 U5 s0 z5 F0 {/********************************************************/
( g, |  ^" i+ F! L  Xvoid delayms(unsigned int ms)& X" V) M' a( B0 h6 ^3 f
{! b+ W7 i" y3 k4 v, u$ K& \
    unsigned char i=100,j;
) Y% \- p9 Y1 ?3 m3 \0 C: s    for(;ms;ms--)% G$ h/ N" @7 I; d4 \6 v  ~2 M
    {* S; A0 b, w) ~
        while(--i)
/ V- J5 q! g/ d" e  A3 _        {# R9 k! Y, N, Q% N0 Y; ]
            j=10;5 a' d3 L4 P- p5 u2 n/ K/ W/ y
            while(--j);  L2 _/ }* s3 `0 B3 y/ |; j% `6 k, ^
        }
- ?* t+ W6 U4 z( c& r7 f7 H1 \    }" O* y1 }. @0 i5 Z' A9 R
}) a5 ?' C8 W5 x) w5 G: T; E8 }
/*********************************************************/( ~  t3 n- H* r5 N" R1 u6 z/ K
void main(void)( l0 s$ k2 {9 W
{5 O3 P9 y. s4 I) n
    unsigned char TempCyc;
/ N  m2 H5 q/ J, W    Delay400Ms(); //启动等待,等LCM讲入工作状态
( V$ e, D' T6 C    LCMInit(); //LCM初始化
* s  o9 Z/ G/ ?( R+ H" Z  |- z    Delay5Ms(); //延时片刻(可不要)
* O0 y8 J" L9 S2 P" h$ J    DisplayListChar(0, 0, mcustudio);
! J$ N) M6 S3 ^5 [( O6 \7 k    DisplayListChar(0, 1, email);
, I: \5 N) C  e! I3 W. Y! @0 @: V    ReadDataLCM();//测试用句无意义
: L5 @& N! z- C- M# h" Y    for (TempCyc=0; TempCyc<10; TempCyc++): f) {5 p# A1 }3 B# P( e
    Delay400Ms(); //延时% ]- s& Q9 o7 j6 p
    DisplayListChar(0, 1, Cls);   
$ d& o& T; r* H7 p' y    while(1)% S9 _8 k9 y! z6 B& N
    {+ b$ H) w. l8 @$ G% @, S
     TMOD=0x01;           //设T0为方式1,GATE=1;
" E2 M% e8 ~8 z     TH0=0;( |6 C4 L+ _4 p- G* `! @
     TL0=0;         % w, l& _$ b- l" \$ k
     ET0=1;             //允许T0中断
! S  Y/ O! k9 G# y( S6 Z3 |7 \     EA=1;               //开启总中断            
3 d2 j& ~9 p, d( f( h1 M/ Z3 x
' |* _% }/ e8 A1 r8 L  j0 v    while(1)# q. `, `% {) s+ I3 m5 @, ]$ |
      {
7 H' H* E8 _1 v; G+ D0 _         StartModule();; b: J, c8 w* g2 r9 ^! d
        // DisplayOneChar(0, 1, ASCII[0]);
; l/ n! N  X  k, g" I2 d. B) h         while(!RX);        //当RX为零时等待
7 i& v  t4 u- r0 W, w* \3 p7 n         TR0=1;                //开启计数
+ L! e' o5 C0 D/ N1 N) E( i: K- _- o         while(RX);            //当RX为1计数并等待/ G2 O' X; b3 {  W$ f
         TR0=0;                //关闭计数
0 G7 e# e- e2 l/ A         Conut();            //计算' J/ h" U5 D9 {) d0 Q, v; x
         delayms(80);        //80MS
9 f$ I" j. l. f5 v0 I
# B) {3 _* j, D; A; s1 X( p) H      }
# C- k6 \: R2 x1 a8 S5 e  }    }
+ {* z$ M; p( n( D; s}- q/ o; b( r1 X  w. R- y+ W

9 D4 g5 q, ~/ E& g  W. d5 R8 \
6 x7 v" D) y6 ?4 X  W" ]
( }" {* y5 ^8 r5 n: F$ S( M
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-22 06:57 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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