当前位置:首页 > 单片机 > 单片机
[导读] 18B20温度LCD显示程序#include//器件配置文件#includesbitLCM_RS=P3^3;//引脚定义sbitLCM_RW=P3^4;//引脚定义sbitLCM_EN=P3^5;//引脚定义sbitOUT=P3^6;//控制继电器sbitTSOR=P3^7;//温度测试端#defineB

18B20温度LCD显示程序

#include//器件配置文件
#include
sbitLCM_RS=P3^3;//引脚定义
sbitLCM_RW=P3^4;//引脚定义

sbitLCM_EN=P3^5;//引脚定义
sbitOUT=P3^6;//控制继电器
sbitTSOR=P3^7;//温度测试端
#defineBusy0x80//常量定义
#defineucharunsignedchar
#defineuintunsignedint
#defineDATAPORTP1
#definereset(){WDT=0x1e;WDT=0xe1;}//看门狗启动/复位宏定义
sfrWDT=0xa6;//看门狗寄存器定义
bitON_OFF;
bitoutflag;
//==============================================
uchartemp1,temp2;
ucharcnt;
uchardEDA,sec;//时间变量
charmin,hour;
charset,T;
ucharReadStatusLCM(void);//读数据到MCU子函数声明
ucharcodestr0[]={"---::---"};//待显字符串
ucharcodestr1[]={"SET:CSA:.C"};
ucharcodestr2[]={""};//待显空字符串
//====================函数声明=======================
voidfun0(void);
voidfun1(void);
voidfun2(void);
voidfun3(void);
voidset_adj(void);
voidinc_key(void);
voiddec_key(void);
voidkey(void);
voidgettempTS(void);
voidinitTS(void);
ucharreadBTS(void);
voidwriteBTS(ucharbyte);
voidresetTS(void);
bitreaDTS(void);
voidwrite1TS(void);
voidwrite0TS(void);
voiddelay15us(void);
voiddelay60us(void);

