delay1ms();
}
/*****************************************************
函数功能:
判断液晶模块的忙碌状态
返回值:
result。
result=1,忙碌;result=0,不忙
***************************************************/
bitBusyTest(void)
{
bitresult;
RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1;//E=1,才允许读写
_nop_();//空操作
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
result=BF;//将忙碌标志电平赋给result
E=0;//将E恢复低电平
returnresult;
}
/*****************************************************
函数功能:
将模式设置指令或显示地址写入液晶模块
入口参数:
dictate
***************************************************/
voidWriteInstruction(unsignedchardictate)
{
while(BusyTest()==1);//如果忙就等待
RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲,
//就是让E从0到1发生正跳变,所以应先置"0"
_nop_();
_nop_();//空操作两个机器周期,给硬件反应时间
P0=dictate;//将数据送入P0口,即写入指令或地址
_nop_();
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
E=1;//E置高电平
_nop_();
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:
指定字符显示的实际地址
入口参数:
x
***************************************************/
voidWriteAddress(unsignedcharx)
{
WriteInstruction(x|0x80);//显示位置的确定方法规定为"80H+地址码x"
}
/*****************************************************
函数功能:
将数据(字符的标准ASCII码)写入液晶模块
入口参数:
y(为字符常量)
***************************************************/
voidWriteData(unsignedchary)
{
while(BusyTest()==1);
RS=1;//RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲,
//就是让E从0到1发生正跳变,所以应先置"0"
P0=y;//将数据送入P0口,即将数据写入液晶模块
_nop_();
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
E=1;//E置高电平
_nop_();
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:
对LCD的显示模式进行初始化设置
***************************************************/
voidLcdInitiate(void)
{
delaynms(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x38);//显示模式设置:
16×2显示,5×7点阵,8位数据接口
delaynms(5);//延时5ms ,给硬件一点反应时间
WriteInstruction(0x38);
delaynms(5);//延时5ms ,给硬件一点反应时间
WriteInstruction(0x38);//连续三次,确保初始化成功
delaynms(5);//延时5ms ,给硬件一点反应时间
WriteInstruction(0x0c);//显示模式设置:
显示开,无光标,光标不闪烁
delaynms(5);//延时5ms ,给硬件一点反应时间
WriteInstruction(0x06);//显示模式设置:
光标右移,字符不移
delaynms(5);//延时5ms ,给硬件一点反应时间
WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除
delaynms(5);//延时5ms ,给硬件一点反应时间
}
/************************************************************************
以下是DS18B20的操作程序
************************************************************************/
sbitDQ=P3^3;
unsignedchartime;//设置全局变量,专门用于严格延时
/*****************************************************
函数功能:
将DS18B20传感器初始化,读取应答信号
出口参数:
flag
***************************************************/
bitInit_DS18B20(void)
{
bitflag;//储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在
DQ=1;//先将数据线拉高
for(time=0;time<2;time++)//略微延时约6微秒
;
DQ=0;//再将数据线从高拉低,要求保持480~960us
for(time=0;time<200;time++)//略微延时约600微秒
;//以向DS18B20发出一持续480~960us的低电平复位脉冲
DQ=1;//释放数据线(将数据线拉高)
for(time=0;time<10;time++)
;//延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)
flag=DQ;//让单片机检测是否输出了存在脉冲(DQ=0表示存在)
for(time=0;time<200;time++)//延时足够长时间,等待存在脉冲输出完毕
;
return(flag);//返回检测成功标志
}
/*****************************************************
函数功能:
从DS18B20读取一个字节数据
出口参数:
dat
***************************************************/
unsignedcharReadOneChar(void)
{
unsignedchari=0;
unsignedchardat;//储存读出的一个字节数据
for(i=0;i<8;i++)
{
DQ=1;//先将数据线拉高
_nop_(); //等待一个机器周期
DQ=0;//单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
dat>>=1;
_nop_();//等待一个机器周期
DQ=1;//将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备
for(time=0;time<2;time++)
;//延时约6us,使主机在15us内采样
if(DQ==1)
dat|=0x80;//如果读到的数据是1,则将1存入dat
else
dat|=0x00;//如果读到的数据是0,则将0存入dat
//将单片机检测到的电平信号DQ存入r[i]
for(time=0;time<8;time++)
;//延时3us,两个读时序之间必须有大于1us的恢复期
}
return(dat);//返回读出的十进制数据
}
/*****************************************************
函数功能:
向DS18B20写入一个字节数据
入口参数:
dat
***************************************************/
WriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=0;i<8;i++)
{
DQ=1;//先将数据线拉高
_nop_(); //等待一个机器周期
DQ=0;//将数据线从高拉低时即启动写时序
DQ=dat&0x01;//利用与运算取出要写的某位二进制数据,
//并将其送到数据线上等待DS18B20采样
for(time=0;time<10;time++)
;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
DQ=1;//释放数据线
for(time=0;time<1;time++)
;//延时3us,两个写时序间至少需要1us的恢复期
dat>>=1;//将dat中的各二进制位数据右移1位
}
for(time=0;time<4;time++)
;//稍作延时,给硬件一点反应时间
}
/******************************************************************************
以下是与温度有关的显示设置
******************************************************************************/
/*****************************************************
函数功能:
显示没有检测到DS18B20
***************************************************/
voiddisplay_error(void)
{
unsignedchari;
WriteAddress(0x00);//写显示地址,将在第1行第1列开始显示
i=0;//从第一个字符开始显示
while(Error[i]!
='\0')//只要没有写到结束标志,就继续写