標(biāo)題:
單片機(jī)超聲波測(cè)距加報(bào)警程序(頻率可變)加報(bào)警距離可變
[打印本頁(yè)]
作者:
Yishi3
時(shí)間:
2020-11-13 15:45
標(biāo)題:
單片機(jī)超聲波測(cè)距加報(bào)警程序(頻率可變)加報(bào)警距離可變
8-元件清單.zip
(6.85 KB, 下載次數(shù): 37)
2020-11-13 15:42 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
2-原理圖(電路圖).rar
(160.17 KB, 下載次數(shù): 47)
2020-11-13 15:42 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
1-程序新.zip
(48.04 KB, 下載次數(shù): 46)
2020-11-13 15:42 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
電路原理圖如下:
Y_V`JF1((AB~X0U}N8W3~QW.png
(78.89 KB, 下載次數(shù): 40)
下載附件
2020-11-13 15:45 上傳
單片機(jī)源程序如下:
#include <reg52.H>//器件配置文件
#include <intrins.h>
#include "eeprom52.h"
//傳感器接口
sbit RX = P2^3;
sbit TX = P2^2;
//按鍵聲明
sbit S1 = P1^4;
sbit S2 = P1^5;
sbit S3 = P1^6;
sbit DIAN=P0^5;
//蜂鳴器
sbit Feng= P2^0;
//變量聲明
unsigned int time=0;
unsigned int timer=0;
unsigned char posit=0;
unsigned long S=0;
unsigned long BJS;//報(bào)警距離
char num=0;
//模式 0正常模式 1調(diào)整
char Mode=0;
bit flag=0,flag_BJ;
unsigned char const discode[] ={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7,0x80}; //數(shù)碼管顯示碼0123456789-和不顯示
unsigned char disbuff[4] ={0,0,0,0}; //數(shù)組用于存放距離信息
unsigned char disbuff_BJ[4] ={0,0,0,0};//報(bào)警信息
sbit W0=P2^4;
sbit W1=P2^5;
sbit W2=P2^6;
sbit W3=P2^7;
/******************把數(shù)據(jù)保存到單片機(jī)內(nèi)部eeprom中******************/
void write_eeprom()
{
SectorErase(0x2000);
byte_write(0x2000, BJS%255);
byte_write(0x2001, BJS/255);
byte_write(0x2060, a_a);
}
/******************把數(shù)據(jù)從單片機(jī)內(nèi)部eeprom中讀出來(lái)*****************/
void read_eeprom()
{
BJS = (byte_read(0x2001)*255)+byte_read(0x2000);
a_a = byte_read(0x2060);
}
/**************開(kāi)機(jī)自檢eeprom初始化*****************/
void init_eeprom()
{
read_eeprom(); //先讀
if(a_a != 1) //新的單片機(jī)初始單片機(jī)內(nèi)問(wèn)eeprom
{
BJS = 40;
a_a = 1;
write_eeprom(); //保存數(shù)據(jù)
}
}
//延時(shí)100ms(不精確)
void delay(void)
{
unsigned char a,b,c;
for(c=10;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
//按鍵掃描
void Key_()
{
//+
if(S1==0)
{
delay(); //延時(shí)去抖
delay(); //延時(shí)去抖
while(S1==0)
{
P1=P1|0x0f;
}
BJS++; //報(bào)警值加
if(BJS>500) //最大500
{
BJS=1;
}
write_eeprom(); //保存數(shù)據(jù)
}
//-
else if(S2==0)
{
delay();
delay(); //延時(shí)去抖
while(S2==0)
{
P1=P1|0x0f;
}
BJS--; //報(bào)警值減
if(BJS<1) //最小1
{
BJS=500;
}
write_eeprom(); //保存數(shù)據(jù)
}
//功能
else if(S3==0) //設(shè)置鍵
{
delay();
delay(); //延時(shí)去抖
while(S3==0)
{
P1=P1|0x0f;
}
Mode++; //模式加
num=0;
if(Mode>=2) //加到2時(shí)清零
{
Mode=0;
}
}
}
/**********************************************************************************************************/
//掃描數(shù)碼管
void Display(void)
{
//正常顯示
if(Mode==0)
{
num++;
if(num==1)
{
W3=1;
W0=1;
P0=~discode[disbuff[0]];
DIAN=0;
W1=0;
}
else if(num==2)
{
W1=1;
P0=~discode[disbuff[1]];
W2=0;
}
else if(num>=3)
{
W2=1;
P0=~discode[disbuff[2]];
W3=0;
num=0;
}
}
//報(bào)警顯示
else
{
num++;
if(num==1)
{
W3=1;
P0=~0xCE; //11001110
W0=0;
}
else if(num==2)
{
W0=1;
P0=~discode[disbuff_BJ[0]];
DIAN=0;
W1=0;
}
else if(num==3)
{
W1=1;
P0=~discode[disbuff_BJ[1]];
W2=0;
}
else if(num>=4)
{
W2=1;
P0=~discode[disbuff_BJ[2]];
W3=0;
num=0;
}
}
}
/**********************************************************************************************************/
//計(jì)算
void Conut(void)
{
time=TH0*256+TL0; //讀出T0的計(jì)時(shí)數(shù)值
TH0=0;
TL0=0; //清空計(jì)時(shí)器
S=(time*1.7)/100; //算出來(lái)是CM
if(Mode==0) //非設(shè)置狀態(tài)時(shí)
{
if((S>=700)||flag==1) //超出測(cè)量范圍顯示“-”
{
flag=0;
disbuff[0]=10; //“-”
disbuff[1]=10; //“-”
disbuff[2]=10; //“-”
}
else
{
//距離小于報(bào)警距
if(S<=BJS) //距離小于報(bào)警值
{
flag_BJ=1; //報(bào)警變量置一,定時(shí)器開(kāi)始報(bào)警
}
else //距離大于報(bào)警值
{
flag_BJ=0; //關(guān)閉報(bào)警
Feng=1; //蜂鳴器關(guān)閉
}
disbuff[0]=S%1000/100; //將距離數(shù)據(jù)拆成單個(gè)位賦值
disbuff[1]=S%100/10;
disbuff[2]=S%10;
}
}
else
{
Feng=1;
flag_BJ=0; //報(bào)警關(guān)閉
disbuff_BJ[0]=BJS%1000/100;
disbuff_BJ[1]=BJS%100/10;
disbuff_BJ[2]=BJS%10;
}
}
/**********************************************************************************************************/
//定時(shí)器0
void zd0() interrupt 1 //T0中斷用來(lái)計(jì)數(shù)器溢出,超過(guò)測(cè)距范圍
{
flag=1; //中斷溢出標(biāo)志
}
/**********************************************************************************************************/
//定時(shí)器1
void zd3() interrupt 3 //T1中斷用來(lái)掃描數(shù)碼管和計(jì)800MS啟動(dòng)模塊
{
unsigned int m;
TH1=0xf8;
TL1=0x30; //定時(shí)2ms
Key_(); //掃描按鍵
Display(); //掃描顯示
timer++; //變量加
if(flag_BJ==1) //報(bào)警開(kāi)
{
m++; //2ms m加一次
if(m>=(S+10)) //m的值大于等于距離加10
{
m=0; //m清零
Feng=!Feng; //蜂鳴器取反
}
}
if(timer>=400) //400次就是800ms
{
timer=0;
TX=1; //800MS 啟動(dòng)一次模塊
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
作者:
cuijb
時(shí)間:
2022-5-2 10:17
樓主程序有問(wèn)題,搭了個(gè)電路點(diǎn)不亮
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1