|
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#include <intrins.h>
sbit c_send = P3^3; //超聲波
sbit c_recive = P3^2;
sbit rs=P1^0;
sbit rw=P1^1;
sbit e =P1^2;
uchar code table_num[]="0123456789abcdefg";
uchar flag_en = 1;
uint temperature ;
sbit beep = P1^6; //蜂鳴器
bit flag_300ms ;
long distance;
uint set_gh,set_gl;
bit flag_csb_juli;
uint flag_time0;
uchar key_can;
uchar menu_1;
uchar a_a;
bit flag_lj_en;
bit flag_lj_3_en;
uchar key_time,key_value;
bit key_500ms ;
uint shuiwei;
uint sw_jz;
uint code wendu_buchang1[46] = {
331,332,333,333,334,334,335,336,336,337,337,338,339,339,340,341,341,342,342,343,
343,344,345,345,346,346,347,348,348,349,349,350,351,351,352,352,353,354,354,355,
355,356,357,357,358,358 };
sbit dq = P1^5; //18b20
void delay_uint(uint q)
{
while(q--);
}
void init_18b20() //18b20初始化函數//
{
bit q;
dq = 1;
delay_uint(1);
dq = 0;
delay_uint(80);
dq = 1;
delay_uint(10);
q = dq;
delay_uint(20);
dq = 1;
}
void write_18b20(uchar dat) /*寫18b20內的數據*/
{
uchar i;
for(i=0;i<8;i++)
{
dq = 0;
dq = dat & 0x01;
delay_uint(5);
dq = 1;
dat >>= 1;
}
}
uchar read_18b20() /*讀取18b20內的數據*/
{
uchar i,value;
for(i=0;i<8;i++)
{
dq = 0;
value >>= 1;
dq = 1;
if(dq == 1)
value |= 0x80;
delay_uint(5);
}
return value;
}
/*讀取溫度的值 */
uint read_temp()
{
uint value;
uchar low;
init_18b20();
write_18b20(0xcc);
write_18b20(0x44);
delay_uint(50);
init_18b20();
write_18b20(0xcc);
write_18b20(0xbe);
EA = 0;
low = read_18b20();
value = read_18b20();
EA = 1;
value <<= 8;
value |= low;
value *= 0.0625;
return value;
}
/***********************1ms延時函數*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
/* 1602命令函數*/
void write_com(uchar com)
{
e=0;
rs=0;
rw=0;
P0=com;
delay_uint(25);
e=1;
delay_uint(100);
e=0;
}
/*1602寫數據函數*/
void write_data(uchar dat)
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_uint(25);
e=1;
delay_uint(100);
e=0;
}
/*改變液晶中某位的值*/
void write_string(uchar hang,uchar add,uchar *p)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
while(1)
{
if(*p == '\0') break;
write_data(*p);
p++;
}
}
/*lcd1602上顯示兩位十進制數*/
void write_sfm2(uchar hang,uchar add,uint date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(0x30+date/10%10);
write_data(0x30+date%10);
}
/*lcd1602上顯示兩位十進制數*/
void write_sfm3(uchar hang,uchar add,uint date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(0x30+date/100%10);
write_data('.');
write_data(0x30+date/10%10);
write_data(0x30+date%10);
write_data('m');
}
/*lcd1602上顯示特定的字符*/
void write_zifu(uchar hang,uchar add,uchar date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(date);
}
/* init_1602()*/
void init_1602() //1602初始化
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
delay_uint(1000);
write_string(1,0," Gaodu: . m ");
write_string(2,0,"H:00.0m L:00.0m ");
write_sfm3(2,2,set_gh);
write_sfm3(2,10,set_gl);
write_zifu(1,15,0xdf);
}
/********************獨立按鍵程序*****************/
uchar key_can;
void key()
{
static uchar key_new;
key_can = 20;
P3 |= 0xf0;
if((P3 & 0xf0) != 0xf0)
{
delay_1ms(1);
if(((P3 & 0xf0) != 0xf0) && (key_new == 1))
{
key_new = 0;
switch(P3 & 0xf0)
{
case 0x70: key_can = 1; break;
case 0xb0: key_can = 2; break;
case 0xd0: key_can = 3; break;
}
}
flag_lj_en = 1;
}
else
{
if(key_new == 0)
{
key_new = 1;
flag_lj_en = 0;
flag_lj_3_en = 0;
key_value = 0;
key_time = 0;
}
}
}
/****************按鍵處理顯示函數***************/
void key_with()
{
if(menu_1 == 0)
{
if(key_can == 3)
{
flag_en = 0;
beep = 1;
}
}
if(key_can == 1)
{
menu_1 ++;
if(menu_1 > 1)
{
menu_1 = 0;
init_1602() ;
}
if(menu_1 == 3)
{
write_string(1,0," juli: . m ");
write_string(2,0,"Jizhun: m ");
}
}
if(menu_1 == 1)
{
if(key_can == 2)
{
if(flag_lj_3_en == 0)
set_gh ++ ;
else
set_gh += 10 ;
if(set_gh > 500)
set_gh = 500;
}
if(key_can == 3)
{
if(flag_lj_3_en == 0)
set_gh -- ;
else
set_gh -= 10;
if(set_gh <= set_gl)
set_gh = set_gl + 1;
}
write_sfm3(2,2,set_gh);
write_sfm3(2,10,set_gl);
write_com(0x80+0x40+2);
write_com(0x0f);
}
if(menu_1 == 2)
{
if(key_can == 2)
{
if(flag_lj_3_en == 0)
set_gl ++ ;
else
set_gl += 10 ;
if(set_gl > set_gh)
set_gl = set_gh - 1;
}
if(key_can == 3)
{
if(flag_lj_3_en == 0)
set_gl -- ;
else
set_gl -= 10;
if(set_gl <= 10)
set_gl = 10 ;
}
write_sfm3(2,2,set_gh);
write_sfm3(2,10,set_gl);
write_com(0x80+0x40+10);
write_com(0x0f);
}
if(menu_1 == 3)
{
if(key_can == 2)
sw_jz = distance;
if(key_can == 3)
sw_jz = distance;
write_sfm3(2,8,sw_jz);
write_com(0x80+0x40+7);
}
}
/**************10us延時函數***************/
void delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/*********************超聲波測距程序*****************************/
void send_wave()
{
c_send = 1;
delay();
c_send = 0;
while(!c_recive);
TR0=1;
while(c_recive)
{
flag_time0 = TH0 * 256 + TL0;
if((flag_time0 > 40000))
{
TR0 = 0;
flag_csb_juli = 2;
distance = 888;
break ;
}
else
{
flag_csb_juli = 1;
}
}
if(flag_csb_juli == 1)
{
TR0=0;
distance = TH0;
distance = distance * 256 + TL0;
if(temperature <= 45)
distance *= wendu_buchang1[temperature] / 2.0 * 0.0001;
else
distance *= 358 / 2.0 * 0.0001;
if(distance > 600)
{
distance = 888;
}
}
}
/*********************定時器0、定時器1初始化******************/
void time_init()
{
EA = 1;
TMOD = 0X11;
ET0 = 0;
TR0 = 1;
ET1 = 0;
TR1 = 1;
}
/**************報警函數***************/
void clock_h_l()
{
static uchar value;
if((shuiwei <= set_gl) || (shuiwei >= set_gh))
{
value ++;
if(value >= 2)
{
if(flag_en == 1)
beep = ~beep;
}
}
else
{
value = 0;
beep = 1;
flag_en = 1;
}
}
/***************主函數*****************/
void main()
{
init_1602();
time_init();
while(1)
{
if(flag_300ms == 1)
{
flag_300ms = 0;
clock_h_l();
temperature = read_temp();
if((beep == 1))
send_wave();
if(menu_1 == 0)
{
if(distance > 10 + sw_jz)
{
write_string(1,7,"--.-m");
}else
{
if(sw_jz >= distance)
{
shuiwei = sw_jz - distance;
}else
shuiwei = 0;
write_sfm3(1,7,shuiwei);
}
write_sfm2(1,13,temperature);
}
write_sfm3(1,8,distance);
}
key();
if(key_can < 10)
{
key_with();
}
}
}
/*********************定時器0中斷服務程序************************/
void time1_int() interrupt 3
{
static uchar value;
TH0 = 0x3c;
TL0 = 0xb0;
value ++;
if(value % 6 == 0)
{
flag_300ms = 1;
value = 0;
}
if(flag_lj_en == 1)
{
key_time ++;
if(key_time >= 10)
{
key_time = 0;
key_500ms = 1;
key_value ++;
if(key_value > 3)
{
key_value = 10;
flag_lj_3_en = 1;
}
}
}
}
|
-
-
陳海燕-超聲波(溫度).rar
2018-5-21 09:02 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
49.12 KB, 下載次數: 25, 下載積分: 黑幣 -5
|