51单片机温度传感器DS18B20程序LCD1602显示文档格式.docx

上传人:b****6 文档编号:20638655 上传时间:2023-01-24 格式:DOCX 页数:14 大小:144.32KB
下载 相关 举报
51单片机温度传感器DS18B20程序LCD1602显示文档格式.docx_第1页
第1页 / 共14页
51单片机温度传感器DS18B20程序LCD1602显示文档格式.docx_第2页
第2页 / 共14页
51单片机温度传感器DS18B20程序LCD1602显示文档格式.docx_第3页
第3页 / 共14页
51单片机温度传感器DS18B20程序LCD1602显示文档格式.docx_第4页
第4页 / 共14页
51单片机温度传感器DS18B20程序LCD1602显示文档格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

51单片机温度传感器DS18B20程序LCD1602显示文档格式.docx

《51单片机温度传感器DS18B20程序LCD1602显示文档格式.docx》由会员分享,可在线阅读,更多相关《51单片机温度传感器DS18B20程序LCD1602显示文档格式.docx(14页珍藏版)》请在冰豆网上搜索。

51单片机温度传感器DS18B20程序LCD1602显示文档格式.docx

#includevintrins.h>

用.4沁t呗宙虬以阳IWE

pan.baidu./s/1qW8sGQK

#defineucharunsignedchar

#defineuintunsignedint

sbitPOO=POP;

sbitP01=P0A1;

sbitP02=P0A2;

sbitP03=P0A3;

sbitP04=卩0人4;

sbitP05=P0A5;

sbitP06=P0A6;

sbitP07=卩0人7;

sbitP10=P1A0;

sbitP11=P1A1;

sbitP12=P1A2;

sbitP13=卩伦

sbitP14=卩1人4;

 

sbitP15=P1A5;

sbitP16=P"

6;

sbitP17=P1A7;

sbitP20=P2A0;

sbitP21=P2A1;

sbitP22=P2A2;

sbitP23=P2A3;

sbitP24=P2A4;

sbitP25=P2A5;

sbitP26=P2A6;

sbitP27=P2A7;

sbitP30=P3A0;

sbitP31=P3A1;

sbitP32=P3A2;

sbitP33=P3A3;

sbitP34=P3A4;

sbitP35=P3A5;

sbitP36=P3A6;

sbitP37=P3A7;

#defineDQP17

***********

精确延时函数*****************/

voiddelay10us(void){

unsignedchara,b;

for(b=1;

b>

0;

b--)for(a=2;

a>

a--);

}

voiddelay20us(void)

