1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 脉冲宽度测量程序 c51 c语言 基于C51单片机和LCD1602显示的超声波测距仪C语言程序...

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

时间:2023-05-20 09:28:21

相关推荐

脉冲宽度测量程序 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;

}

voidWriteByteToDS18B20(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 uintunsigned 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);

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。