历史上的今天
返回首页

历史上的今天

今天是:2025年01月07日(星期二)

正在发生

2018年01月07日 | 18B20温度LCD显示程序

2018-01-07 来源:eefocus

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;} 


推荐阅读

史海拾趣

Cables To Go公司的发展小趣事

品牌建设是公司发展的重要一环。Cables To Go公司注重品牌形象的塑造和传播,通过参加行业展会、举办产品发布会等方式提升品牌知名度。同时,公司还积极参与社会公益活动,展现企业的社会责任感和担当精神。这些举措有效地提升了Cables To Go的品牌形象和影响力,为公司的长期发展奠定了坚实的基础。

Federal Custom Cable公司的发展小趣事

Federal Custom Cable公司成立于XXXX年,由几位具有丰富电缆制造经验的工程师创立。公司创立之初,就专注于为客户提供定制化的电缆解决方案。他们深入了解不同行业对电缆的特殊需求,通过技术创新和工艺改进,生产出符合客户要求的电缆产品。这种对定制化需求的精准把握,使Federal Custom Cable在竞争激烈的电缆市场中脱颖而出。

Eska公司的发展小趣事

除了造纸业务外,Eska公司还专注于消防手套的研发与制造。50多年前,Eska就开始研发消防手套,并一直将安全性放在首位。公司严格遵循最大安全性、敏感度、耐火、切割保护、防热和防伤害等标准,确保消防手套在各种环境下都能为消防员提供可靠的保护。Eska的消防手套因其卓越的性能和质量,深受世界和欧洲消防竞技大赛冠军及参赛者的信任和喜爱。

Elpac公司的发展小趣事

Elpac公司深知人才是企业发展的核心动力。因此,公司高度重视人才培养和团队建设。公司建立了完善的人才培训体系,为员工提供多样化的培训和发展机会。同时,公司还鼓励员工积极参与各种创新活动和竞赛,激发员工的创新精神和创造力。这种积极向上的企业文化吸引了大量优秀人才加入Elpac公司,为公司的持续发展提供了有力保障。

台湾第一电阻(Firstohm)公司的发展小趣事
电冰箱不制冷可能由多种原因引起,包括电源问题、温度设置不当、制冷系统故障等。首先,检查电源插头是否牢固插入插座,并确保插座有电。其次,检查温度设置是否正确,冷藏室温度一般应设置在2-4摄氏度,冷冻室温度应设置在-18摄氏度左右。如果以上均正常,可能是制冷系统出现故障,如压缩机故障、制冷剂泄漏等,需要请专业人员进行检查和维修。
Accuride公司的发展小趣事

在经营过程中,Accuride公司也进行了一系列子公司出售和业务调整。例如,它曾宣布出售其子公司Fabco汽车公司。这一举措有助于Accuride公司更加专注于其核心业务,优化资源配置,提升整体运营效率。同时,通过出售子公司,Accuride也获得了一定的资金回流,为公司的未来发展提供了资金支持。

问答坊 | AI 解惑

从封装技术发展来看半导体设计仅仅是刚“起步”!

当创建一款新型的IC时,开始时关注的焦点很自然是设计。随着亚微米工艺的普及,在进入流片阶段以及随后的验证阶段后,掩模和晶圆制造成本都大幅增加,于是多项目晶圆(MPW)业务目前正在得到普及和增长。然而除非到了最后,人们不会投精力于器件的封 ...…

查看全部问答>

什么是模块电源-----模块电源的设计分析

模块电源,电源模块是可以直接贴装在印刷电路板上的电源供应器 (参看图1),其特点是可为专用集成电路(ASIC)、数字信号处理器 (DSP)、微处理器、存储器、现场可编程门阵列 (FPGA) 及其他数字或模拟负载提供供电。一般来说,这类模块称为负载点 (PO ...…

查看全部问答>

AVR单片机定时器0设置的问题?

IAR的开发环境,用的是Atmega48单片机。 T0中断无法进入!设置如下: void timer0Init()            //定时器0初始化 {   // initialize timer 0   //TCCROB =0X00;    ...…

查看全部问答>

有没有人学嵌入式的啊??

刚开始学的,看书糊里糊涂的,概念乱啊,有点看不下去了, 书是北航的嵌入式系统原理 不知道是不是要换换学嵌入式的方法, 不知道版里的前辈们有什么好的建议啊?谢谢阿…

查看全部问答>

内存地址映射问题,初学者,高手指教。

问:        cpu中的寄存器是以什么方式对应到编程中的一段地址的?知道有统一编址,那么硬件上是怎么实现在应用程序中通过一个地址去访问寄存器的,这个对应过程是怎样的?还有统一编址和独立编址这个内存的地址在编程是对应 ...…

查看全部问答>

祝版主鸟语花香

                                 俺是花痴,给力,2008+3!!!…

查看全部问答>

请教C语言的基本概念

1、C有哪些数据类型? 2、什么是指向指针的指针? 3、为什么C语言的字符串要用“\\0”结束?…

查看全部问答>

51也能跑实时系统

本RTX51 Tiny 编程书介绍的信息包含如何使用Keil RTX51 Tiny 实时内核, 如何去进行系统编程,适用于各种51 系列的单片机,对于熟练运用51 单片机的 高手来说,可以通过本书进行51 单片机高级编程,对于初学51 单片机的读者来 说,也可以让很 ...…

查看全部问答>