原本能够正常走时,然后想在1602屏的右边显示DHT11的温湿度,加了dht11程序后好像卡在read_TRH(); 那里了。求帮忙看看哪里出问题了
代码如下:粘贴过来缩进没了
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit duanxuan=P2^6;
sbit weixuan=P2^7;
sbit rs=P3^5;
sbit lcden=P3^4;
sbit s1=P3^0;//功能键
sbit s2=P3^1;//增大键
sbit s3=P3^2;//减小键
sbit s4=P3^6;//闹钟查看键
sbit rd=P3^7;
sbit dscs=P1^4;
sbit dsas=P1^5;
sbit dsrw=P1^6;
sbit dsds=P1^7;
sbit disirq=P3^3;
sbit beep=P2^3;
sbit relay=P2^5;//继电器模块接口
sbit TRH = P2^0;//温湿度传感器DHT11数据接入
//初始化函数
//上电后显示默认时间
unsigned char str1[]={""};
unsigned char str2[]={""};
uchar code table[]= " - ";
uchar code table1[]=" : : ";
uchar num,count,s1num,t0_num,flag,get;
//DHT11定义
uchar TH_data,TL_data,RH_data,RL_data,CK_data;
uchar TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
uchar com_data,untemp,temp,m;
uchar respond;
//
/*********************************************************************************/
void delayNOP()
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/*********************************************************************************/
/*********************************************************************************/
// 毫秒级延时子程序
/*********************************************************************************/
void delay_ms(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i< 150; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*********************************************************************************/
/*********************************************************************************/
//5us级延时程序
/*********************************************************************************/
void delay_us()
{
uchar i;
i--;
i--;
i--;
i--;
i--;
i--;
}
/********************************************************************************/
/****************************************************************************/
//收发信号检测,数据读取
/****************************************************************************/
char receive()
{
uchar i;
com_data=0;
for(i=0;i<=7;i++)
{
respond=2;
while((!TRH)&&respond++);
delay_us();
delay_us();
delay_us();
if(TRH)
{
temp=1;
respond=2;
while((TRH)&&respond++);
}
else
temp=0;
com_data<<=1;
com_data|=temp;
}
return(com_data);
}
/****************************************************************************/
/****************************************************************************/
//湿度读取子程序
//温度高8位== TL_data
//温度低8位== TH_data
//湿度高8位== RH_data
//湿度低8位== RH_data
//校验 8位 == CK_data
//调用的程序有 delay();, Delay_5us();,RECEIVE();
/***************************************************************************/
void read_TRH()
{
//主机拉低18ms
TRH=0;
delay_ms(18);
TRH=1;
//DATA总线由上拉电阻拉高 主机延时20us
delay_us();
delay_us();
delay_us();
delay_us();
delay_us();
//delay_us();
//delay_us();
//delay_us();
//delay_us();
//主机设为输入 判断从机响应信号
TRH=1;
//判断DHT11是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!TRH)
{
respond=2; //判断DHT11发出 80us 的低电平响应信号是否结束
while((!TRH)&& respond++);
respond=2; //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while(TRH && respond++); //数据接收状态
RH_temp = receive();
RL_temp = receive();
TH_temp = receive();
TL_temp = receive();
CK_temp = receive();
TRH=1; //数据校验
untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
if(untemp==CK_temp)
{
RH_data = RH_temp;
RL_data = RL_temp;
TH_data = TH_temp;
TL_data = TL_temp;
CK_data = CK_temp;
}
}
str2[1] = (char)(0X30+TH_data/10); //温度整数部分
str2[2] = (char)(0X30+TH_data%10);
str2[3] = 0x2e; //小数点
str2[4] = (char)(0X30+TL_data/10); //温度小数部分
str2[5] = 0X27; //"'"
str2[6] = 0X43; //"C"
str1[1] = (char)(0X30+RH_data/10); //湿度整数部分
str1[2] = (char)(0X30+RH_data%10);
str1[3] = 0x2e; //小数点
str1[4] = (char)(0X30+RL_data/10);//湿度小数部分
str1[5] = 0X25; //"%"
}
/****************************************************************************/
//TH,TL,RH,RL分别代表温湿度的整数和小数部分
char min,sec,hour,month,day,week,asec,amin,ahour;
uint i;
bit flag1;flag_ri;
void set_alarm(uchar,uchar,uchar);
void write_com(uchar com)//指令码
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar dat)
{
rs=1;
lcden=0;
P0=dat;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
void write_ds(uchar add,uchar dat)
{
dscs=0;//片选打开
dsas=1;
dsds=1;
dsrw=1;
P0=add;
dsas=0;
dsrw=0;
P0=dat;
dsrw=1;
dsas=1;
dscs=1;
}
uchar read_ds(uchar add)
{
uchar ds_data;
dscs=0;
dsas=1;
dsds=1;
dsrw=1;
P0=add;
dsas=0;
dsds=0;
P0=0xff;
ds_data=P0;
dsds=1;
dsas=1;
dscs=1;
return ds_data;
}
void set_time()//初始化时间
{
write_ds(9,16);//年份已经设置为16年
write_ds(1,0);
write_ds(3,0);
write_ds(5,0);
write_ds(6,1);
}
void read_alarm()//读取12C887闹钟值
{
asec=read_ds(1);
amin=read_ds(3);
ahour=read_ds(5);
}
void didi()
{
beep=0;
delay(250);
beep=1;
delay(100);
beep=0;
delay(150);
beep=1;
delay(400);
}
void di()
{
beep=0;
delay(20);
beep=1;
}
void baoshi()
{
if(hour!=hour)
{
if(get<24&&get>8)
di();
}
}
//初始化函数
void init()
{
duanxuan=0;
weixuan=0;
rd=0;
EA=1;
EX1=1;
IT1=1;
flag1=0;
s1num=0;
t0_num=0;
lcden=0;
relay=1;
set_time();
//read_ds(0x0c);
write_com(0x38);
write_com(0x0c);
write_com(0x06);//整屏显示
write_com(0x01);//清屏
write_com(0x80);
for(num=0;num<9;num++)
{
write_data(table[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<8;num++)
{
write_data(table1[num]);
delay(5);
}
}
void write_week(char week)
{
write_com(0x80+6);
switch(week)
{
case 1:write_data('M');
delay(5);
write_data('o');
delay(5);
write_data('n');
break;
case 2:write_data('T');
delay(5);
write_data('u');
delay(5);
write_data('e');
break;
case 3:write_data('W');
delay(5);
write_data('e');
delay(5);
write_data('d');
break;
case 4:write_data('T');
delay(5);
write_data('h');
delay(5);
write_data('u');
break;
case 5:write_data('F');
delay(5);
write_data('r');
delay(5);
write_data('i');
break;
case 6:write_data('S');
delay(5);
write_data('a');
delay(5);
write_data('t');
break;
case 7:write_data('S');
delay(5);
write_data('u');
delay(5);
write_data('n');
break;
}
}
void write_hour_min_sec(uchar add,uchar dat)
{
uchar shi,ge;
shi=dat/10;
ge=dat%10;
write_com(0x80+0x40+add);//第二行
write_data(0x30+shi);
write_data(0x30+ge);
}
void write_month_day(uchar add,uchar dat)
{
char shi,ge;
shi=dat/10;
ge=dat%10;
write_com(0x80+add);//第二行
write_data(0x30+shi);
write_data(0x30+ge);
}
void keyscan()
{
if(flag_ri==1)//按任意键取消闹钟
{
if((s1==0)||(s2==0)||(s3==0)||(s4==0))
{
delay(5);
if((s1==0)||(s2==0)||(s3==0)||(s4==0))
{
while(!(s1&&s2&&s3&&s4));
di();
flag_ri=0;
relay=1;
}
}
}
if(s1==0)//功能键按下
{
delay(5);
if(s1==0)
{
s1num++;
if(flag1==1)
if(s1num==4)
s1num=1;
flag=1;
while(!s1);//松手
di();
if(s1num==1)
{
write_com(0x80+0x40+6);
write_com(0x0f);
}
if(s1num==2)
{
write_com(0x80+0x40+3);
}
if(s1num==3)
{
write_com(0x80+0x40+0);
}
if(s1num==4)//调整月份
{
write_com(0x80);
}
if(s1num==5)//调整日数
{
write_com(0x80+3);
}
if(s1num==6)
{
write_com(0x80+6);//调整星期
}
if(s1num==7)
{
write_ds(0,sec);
write_ds(2,min);
write_ds(4,hour);
write_ds(6,week);
write_ds(7,day);
write_ds(8,month);
}
if(s1num==8)//确认键
{
s1num=0;
write_com(0x0c);
flag=0;
}
}
}
if(s1num!=0)//只有s1被按下了,才检测s2,s3
{
if(s2==0)//且s2也被按下
{
delay(5);
if(s2==0)
{
di();
while(!s2);
if(s1num==1)//确定在哪个位置
{
sec++;
if(sec==60)
sec=0;
write_hour_min_sec(6,sec);
write_com(0x80+0x40+6);
}
if(s1num==2)
{
min++;
if(min==60)
min=0;
write_hour_min_sec(3,min);
write_com(0x80+0x40+3);
}
if(s1num==3)
{
hour++;
if(hour==24)
hour=0;
write_hour_min_sec(0,hour);
write_com(0x80+0x40+0);
}
if(s1num==4)
{
month++;
if(month==13)
month=1;
write_month_day(0,month);
write_com(0x80);
}
if(s1num==5)
{
day++;
if(day==32)
day=1;
write_month_day(3,day);
write_com(0x80+3);
}
if(s1num==6)
{
week++;
if(week==8)
week=1;
write_week(week);
write_com(0x80+6);
}
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
di();
if(s1num==1)
{
sec--;
if(sec==-1)
sec=59;
write_hour_min_sec(6,sec);
write_com(0x80+0x40+6);
}
if(s1num==2)
{
min--;
if(min==-1)
min=59;
write_hour_min_sec(3,min);
write_com(0x80+0x40+3);
}
if(s1num==3)
{
hour--;
if(hour==-1)
hour=23;
write_hour_min_sec(0,hour);
write_com(0x80+0x40);
}
if(s1num==4)
{
month--;
if(month==0)
month=12;
write_month_day(0,month);
write_com(0x80);
}
if(s1num==5)
{
day--;
if(day==0)
day=31;
write_month_day(3,day);
write_com(0x80+3);
}
if(s1num==6)
{
week--;
if(week==0)
week=7;
write_week(week);
write_com(0x80+6);
}
}
}
}
if(s4==0)
{
delay(5);
if(s4==0)
{
flag1=~flag1;
while(!s4);
di();
if(flag1==0)//退出闹钟设置时保存设置
{
flag=0;
write_com(0x80+0x40);
write_data(' ');
write_data(' ');
write_com(0x0c);
write_ds(1,sec);
write_ds(3,min);
write_ds(5,hour);
}
else//进入闹钟设置
{
read_alarm();
sec=asec;//重新赋值用以按键调节
min=amin;
hour=ahour;
write_com(0x80+0x40+8);
write_data(0x2e);
write_com(0x80+0x40);
write_hour_min_sec(6,asec);
write_hour_min_sec(3,amin);
write_hour_min_sec(0,ahour);
}
}
}
}
void main()
{
init();
while(1)
{
keyscan();
if(flag_ri==1)//闹钟铃声程序
{
relay=0;
}
if(flag==0&&flag1==0)//正常运行
{
keyscan();
month=read_ds(8);
day=read_ds(7);
week=read_ds(6);
hour=read_ds(4);
min=read_ds(2);
sec=read_ds(0);
write_hour_min_sec(6,sec);
write_hour_min_sec(3,min);
write_hour_min_sec(0,hour);
write_week(week);
write_month_day(0,month);
write_month_day(3,day);
read_TRH(); //写字符
m=0x4a;//写湿度数据
for(i=1;i<=5;i++)
{
write_com(0x80+m);
write_data(str1[i]);
m++;
}//写温度数据
m=0x0a;
for(i=1;i<=6;i++)
{
write_com(0x80+m);
write_data(str2[i]);
m++;
}
delay_ms(100) ;//延时
}
}
}
void exter() interrupt 2
{
uchar c;
flag_ri=1;
c=read_ds(0x0c);
}