{

b--)for(a=7;

voiddelay30us()

for(b=3;

b--)for(a=3;

//误差0us

voiddelay100us()

b--)for(a=47;

voiddelay200us(void){

b--)for(a=97;

voiddelay500us()

for(b=71;

voidDS18B20_init()//DS18B20

初始化复位

DQ=1;

_nop_();

_nop_();

DQ=0;

delay500us();

//延时几个时钟周期保证DC引脚稳定在高电平

//最短为480us的低电平信号复位

//拉高总线15-60us

delay30us();

delay200us();

位成功

//延时足够时间复位基本上都会成功因此不必再判断是否复

//释放总线

ucharRead_One_Byte(){

uchari;

ucharbyte=0;

for(i=0;

i<

8;

i++)

delay100us();

}return(byte);

voidWrite_One_Byte(ucharbyte){

uchari=0;

for(i=0;

i++){

intRead_Temp()////////***

intt;

floattep;

uchara,b;

DS18B20_init();

Write_One_Byte(0xcc);

Write_One_Byte(0x44);

//跳过ROM命令单个传感器所以不必读取ROM里的序列号

//开始转换

//跳过ROM命令

Write_One_Byte(0xbe);

a=Read_One_Byte();

b=Read_One_Byte();

//读寄存器,共九字节,前两字节为转换值

//a存低字节

//b存高字节

t=b;

t<

<

=8;

//

高字节转换为10进制

t=t|a;

code,code不想同时清显示

//*

****************************************

延时函

**************************************

*//

voiddelayms(uintms)//{

uchara,b,c;

while(ms--){

for(c=1;

c>

c--)for(b=142;

/*

延时?

个ms

*********

字符串复制函数**********

voidstring_copy(uchar*target,uchar{

*source)//字符串复制target:

目标source

source[i]!

='

\0'

;

i++)//{

target[i]=source[i];

target[i]='

注意target的长度无保护措施!

〃**********

字符串比较函数

**********

ucharstring_cmp(uchar*target,uchar*source)//字符串比较target:

目标source:

源{

ucharrevalue;

两个都不等于'

target[i]!

&

&

source[i]!

i++)//执行出现一个等于'

就跳出

if(target[i]==source[i])

revalue=1;

else

revalue=0;

break;

if(revalue==1)

if(target[i]=='

source[i]=='

)revalue=1;

return(revalue);

*/

***************

LCD

********************

//LCD基本函数:

voidbusy_check()//忙碌检测

/*RW=1;

//读

RS=0;

//指令寄存器

LCD_DATA=0xFF;

//实验证明读数时要将I/O口要置1

LCDEN=0;

LCDEN=1;

//EN高电平读信息负跳变执行指令

while

(1)

{if(LCD_BUSY==0)//P07==0跳出循环break;

}*/

delayms

(2);

//仿真时用延时法下载到真实单片机上时,将这句注释掉,采用上面的语句。

voidlcdwrcom(ucharcommand)//写指令

busy_check();

RW=0;

//写

//指令寄存器

LCD_DATA=command;

//负跳变写入指令

LCDEN=0;

voidlcdwrdata(ucharlcd_data)//写数据数字、字母、标点符号都是数据

RS=1;

//数据寄存器

LCD_DATA=lcd_data;

voidlcd_init()

delayms(15);

//必要lcd1602上电到电压稳定需要时间RW=0;

LCD_DATA=0x38;

//0x38设置显示模式为:

16X2显示,5X7点阵,8位数据接口

delayms(5);

lcdwrcom(0x0c);

lcdwrcom(0x06);

lcdwrcom(0x01);

//}

打开显示无光标不闪烁指令3光标右移屏幕所有文字移动无效清显示,光标复位到地址00H位置。

//LCD扩展函数:

定位下一步要写数的地址

voidaddress(ucharx,uchary)//{

ucharlocation;

if(x==0)

location=0x80|y;

location=0xC0|y;

lcdwrcom(location);

voidprintchar(ucharx,uchary,ucharletter)//

address(x,y);

lcdwrdata(letter);

voidprintword(ucharx,uchary,uchar*word)//

显示字母、单个字符

显示单词(字符数组)

{uchari=0;

word[i]!

i++){address(x,y+i);

lcdwrdata(word[i]);

voidprintuint(ucharx,uchary,ucharnum_ws_max,uintnum)//显示无符号整形0~65535x:

行y:

列num_ws_max变量的最大位数

ucharstr[5]={0x20,0x20,0x20,0x20,0x20};

if(num>

=10000)

str[0]=num/10000+'

0'

str[1]=num%10000/1000+'

str[2]=num%1000/100+'

str[3]=num%100/10+'

str[4]=num%10+'

//str[5]='

//手动加字符串结束标志

elseif(num>

=1000)

str[0]=num/1000+'

str[1]=num%1000/100+'

str[2]=num%100/10+'

str[3]=num%10+'

str[4]='

=100)

str[0]=num/100+'

str[1]=num%100/10+'

str[2]=num%10+'

str[3]='

=10)

str[0]=num/10+'

str[1]=num%10+'

str[2]='

=0)

str[0]=num+'

str[1]='

=5;

i++)//uint类型最大值65535为5位数

if(str[i]!

i<

num_ws_max)

{address(x,y+i);

lcdwrdata(str[i]);

lcdwrdata(temp/1000+'

);

address(x,y+1);

lcdwrdata(temp%1000/100+'

address(x,y+2);

lcdwrdata(temp%100/10+'

address(x,y+3);

lcdwrdata('

.'

address(x,y+4);

lcdwrdata(temp%10+'

voidmain()

inttemp;

//温度值lcd_init();

printword(0,0,"

temp:

"

while

(1)

temp=Read_Temp();

if(temp>

0)

printchar(0,5,'

+'

printtemp(0,6,temp);

elseif(temp==0)

'

printchar(0,6,'

{temp=-temp;

printchar(0,5,'

-'

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1