标题:
STC89C51最小系统+HC-SR04+LCD12864(超声波测距仪)源码
[打印本页]
作者:
初学者孟宪
时间:
2018-7-13 16:12
标题:
STC89C51最小系统+HC-SR04+LCD12864(超声波测距仪)源码
QQ图片20180713160516.jpg
(1.83 MB, 下载次数: 52)
下载附件
2018-7-13 16:06 上传
单片机源程序如下:
/////////////////////////////////////////////////////////////////
/***********************超声波模块程序**************************/
/////////////////////////////////////////////////////////////////
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//全局变量定义
unsigned int time;
unsigned int S,s_false;
unsigned long num1;
bit flag;
//12864液晶显示定义
uchar code sj1[]={"<<超声波测距仪>>"};
uchar code sj2[]={" 榆林学院 "};
uchar code sj3[]={"测量范围5cm-2m "};
uchar code sj4[]={"当前距离:"};
uchar code sj5[]={"错误 "};
//超声波引脚定义
sbit Trig =P1^1; //定义引脚
sbit Echo =P3^2;
//12864液晶引脚定义
sbit lcdrs=P3^5; //命令数据
sbit lcdrw=P3^6; //读写
sbit lcde =P3^4;
sbit LCD_PSB=P3^7;
//时钟调整按键引脚定义
sbit rad=P2^4;
sbit rsu=P2^5;
sbit mad=P2^6;
sbit msu=P2^7;
sbit rst=P3^1; //DS1302复位端,低电平关闭
//延时函数
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay_20us()
{
uchar a;
for(a=0;a<100;a++);
}
//2864液晶写命令函数
void xmn(unsigned char com)
{
lcdrs=0;
P0=com;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
//2864液晶写数据函数
void xsj(unsigned char zifu)
{
lcdrs=1;
P0=zifu;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
//2864液晶显示函数1
void xs1()
{
uchar i;
xmn(0x80);
for(i=0;i<16;i++)
{
xsj(sj1[i]);
}
xmn(0x90);
for(i=0;i<16;i++)
{
xsj(sj2[i]);
}
xmn(0x88);
for(i=0;i<16;i++)
{
xsj(sj3[i]);
}
xmn(0x98);
for(i=0;i<16;i++)
{
xsj(sj4[i]);
}
}
//2864液晶显示函数2
void xs2(uint t_emp)
{
uchar qian,bai,shi,ge;
qian=t_emp/1000;
bai=(t_emp%1000)/100;
shi=(t_emp%100)/10;
ge=t_emp%10;
xmn(0x9d);
xsj(0x30+qian);
delay(1);
xsj(0x30+bai);
delay(1);
xsj(0x30+shi);
delay(1);
xsj(0x30+ge);
delay(1);
xsj('c');
delay(1);
xsj('m');
delay(100);
}
//超声波计数函数
void T0_time() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=0; //中断溢出标志,失败
TH0=0;
TL0=0;
TR0=0; //关闭计数
}
//中断定时函数
void T1_timer() interrupt 3 //中断
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
num1++;
}
//超声波模块启动函数
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 Count(void)
{
uchar i;
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.8)/100+2; //算出来是CM
if(((S<5)||(S>=600))||flag==0) //超出测量范围显示“-”失败
{
//flag=1;
s_false=1000;
xmn(0x9d);
for(i=0;i<6;i++)
{
xsj(sj5[i]);
}
//(s_false);
}
else
{
xs2(S);
}
}
//12864液晶初始化函数
void init()
{LCD_PSB=1;
delay(100);
xmn(0x30);
delay_20us();
xmn(0x30);
delay_20us();
xmn(0x0c);
delay_20us();
xmn(0x01);
delay_20us();
xmn(0x06);
delay_20us();
}
//主函数
void main()
{
//unsigned char TempCyc;
rst=0; //关闭板上DS1302
P0=0XFF;
P0=0XFF;
P0=0X00;
P0=0X00;
delay(500); //启动等待,等LCM讲入工作状态
lcdrw=0;
init(); //LCM初始化
delay(500); //延时片刻(可不要)
while(1)
{
TMOD=0x11; //设T0为方式1,GATE=1;
TH0=0;
TL0=0;
ET0=1; //允许T0中断
ET1=1;
TR1=1;
EA=1; //开启总中断
xs1();
Trig=0;
Echo=0;
while(1)
{
StartModule();
flag=1;
//while(!Echo); //当echo为零时等待
while((!Echo)&&flag);//当echo为零时等待,中断flag跳出等待
TR0=1; //开启计数
while(Echo&&flag); //当echo为1计数并等待
TR0=0; //关闭计数
Count(); //计算
delay(120); //80MS
}
}
}
复制代码
所有资料51hei提供下载:
51单片机控制超声波测距.zip
(62.84 KB, 下载次数: 112)
2018-7-13 16:12 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1