//********延时K*1mS,12.000MHz*********
voiddelay(uintk)//函数名为delay的延时子函数。定义k为无符号整型变量
{//delay函数开始
uinti,j;//定义i、j为无符号整型变量
for(i=0;i{//for循环语句开始
for(j=0;j<60;j++)//for循环语句开始
{;}
reset()}//两个for循环体
}//delay函数结束
/*-----------------------------写指令到LCM子函数-------------------------------*/
voidWriteCommandLCM(ucharWCLCM,ucharBusyC)/*函数名为WriteCommandLCM的写指令到LCM子函数。定义WCLCM、BusyC为无符号字符型变量*/
{//WriteCommandLCM函数开始
if(BusyC)ReadStatusLCM();/*若BusyC为"1",则调用ReadStatusLCM子函数进行忙检测*/
DATAPORT=WCLCM;//将变量WCLCM中的指令传送至P1口
LCM_RS=0;//选中指令寄存器
LCM_RW=0;//写模式
LCM_EN=0;//置LCM_EN端为低电平
LCM_EN=0;//置LCM_EN端为低电平,延时一会儿
LCM_EN=1;//置LCM_EN端为高电平,写入使能
}//WriteCommandLCM函数结束
/*----------------------------写数据到LCM子函数-------------------------------*/
voidWriteDataLCM(ucharWDLCM)/*函数名为WriteDataLCM的写数据到LCM子函数。定义WDLCM为无符号字符型变量*/
{//WriteDataLCM函数开始
ReadStatusLCM();//调用ReadStatusLCM子函数检测忙信号
DATAPORT=WDLCM;//将变量WDLCM中数据传送至P1口
LCM_RS=1;//选中数据寄存器
LCM_RW=0;//写模式
LCM_EN=0;//置LCM_EN端为低电平
LCM_EN=0;//置LCM_EN端为低电平,延时一会儿
LCM_EN=1;//置LCM_EN端为高电平,写入使能
}//WriteDataLCM函数结束
/*--------------------------------读数据到MCU子函数---------------------------*/
/*ucharReadDataLCM(void)//函数名为ReadDataLCM的读数据到MCU子函数
{//ReadDataLCM函数开始
LCM_RS=1;//选中数据寄存器
LCM_RW=1;//读模式
LCM_EN=0;//置LCM_EN端为低电平
LCM_EN=0;//置LCM_EN端为低电平,延时一会儿
LCM_EN=1;//置LCM_EN端为高电平,读使能
return(DATAPORT);//返回P1口的内容
}*///ReadDataLCM函数结束

/*--------------------------------读状态到MCU子函数-----------------------------*/
ucharReadStatusLCM(void)//函数名为ReadStatusLCM的读状态到MCU子函数
{//ReadStatusLCM函数开始
DATAPORT=0xFF;//置P1口为全1
LCM_RS=0;//选中指令寄存器
LCM_RW=1;//读模式
LCM_EN=0;//置LCM_EN端为低电平
LCM_EN=0;//置LCM_EN端为低电平,延时一会儿
LCM_EN=1;//置LCM_EN端为高电平,读使能
while(P1&Busy);/*检测忙信号。当P1口内容与Busy(80H)相与后不为零时,程序原地踏步*/
return(DATAPORT);//返回P1口的内容
}//ReadStatusLCM函数结束

/*--------------------------LCM初始化子函数----------------------------*/
voidInitLcd()//函数名为InitLcd的LCM初始化子函数
{//InitLcd函数开始
WriteCommandLCM(0x38,1);//8位数据传送,2行显示,5*7字形,检测忙信号
WriteCommandLCM(0x08,1);//关闭显示,检测忙信号
WriteCommandLCM(0x01,1);//清屏,检测忙信号
WriteCommandLCM(0x06,1);//显示光标右移设置,检测忙信号
WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示、不闪烁,检测忙信号
}//InitLcd函数结束

/*-------------------显示指定座标的一个字符子函数---------------------------*/
voidDisplayOneChar(ucharX,ucharY,ucharDData)
{
Y&=1;
X&=15;
if(Y)X|=0x40;
X|=0x80;
WriteCommandLCM(X,0);
WriteDataLCM(DData);
}

/*--------------------显示指定座标的一串字符子函数----------------------*/
voidDisplayListChar(ucharX,ucharY,ucharcode*DData)
{
ucharListLength=0;
Y&=0x1;
X&=0xF;
while(X<=15)
{
DisplayOneChar(X,Y,DData[ListLength]);
ListLength++;
X++;
}
}
//=================================================
voidinit_timer0(void)//定时器T0初始化
{
TMOD=0x01;
TH0=-(50235/256);
TL0=-(50235%256);
TR0=1;
ET0=1;EA=1;
}
//==================================================
voidtime_zd0(void)interrupt1using1//定时器T0中断子函数
{
TH0=-(50235/256);
TL0=-(50235%256);
deda++;cnt++;
if(deda>=20){sec++;deda=0;}
if(sec>=60){min++;sec=0;}
if(min>=60){hour++;min=0;}
if(hour>=24){hour=0;}
if(cnt>=6)cnt=0;
key();//扫描键盘
}

//==================================
voidfun0(void)//液晶显示子函数0
{
WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示、不闪烁,检测忙信号
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
//===============================
DisplayOneChar(3,0,hour/10+0x30);//液晶上显示小时
DisplayOneChar(4,0,hour%10+0x30);
//=========================
DisplayOneChar(6,0,min/10+0x30);//液晶上显示分
DisplayOneChar(7,0,min%10+0x30);
//==============================
DisplayOneChar(9,0,sec/10+0x30);//液晶上显示秒
DisplayOneChar(10,0,sec%10+0x30);
//=================================
DisplayOneChar(4,1,T/10+0x30);//液晶上显示设定的温度值
DisplayOneChar(5,1,T%10+0x30);
//=================================
DisplayOneChar(11,1,temp1/10+0x30);//液晶上显示测得的温度值
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2+0x30);
//================================
if(ON_OFF==0)//若控温标志为0
{
DisplayOneChar(14,0,0x4f);//液晶上显示不控温的图标
DisplayOneChar(15,0,0x46);
}
else
{
DisplayOneChar(14,0,0x4f);//否则液晶上显示控温的图标
DisplayOneChar(15,0,0x4e);
if(outflag==1)DisplayOneChar(0,0,0x7c);
elseDisplayOneChar(0,0,0xef);
}
//============================

}
/*******************************************/
voidfun1(void)//液晶显示子函数1
{
WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示、不闪烁,检测忙信号
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
//=========================
DisplayOneChar(6,0,min/10+0x30);
DisplayOneChar(7,0,min%10+0x30);
//==============================
DisplayOneChar(9,0,sec/10+0x30);
DisplayOneChar(10,0,sec%10+0x30);
//=================================
DisplayOneChar(4,1,T/10+0x30);
DisplayOneChar(5,1,T%10+0x30);
//=================================
DisplayOneChar(11,1,temp1/10+0x30);
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2+0x30);
//=================================
WriteCommandLCM(0x0f,1);//显示屏打开,光标显示、闪烁,检测忙信号
DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30);
}
/********************************************/
voidfun2(void)//液晶显示子函数2
{
WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示、不闪烁,检测忙信号
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
//=========================
DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30);
//=================================
DisplayOneChar(9,0,sec/10+0x30);
DisplayOneChar(10,0,sec%10+0x30);
//=================================
DisplayOneChar(4,1,T/10+0x30);
DisplayOneChar(5,1,T%10+0x30);
//=================================
DisplayOneChar(11,1,temp1/10+0x30);
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2+0x30);
//===================================
WriteCommandLCM(0x0f,1);//显示屏打开,光标显示、闪烁,检测忙信号
DisplayOneChar(6,0,min/10+0x30);
DisplayOneChar(7,0,min%10+0x30);
}
/***************************************/
voidfun3(void)//液晶显示子函数3
{
WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示、不闪烁,检测忙信号
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
//=========================
DisplayOneChar(3,0,hour/10+0x30);
DisplayOneChar(4,0,hour%10+0x30);
//===============================
DisplayOneChar(6,0,min/10+0x30);
DisplayOneChar(7,0,min%10+0x30);
//=================================
DisplayOneChar(9,0,sec/10+0x30);
DisplayOneChar(10,0,sec%10+0x30);
//=================================
DisplayOneChar(11,1,temp1/10+0x30);
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2+0x30);
//=================================
WriteCommandLCM(0x0f,1);//显示屏打开,光标显示、闪烁,检测忙信号
DisplayOneChar(4,1,T/10+0x30);
DisplayOneChar(5,1,T%10+0x30);
}
/************************************/
voidkey(void)//扫描键盘
{ucharxx;//局部变量
P2=0xff;
if(P2!=0xff)
{delay(10);
if(P2!=0xff)
{xx=P2;
switch(xx)//根据按键状态,调用不同的子函数
{
case0xfe:set_adj();break;//"MS"键按下,调用set_adj()子函数
case0xfd:inc_key();break;//"+"键按下,调用inc_key()子函数
case0xfb:dec_key();break;//"-"键按下,调用dec_key()子函数
case0xf7:ON_OFF=!ON_OFF;break;//"ON/OFF"键按下,ON_OFF标志取反
default:break;
}
}
}
}
/************************************/
voidset_adj(void)//设定工作模式子函数
{
if(cnt==5)
{set++;
if(set>=4)set=0;
}
}
/***************************************/
voidinc_key(void)//按键加法子函数
{
if(cnt==5)
{
switch(set)
{
case0:if(P2==0xf7)ON_OFF=!ON_OFF;break;
case1:hour++;if(hour>=23)hour=23;break;
case2:min++;if(min>=59)min=59;break;
case3:T++;if(T>=99)T=99;break;
default:break;
}
}
}
/***************************************/
voiddec_key(void)//按键减法子函数
{
if(cnt==5)
{
switch(set)
{
case0:if(P2==0xf7)ON_OFF=!ON_OFF;break;
case1:hour--;if(hour<=0)hour=0;break;
case2:min--;if(min<=0)min=0;break;
case3:T--;if(T<=1)T=1;break;
default:break;
}
}
}
/***************************************/
/*****************************************/
voiddelay15us(void)//延时15微秒子函数
{
uchari;
for(i=0;i<4;i++);
}
//*************************************************
voiddelay60us(void)//延时60微秒子函数
{
uchari;
for(i=0;i<15;i++);
}
//***************************************************
voidwrite0TS(void)//写DS18B20数据位0
{
TSOR=1;
TSOR=0;
delay15us();delay15us();delay15us();delay15us();
TSOR=1;
_nop_();
_nop_();
}
//********************************************************
voidwrite1TS(void)//写DS18B20数据位1
{
TSOR=1;
TSOR=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
TSOR=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
delay15us();delay15us();delay15us();
}
//******************************
bitreadTS(void)//读DS18B20数据位
{
bitb;
TSOR=1;
TSOR=0;
_nop_();_nop_();_nop_();_nop_();
TSOR=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
b=TSOR;
delay15us();delay15us();delay15us();
_nop_();_nop_();
returnb;
}
//*************************************
voidresetTS(void)//复位DS18B20
{uchari;
TSOR=1;
TSOR=0;
for(i=0;i<8;i++)delay60us();
TSOR=1;
while(TSOR);
for(i=0;i<8;i++)delay60us();
}
//***************************************
voidwriteBTS(ucharbyte)//写1字节
{uchari;
for(i=0;i<8;i++)
{
if(byte&0x01)
write1TS();
else
write0TS();
byte=byte>>1;
}
}
//****************************************
ucharreadBTS(void)//读1字节
{uchari,j;
bitb;
j=0;
for(i=0;i<8;i++)
{
b=readTS();
if(b)j+=1;
j=_cror_(j,1);
}
returnj;
}
//************************************************
voidinitTS(void)//初始化DS18B20
{
resetTS();
writeBTS(0xCC);
writeBTS(0x4e);
writeBTS(0x64);
writeBTS(0x8a);
writeBTS(0x1f);
}
//******************************************************
voidgettempTS(void)//读取测得的环境温度
{
resetTS();
writeBTS(0xcc);
writeBTS(0x44);
delay(200);
resetTS();
writeBTS(0xcc);
writeBTS(0xbe);
temp2=readBTS();
temp1=readBTS();
readBTS();readBTS();readBTS();readBTS();
readBTS();readBTS();readBTS();
temp1=temp1<<4;
temp1+=(temp2&0xf0)>>4;
temp2=(temp2&0x0f)?5:0;
}

//********主函数*********
voidmain(void)
{
delay(500);//延时500ms,等电源稳定
InitLcd();//LCM初始化
init_timer0();//初始化定时器T0
DisplayListChar(0,0,str0);//显示预定行
DisplayListChar(0,1,str1);
initTS();//初始化DS18B20
reset()
for(;;)
{
//========================
switch(set)//LCD根据工作模式进行显示
{
case0:fun0();break;//正常工作显示
case1:fun1();break;//调整时显示
case2:fun2();break;//调整分显示
case3:fun3();break;//设置控温值显示
default:break;
}
delay(300);
gettempTS();//读取测得的环境温度
if(ON_OFF==1)//若控温标志为1,控制压缩机动作
{
if(temp1>=T+1){delay(1000);//
if(temp1>=T+1){outflag=1;OUT=0;}//测得的温度大于等于控温值+1度时,
//压缩机启动致冷
}
if(temp1if(temp1//压缩机停止工作
}
}
else//否则控温标志为0,压缩机停止工作
{outflag=0;OUT=1;}
}
}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