计控 粮仓温度自动检测系统 - 图文(6)

2019-08-31 11:42

课程设计:粮仓温度自动检测系统 *************************/

unsigned char ReadOneChar(void)

{ unsigned char i=0;

unsigned char dat; //储

存读出的一个字节数据

for (i=0;i<8;i++) {

DQ =1; // 先

将数据线拉高

_nop_();

//等

待一个机器周期

DQ = 0; //单

片机从DS18B20读书据时,将数据线从高拉低即启动读时序

_nop_(); //等待

一个机器周期

DQ = 1; //将数

据线\人为\拉高,为单片机检测DS18B20的输出电平作准备

for(time=0;time<2;time++)

; //延时约6us,使主机在15us内采样

dat>>=1;

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

***************************************************/

void WriteOneChar(unsigned char dat)

{ unsigned char i=0; for (i=0; i<8; i++) {

DQ =1; //

先将数据线拉高

_nop_(); //等待

一个机器周期

DQ=0; //

将数据线从高拉低时即启动写时序 23

课程设计:粮仓温度自动检测系统 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++)

; //稍作延

时,给硬件一点反应时间

}

/*****************************************************

函数功能:做好读温度的准备***************************************************/

void ReadyReadTemp(void)

{

Init_DS18B20(); //将DS18B20初始化

WriteOneChar(0xCC); //

跳过读序号列号的操作

WriteOneChar(0x44); //

启动温度转换

delay(200); //转换一

次需要延时一段时间

Init_DS18B20(); //

将DS18B20初始化

WriteOneChar(0xCC); //

跳过读序号列号的操作

WriteOneChar(0xBE); //

读取温度寄存器,前两个分别是温度的低位和高位

}

/*void display_temp1(unsigned char x)

{

unsigned char j,k,l; //j,k,l分别储存温度的百位、十位和个位

j=x/100; //

取百位

k=(x0)/10; //取十位 l=x; //取

个位

WriteAddress(0x46); //

24

课程设计:粮仓温度自动检测系统 写显示地址,将在第2行第7列开始显示

if(flag==1)

//负

温度时 显示“—”

{

WriteData(digit[10]); //

将百位数字的字符常量写入LCD

} else{

WriteData(digit[j]); //将

十位数字的字符常量写入LCD

}

WriteData(digit[k]); //

将十位数字的字符常量写入LCD

WriteData(digit[l]); //将

个位数字的字符常量写入LCD

delay(50); //延时

1ms给硬件一点反应时间

}*/

/**********************************************************/

void pand() {

if(sec==-1)sec=59;

if(sec==60) { sec=0;} if(min==-1)min=59; if(min==60)

{

min=0;} if(h==-1)h=23; if(h==24) {

h=0;}

if(x==-1)x=6;

if(x==7){x=0;}

// 星期 if(m==2)

//判

断闰年

{ if(year%4==0) {

if(d==30){d=1;}if(d==0)d=29;

}

if(year%4!=0) {

if(d==29)d=1;if(d==0)d=28;

}

}

switch(m) {

case 1:case 3:case 5:case

7:case 8:case 10:

case 12:

if(d==32)d=1;if(d==0)d=31;break;

25

课程设计:粮仓温度自动检测系统 case 4:case 6:case 9:case 11:

if(d==31){d=1;}if(d==0)d=30;break;

} //月完

if(m==0)m=12; if(m==13) {m=1;}

if(year<12)year=99; if(year==100){year=0;}

}

void beef() {

TMOD|=0x11; TH1=60; TL1=176; ET1=1;TR1=1; }

/***********************************************************************/

/*****************************************************

函数功能:判断液晶模块的忙碌状态

返回值:result。result=1,忙碌;result=0,不忙

***************************************************/

bit BusyTest(void)

{

bit result;

RS=0; //根据规

定,RS为低电平,RW为高电平时,可以读状态

RW=1;

E=1; //E=1,才允许读写

_nop_(); //空操作 _nop_(); _nop_();

_nop_(); //空操

作四个机器周期,给硬件反应时间

result=BF; //将忙碌标志电平赋给result

E=0;

return result; }

/*****************************************************

函数功能:将模式设置指令或显示地址写入液晶模块

入口参数:dictate

***************************************************/

void Write_com (unsigned char dictate)

{

while(BusyTest()==1); //如果忙就等待

26

课程设计:粮仓温度自动检测系统 RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令

RW=0;

E=0;

//E置低电平(写指令时,

// 就是让E从0到1发生正跳变,所以应先置\

_nop_();

_nop_(); //

空操作两个机器周期,给硬件反应时间

P0=dictate; //

将数据送入P0口,即写入指令或地址

_nop_(); _nop_(); _nop_();

_nop_();

//空操作四个机器周期,给硬件反应时间

E=1;

//E置高电平

_nop_(); _nop_(); _nop_();

_nop_();

//空操作四个机器周期,给硬件反应时间

E=0;

//当E由高电平跳变成低电平时,液晶模块开始执行命令

}

/*****************************************************

函数功能:指定字符显示的实际地址

入口参数:x

***************************************************/

void WriteAddress(unsigned char x)

{

Write_com(x|0x80); //显示位置的确定方法规定为\地址码x\

}

/*****************************************************

函数功能:将数据(字符的标准ASCII码)写入液晶模块

入口参数:y(为字符常量)

***************************************************/

void WriteData(unsigned char y)

{

while(BusyTest()==1);

RS=1; //RS

为高电平,RW为低电平时,可以写入数据

27


计控 粮仓温度自动检测系统 - 图文(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2018-2024年中国高速铁路行业运营态势报告(目录) - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: