新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于51单片机的天气温度报警系统

基于51单片机的天气温度报警系统

作者: 时间:2016-11-30 来源:网络 收藏

/*向16602写入指令*/
void write_com_1602(uchar com)
{
lcdrs=0;
lcdrw=0;
P3=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
/*从1602读取数据*/
void write_data_1602(uchar date)
{
lcdrs=1;
lcdrw=0;
P3=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}

/*判断温度正负*/
void checkMSB(uchar ta)
{
if(ta==0x07)
{
write_com_1602(0x80+0x48);
write_data_1602(0x20);
TN=MSB*16+LSB/16;
TD=(LSB%16)*10/16;
if(TN>=TH){P1=~P1;} //如果温度设置的超出上限,LED闪烁
else{P1=0xFF;}
}else{
write_com_1602(0x80+0x48);
display_minus();
LSB=~LSB+1;
MSB=~MSB;
TN=MSB*16+LSB/16;
TD=(LSB%16)*10/16;
P1=~P1; //如果温度超出设置的下限(小于0),LED闪烁
}
}

/*向DS1302写数据,分别写入地址和指令*/
void write_com_1302(uchar add,com)
{
uchar i;
CE=1;
for(i=0;i<8;i++)
{
SCLK=0;
IO=add&0x01;
add>>=1;
SCLK=1;
}
for(i=0;i<8;i++)
{
SCLK=0;
IO=com&0x01;
com>>=1;
SCLK=1;
}
SCLK=0;
CE=0;
}
/*从DS1302中读数据,但须先写入地址*/
uchar read_data_1302(uchar add)
{
uchar Data,i;
CE=1;
for(i=0;i<8;i++)
{
SCLK=0;
IO=add&0x01;
add>>=1;
SCLK=1;
}
for(i=0;i<8;i++)
{
SCLK=0;
Data>>=1;
if(IO==1)Data|=0x80;
SCLK=1;
_nop_();
}
SCLK=0;
CE=0;
return Data;
}
/*将从DS1302中读到的数据换化为10进制*/
uchar changenum(uchar num)
{
uchar TH,TL,new_num;
TH=num&0xF0;
TH>>=4;
TH*=10;
TL=num&0x0F;
new_num=TH+TL;
return new_num;
}
void main()
{
while(1)
{
Temperature_conversion(); //温度转换
LSB=read_scratchpad(); //读取LSB位数据
MSB=read_scratchpad(); //读取MSB位数据
TH=read_scratchpad(); //读取TH Register数据
TL=read_scratchpad(); //读取TL Register数据
CR=read_scratchpad(); //读取Configuration Register数据
TA=MSB|0x07; //按位与,从MSB位判断温度正负
checkMSB(TA); //判断温度正负
write_com_1602(0x80+0x49);
display_temp1(TN);
display_dot();
display_temp2(TD);
display_cent();
write_com_1602(0x80);
YY=read_data_1302(0x8D);
YY=changenum(YY);
display_temp3(YY);
display_minus();
MM=read_data_1302(0x89);
MM=changenum(MM);
display_temp3(MM);
display_minus();
DD=read_data_1302(0x87);
DD=changenum(DD);
display_temp3(DD);
write_data_1602(0x20);
write_data_1602(0x20);
write_data_1602(0x20);
HH=read_data_1302(0x85);
HH=changenum(HH);
display_temp3(HH);
display_minus();
MIN=read_data_1302(0x83);
MIN=changenum(MIN);
display_temp3(MIN);
WEEK=read_data_1302(0x8B)-1;
write_com_1602(0x80+0x45);
write_data_1602(digit[WEEK]);
//SEC=read_data_1302(0x81);
//SEC=changenum(SEC);
//display_temp3(SEC);
}
}


上一页 1 2 下一页

评论


技术专区

关闭