找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 943|回复: 0
收起左侧

求帮助:用HC-SR04测距让后用LCD1602显示,为什么显示错误

[复制链接]
ID:761375 发表于 2020-9-22 16:26 | 显示全部楼层 |阅读模式
#include <reg52.h>
#include <intrins.h>

#define LCD_DATA P0

sbit LCD_E=P2^7;
sbit LCD_RW=P2^5;
sbit LCD_RS=P2^6;

sbit led = P2^0;
sbit led1 = P2^1;
sbit led2 = P2^2;

sbit key = P3^1;

sbit trg = P1^2;           //超声波模块控制端
sbit ech = P1^3;           //超声波模块接收端

unsigned char i;
unsigned char flag = 0;

unsigned int count = 0;           //超声波模块时间变量
unsigned long dis;   //超声波测量的距离
unsigned char num[10] = "0123456789";

unsigned char thousend,hundred,ten,unit;

/*
延时函数delay延时 1ms入口参数  c                   
*/
void delay(unsigned int c)  
{
    unsigned char a,b;
        for (c; c>0; c--)
        {
                 for (b=199;b>0;b--)
                 {
                          for(a=1;a>0;a--);
                 }      
        }          
}

/****10us延时****/
void Delay10us()                //@12.000MHz
{
        unsigned char i;

        _nop_();
        _nop_();
        i = 27;
        while (--i);
}                         

void Lcd_Write_Cmd(unsigned int cmd)
{
        LCD_RS = 0;
        LCD_RW = 0;

        LCD_DATA = cmd;
        delay(5);

        LCD_E = 1;
        LCD_E = 0;
}

void Lcd_Write_Dat(unsigned char dat)
{
        LCD_RS = 1;
        LCD_RW = 0;

        LCD_DATA = dat;
        delay(5);

        LCD_E = 1;
        LCD_E = 0;
}                                         

void Lcd_Init()
{
        Lcd_Write_Cmd(0x38);
        Lcd_Write_Cmd(0x0f);
        Lcd_Write_Cmd(0x06);
        Lcd_Write_Cmd(0x01);               
}

/****定时器初始化****/
void T0_T1_Int0_Init()
{
        TMOD = 0x11;     //配置定时器工作模式及方式寄存器(TCON为定时器控制寄存器)
       
        TH0 = (65535 - 5000) / 256;
        TL0 = (65535 - 5000) % 256;

        TH1 = 0;                 //为定时器1设初值
        TL1 = 0;                 //高八位与低八位均为0

        EA = 1;                         //开放总中断
        ET1 = 1;                 //开放定时器1中断
        ET0 = 1;
}

void T0_ser() interrupt 1
{
        unsigned char n;       

        TH0 = (65535 - 5000) / 256;
        TL0 = (65535 - 5000) % 256;

        n++;

        if(n >= 16)
        {
                n = 0;
                trg = 1;                                   //向控制端
                Delay10us();                           //提供
                Delay10us();                          //20us
                trg = 0;
       
                led = ~led;
        }
}

void T1_ser() interrupt 3
{
        TH1 = 0;
        TL1 = 0;
}

void Distance()
{
        while(!ech);
        TR1 = 1;
        while(ech);
        TR1 = 0;
}

void Dis_Count()
{
        count = TH1 * 256 + TL1;
        dis = (long)(count * 0.017); //计算小车到障碍物的距离(cm)

        thousend = dis / 1000;
        hundred = dis % 1000 / 100;                  
        ten = dis % 100 / 10;                               
        unit = dis % 10;
}

void main()
{                          
        Lcd_Init();

        T0_T1_Int0_Init();

        Lcd_Write_Cmd(0x80);

        TR0 = 1;
         
        while(1)
        {         
                Distance();
                Dis_Count();
                                                               
                Lcd_Write_Dat(num[thousend]);
                delay(1);
                Lcd_Write_Dat(num[hundred]);
                delay(1);
                Lcd_Write_Dat(num[ten]);
                delay(1);
                Lcd_Write_Dat(num[unit]);
                delay(100);
       
                Lcd_Write_Cmd(0x01);

                if(dis < 50)
                {
                        led2 = 0;       
                }
                if(dis > 50)
                {
                        led2 = 1;       
                }       
        }
}

LCD1602显示的数字一直再增加
不知道哪里出了问题

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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