程序如下 /******************************************************************************* *
* 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位数字,但是值一直是固定的,用示波器看发射也有,反射波的高电平时间能随着距离变长而变长,但是一值显示固定值,求师傅指点! |