1、#define uchar unsigned char /无符号8位#define uint unsigned int /无符号16位#define ulong unsigned long /无符号32位/*全局变量定义*/sbit BEEP=P15; /报警测量超出范围sbit Trig=P34; /HC-SR04触发信号输入sbit Echo=P32; /HC-SR04回响信号输出float xdataDistanceValue=0.0; /测量的距离值float xdata SPEEDSOUND; /声速float xdata XTALTIME; /单片机计数周期ucharxdatast
2、ringBuf6; /数值转字符串缓冲/LCD1602提示信息uchar code Prompts16= Measure Distance, /测量距离- Out of Range -, /超出测量范围MAX range 400cm , /测距最大值400cmMIN range 2cm , /测距最小值2cm , /清屏;ucharxdataDistanceText=Range:;/测量结果字符串ucharxdataTemperatureText=Temperature:/测量温度值/*外部函数声明*/extern void LCD_Initialize(); /LCD初始化extern vo
3、id LCD_Display_String(uchar *, uchar);extern void ReadTemperatureFromDS18B20();externintxdataCurTempInteger; void DelayMS(uintms); /毫秒延时函数void Delay20us(); /20微秒延时函数void HCSR04_Initialize(); /HCSR04初始化float MeasuringDistance(); /测量距离float DistanceStatistics(); /测距的数值排序求平均void DisplayDistanceValue(fl
4、oat dat); /输出距离值到LCD1602上ucharUnsigedIntToString(uint value); /将无符号的整数转成字符串,返回字符串长度,不包括0结束符void Beep(uchar time); /蜂鸣器void DisplayTemperatureValue(); /显示温度值/*测量距离*/floatMeasuringDistance() /最大定时时间约65ms TH0=0; TL0=0; /生成20us的脉冲宽度的触发信号 Trig=1;Delay20us(); Trig=0;while(!Echo);/等待回响信号变高电平 TR0=1; /启动定时器0
5、 while(Echo);/等待回响信号变低电平 TR0=0; /关闭定时器0 return (SPEEDSOUND*XTALTIME*(float)TH0*256+(float)TL0)/2000; /返回距离值(mm)/*HCSR04初始化*/void HCSR04_Initialize() XTALTIME=12/12; /计算单片机计数周期晶振=12M单位us SPEEDSOUND=334.1+25*0.61; /温度25度时声速的值 Echo=0; TMOD=0x01;/*输出距离值到LCD1602上*/voidDisplayDistanceValue(float dat)uchar
6、i=0,j=0,len;uint value;value=(uint)dat; /范围检查大于4000mm和小于20mm都为超出测量范围if(value4000) LCD_Display_String(Prompts1,0x00);LCD_Display_String(Prompts2,0x40);Beep(2); else if(value20)LCD_Display_String(Prompts3,0x40);elselen=UnsigedIntToString(value); /将数值转换成字符串 /保留1位小数while(stringBufi!=)if(len-j=1) Distanc
7、eText6+j=.j+;elseDistanceText6+j=stringBufi;i+;cmi=7+j; /剩余位置补空格while(i16)DistanceTexti= LCD_Display_String(DistanceText,0x40); /LCD_Display_String(Prompts0,0x00);/*显示温度值*/voidDisplayTemperatureValue()TemperatureText13=CurTempInteger/10+0TemperatureText14=CurTempInteger%10+TemperatureText15=CLCD_Dis
8、play_String(TemperatureText,0x00);/*将无符号的整数转成字符串,返回字符串长度*/ucharUnsigedIntToString(uint value)uchari=0,t,length; /从个位开始转换dostringBufi=+value%10;value=value/10;while(value!=0);length=i; /将字符串颠倒顺序for(i=0;i(length/2);i+) t=stringBufi;stringBufi=stringBuflength-i-1;stringBuflength-i-1=t;stringBuflength=r
9、eturn length;/*蜂鸣器*/void Beep(uchar time)uchari;100; BEEP=!BEEP;DelayMS(time); BEEP=0;DelayMS(100);/*延时函数毫秒 12.000MHz*/voidDelayMS(uintms)uchari, j;while(ms-) _nop_();i=2; j=239;while (-j);while (-i);/*延时函数 20微秒 12.000MHz*/void Delay20us()i=7;while (-i);/*定时器0中断*/void Timer0() interrupt 1/DS18B20代码:
10、/*-* 程序功能: DS18B20温度检测程序STC89C52 12MHz* 晶振:12Mhz-*/sbit DS18B20_DQ = P33; /定义DS18B20端口DS18B20_DQintxdataCurTempInteger; /当前采集的温度值整数部分intxdataCurTempDecimal; /当前采集的温度值小数部分/*功能:延时函数 STC89C52 12MHz 12T模式参数:无返回:无*/voidDelayus(uint count)while (-count); /*功能:DS18B20复位及状态检测参数:0或1,1表示未准备好,0表示准备好*/uchar Res
11、et_DS18B20()uchar status; DS18B20_DQ=1;Delayus(1); /开始复位过程 DS18B20_DQ=0; /数据线拉低Delayus(100); /延时480us-960us /数据线拉高Delayus(10); /延时15us-60us status=DS18B20_DQ; /读取数据线上的状态Delayus(120);return status;写一字节到DS18B20中参数:dat=数据返回:void WriteByteToDS18B20(uchardat)8; DS18B20_DQ=dat&0x01; /发送1位数据Delayus(15); /延时60us以上 DS18B20_
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1