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