欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
藍橋杯單片機超聲波測距報警實時時鐘電路電路具體功能與程序
[打印本頁]
作者:
njz123
時間:
2023-4-25 14:26
標題:
藍橋杯單片機超聲波測距報警實時時鐘電路電路具體功能與程序
要求:1. 電路通電后進入初始化狀態:燈L1亮,數碼管全亮,蜂鳴器接通,1s后全部關閉,顯示時間設定11-50-59。2. 按下S7按鍵切換顯示實時時鐘XX-XX-XX、顯示超聲波測量距離XXX。3. 顯示實時時鐘狀態下,按S6按鍵進行時間調整,第一次按下S6進入時調整, “時”閃爍;第二次按下S6進入分調整,“分”閃爍。再一次按下退出調整。S4、S5為調節數值S5+,S4-(時間距離)的加減按鍵。4. 顯示超聲波測距狀態下,按S6按鍵進行報警距離調整,S6按第一次進入調整狀態,第二次按下退出,將調節后的數值保存到24C02中。S4、S5為調節數值S5+,S4-(時間距離)的加按鍵。顯示超聲波報警距離--XXX。5. 超聲波測距報警初值設定為30cm,超聲波檢測超過設定值X不報警,小于X立即報警,小于1.2倍的X, L1燈閃爍。6. 設計一個欠壓電路,12V供電,電壓小于10V切斷電路電源。
單片機源程序如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#include"dsp.h" //顯示函數頭文件
#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秒標志
bit sec_flag;
uint sec_szadd;
bit sec_szflag;
uchar bj_jl; //報警距離
uint ss; //距離函數
uchar sz_time[3];
uchar ms_add; //模式標志位
bit ms_flag;
bit ms_HCflag; //測距模式下 設置與正常顯示的標志位 為0時正常顯示距離 為1時設置報警距離
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(); //設置時間時的顯示模式
void szHC_moshi(); //設置報警距離時的顯示模式
void key_s7(); //s7功能按鈕,設置時間模式或者距離模式
void key_s6_time(); //s6設置時間模式功能按鈕
void key_s6_HC(); //s6設置距離模式功能按鈕
void jiaohu(); //功能交互函數
void main()
{
int_t0(); //定時器初始化
int_sd(); //上電初始化
int_1302(); //初始化1302
// bj_jl=30; //設置報警距離 第一次寫入程序時要把這兩行屏蔽的恢復 然后再屏蔽掉再寫入
// w_iic(0x00,bj_jl); //將報警距離寫入24C02
bj_jl=r_iic(0x00); //從24C02中讀取報警距離
while(1)
{
red_1302(); //讀取1302時間
if(sec_flag) //1s讀取一次超聲波距離
{
ss=red_HC();
sec_flag=0;
}
key_s7(); //s7按鍵功能
jiaohu(); //功能交互
if(ss<bj_jl) //報警函數
{
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標志位置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開始計時
}
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; //數碼管全量
open_beep(); //開蜂鳴器
while(!sec_flag); //等待1秒
cls_led1(); //關led1 關顯示 關蜂鳴器 sec_flag標志位清零
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; //模式 當MS_FLAG=0時 為顯示時間模式 當MS_FLAG=1時為顯示距離模式
while(!s7);
}
}
}
void key_s6_time() //時間模式下 s6按鍵功能函數
{
if(s6==0)
{
delay(5);
if(s6==0)
{
if(ms_add==0) //如果s6被按下
{
sz_time[0]=shi; //儲存當前的時間
sz_time[1]=min;
sz_time[2]=sec;
}
ms_add++;
if(ms_add==3) //當按鈕按下三次以后 將設置后的時間寫入1302
{
ms_add=0; //標志清零
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按鈕功能函數
{
if(s6==0)
{
delay(5);
if(s6==0)
{
if(ms_HCflag) //再次按下時將設置的報警距離存入24C02
{
w_iic(0x00,bj_jl);
delay(10);
}
ms_HCflag=~ms_HCflag;
while(!s6);
}
}
}
void sz_moshi() //設置時間的顯示模式
{
switch(ms_add) //ms_add為1時顯示case 1的內容 時閃爍 為2時顯示case 2的內容 分閃爍
{
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; //顯示按下設置鍵后存儲的時間
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 顯示設置時間模式函數
if(s5==0) //如果s5按下 對應的時間加1
{
delay(5);
if(s5==0)
{
sz_time[ms_add-1]++;
while(!s5);
}
}
if(s4==0) //如果s4按下 對應的時間減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(); //設置報警距離顯示模式
}
}
復制代碼
Keil代碼下載:
超聲波測距及時鐘.rar
(144.53 KB, 下載次數: 37)
2023-4-25 14:11 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
1015282347
時間:
2024-3-21 21:41
樓主這個真的很全啊!!!
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1