51单片机测温18b20与LCD12864程序知道.docx
- 文档编号:8148252
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:15
- 大小:18.35KB
51单片机测温18b20与LCD12864程序知道.docx
《51单片机测温18b20与LCD12864程序知道.docx》由会员分享,可在线阅读,更多相关《51单片机测温18b20与LCD12864程序知道.docx(15页珍藏版)》请在冰豆网上搜索。
51单片机测温18b20与LCD12864程序知道
基于STC89C52单片机的18b20测温程序
主程序:
/*****************************************************************************
使用单片机:
STC89C52
晶振频率:
11.0592MHZ
开发环境:
Keil4.0
功能简述:
调试用12864LCD的显示功能,蜂鸣器报警装置
******************************************************************************/
#include
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#definelcd_dataP0
#include"lcd.h"
#include"ds18b20.h"
codeucharDisplay1[8]={"实际温度"};
codeucharDisplay2[8]={"报警温度"};
sbitsl=P0^3;
sbitsr=P0^4;
sbitsu=P0^5;
sbitsd=P0^6;
charf=0;//定义标志位
sbitbeep=P1^7;//蜂鸣器
uinttemp,templa;//定义整形温度数据
floatf_temp;//定义浮点型得温度数据
intActual_Temp;
intAlarm_Temp;
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
voiddelay(uintz)//延时函数
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidKey_Scan()//键盘扫描程序
{
if(sl==0)//实现光标的左移
{
delay(5);//消抖
if(sl==0)
{
while(!
sl);//按键松手检测等待按键释放
if(f==0)
f=4;
elsef--;//按键自减1
}
}
if(sr==0)//实现光标的右移
{
delay(5);//消抖
if(sr==0)
{
while(!
sr);//按键松手检测
f++;
if(f==4)
f=0;
}
}
if(su==0)//实现按键加的功能
{
delay(5);//消抖
if(su==0)
{
while(!
su);//按键松手检测
if(f==1)
{Alarm_Temp=Alarm_Temp+100;}
if(f==2)
{Alarm_Temp=Alarm_Temp+10;}
if(f==3)
{Alarm_Temp=Alarm_Temp+1;}
}
}
if(sd==0)//实现按键减的功能
{
delay(5);//消抖
if(sd==0)
{
while(!
sd);//按键松手检测
if(f==1)
{Alarm_Temp=Alarm_Temp-100;}
if(f==2)
{Alarm_Temp=Alarm_Temp-10;}
if(f==3)
{
Alarm_Temp=Alarm_Temp-1;
}
}
}
Alarm_Temp=Alarm_Temp;
}
voidLCD_Display(intvalue,charx,chary)
{
uintabs_value;
codeucharDisplay_Dot[1]={"."};
codeucharDisplay_Unit[1]={"C"};
if(value<0)
{LCD_Pos(x,y-1);
LCD_SendData("-",1);
}
else
{
LCD_Pos(x,y-1);
LCD_SendData("+",1);
}
abs_value=abs(value);
LCD_Pos(x,y);
LCD_Write(abs_value/100+0x30,1);
LCD_Write(abs_value%100/10+0x30,1);
LCD_SendData(Display_Dot,1);//显示小数点
LCD_Write(abs_value%10+0x30,1);
LCD_SendData(Display_Unit,1);//显示单位
}
voidLCD_DisplayTemp()////显示实际温度与报警温度值
{
LCD_Display(Actual_Temp,0,5);
LCD_Display(Alarm_Temp,1,5);
switch(f){
case0:
LCD_Pos(2,5);
LCD_Write(32,1);//显示空白字符
LCD_Write(32,1);//显示空白字符
LCD_Write(32,1);//显示空白字符
LCD_Write(32,1);//显示空白字符
break;
case1:
LCD_Pos(2,5);
LCD_Write(24,1);//显示向上指针
LCD_Write(32,1);//显示空白字符
LCD_Write(32,1);//显示空白字符
LCD_Write(32,1);//显示空白字符
break;
case2:
LCD_Pos(2,5);
LCD_Write(32,1);//显示空白字符
LCD_Write(24,1);//显示向上指针
LCD_Write(32,1);//显示空白字符
LCD_Write(32,1);//显示空白字符
break;
case3:
LCD_Pos(2,5);
LCD_Write(32,1);//显示空白字符
LCD_Write(32,1);//显示空白字符
LCD_Write(24,1);//显示向上指针
LCD_Write(32,1);//显示空白字符
case4:
LCD_Pos(2,5);
LCD_Write(32,1);//显示空白字符
LCD_Write(32,1);//显示空白字符
LCD_Write(32,1);//显示向上指针
LCD_Write(24,1);//显示空白字符
}
}
voidDS18B20_TempChange(void)//DS18B20开始获取温度并转换
{
DS18B20_Reset();
delay
(1);
DS18B20_WriteByte(0xcc);//写跳过读ROM指令
DS18B20_WriteByte(0x44);//写温度转换指令
}
voidDS18B20_GetTemp()//从DS18B20读取寄存器中存储的温度数据
{
uchara,b;
DS18B20_Reset();
delay
(1);
DS18B20_WriteByte(0xcc);
DS18B20_WriteByte(0xbe);
a=DS18B20_Read();//读低8位
b=DS18B20_Read();//读高8位
temp=b;
temp<<=8;//两个字节组合为1个字
temp=temp|a;
if(temp&0x80==0x80)temp=-(~temp+1);//判断实测温度的正负
f_temp=temp*0.0625;//温度在寄存器中为12位分辨率位0.0625°
temp=f_temp*10+0.5;//乘以10表示小数点后面只取1位,加0.5是四舍五入
f_temp=f_temp+0.05;
Actual_Temp=temp;//temp是整型
}
voidBeep_Warn()//蜂鸣器报警
{
if(Actual_Temp>Alarm_Temp)
beep=0;//蜂鸣器响
else
beep=1;//蜂鸣器不响
}
voidmain()
{uinti;
LCD_init();//初始化LCD
LCD_Clear();//LCD清屏
LCD_Pos(0,0);//设置显示位置为第一行的第一个字符
LCD_SendData(Display1,8);//显示:
实际温度
LCD_Pos(1,0);//设置显示位置为第二行的第一个字符
LCD_SendData(Display2,8);//显示报警温度
while
(1)
{DS18B20_TempChange();
for(i=0;i<10;i++)
{
Beep_Warn();
DS18B20_GetTemp();
LCD_DisplayTemp();//调用显示函数
}
Key_Scan();//调用键盘函数
}
}
//程序很棒,仅供参考,不明白处可留言。
lcd.h程序内容
#ifndef_lcd_H_
#define_lcd_H_
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
//液晶接口定义
sbitCS=P2^0;
sbitSID=P2^1;
sbitCLK=P2^2;
voidLCD_init(void);//LCD初始化程序
voidLCD_Write(ucharword,uchardat);//写液晶子程序
voidLCD_SendData(unsignedchar*date,charnum);//一次写多个字符函数程序
voidLCD_Pos(unsignedcharX,unsignedcharY);//设定LCD显示定位
voidLCD_Clear();//LCD清屏
#endif
lcd.c程序内容
#include"lcd.h"
/********************************************************************************
函数名:
LCD_init
功能说明:
LCD初始化子程序
调用函数:
LCD_Write
入口参数:
出口参数:
说明:
********************************************************************************/
voidLCD_init(void)
{
CS=1;
SID=0;
CLK=0;
LCD_Write(0x30,0);//功能设置,一次送8位数据,基本指令集
LCD_Write(0x30,0);//功能设置,一次送8位数据,基本指令集
LCD_Write(0x0c,0);//0000,1100整体显示,游标off,游标位置off
LCD_Write(0x01,0);//0000,0001清DDRAM
LCD_Write(0x02,0);//0000,0010DDRAM地址归位
LCD_Write(0x80,0);//1000,0000设定DDRAM7位地址000,0000到地址计数器AC//
LCD_Write(0x06,0);
}
/********************************************************************************
函数名:
LCD_Write
功能说明:
写液晶子程序
调用函数:
入口参数:
word(要写的内容)dat(1为数据,0为指令)
出口参数:
说明:
********************************************************************************/
voidLCD_Write(ucharword,uchardat)
{
ucharlcddat[3];
uchari,j,k;
lcddat[0]=(0xf8+(dat<<1));//第一个字节
lcddat[1]=(word&0xf0);//第二个字节内容的高四位+0000
lcddat[2]=((word<<4)&0xf0);//第三个字节内容的第四位+0000
CS=0;
CS=1;
CLK=0;
for(i=0;i<3;i++)
{
j=lcddat[i];
for(k=0;k<8;k++)
{
if((j< elseSID=0; /**时钟下降沿写入数据**/ CLK=1; CLK=0; } } } /******************************************************************************** 函数名: LCD_SendData 功能说明: 一次写多个字符 调用函数: LCD_Write 入口参数: *data(要显示的字符)num(显示的字符个数) 出口参数: 说明: 需要编程者自行判断显示的字符个数 ********************************************************************************/ voidLCD_SendData(unsignedchar*date,charnum) { charj; for(j=0;j { LCD_Write(date[j],1);//显示字符 } } /******************************************************************************** 函数名: LCD_pos 功能说明: 设定LCD显示定位 调用函数: LCD_Write 入口参数: X,Y分别为液晶上行和列坐标 出口参数: 说明: 12864液晶一共可以显示4行,每行可以显示八个汉子或16个字符,都有固定的地址 ********************************************************************************/ voidLCD_Pos(unsignedcharX,unsignedcharY) { unsignedcharpos; if(X==0) {X=0x80;} elseif(X==1) {X=0x90;} elseif(X==2) {X=0x88;} elseif(X==3) {X=0x98;} pos=X+Y; LCD_Write(pos,0); } /******************************************************************************** 函数名: LCD_Clear 功能说明: LCD显示清屏 调用函数: LCD_Write 入口参数: 出口参数: 说明: 不能清屏游标等。 ********************************************************************************/ voidLCD_Clear() { LCD_Write(0x01,0);//0000,0001清DDRAM LCD_Write(0x02,0);//0000,0010DDRAM地址归位 } ds18b20.h程序内容 #ifndef_ds18b20_H_ #define_ds18b20_H_ #include #include #defineucharunsignedchar #defineuintunsignedint sbitds=P2^3;//温度传感信号线 voidDS18B20_Reset(void);//18B20复位,初始化函数 bitDS18B20_ReadBit(void);//读1位函数 ucharDS18B20_Read(void);//读1个字节 voidDS18B20_WriteByte(uchardat);//向18B20写一个字节数据 #endif ds18b20.c程序内容 #include"ds18b20.h" voidDS18B20_Reset(void)//18B20复位,初始化函数 { uinti; ds=0; i=103; while(i>0)i--; ds=1; i=4; while(i>0)i--; } bitDS18B20_ReadBit(void)//读1位函数 { uinti; bitdat; ds=0;i++;//i++起延时作用 ds=1;i++;i++; dat=ds; i=8;while(i>0)i--; return(dat); } ucharDS18B20_Read(void)//读1个字节 { uchari,j,dat; dat=0; for(i=1;i<=8;i++) { j=DS18B20_ReadBit(); dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里 } return(dat); } voidDS18B20_WriteByte(uchardat)//向18B20写一个字节数据 { uinti; ucharj; bittestb; for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb)//写1 { ds=0; i++;i++; ds=1; i=8;while(i>0)i--; } else { ds=0;//写0 i=8;while(i>0)i--; ds=1; i++;i++; } } } //程序很棒,仅供参考,不明白处可留言。 序很棒,仅供参考,不明白处可留言。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 测温 18 b20 LCD12864 程序 知道