课程设计:粮仓温度自动检测系统 RW=0;
E=0; //E置
低电平(写指令时,,
// 就是让E从0到1发生正跳变,所以应先置\
P0=y; //将数
据送入P0口,即将数据写入液晶模块
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=1; //E置高
电平
_nop_(); _nop_(); _nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E
由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:对LCD的显示模式进行初始化设置
**************************
*************************/
void LcdInt(void) {
delay(15);
//延时15ms,首次写指令时应给LCD一段较长的反应时间
Write_com(0x38); //显
示模式设置:16×2显示,5×7点阵,8位数据接口
delay(5); //延时5ms Write_com(0x38); delay(5);
Write_com(0x38); //3次写
设置模式
delay(5);
Write_com(0x0c); //显示
模式设置:显示不开0c,有光标0e,光标闪烁0f
delay(5);
// Write_com(0x06); //显示模式设置:光标右移,字符不移
delay(5);
Write_com(0x01); //清屏
幕指令,将以前的显示内容清除
delay(5);
}
void wendu(void) {
unsigned char TL,TH,TN; 28
课程设计:粮仓温度自动检测系统 //储存暂存器的温度低位
//unsigned char //储存暂存器的温度高位
unsigned char i,j; //储存温度的整数部分
//unsigned char TD;
if((TH&0xf8)!=0x00)//
判断高五位 得到温度正负标志
{ flag=1;
TL=~TL; //取反 //储存温度的小数部分
// LcdInitiate();
//将液晶初始化
// delaynms(5);
//延时5ms给硬件一点反应时间
if(Init_DS18B20()==0)
//display_error();
//display_explain();
//display_symbol(); //显示温度说明
// display_dot(); //显示温度的小数点
// display_cent(); //显示温度的单位
//不断检测并显示温度
{ flag=0;
ReadyReadTemp();
//读温度准备
TL=ReadOneChar(); //先读的是温度值低位
TH=ReadOneChar();
//接着读的是温度值高位 TH=~TH; //取反
tltemp=TL+1; //低位加
1
TL=tltemp;
if(tltemp>255) TH++; //如果低8位大于255,向高8位进1
TN=TH*16+TL/16; //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
i=TN/10;j=TN;
WriteAddress(0x49);WriteData('t');WriteData(s[10]);WriteData(s[i]);WriteData(s[j]);
WriteData(0x27);WriteData(0x43);
//这样得出的是温度的整数部分,小数部分被丢弃了
//TD=(TL)*10/16; //计算温度的小数部分,将余数乘以10再除以16取整,
}
29
课程设计:粮仓温度自动检测系统 else {TN=TH*16+TL/16; //delay(10); }
//实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
} //这样得出的是温度的整数部分,小数部分被丢弃了
//TD=(TL)*10/16; //计算温度的小数部分,将余数乘以10再除以16取整,
i=TN/10;j=TN;
if(TN>8) {
e=1; }
WriteAddress(0x49);WriteData('t');WriteData(0x3a);WriteData(s[i]);WriteData(s[j]);
WriteData(0x27);WriteData(0x43);
}
//这样得到的是温度小数部分的第一位数字(保留1位小数)
//display_temp1(TN);
//显示温度的整数部分
//display_temp2(TD);
//显示温度的小数部分
void main(void) //主函数
{
k1=1;k2=1;k3=1;k4=1;k5=1; FM=1;
l1=1;l2=1;l3=1;l4=0;
LcdInt(); //调用LCD初始化函数
delay(10);
//初始化
Write_com(0x01);//
清显示:清屏幕指令
delay(5);
WriteAddress(0x00); // 设置
显示位置为第一行的第1个字
delay(5);
30
课程设计:粮仓温度自动检测系统 //WriteData(0x32);WriteData(0x30);
WriteData(0x31);WriteData(0x32);
WriteData(0x2D);delay(5);
WriteData(0x30);delay(5);
WriteData(0x39);delay(5);
WriteData(0x2D);delay(5); WriteData(0x30);delay(5);
WriteData(0x31);delay(5);
WriteData(0x2f);delay(5);Write
Data(0x36);delay(5);
WriteAddress(0x40); WriteData(0x30);delay(5);
WriteData(0x30);delay(5);
WriteData(':');delay(5);
WriteData(0x30);delay(5);
WriteData(0x30);delay(5);
WriteData(':');delay(5);
WriteData(0x30);delay(5);
WriteData(0x30);delay(5);
WriteAddress(0x49);WriteData('t');d
elay(5);
WriteData(0x3A);delay(5);Write
Data(0x32);delay(5);WriteData(0x31);delay(5);
WriteData(0x27);delay(5);
WriteData(0x43);
delay(5);
TMOD|=0x01; //两定时器用0x11,一个用0x01
TH0=60;//(65536-50000)/256;
TL0=176;//(65536-50000)%6;
EA=1; ET0=1; TR0=1; //中断
//按键高
while(1)
/*******************/
{
31
课程设计:粮仓温度自动检测系统 if(e==1) {
FM=!FM;delay(5);
}
if(k1==0) //如果检测到低电平,说明按键按下
{
//
TMOD|=0x01;
//
TH0=60;//(65536-50000)/256;
//TL0=176;//(65536-50000)%6;
delay(10); //延时去抖,一般10-20ms
if(k1==0) //再次确认按键是否按下,没有按下则退出
{
while(k1==0);//如果确认按下按键等待按键释放,没有释放则一直等待
{
EA=~EA;ET0=~ET0; TR0=~TR0; //释放则执行需要的程序//关中断
if(EA==0)
{ Write_com(0x0e);delay(5);}
//
显示模式设置:显示不开0c,有光标0e,光标闪烁0f
if(EA==1)
{ Write_com(0x0c);delay(5);b=0;}
}
}
}
if(EA==0)
{ if(k2==0) //
如果检测到低电平,说明按键按下
{
delay(10); //延时去抖,一般10-20ms
if(k2==0) //再次确认按键是否按下,没有按下则退出
{
while(k2==0);//如果确认按下按键
32