打印

请师傅看看哪里问题,12864+超声波模块显示不正常

[复制链接]
1205|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
rdfeps|  楼主 | 2014-4-8 17:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序如下 /*******************************************************************************                                                                       *
*      12864标准字库液晶演示 数据p0,控制p2                                     *
********************************************************************************/
#include <reg52.h>
//#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
uint bai,shi,ge,time,s;  //定义千位 百位 十位 个位 时间  长度
bit flag;
void delay (uint t);
void delay20us(void);
void write_12864com(uchar com);
void write_12864dat(uchar dat);
void init ();
void Clr_Scr(void);
void display1();
void display2();
void display3();
void conut() ;   //计算距离函数
// uint table1[]={"  程序初始化中 "};
uchar table[]={'0','1','2','3','4','5','6','7','8','9'};

/************* 12864LCD引脚定义 *************/
#define LCD_data  P0       //数据口
sbit rs  =  P2^6;      //寄存器选择输入
sbit rw  =  P2^5;      //液晶读/写控制
sbit e  =  P2^7;      //液晶使能控制
sbit psb =  P2^2;      //串/并方式控制
sbit rst =  P3^7;      //液晶复位端口
//超声波引脚定义
sbit trig  = P2^0; //产生脉冲引脚
sbit echo  = P3^2; //回波引脚

//                                                                                     主函数                                                                                      
void main (void)
{
  delay (3);   // 等待电路板电平稳定
  init ();       //液晶屏初始化

  trig=0;  //拉低发射端,准备发射超声波
  EA=1;    //打开总中断
  TMOD=0X90 ; // TMOD中断工作方式控制字  打开定时器0 工作方式16位 且受门控GATE控制(p3.2为高电平且TR0=1)
  while (1)
  {
  EA=0;
        trig=1; //发射超声波
   delay20us(); //  发射时间20US
        trig=0; //停止发射
  // while (echo==0);   // 等待反射波  ,没有收到反射波则一直等待
  // flag=0; //接收到回波,将标志位清0,准备下次接收
        EA=1;  //恢复总中断
         
   TH0=0; //清空定时器1的高8位
        TL0=0; //清空定时器1的低8位
        TF0=0; //定时器1的溢出标志位手动清0
        TR0=1; //开始计算超声波的接收时间时长 (最长65535us)
        while (echo==1);  //如果一直有回波,则一直等待 让定时器保存总时长
   TR0=0;  //一次发射-接收结束。关闭定时器0,定时器的值保存在16位计数器里,稍后计算距离
                  conut() ;
        display1 ();
   display2 ();
        display3 ();
        delay (100);
       

   
        }
}
void conut()                 //计算距离
{
        time=TH0*256+TL0;                                                           
        TH0=0;
        TL0=0;
        s=time/58;
        
       bai=s%1000/100;
       shi=s%100/10;
        ge=s%10;
}
/*         定时器1中断            */
void timer0() interrupt 1

{
        conut() ;
TH0=0; //清空定时器1的高8位
        TL0=0; //清空定时器1的低8位
}         






void display1()
{
  
write_12864com (0x80);  
  
        write_12864dat (table[bai]);
  
}
void display2()
{
  
write_12864com (0x81);  


        write_12864dat (table[shi]);

}
   void display3()
{
  
write_12864com (0x82);  


        write_12864dat (table[ge]);

}






//psb=1;
//rst=1;







   //写指令函数                                       
void write_12864com(uchar com)
{
  rs=0;
  rw=0;
  delay(1);
  e=1;
  P0=com;
  delay(10);
  e=0;
  delay (2);
}

//写数据函数
void write_12864dat(uchar dat)
{
rs=1;
  rw=0;
  delay(1);
  e=1;
  P0=dat;            
  delay(10);
  e=0;
  delay (2);
}

//初始化
void init ()
{
delay (100);
write_12864com(0x30);
delay (3);
write_12864com(0x30);
delay (1);
write_12864com(0x0e);
delay (3);
write_12864com(0x01);
delay (250);
write_12864com(0x06);
delay(10);
}
//延时函数
void delay (uint t)
{
  uchar j;
  for(t;t>0;t--)
  for(j=19;j>0;j--);
}

void delay20us(void)   //误差 0us
{
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=7;a>0;a--);
}

程序 中12864的驱动是正常的,能显示3位数字,但是值一直是固定的,用示波器看发射也有,反射波的高电平时间能随着距离变长而变长,但是一值显示固定值,求师傅指点!

相关帖子

沙发
dirtwillfly| | 2014-4-8 19:36 | 只看该作者
好长的代码,帮顶顶

使用特权

评论回复
板凳
rdfeps|  楼主 | 2014-4-8 19:58 | 只看该作者
sbit trig  = P2^0; //产生脉冲引脚
sbit echo  = P3^2; //回波引脚
//                                                                                     主函数                                                                                      
void main (void)
{
  delay (3);   // 等待电路板电平稳定
  init ();       //液晶屏初始化
  trig=0;  //拉低发射端,准备发射超声波
  EA=1;    //打开总中断
  TMOD=0X90 ; // TMOD中断工作方式控制字  打开定时器0 工作方式16位 且受门控GATE控制(p3.2为高电平且TR0=1)
  while (1)
  {
  EA=0;
        trig=1; //发射超声波
   delay20us(); //  发射时间20US
        trig=0; //停止发射
  // while (echo==0);   // 等待反射波  ,没有收到反射波则一直等待
  // flag=0; //接收到回波,将标志位清0,准备下次接收
        EA=1;  //恢复总中断
         TH0=0; //清空定时器1的高8位
        TL0=0; //清空定时器1的低8位
        TF0=0; //定时器1的溢出标志位手动清0
        TR0=1; //开始计算超声波的接收时间时长 (最长65535us)
        while (echo==1);  //如果一直有回波,则一直等待 让定时器保存总时长
   TR0=0;  //一次发射-接收结束。关闭定时器0,定时器的值保存在16位计数器里,稍后计算距离
                  conut() ;
        display1 ();
   display2 ();
        display3 ();
        delay (100);   
        }
}
void conut()                 //计算距离
{
        time=TH0*256+TL0;                                                           
        TH0=0;
        TL0=0;
        s=time/58;
       bai=s%1000/100;
       shi=s%100/10;
        ge=s%10;
}
/*         定时器1中断            */
void timer0() interrupt 1
{
        conut() ;
TH0=0; //清空定时器1的高8位
        TL0=0; //清空定时器1的低8位
}         
void display1()
{
  write_12864com (0x80);  
   write_12864dat (table[bai]);
  }
void display2()
{
  write_12864com (0x81);  
  write_12864dat (table[shi]);
}
   void display3()
{
  write_12864com (0x82);  
write_12864dat (table[ge]);
}
应该是这一段有问题,我是新手自学的,不知道哪里出了问题

使用特权

评论回复
地板
rdfeps|  楼主 | 2014-4-8 20:27 | 只看该作者
本帖最后由 rdfeps 于 2014-4-8 21:54 编辑

忘 了开ET0   TMOD应该是0X09,但是ET0=1后还 是不行

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

23

帖子

1

粉丝