?? srf25.c
字號:
#include <intrins.h>
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define nop() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
sbit Fout=P1^6;//40kHZ
sbit Damp=P3^3;//阻尼
sbit Block=P3^4;//封鎖
sbit Led_seg=P1^1;
sbit Led_rclk =P1^0;
sbit Led_srclk=P3^7;
sbit DQ =P1^7; //定義通信端口
const char tab[]= //定義LED數碼管顯示數字.常量(不帶點)
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
//0-9,-,全滅 0-9帶小數點 共陽數碼管
float Distance;//距離
uint Time;
uchar wd;//存儲計時器高位,低位
uchar ReceiveOk=0,flag=0;
void Init();//初始化
void Delay(uchar t);
void Send();//發射聲波
void Receive();//接收外部中斷程序
void Display(uint x);//顯示程序
void Disp(void);
float ReadTemperature(void);
void WriteOneChar(uchar dat);
uchar ReadOneChar(void);
void Init_DS18B20(void);
void delays(uint i);
//-----------------------主程序-------------------------------
void main(void)
{
uchar j, k;
TMOD=0x01; //計數器1模式1
IE=0x00;
// PX0=1; //INT0高優先級
TF0=0;
IT0=0; //INT0下降沿觸發0
wd=ReadTemperature();//讀溫度
while (1)
{
Send();
for(j=0;j<5;j++) Delay(250);
IT0=1; //INT0下降沿觸發0
while(1)
{
if(ReceiveOk==1)
{
ReceiveOk=0;
// Distance=(331.5+0.6*wd)*Time/20000;//89C2051
Distance=(331.5+0.6*wd)*Time/29000;//STC2051
Display((int)(Distance));
break;
}
if(flag==1)
{
flag=0;
TF0=0;
Distance=0;
Display(0);
break;
}
Delay(250);
}
for(k=0;k<100;k++) Delay(250);
}
}
//------------------------延時函數----------------------------
void Delay(uchar t)
{
uchar i,j=0xff;
for(i=0;i<t;i++)
{
for(j=0x19;j>0;j--);
}
}
//------------------------40KHZ超聲波發射----------------------------
void Send()
{
uchar counter;
IE=0x00;
IT0=0; //INT0下降沿觸發0
Damp=0; //關阻尼
Block=0; //開始封鎖 低電平9012導通
Fout=0;
TH0=0;
TL0=0; //計數器清零
TR0=1; //啟動計數器1;
for (counter=0;counter<20;)
{
nop() nop() nop() nop() nop() nop()
nop() nop() nop() nop() nop() nop()
nop() nop() nop() nop() nop() nop()
nop()
counter++;
Fout=!Fout;
}
Damp=1; //開阻尼 9014高電平導通
Block=1; //解除封鎖 9012高電平關斷
EX0=1; //外部中斷0允許
ET0=1; //定時器0溢出允許
EA=1;
}
void Out595(void)
{
Led_rclk=0;
nop()
Led_rclk=1;
}
void Sendbyte(uchar byte)
{
uchar data count;
uchar num;
num=tab[byte];
for(count=0;count<=7;count++)
{
Led_srclk=0;
if((num&0x80)==0x80) //*最高位為1,則向SDATA_595發送1*/
Led_seg=1; //*發出數據的最高位*/
else
Led_seg=0;
num<<=1; //*右移位*/
Led_srclk=1; //*產生上生沿*/
}
}
void Display(uint x)
{
uchar a,b,c;
a=x%10;
b=x/10%10;
c=x/100%10;
Sendbyte(a);
Sendbyte(b);
Sendbyte(c+0x0b);
Out595();
}
//--------------------外部中斷接收程序-------------------------
void Receive() interrupt 0 //外部中斷INT0
{
TR0=0;
IE=0x00; //關中斷
Time=TH0*256+TL0;
ReceiveOk=1;
}
void Overtime() interrupt 1 //定時器0溢出
{
TR0=0;
IE=0x00; //關中斷
flag=1;
}
//讀取溫度
float ReadTemperature(void)
{
uchar a=0;
uchar b=0;
uint t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉換
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
return(tt);
}
//寫一個字節
void WriteOneChar(uchar dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delays(5);
DQ = 1;
dat>>=1;
}
delays(4);
}
//讀一個字節
uchar ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat|=0x80;
delays(4);
}
return(dat);
}
//初始化函數
void Init_DS18B20(void)
{
uchar x=0;
DQ = 1; //DQ復位
delays(8); //稍做延時
DQ = 0; //單片機將DQ拉低
delays(80); //精確延時 大于 480us
DQ = 1; //拉高總線
delays(14);
x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
delays(20);
}
//延時函數
void delays(uint i)
{
while(i--);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -