標(biāo)題:
藍(lán)橋杯單片機(jī)超聲波測距報(bào)警實(shí)時時鐘電路電路具體功能與程序
[打印本頁]
作者:
njz123
時間:
2023-4-25 14:26
標(biāo)題:
藍(lán)橋杯單片機(jī)超聲波測距報(bào)警實(shí)時時鐘電路電路具體功能與程序
要求:1. 電路通電后進(jìn)入初始化狀態(tài):燈L1亮,數(shù)碼管全亮,蜂鳴器接通,1s后全部關(guān)閉,顯示時間設(shè)定11-50-59。2. 按下S7按鍵切換顯示實(shí)時時鐘XX-XX-XX、顯示超聲波測量距離XXX。3. 顯示實(shí)時時鐘狀態(tài)下,按S6按鍵進(jìn)行時間調(diào)整,第一次按下S6進(jìn)入時調(diào)整, “時”閃爍;第二次按下S6進(jìn)入分調(diào)整,“分”閃爍。再一次按下退出調(diào)整。S4、S5為調(diào)節(jié)數(shù)值S5+,S4-(時間距離)的加減按鍵。4. 顯示超聲波測距狀態(tài)下,按S6按鍵進(jìn)行報(bào)警距離調(diào)整,S6按第一次進(jìn)入調(diào)整狀態(tài),第二次按下退出,將調(diào)節(jié)后的數(shù)值保存到24C02中。S4、S5為調(diào)節(jié)數(shù)值S5+,S4-(時間距離)的加按鍵。顯示超聲波報(bào)警距離--XXX。5. 超聲波測距報(bào)警初值設(shè)定為30cm,超聲波檢測超過設(shè)定值X不報(bào)警,小于X立即報(bào)警,小于1.2倍的X, L1燈閃爍。6. 設(shè)計(jì)一個欠壓電路,12V供電,電壓小于10V切斷電路電源。
單片機(jī)源程序如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#include"dsp.h" //顯示函數(shù)頭文件
#include"1302.h"
#include"chaoshenbo.h"
#include"iic.h"
sbit s7=P3^0; //按鍵
sbit s6=P3^1;
sbit s5=P3^2;
sbit s4=P3^3;
uint sec_add; //中斷1秒標(biāo)志
bit sec_flag;
uint sec_szadd;
bit sec_szflag;
uchar bj_jl; //報(bào)警距離
uint ss; //距離函數(shù)
uchar sz_time[3];
uchar ms_add; //模式標(biāo)志位
bit ms_flag;
bit ms_HCflag; //測距模式下 設(shè)置與正常顯示的標(biāo)志位 為0時正常顯示距離 為1時設(shè)置報(bào)警距離
void int_t0(); //定時器T0、T1初始化
void open_led1();
void cls_led1();
void open_beep();
void cls_beep();
void int_sd(); //上電初始化
void moshi(); //正常顯示模式
void sz_moshi(); //設(shè)置時間時的顯示模式
void szHC_moshi(); //設(shè)置報(bào)警距離時的顯示模式
void key_s7(); //s7功能按鈕,設(shè)置時間模式或者距離模式
void key_s6_time(); //s6設(shè)置時間模式功能按鈕
void key_s6_HC(); //s6設(shè)置距離模式功能按鈕
void jiaohu(); //功能交互函數(shù)
void main()
{
int_t0(); //定時器初始化
int_sd(); //上電初始化
int_1302(); //初始化1302
// bj_jl=30; //設(shè)置報(bào)警距離 第一次寫入程序時要把這兩行屏蔽的恢復(fù) 然后再屏蔽掉再寫入
// w_iic(0x00,bj_jl); //將報(bào)警距離寫入24C02
bj_jl=r_iic(0x00); //從24C02中讀取報(bào)警距離
while(1)
{
red_1302(); //讀取1302時間
if(sec_flag) //1s讀取一次超聲波距離
{
ss=red_HC();
sec_flag=0;
}
key_s7(); //s7按鍵功能
jiaohu(); //功能交互
if(ss<bj_jl) //報(bào)警函數(shù)
{
open_beep();
}
else
{cls_beep();}
if(ss<(uint)(bj_jl*1.2)) //小與1.2倍距離時led1閃爍
{
if(sec_szflag)
open_led1();
else
cls_led1();
} else cls_led1();
}
}
void t0() interrupt 1
{
TH0=(65535-1000)/256;
TL0=(65535-1000)&256;
sec_add++; //1秒后sec_flag標(biāo)志位置1
if(sec_add==200)
{
sec_add=0;
sec_flag=1;
}
sec_szadd++;
if(sec_szadd==1000)
{
sec_szadd=0;
sec_szflag=~sec_szflag;
}
display();
}
void int_t0()
{
TMOD=0X11;
EA=1;
ET0=1;
TH0=(65535-1000)/256;
TL0=(65535-1000)&256;
TH1=0;
TL1=0;
TR0 = 1; //定時器0開始計(jì)時
}
void open_led1()
{
P2=(P2&0x1f)|0x80;
P0=0x7f;
P2&=0x1f;
}
void cls_led1()
{
P2=(P2&0x1f)|0x80;
P0=0xff;
P2&=0x1f;
}
void open_beep()
{
P2=(P2&0x1f)|0xa0;
P0=0xff;
P2&=0x1f;
}
void cls_beep()
{
P2=(P2&0x1f)|0xa0;
P0=0x00;
P2&=0x1f;
}
void int_sd()
{
open_led1(); //開led1
dspbuf[0]=dspbuf[1]=dspbuf[2]=dspbuf[3]=dspbuf[4]=dspbuf[5]=dspbuf[6]=dspbuf[7]=12; //數(shù)碼管全量
open_beep(); //開蜂鳴器
while(!sec_flag); //等待1秒
cls_led1(); //關(guān)led1 關(guān)顯示 關(guān)蜂鳴器 sec_flag標(biāo)志位清零
dspbuf[0]=dspbuf[1]=dspbuf[2]=dspbuf[3]=dspbuf[4]=dspbuf[5]=dspbuf[6]=dspbuf[7]=11;
cls_beep();
sec_flag=0;
}
void delay(uint time)
{
uint i;
while(time--)
{
for(i=0;i<800;i++);
}
}
void moshi() //顯示模式
{
uchar x;
x=ms_flag;
switch(x)
{
case 0: dspbuf[0]=shi/10; //顯示時間模式
dspbuf[1]=shi%10;
dspbuf[2]=10;
dspbuf[3]=min/10;
dspbuf[4]=min%10;
dspbuf[5]=10;
dspbuf[6]=sec/10;
dspbuf[7]=sec%10;
break;
case 1: dspbuf[5]=ss/100; //顯示距離模式
dspbuf[6]=ss%100/10;
dspbuf[7]=ss%10;
dspbuf[0]=11;
dspbuf[1]=11;
dspbuf[2]=11;
dspbuf[3]=11;
dspbuf[4]=11;
break;
}
}
void key_s7()
{
if(s7==0)
{
delay(5);
if(s7==0)
{
ms_flag=~ms_flag; //模式 當(dāng)MS_FLAG=0時 為顯示時間模式 當(dāng)MS_FLAG=1時為顯示距離模式
while(!s7);
}
}
}
void key_s6_time() //時間模式下 s6按鍵功能函數(shù)
{
if(s6==0)
{
delay(5);
if(s6==0)
{
if(ms_add==0) //如果s6被按下
{
sz_time[0]=shi; //儲存當(dāng)前的時間
sz_time[1]=min;
sz_time[2]=sec;
}
ms_add++;
if(ms_add==3) //當(dāng)按鈕按下三次以后 將設(shè)置后的時間寫入1302
{
ms_add=0; //標(biāo)志清零
write_13(0x8e,0x00);
write_13(0x80,sz_time[2]); //秒存
write_13(0x82,sz_time[1]); //分存
write_13(0x84,sz_time[0]); //時存
write_13(0x8e,0x80);
}
while(!s6);
}
}
}
void key_s6_HC() //距離模式時 s6按鈕功能函數(shù)
{
if(s6==0)
{
delay(5);
if(s6==0)
{
if(ms_HCflag) //再次按下時將設(shè)置的報(bào)警距離存入24C02
{
w_iic(0x00,bj_jl);
delay(10);
}
ms_HCflag=~ms_HCflag;
while(!s6);
}
}
}
void sz_moshi() //設(shè)置時間的顯示模式
{
switch(ms_add) //ms_add為1時顯示case 1的內(nèi)容 時閃爍 為2時顯示case 2的內(nèi)容 分閃爍
{
case 1: if(sec_szflag) //小時位閃爍
{
dspbuf[0]=sz_time[0]/10;
dspbuf[1]=sz_time[0]%10;
} else
{
dspbuf[0]=11;
dspbuf[1]=11;
}
dspbuf[2]=10;
dspbuf[3]=sz_time[1]/10; //顯示按下設(shè)置鍵后存儲的時間
dspbuf[4]=sz_time[1]%10;
dspbuf[5]=10;
dspbuf[6]=sz_time[2]/10;
dspbuf[7]=sz_time[2]%10;
break;
case 2: if(sec_szflag)
{
dspbuf[3]=sz_time[1]/10;
dspbuf[4]=sz_time[1]%10;
} else
{
dspbuf[3]=11;
dspbuf[4]=11;
}
dspbuf[2]=10;
dspbuf[0]=sz_time[0]/10;
dspbuf[1]=sz_time[0]%10;
dspbuf[5]=10;
dspbuf[6]=sz_time[2]/10;
dspbuf[7]=sz_time[2]%10;
break;
}
}
void szHC_moshi()
{
dspbuf[5]=bj_jl/100;
dspbuf[6]=bj_jl%100/10;
dspbuf[7]=bj_jl%10;
dspbuf[0]=11;
dspbuf[1]=11;
dspbuf[2]=11;
dspbuf[3]=11;
dspbuf[4]=11;
if(s5==0)
{
delay(5);
if(s5==0)
{
bj_jl++;
while(!s5);
}
}
if(s4==0)
{
delay(5);
if(s4==0)
{
bj_jl--;
while(!s4);
}
}
}
void jiaohu()
{
if(ms_flag==0)
{
key_s6_time();
if(ms_add==0) //s6按鍵沒有被按下時 ms_add為0 顯示正常界面
{
moshi();
}
else
{
sz_moshi(); //s6被按下后 ms-add不為0 顯示設(shè)置時間模式函數(shù)
if(s5==0) //如果s5按下 對應(yīng)的時間加1
{
delay(5);
if(s5==0)
{
sz_time[ms_add-1]++;
while(!s5);
}
}
if(s4==0) //如果s4按下 對應(yīng)的時間減1
{
delay(5);
if(s4==0)
{
sz_time[ms_add-1]--;
while(!s4);
}
}
}
}
else
{ //顯示距離模式時
key_s6_HC();
if(ms_HCflag==0)
moshi();
else
szHC_moshi(); //設(shè)置報(bào)警距離顯示模式
}
}
復(fù)制代碼
Keil代碼下載:
超聲波測距及時鐘.rar
(144.53 KB, 下載次數(shù): 37)
2023-4-25 14:11 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
1015282347
時間:
2024-3-21 21:41
樓主這個真的很全啊!!
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1