?? checkdistance.c
字號:
/*
** 設計者:蒙林通 ***
** 華信通電子公司 **
** 廣東工業大學 *****
** 設計時間:2008/08/15 *
** ***歷時:2天半 ****
*/
#include "reg52.h"
#include "intrins.h"
#include "main.h"
#define uchar unsigned char
#define uint unsigned int
#define sd=0.334
unsigned int distance,tem;
uchar data tdisdata[4];
uchar data disdata[5];
uint tvalue,tempkey;//溫度值
uchar tflag;//溫度正負標志
sbit en=P2^5;
sbit rs=P2^7;
sbit rw=P2^6;
sbit D0=P1^0;
sbit D1=P1^1;
sbit D2=P1^2;
sbit D3=P1^3;
sbit D4=P1^4;
sbit deep=P3^6;
sbit DQ=P3^5;
sbit LED1=P1^5;
sbit LED2=P1^6;
sbit move=P1^7;
sbit mode_button=P3^4;
sbit operation_button=P3^5;
uchar code table[]=">>溫度: 0000 C";
uchar code table2[]="=>距離:00000mm";
uchar code warn1[7][14]={"->請注意左方!!","->請注意右方!!","->請注意后方!!","->左后輪泥坑!!","->右后輪泥坑!!","->左后輪石頭!!","->右后輪石頭!!"};
uchar code warn2[]="->車距勻安全!!";
uchar code welcome[]=" 提示系統 ";
uchar code direction[5][4]={"左距","右距","后距","左輪","右輪"} ;
uint time,t,kk;
uchar bai,shi,ge,flag,i,j,temp;
unsigned long int shu=0,v;
unsigned int back=0;
/******************************
*延時子程序
******************************/
void delay(uint z)
{
uint x,y;
for(y=110;y>0;y--)
for(x=z;x>0;x--);
}
/****************************
*寫指令
****************************/
void write_com(uchar com)
{
rs=0;
rw=0;
P0=com;
delay(5);
en=1;
delay(5);
en=0;
}
/************************
*寫數據
************************/
void write_date(uchar date)
{
rs=1;
rw=0;
P0=date;
delay(5);
en=1;
delay(5);
en=0;
}
//******************************18B20溫度傳感程序***************************//
void delay1ms(unsigned int ms)//延時1毫秒(不夠精確的)
{unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<100;j++);
}
/******************************ds1820程序***************************************/
void delay_18B20(unsigned int i)//延時1微秒
{
while(i--);
}
void ds1820rst()/*ds1820復位*/
{ unsigned char x=0;
DQ = 1; //DQ復位
delay_18B20(4); //延時
DQ = 0; //DQ拉低
delay_18B20(100); //精確延時大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*讀數據*/
{ unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{ DQ = 0; //給脈沖信號
dat>>=1;
DQ = 1; //給脈沖信號
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*寫數據*/
{unsigned char i=0;
for (i=8; i>0; i--)
{ DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
}
}
//******************讀溫度*********************/
read_temp()/*讀取溫度值并轉換*/
{
uchar a,b;
ds1820rst();
ds1820wr(0xcc);//*跳過讀序列號*/
ds1820wr(0x44);//*啟動溫度轉換*/
ds1820rst();
ds1820wr(0xcc);//*跳過讀序列號*/
ds1820wr(0xbe);//*讀取溫度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else
{tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//溫度值擴大10倍,精確到1位小數
return(tvalue);
}
/*********************溫度顯示函數**********************/
void ds1820disp()//溫度值顯示
{ uchar flagdat;
disdata[0]=tvalue/1000+0x30;//百位數
disdata[1]=tvalue%1000/100+0x30;//十位數
disdata[2]=tvalue%100/10+0x30;//個位數
disdata[3]=tvalue%10+0x30;//小數位
if(tflag==0)
flagdat=0x20;//正溫度不顯示符號
else
flagdat=0x2d;//負溫度顯示負號:-
if(disdata[0]==0x30)
{disdata[0]=0x20;//如果百位為0,不顯示
if(disdata[1]==0x30)
{disdata[1]=0x20;//如果百位為0,十位為0也不顯示
}
}
write_com(0x90+4);
//write_date(flagdat);//顯示符號位
write_date(disdata[0]);//顯示百位
write_date(disdata[1]);//顯示十位
write_date(disdata[2]);//顯示個位
write_date(0x2e);//顯示小數點
write_date(disdata[3]);//顯示小數位
}
/////////////////**********************超聲波程序**********/////////////
/************************
*距離數值動態顯示
*************************/
void dis_distance(uint add,uint date)
{
uchar mi,fen,li,bai,shi,ge;
mi=date/100000;
fen=date%100000/10000;
li=date%10000/1000;
bai=date%1000/100;
shi=date%100/10;
ge=date%10;
write_com(0x88+add);
write_date(0x30+mi);
write_date(0x30+fen);
write_date(0x30+li);
write_date(0x30+bai);
write_date(0x30+shi);
write_date(0x30+ge);
date=0;
}
//**************提示注意函婁**************//
dis_warn(char num[])
{ int k;
write_com(0x98);
for(k=0;k<14;k++)
{
write_date(num[k]);
}
}
///////////////////////////////////////////
dis_direction(char num[])
{ int k;
write_com(0x88+1);
for(k=0;k<4;k++)
{
write_date(num[k]);
}
}
/***************************
*初始化程
***************************/
void init(void)
{
write_com(0x01); //清除顯示
write_com(0x02); //地址歸零
write_com(0x06); //進入設定點
write_com(0x0c); //顯示開關設置
write_com(0x30); //功能設定
write_com(0x80); //在第一行開始輸入
for(i=0;i<14;i++) //顯示初始化
{
write_date(welcome[i]);
}
write_com(0x90); //在第一行開始輸入
for(i=0;i<14;i++) //顯示初始化
{
write_date(table[i]);
}
write_com(0x88); //在第一行開始輸入
for(i=0;i<14;i++) //顯示初始化
{
write_date(table2[i]);
}
TMOD=0X01; //設定定時器為工作方式1
TH0=0X00;
TL0=0X00; //裝初始值
EA=1; //開總中斷
IT1=1; //設定外部中斷為下降沿觸發方式
}
/********************************
*延時方法發送方波
********************************/
void send(unsigned int number) //左方發送函數
{ if(number==1)
{
j=100;
TH0=0X00;
TL0=0X00;
EX1=1;
TR0=1; //開計數器
while(j--) //發送2個方波
{
D0=!D0;
_nop_();
_nop_();
_nop_();
} //開外部中斷1
delay(20);
}
else
if(number==2)
{
j=100;
TH0=0X00;
TL0=0X00;
EX1=1;
TR0=1; //開計數器
while(j--) //發送2個方波
{
D1=!D1;
_nop_();
_nop_();
_nop_();
} //開外部中斷1
delay(20);
}
else
if(number==3)
{
j=100;
TH0=0X00;
TL0=0X00;
EX1=1;
TR0=1; //開計數器
while(j--) //發送2個方波
{
D2=!D2;
_nop_();
_nop_();
_nop_();
} //開外部中斷1
delay(20);
}
else
if(number==4)
{
j=100;
TH0=0X00;
TL0=0X00;
EX1=1;
TR0=1; //開計數器
while(j--) //發送2個方波
{
D3=!D3;
_nop_();
_nop_();
_nop_();
} //開外部中斷1
delay(20);
}
else
if(number==5)
{
j=100;
TH0=0X00;
TL0=0X00;
EX1=1;
TR0=1; //開計數器
while(j--) //發送2個方波
{
D4=!D4;
_nop_();
_nop_();
_nop_();
} //開外部中斷1
delay(10);
}
IE1=0; //延時10ms,等待發送完畢
if(flag==0)
{
TR0=0;
EX1=0;
TH0=0X00;
TL0=0X00;
} //超過10ms或接收到中斷后關外部中斷1,防止干擾
if(TF0==1) //如果計數器溢出則清0
{
TF0=0;
TR0=0;
TH0=0X00;
TL0=0X00;
}
}
////// 開機聲//////
void beep()
{
deep=0;
delay1ms(400);
deep=1;
}
// ************** 外部中斷.驅動小車 ********************//
void in0() interrupt 1 using 0
{
tem++;
if(tem%2==0)
move=0;
else
move=1;
}
/****************************
*外部中斷1;處理數據,測出距離
******************************/
void in1() interrupt 2 using 1
{
IE1=0;
TR0=0;
EX1=0;
flag=1;
// T=read_temp();
// v=331.5+0.607*T;
time=TH0*256+TL0;
shu=(time/100)*17-20;
TH0=0X00;
TL0=0X00;
}
void gotkey(void) {
if (mode_button==0) {
delay(5);
if (mode_button==0)
{
tempkey=1;
LED1=0;
LED2=1;
beep();
}
}
if (operation_button==0) {
delay(5);
if (operation_button==0)
{tempkey=2;
LED1=1;
LED2=0;
beep();
}
}
else tempkey=tempkey;
}
/*****************************
*主程序
******************************/
void main()
{
tem=1;
tempkey=1;
LED1=0;
kk=1;
beep();
init();
seek_play(1); //播入歡迎語音
play();
delay(2000);
EX0=1;
PX0=1;
while(1)
{ gotkey();
read_temp();
ds1820disp();
if(tempkey==1)
{
for(kk=1;kk<4;kk++)
{ if(kk==4)
kk=0;
else
send(kk);
if(flag==1) //如果接收到回波,則進行處理
{
dis_direction(&direction[kk-1][0]);
dis_distance(3,shu);
delay(100);
flag=0;
if(shu<1000)
{
dis_warn(&warn1[kk-1][0]);
seek_play(kk+1);
play();
}
else
dis_warn(warn2);
}
}
}
else if(tempkey==2)
{ send(3);
if(flag==1)
{
dis_direction(&direction[2][0]);
dis_distance(3,shu);
delay(100);
flag=0;
if(shu<500) //滿足條件提示注意后方車輛
{
dis_warn(&warn1[2][0]);
seek_play(4);
play();
}
else
dis_warn(warn2);
}
for(kk=4;kk<6;kk++)
{ if(kk==6)
kk=0;
else
send(kk);
if(flag==1) //如果接收到回波,則進行處理
{
dis_direction(&direction[kk-1][0]);
dis_distance(3,shu);
delay(100);
flag=0;
if(shu<100)
{
dis_warn(&warn1[kk+1][0]);
seek_play(kk+3);
play();
}
else
if(shu>200) // 滿足條件就提示有泥坑
{
dis_warn(&warn1[kk-1][0]);
seek_play(kk+1);
play();
}
else
dis_warn(warn2);
}
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -