脉冲宽度测量程序 c51 c语言,基于C51单片机和LCD1602显示的超声波测距仪C语言程序...
;
stringBuf=stringBuf[length-i-1];
stringBuf[length-i-1]=t;
}
stringBuf[length]='\0';
return length;
}
//蜂鳴器
//延時函數 毫秒 @12.000MHz
void DelayMS(uint ms)
{
uchar i, j;
while(ms--)
{
_nop_();
i = 2;
j = 239;
do
{
while (--j);
}while (--i);
}
}
//延時函數 20微秒 @12.000MHz
void Delay20us()
{
uchar i;
_nop_();
i = 7;
while (--i);
}
//定時器0中斷
void Timer0() interrupt 1
{
}
//DS18B20代碼:
#include
#include
#define uchar unsigned char??//無符號8位
#define uint unsigned int? ?//無符號16位
//定義DS18B20端口DS18B20_DQ
sbit DS18B20_DQ = P2^7;
//當前采集的溫度值整數部分
int xdata CurTempInteger;
//當前采集的溫度值小數部分
int xdata CurTempDecimal;
void Delayus(uint count)
{
while (--count);
}
uchar Reset_DS18B20()
{
uchar status;
DS18B20_DQ=1;
Delayus(1);
//開始復位過程
DS18B20_DQ=0;??//數據線拉低
Delayus(100);??//延時480us-960us
DS18B20_DQ=1;??//數據線拉高
Delayus(10);??//延時15us-60us
status=DS18B20_DQ; //讀取數據線上的狀態
Delayus(120);
return status;
}
void??WriteByteToDS18B20(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DS18B20_DQ=0;
DS18B20_DQ=dat&0x01;? ?//發送1位數據
Delayus(15);? ?? ?//延時60us以上
DS18B20_DQ=1;? ?? ?//釋放總線,等待總線恢復
dat>>=1;? ?? ? //準備下一位數據
}
}
uchar ReadByteFromDS18B20()
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
DS18B20_DQ=0;? ?? ?//拉低總線,產生讀信號
dat>>=1;
DS18B20_DQ=1;? ???//釋放總線,準備讀1位數據
Delayus(2);? ???//延時4us
if(DS18B20_DQ) dat|=0x80; //合并每位數據
Delayus(15);? ???//延時60us
DS18B20_DQ=1;? ???//拉高總線,準備讀下1位數據
}
return dat;
}
void ReadTemperatureFromDS18B20()
{
uchar flag=0;//正負符號標志
//存儲當前采集的溫度值
uchar TempValue[]={0,0};
if(Reset_DS18B20())
{
CurTempInteger=255;
CurTempDecimal=0;
}
else
{
WriteByteToDS18B20(0xCC);//跳過ROM命令
WriteByteToDS18B20(0x44);//溫度轉換命令
Reset_DS18B20();//復位
WriteByteToDS18B20(0xCC);//跳過ROM命令
WriteByteToDS18B20(0xBE);//讀取溫度暫存器命令
TempValue[0]=ReadByteFromDS18B20();//先讀低字節溫度值
TempValue[1]=ReadByteFromDS18B20();//后讀高字節溫度值
Reset_DS18B20();//復位
//計算溫度值
//先進行正溫度與負溫度判斷,高5位全為1(0xF8)則為負數
if((TempValue[1]&0xF8)==0xF8)
{
//負溫度計算:取反加1,低字節為0時,高字節取反加1,否則不需要。
TempValue[1]=~TempValue[1];
TempValue[0]=~TempValue[0]+1;
if(TempValue[0]==0x00) TempValue[1]++;
flag=1;//負數標志
}
//將溫度值分為整數和小數兩部分存儲(默認為12位精度)
CurTempInteger=((TempValue[1]&0x07)<<4)|((TempValue[0]&0xF0)>>4);? ?if(flag) CurTempInteger=-CurTempInteger;
CurTempDecimal=(TempValue[0]&0x0F)*625;
}
}
//LCD1602程序代碼:
#include
#include
#define uchar unsigned char
#define uint??unsigned int
#define Delay4us(){_nop_();_nop_();_nop_();_nop_();}
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^2;
void LCDDelay(uint ms)
{
uchar i, j;
while(ms--)
{
_nop_();
i = 2;
j = 239;
do
{
while (--j);
}while (--i);
}
}
bit LCD_Busy_Check()
{
bit result;
LCD_RS=0; LCD_RW=1; LCD_EN=1;
Delay4us();
result=(bit)(P0&0x80);
LCD_EN=0;
return result;
}
void Write_LCD_Command(uchar cmd)
{
while(LCD_Busy_Check());
LCD_RS=0; LCD_RW=0;??LCD_EN=0; _nop_(); _nop_();
P0=cmd; Delay4us();
LCD_EN=1; Delay4us(); LCD_EN=0;
}
void Write_LCD_Data(uchar dat)
{
while(LCD_Busy_Check());
LCD_RS=1;LCD_RW=0;LCD_EN=0;
P0=dat;Delay4us();
LCD_EN=1;Delay4us();LCD_EN=0;
}
void LCD_Set_POS(uchar pos)
{
Write_LCD_Command(pos|0x80);
}
void LCD_Initialize()
{
Write_LCD_Command(0x01); LCDDelay(5);
Write_LCD_Command(0x38); LCDDelay(5);
Write_LCD_Command(0x0C); LCDDelay(5);
Write_LCD_Command(0x06); LCDDelay(5);
}
void LCD_Display_String(uchar *str, uchar LineNo)
{
uchar k;
LCD_Set_POS(LineNo);
for(k=0;k<16;k++)
{
Write_LCD_Data(str[k]);
}
}
void LCD_Display_OneChar(uchar Dat, uchar X, uchar Y)
{
Y &= 0x01; //限制Y不能大于1(2行,0-1)
X &= 0x0F;??//限制X不能大于15(16個字符,0-15)
if(Y) {X |= 0x40;} //當要在第二行顯示時地址碼+0x40;
X |= 0x80; //算出指令碼
Write_LCD_Command(X);
Write_LCD_Data(Dat);
}
總結
以上是生活随笔為你收集整理的脉冲宽度测量程序 c51 c语言,基于C51单片机和LCD1602显示的超声波测距仪C语言程序...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux hadoop测试,快速搭建H
- 下一篇: 多序列比对的c语言程序,多序列比对的实际