×
单片机 > 单片机程序设计 > 详情

18B20温度LCD显示程序

发布时间:2020-05-26 发布时间:
|

18B20温度LCD显示程序

#include     //器件配置文件 
#include  
sbit LCM_RS=P3^3;      //引脚定义 
sbit LCM_RW=P3^4;     //引脚定义

sbit LCM_EN=P3^5;      //引脚定义 
sbit OUT=P3^6;            //控制继电器 
sbit TSOR=P3^7;            //温度测试端 
#define Busy 0x80        //常量定义 
#define uchar unsigned char 
#define uint unsigned int 
#define DATAPORT P1  
#define reset() {WDT=0x1e;WDT=0xe1;}// 看门狗启动/复位宏定义 
sfr WDT=0xa6;//看门狗寄存器定义 
bit ON_OFF; 
bit outflag; 
//============================================== 
uchar temp1,temp2; 
uchar cnt; 
uchar dEDA,sec;        //时间变量 
char min,hour; 
char set,T; 
uchar ReadStatusLCM(void);//读数据到MCU子函数声明 
uchar code str0[]={"---  :  :  ---  "};//待显字符串 
uchar code str1[]={"SET:  C SA:  . C"}; 
uchar code str2[]={"                "};//待显空字符串 
//====================函数声明======================= 
void fun0(void); 
void fun1(void); 
void fun2(void); 
void fun3(void); 
void set_adj(void); 
void inc_key(void); 
void dec_key(void); 
void key(void); 
void gettempTS(void); 
void initTS(void); 
uchar readBTS(void); 
void writeBTS(uchar byte); 
void resetTS(void); 
bit reaDTS(void); 
void write1TS(void); 
void write0TS(void); 
void delay15us(void); 
void delay60us(void); 

