#include <REGX51.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LcdData P2 //1602數(shù)據(jù)端口
sbit LCD_RS=P0^7; //1602 RS端口
sbit LCD_RW=P0^6; //1602 RW端口
sbit LCD_EN=P0^5; //1602 EN端口
sbit Echo=P1^2; //HC-SR04 接收端口
sbit Trig=P1^1; //HC-SR04 發(fā)射端口
sbit Resets_Key=P3^2; //復(fù)位清零按鍵
sbit Single_Key=P3^3; //單次測量按鍵 誤差較大
sbit Contin_Key=P3^4; //連續(xù)測量按鍵 誤差小
sbit Averag_Key=P3^5; //連續(xù)(平均測量)按鍵 誤差較小
sbit Setting_Key=P3^6; //溫度修正按鍵
sbit Add_Key=P1^5; //溫度加1按鍵
sbit Sub_Key=P1^6; //溫度減1按鍵
sbit DQ=P3^7; //DS18B20單總線接口
bit Temp_Flag; //正負(fù)溫度標(biāo)志:溫度為正Temp_Flag=0,否則為1
uint temp=25; //溫度值
bit flag_flow=0,flag_one=0,flag_clear=0,flag_con1=0,flag_con2=0,flag_temp=0;
uchar i=0,m,j,k;
uint time=0,S=0,S1=0,totle=0;
float V=346.0;
uint Sav[11]; //連續(xù)測量時(shí)10次平均值數(shù)組
uchar Line1[16]={"T: C V:346m/s"}; //1602第一行初始字符顯示數(shù)組
uchar Line2[16]={"S= m "}; //1602第二行初始字符顯示數(shù)組
void Delayms(uchar xms); //延時(shí)xms函數(shù)
void WriteLcd(uchar Dat,bit x); //1602寫函數(shù)
void InitLcd(void); //1602初始化函數(shù)
void DisplayLcd(); //1602顯示函數(shù)
void init(); //初始化函數(shù)
void keyscan(); //鍵掃描函數(shù)
void StartModule(); //啟動(dòng)模塊函數(shù)
void Conut(void); //測量計(jì)算函數(shù)
void Delayus(uchar xus); //us級延時(shí)函數(shù)
bit Init_DS18B20(void); //初始化DS18B20函數(shù)
uchar Read_DS18B20(void); //讀DS18B20函數(shù)
void Write_DS18B20(uchar Dat); //寫DS18B20函數(shù)
void GetTemp(); //取溫度函數(shù)
void CalcTestTemp(); //溫度處理函數(shù)
void main(void) //主函數(shù)
{
init();
InitLcd();
while(1)
{
keyscan(); //鍵掃描函數(shù)
DisplayLcd();
if(flag_temp==0)
{
GetTemp();
CalcTestTemp();
}
if(flag_one==1||flag_con1==1||flag_con2==1)
{
StartModule(); //開始發(fā)射超聲波
while(!Echo); //當(dāng)RX為零時(shí)等待
TR0=1; //開啟計(jì)數(shù)
while(Echo); //當(dāng)RX為1計(jì)數(shù)并等待
TR0=0; //關(guān)閉計(jì)數(shù)
Conut(); //計(jì)算
Delayus(200);
flag_one=0;
}
}
}
void Delayms(uchar xms) //延時(shí)ms函數(shù)
{
uchar i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void WriteLcd(uchar Dat,bit x) //1602寫函數(shù)(寫指令時(shí)x=0,寫數(shù)據(jù)時(shí)x=1)
{
LCD_EN=0;
LcdData=Dat;
LCD_RS=x;
LCD_RW=0;
LCD_EN=1;
Delayms(1);
LCD_EN=0;
}
void InitLcd(void) //1602初始化函數(shù)
{
WriteLcd(0x38,0); //功能設(shè)定(38H),8位數(shù)據(jù),2行顯示,5*7點(diǎn)陣
WriteLcd(0x0C,0); //顯示開、關(guān)設(shè)定(0CH),開顯示,不顯示光標(biāo),光標(biāo)不閃爍
WriteLcd(0x06,0); //輸入模式設(shè)定(06H),讀寫一個(gè)字符后,地址指針加1,且光標(biāo)加1
WriteLcd(0x01,0); //清除顯示(01H),清除數(shù)據(jù)RAM中的數(shù)據(jù)
}
void DisplayLcd() //液晶屏顯示函數(shù)
{
uchar y;
V=(331.4+temp*0.607);
Line1[2]=temp/10+0x30;
Line1[3]=temp%10+0x30;
Line1[4]=0xDF; //顯示℃中C前面的小圓
Line1[10]=(uint)V/100+0x30;
Line1[11]=(uint)V%100/10+0x30;
Line1[12]=(uint)V%10+0x30;
if(flag_clear==1)
S1=0;
if((S1>=7000)||flag_flow==1) //超出測量范圍顯示“-”
{
flag_flow=0;
Line2[2]='-';
Line2[3]='.';
............................................................................
由于程序較長,需要的到上面的的下載地址自己下載
原貼:
http://www.raoushi.com/bbs/dpj-89642-1.html