日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

脉冲宽度测量程序 c51 c语言,基于C51单片机和LCD1602显示的超声波测距仪C语言程序...

發布時間:2025/1/21 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 脉冲宽度测量程序 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语言程序...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。