//********延时K*1mS,12.000MHz********* 
void delay(uint k)//函数名为delay的延时子函数。定义k为无符号整型变量 
{                 //delay函数开始 
uint i,j;        //定义i、j为无符号整型变量 
for(i=0;i{       //for循环语句开始 
for(j=0;j<60;j++)      // for循环语句开始 
{;} 
reset()}             //两个for循环体 
}                   //delay函数结束 
/*-----------------------------写指令到LCM子函数-------------------------------*/ 
void WriteCommandLCM(uchar WCLCM, uchar BusyC) /*函数名为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子函数-------------------------------*/ 
void WriteDataLCM(uchar WDLCM)  /*函数名为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子函数---------------------------*/ 
/*uchar ReadDataLCM(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子函数-----------------------------*/ 
uchar ReadStatusLCM(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初始化子函数----------------------------*/ 
void InitLcd()             //函数名为InitLcd 的LCM初始化子函数 
{                       // InitLcd函数开始 
WriteCommandLCM(0x38,1);//8位数据传送,2行显示,5*7字形,检测忙信号 
WriteCommandLCM(0x08,1);//关闭显示,检测忙信号 
WriteCommandLCM(0x01,1);//清屏,检测忙信号 
WriteCommandLCM(0x06,1);//显示光标右移设置,检测忙信号 
WriteCommandLCM(0x0c,1);//显示屏打开,光标不显示、不闪烁,检测忙信号 
}                       // InitLcd函数结束 

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

/*--------------------显示指定座标的一串字符子函数----------------------*/ 
void DisplayListChar(uchar X,uchar Y,uchar code *DData) 
{                        
uchar ListLength=0;  
Y&=0x1;                 
X&=0xF;                
while(X<=15)             
{                       
DisplayOneChar(X,Y,DData[ListLength]); 
ListLength++;             
X++;                   
}                      
}                      
//================================================= 
void init_timer0(void)        //定时器T0初始化 

TMOD=0x01; 
TH0=-(50235/256); 
TL0=-(50235%256); 
TR0=1; 
ET0=1;EA=1; 

//================================================== 
void time_zd0(void) interrupt 1 using 1        //定时器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();                        //扫描键盘 


//================================== 
void fun0(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); 
    else DisplayOneChar(0,0,0xef); 
    } 
    //============================ 
     

/*******************************************/ 
void fun1(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); 

/********************************************/ 
void fun2(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); 

/***************************************/ 
void fun3(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); 

/************************************/ 
void key(void)                        //扫描键盘 
{uchar xx;// 局部变量 
P2=0xff; 
    if(P2!=0xff) 
    {delay(10); 
        if(P2!=0xff) 
        {xx=P2; 
            switch(xx)// 根据按键状态,调用不同的子函数 
            { 
            case 0xfe:set_adj();break; //"MS"键按下,调用set_adj()子函数 
            case 0xfd:inc_key();break; //"+"键按下,调用inc_key()子函数 
            case 0xfb:dec_key();break; //"-"键按下,调用dec_key()子函数 
            case 0xf7:ON_OFF=!ON_OFF;break;// "ON/OFF"键按下,ON_OFF标志取反 
            default:break; 
            } 
        } 
    } 

/************************************/ 
void set_adj(void)                    //设定工作模式子函数 

    if(cnt==5) 
    {set++; 
    if(set>=4)set=0; 
    } 

/***************************************/ 
void inc_key(void)                    //按键加法子函数 

    if(cnt==5) 
    { 
        switch(set) 
        { 
        case 0:if(P2==0xf7)ON_OFF=!ON_OFF;break; 
        case 1:hour++;if(hour>=23)hour=23;break; 
        case 2:min++;if(min>=59)min=59;break; 
        case 3:T++;if(T>=99)T=99;    break; 
        default:break; 
        } 
    } 

/***************************************/ 
void dec_key(void)                        //按键减法子函数 

    if(cnt==5) 
    { 
        switch(set) 
        { 
        case 0:if(P2==0xf7)ON_OFF=!ON_OFF;break; 
        case 1:hour--;if(hour<=0)hour=0;break; 
        case 2:min--;if(min<=0)min=0;break; 
        case 3:T--;if(T<=1)T=1;break; 
        default:break; 
        } 
    } 

/***************************************/ 
/*****************************************/ 
void delay15us(void)                        //延时15微秒子函数 

uchar i; 
for(i=0;i<4;i++); 

//************************************************* 
void delay60us(void)                        //延时60微秒子函数 

uchar i; 
for(i=0;i<15;i++); 

//*************************************************** 
void write0TS(void)                        //写DS18B20数据位0 

TSOR=1; 
TSOR=0; 
delay15us();delay15us();delay15us();delay15us(); 
TSOR=1; 
_nop_(); 
_nop_(); 

//******************************************************** 
void write1TS(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(); 

//****************************** 
bit readTS(void)                        //读DS18B20数据位 

bit b; 
TSOR=1; 
TSOR=0; 
_nop_();_nop_();_nop_();_nop_(); 
TSOR=1; 
_nop_();_nop_();_nop_();_nop_();_nop_(); 
b=TSOR; 
delay15us();delay15us();delay15us(); 
_nop_();_nop_(); 
return b; 

//************************************* 
void resetTS(void)                        //复位DS18B20 
{uchar i; 
TSOR=1; 
TSOR=0; 
for(i=0;i<8;i++)delay60us(); 
TSOR=1; 
while(TSOR); 
for(i=0;i<8;i++)delay60us(); 

//*************************************** 
void writeBTS(uchar byte)                //写1字节 
{uchar i; 
for(i=0;i<8;i++) 

if(byte&0x01) 
write1TS(); 
else 
write0TS(); 
byte=byte>>1; 


//**************************************** 
uchar readBTS(void)                        //读1字节 
{uchar i,j; 
bit b; 
j=0; 
for(i=0;i<8;i++) 

b=readTS(); 
if(b)j+=1; 
j=_cror_(j,1); 

return j; 

//************************************************ 
void initTS(void)                    //初始化DS18B20 

resetTS(); 
writeBTS(0xCC); 
writeBTS(0x4e); 
writeBTS(0x64); 
writeBTS(0x8a); 
writeBTS(0x1f); 

//****************************************************** 
void gettempTS(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; 


//********主函数********* 
void main(void) 

delay(500);                      //延时500ms,等电源稳定 
InitLcd();                        //LCM初始化 
init_timer0();//初始化定时器T0 
DisplayListChar(0,0,str0);// 显示预定行 
DisplayListChar(0,1,str1); 
initTS();//初始化DS18B20 
reset() 
for(;;) 

//======================== 
switch(set)                //LCD根据工作模式进行显示 

case 0:fun0();break;// 正常工作显示 
case 1:fun1();break; //调整时显示 
case 2:fun2();break;// 调整分显示 
case 3: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(temp1            if(temp1//压缩机停止工作 
                } 

else // 否则控温标志为0,压缩机停止工作 
{outflag=0;OUT=1;} 



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
采用AT89C2051的数字可调稳压电源单片机源程序