android 字符串 声波,我想将超声波测到的距离用单片机串口发到上位机,以字符串的形式发送 求帮助...

本帖最后由 ennnnnmin 于 2019-4-12 23:36 编辑

我想将我超声波测到的距离发到上位机,以字符串的形式发送,例如 2M,3M这样的,LCD用的是1602。

---------------------------------------------------------------------------------------------------------------

#include

#include

#include"lcd.h"

sbit Trig = P2^1;

sbit Echo = P2^0;

unsigned char PuZh[]=" chaoshengbo ";

unsigned char code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.','-','M'};

static unsigned char DisNum = 0; //显示用指针

unsigned int  time=0;

unsigned long S=0;

bit      flag =0;

unsigned char disbuff[4]           ={ 0,0,0,0,};

/*******************************************************************************

* 函 数 名         : main

* 函数功能                   : 主函数

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/

void Conut(void)

{

time=TH0*256+TL0;

TH0=0;

TL0=0;

S=(time*1.7)/100;     //算出来是CM

if((S>=700)||flag==1) //超出测量范围显示“-”

{

flag=0;

DisplayOneChar(0, 1, ASCII[11]);

DisplayOneChar(1, 1, ASCII[12]);        //显示M

}

else

{

disbuff[0]=S%1000/100;

DisplayOneChar(0, 1, ASCII[disbuff[0]]);

DisplayOneChar(1, 1, ASCII[12]);        //显示M

}

}

void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围

{

flag=1;                                                         //中断溢出标志

}

void  StartModule()                          //启动模块

{

Trig=1;                                             //启动一次模块

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

Trig=0;

}

void delayms(unsigned int ms)

{

unsigned char i=100,j;

for(;ms;ms--)

{

while(--i)

{

j=10;

while(--j);

}

}

}

void main(void)

{

TMOD=0x01;                   //设T0为方式1,GATE=1;

TH0=0;

TL0=0;

ET0=1;             //允许T0中断

EA=1;                           //开启总中断

InitLcd1602();

LcdShowStr(0,0,PuZh);

while(1)

{

StartModule();

while(!Echo);                //当RX为零时等待

TR0=1;                            //开启计数

while(Echo);                        //当RX为1计数并等待

TR0=0;                                //关闭计数

Conut();                        //计算

delayms(80);

}

}

--------------------------------------------------------------------------------

#include"lcd.h"

void Read_Busy()           //忙检测函数,判断bit7是0,允许执行;1禁止

{

unsigned char sta;      //

LCD1602_DB = 0xff;

LCD1602_RS = 0;

LCD1602_RW = 1;

do

{

LCD1602_EN = 1;

sta = LCD1602_DB;

LCD1602_EN = 0;    //使能,用完就拉低,释放总线

}while(sta & 0x80);

}

void Lcd1602_Write_Cmd(unsigned char cmd)     //写命令

{

Read_Busy();

LCD1602_RS = 0;

LCD1602_RW = 0;

LCD1602_DB = cmd;

LCD1602_EN = 1;

LCD1602_EN = 0;

}

void Lcd1602_Write_Data(unsigned char dat)   //写数据

{

Read_Busy();

LCD1602_RS = 1;

LCD1602_RW = 0;

LCD1602_DB = dat;

LCD1602_EN = 1;

LCD1602_EN = 0;

}

void LcdSetCursor(unsigned char x,unsigned char y)  //坐标显示

{

unsigned char addr;

if(y == 0)

addr = 0x00 + x;

else

addr = 0x40 + x;

Lcd1602_Write_Cmd(addr|0x80);

}

//按指定位置显示一个字符

void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)

{

Y &= 0x1;

X &= 0xF; //限制X不能大于15,Y不能大于1

if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;

X |= 0x80; //算出指令码

Lcd1602_Write_Cmd(X); //发命令字

Lcd1602_Write_Data(DData); //发数据

}

void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str)     //显示字符串

{

LcdSetCursor(x,y);      //当前字符的坐标

while(*str != '\0')

{

Lcd1602_Write_Data(*str++);

}

}

void InitLcd1602()              //1602初始化

{

Lcd1602_Write_Cmd(0x38);    //打开,5*8,8位数据

Lcd1602_Write_Cmd(0x0c);

Lcd1602_Write_Cmd(0x06);

Lcd1602_Write_Cmd(0x01);    //清屏

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值