標(biāo)題:
程序資料齊全的51單片機的液晶顯示超聲波測距儀
[打印本頁]
作者:
dzdiy
時間:
2015-4-11 19:24
標(biāo)題:
程序資料齊全的51單片機的液晶顯示超聲波測距儀
這款基于51單片機的液晶顯示超聲波測距儀,超聲波模塊使用的是US-100。這個基本上很常見的:通過一個矩形脈沖啟動超聲波,通過echo引腳計算出高電平的時間,這個已經(jīng)有溫度補償!所以計算出來的時間是可以乘340m/s的。蜂鳴器用的是無源的,用PWM波就可以驅(qū)動啦!1k到5k。使用的液晶是1602液晶,以前也用過,實物圖如下圖所示:具體使用就不多說啦!下面是實物圖及源程序,貼出來方便大家仿制。
第一個文件:
#ifndef _1602_H_
#define _1602_H_
#include "reg52.h"
sbit RS=P1^0;
sbit RW=P1^1;
sbit EN=P1^2;
void delay();
void delay1(int z);
void write_com(unsigned char com);
void write_date(unsigned char date);
void L1602_init();
void L1602_char(unsigned char hang,unsigned char lie,char sign);
void L1602_string(unsigned char hang,unsigned char lie,unsigned char *p);
void L1602_int(unsigned char hang, unsigned char lie, int num);
#endif
#include "1602.H"
#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
void delay()
{
int i,j;
for(i=1;i>0;i--)
for(j=15;j>0;j--);
}
void delay1(int z)
{
int i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void write_com(uchar com)
{
P0 = com;
RS = 0;
RW = 0;//寫
EN = 0;
delay();
EN = 1;
delay();
}
void write_date(uchar date)
{
P0 = date;
RS = 1;
RW = 0;
EN = 0;
delay();
EN = 1;
delay();
}
void L1602_init()
{
write_com(0x01); //清屏
write_com(0x38); //顯示模式
write_com(0x0c); //顯示和光標(biāo)
write_com(0x06); //地址指針設(shè)置
}
void L1602_char(uchar hang,uchar lie,char sign)//顯示單個字符
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0x80+0x40;
a = a + lie - 1;
write_com(a);//寫地址
write_date(sign); //寫數(shù)據(jù)
}
void L1602_string(uchar hang,uchar lie,uchar *p) //顯示字符串
{
uchar a;
if(hang == 1) a = 0x80;
if(hang == 2) a = 0x80+0x40;
a = a + lie - 1;
write_com(a);
while(1)
{
if(*p == '\0') break;
write_date(*p);
p++;
}
}
void L1602_int(uchar hang, uchar lie, int num)
{
uint temp;
uint gewei,shiwei,baiwei,xiaoshu;
temp = num;
baiwei = temp / 1000;
shiwei = temp % 1000 / 100;
gewei = temp % 100 / 10;
xiaoshu = temp % 10;
if (num>=1000)
{
L1602_char(hang, lie+1, baiwei+48);
L1602_char(hang, lie+2, shiwei+48);
L1602_char(hang, lie+3, gewei+48);
L1602_char(hang, lie+4, '.');
L1602_char(hang, lie+5, xiaoshu+48);
}
else if (num>=100)
{
L1602_char(hang, lie+1, ' ');
L1602_char(hang, lie+2, shiwei+48);
L1602_char(hang, lie+3, gewei+48);
L1602_char(hang, lie+4, '.');
L1602_char(hang, lie+5, xiaoshu+48);
}
else
{
L1602_char(hang, lie+1, ' ');
L1602_char(hang, lie+2, ' ');
L1602_char(hang, lie+3, gewei+48);
L1602_char(hang, lie+4, '.');
L1602_char(hang, lie+5, xiaoshu+48);
}
}
復(fù)制代碼
第2個文件:
#include"1602.h"
#define uchar unsigned char
#define uint unsigned int
sbit tring = P1^3; //超聲波控制端
sbit echo = P3^2; //回波必須接在外部中斷引腳上
sbit ledwarn = P2^0; //報警燈,低電平亮
sbit beep = P2^1; //報警蜂鳴器
uint displayCount;//顯示計數(shù)
uint time = 0;//時間
unsigned long distance ;//距離
float distancef;//浮點型的數(shù)據(jù)
uint flagSucceed = 0; //測量成功標(biāo)志位
uint flagDisplay = 0; //開顯示標(biāo)志位
void delay_20us()
{
uchar i ;
for(i=0;i<140;i++);
}
void init_shuju()
{
tring = 0;
distance = 0;
displayCount = 0;
}
void init_waibu0()
{
IT0 = 0; //外部引腳為低時觸發(fā)中斷
EX0=0; //關(guān)閉外部中斷
}
void timer0_Init()
{
TMOD = 0x11; //定時器0和1工作在16位方式
TH0 = (65535-45872)/256;
TL0 = (65535-45872)%6;
TR0 = 1; //啟動定時器
ET0 = 1; //允許定時器0中斷
}
void timer1_Init()
{
TMOD = 0x11; //定時器0和1工作在16位方式
TH1 = 0;
TL1 = 0;
ET1 = 1; //定時器1中斷允許
}
void wbzd0() interrupt 0//下降沿觸發(fā)
{
time =TH1*256+TL1; //取出定時器的值
flagSucceed = 1; //置成功測量的標(biāo)志
EX0=0; //關(guān)閉外部中斷
// TR1=0;
}
void timer0() interrupt 1 // 定時器0
{
TH0 = (65535-45872)/256;
TL0 = (65535-45872)%6;
displayCount ++;
if (displayCount >= 20) //1秒鐘顯示一次
{
flagDisplay = 1; //開顯示
displayCount = 0;
}
}
void start_csb() //啟動csb模塊
{
tring = 1;
delay_20us();
tring = 0;
}
void main()
{
EA=0;
init_shuju();
init_waibu0();
timer0_Init();
timer1_Init();
L1602_init();
L1602_string(1,1,"welcome my ");
L1602_string(2,1,"test distance ");
delay1(1);
while(1)
{
EA=0;//關(guān)閉總中斷
start_csb();
while(echo==0);//變高則進(jìn)入下一步
flagSucceed = 0;
TR1=1; //啟動定時器1開始計數(shù)
EA = 1;
EX0=1;
TH1= 0;
TL1= 0;
TF1= 0; //定時器1溢出標(biāo)志位
while (TH1<90) ; //盲區(qū)
TR1 = 0; //關(guān)閉定時器1
EX0 = 0; //關(guān)閉外部中斷
if(flagSucceed==1) //一次測試成功,則計算距離,單位為厘米
{
distancef = time * 1.085;//微妙為單位
distancef /=58;//單位為厘米
distance = distancef*10+0.5;
//如果距離小于20cm,則聲光報警
if ((flagSucceed == 1) && (distance <= 200))
{
ledwarn = 0;
beep = 0;
delay1(1);
beep = 1;
delay1(1);
}
else
{
ledwarn = 1;
beep = 1;
}
}
if (flagDisplay == 1) //1秒顯示時間到
{
if(flagSucceed==0)//沒有測試成功
{
L1602_string(1,1," can't distance ");
L1602_string(2,1," ------ ");
}
else
{
//LCD顯示數(shù)據(jù)
L1602_string(1,1,"distance result:");
L1602_string(2,1," cm ");
L1602_int(2,5,distance);
}
flagDisplay = 0;
}
}
}
復(fù)制代碼
作者:
6ningning
時間:
2015-4-12 14:32
學(xué)習(xí)了。謝謝。
作者:
小坤--
時間:
2015-4-14 14:34
感謝分享
作者:
51單片機丶
時間:
2015-4-16 21:19
來看看
作者:
mybigapple
時間:
2015-4-16 22:01
你這個方式好。有簡介,有圖片,有直接可見代碼。好!
作者:
rthua
時間:
2015-4-17 01:10
很好,有時間自己動手做一個
作者:
rthua
時間:
2015-4-17 08:26
這個和另外一個有什么區(qū)別
作者:
sppcb
時間:
2015-4-17 09:33
作者:
y6711
時間:
2015-5-12 22:02
沒有電路圖之類的嗎
作者:
msyfhdlhs
時間:
2015-5-15 00:25
謝謝樓主
作者:
1678
時間:
2015-8-7 19:14
高手 就是不一樣 啊
作者:
麒-麟
時間:
2015-8-7 22:25
兄弟?梢耘囊粋后面圖嗎或電路圖。謝謝。
作者:
Karry的晴川
時間:
2015-12-3 13:48
可惜沒有原理圖
作者:
殘夢憶殤
時間:
2016-4-5 12:46
樓主右上角那個是溫度補償嗎
作者:
3350775227
時間:
2016-5-16 14:30
樓主,用hc-sr04的可以不
作者:
FANGWEI
時間:
2016-6-17 07:13
很好,有時間自己動手做一個
作者:
qiyezao
時間:
2016-7-1 14:01
沒有電路圖嗎?
作者:
lb688
時間:
2016-7-7 16:49
好資料。。。
作者:
走狗
時間:
2016-12-23 18:54
有接線圖嘛
作者:
chp
時間:
2017-9-29 20:52
實用 感謝分享
作者:
mmbo321000
時間:
2017-11-18 20:50
謝謝無私分享。
作者:
journey@
時間:
2018-4-28 23:20
樓主,請問你這個最遠(yuǎn)能測多少米
作者:
ufot
時間:
2018-6-3 12:51
感謝分享,最近剛好要做這個實訓(xùn)
作者:
ufot
時間:
2018-6-3 13:05
謝謝分享,剛好要做這個實訓(xùn),正愁代碼怎么弄呢
作者:
smartphone
時間:
2018-6-5 08:58
好制作 謝謝提供
作者:
Away88
時間:
2018-9-25 16:39
沒有原理圖嗎?
作者:
Away88
時間:
2018-9-25 16:39
我想看看原理圖,學(xué)習(xí)一下可以嗎
作者:
油炸小4562
時間:
2018-10-9 15:22
很有用,謝謝分享
作者:
195470880
時間:
2020-5-14 22:08
我想看看原理圖,學(xué)習(xí)一下可以嗎?謝謝分享!
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1