请各位兄弟帮帮看看是什么原因
/主函数
#include<uart.h>
#include <KEYS.h>
#include <BoeBot.h>
#include <stdlib.h>
#include <intrins.h>
#include <lcd2004.h>
//----------------IO口定义区--------------------//
sbit DHT = P1^2 ;//DHT11数据引脚
sbit SDA=P0^1 ; //DS1307数据输入
sbit SCLK=P0^0; //DS1307时钟输入
sbit Key1=P3^2; //功能键
sbit Key2=P3^3; //加
sbit Key3=P3^4; //减
//----------------变量定义区------------------//
unsigned charU8FLAG,k;
unsigned charU8count,U8temp;
unsigned charU8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
unsigned charU8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
unsigned charU8comdata;
unsigned chartemp={"****"}; //温度数组
unsigned charhumi={"*****"}; //湿度数组
unsigned chartime={"********"}; //时间数组
unsigned chardate={"********"}; //日期数组
unsigned charweekdata={"***"}; //定义星期数组
unsigned char set_rtc_code={0,40,18,2,13,3,12}; //初始化DS1307,{秒,分钟,小时,星期, 日,月,年}
//unsigned char reset_rtc_code;
code unsigned char rtc_address={0x00,0x01,0x02,0x03,0x04,0x05,0x06};
unsigned char read_rtc_code={"1234567"};
//unsigned char ntime={0,0};
volatile unsigned char s1num=0,miao;
volatile unsigned char year;week=0,second=0,minute=0,hour=0,day=0,month=0;
//bit ntime_flag=0,flag1=0;
//unsigned char i=0;
//idata unsigned char miao,shi,fen,ri,yue,nian,week;
//idata unsigned char ring_time=0,alarm_hour2=0,alarm_minute2=4,alarm_2_ok=0,alarm_2_en=1,alarm_2_off=0;
//idata unsigned char year;week=0,second=0,minute=0,hour=0,day=0,month=0;//分别保存秒、分、时、天、月、年的变量
void Delay(unsigned int j) //定义延时函数
{
unsigned char i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
voidDelay_10us(void)
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
void chan(void) //转换字符函数
{
time=read_rtc_code/10+'0';
time=read_rtc_code%10+'0'; //小时
time=':';
time=read_rtc_code/10+'0';
time=read_rtc_code%10+'0'; //分钟
time=':';
time=read_rtc_code/10+'0';
time=read_rtc_code%10+'0'; //秒
time='\0';
date=read_rtc_code/10+'0';
date=read_rtc_code%10+'0'; //年
date='-';
date=read_rtc_code/10+'0';
date=read_rtc_code%10+'0'; //月
date='-';
date=read_rtc_code/10+'0';
date=read_rtc_code%10+'0'; //日
date='\0';
switch (read_rtc_code) //星期
{
case 1:weekdata='M';weekdata='o';weekdata='n';break;
case 2:weekdata='T';weekdata='u';weekdata='e';break;
case 3:weekdata='W';weekdata='e';weekdata='d';break;
case 4:weekdata='T';weekdata='h';weekdata='u';break;
case 5:weekdata='F';weekdata='r';weekdata='i';break;
case 6:weekdata='S';weekdata='a';weekdata='t';break;
case 7:weekdata='S';weekdata='u';weekdata='n';break;
}
}
/******************************** I2C PART START*********************/
void I2C_delay(void)
{
_nop_();_nop_();_nop_();//_nop_();_nop_(); //1.调整延时时间和上拉电阻,保证数据稳定
//2.DS1307与DHT11的供电部分加滤波,接地太近有干扰
}
/***********************************************************************/
void I2C_start(void)
{
//SCLK=0;
//I2C_delay();
SDA=1;
//I2C_delay();
_nop_();
SCLK=1;
//I2C_delay();
_nop_();
SDA=0;
//I2C_delay();
_nop_();
SCLK=0;
//I2C_delay();
_nop_();
}
/***********************************************************************/
void I2C_stop(void)
{
//SCLK=0;
SDA=0;
//I2C_delay();
_nop_();
SCLK=1;
//SCLK=1;
//I2C_delay();
_nop_();
SDA=1;
//I2C_delay();
_nop_();
SCLK=0;
//I2C_delay();//_nop_();
//SDA=0;
}
/***********************************************************************/
void I2C_send_ack(bit k)
{
SDA=k;
I2C_delay();
SCLK=1;
I2C_delay();
SCLK=0;
//I2C_delay();
}
/***********************************************************************/
void I2C_write_byte(unsigned char dat)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCLK=0;
//_nop_();
I2C_delay();
SDA=(bit)(dat&0x80);
dat<<=1;
I2C_delay();
SCLK=1;
I2C_delay();
}
SCLK=0;
//I2C_delay();
}
/***********************************************************************/
unsigned char I2C_read_byte(void)
{
unsigned char i,dat;
for (i=0;i<8;i++)
{
SCLK=0;
I2C_delay();
SDA=1;
I2C_delay();
SCLK=1;
I2C_delay();
if(SDA)
dat|=0x80>>i;
}
SCLK=0;
//I2C_delay();
return (dat);
}
/******************************** DS1307 PART START****************/
unsigned char Write1307(unsigned char add,dat) //向DS1307写入数据
{
unsigned char temp;
temp=dat/10;
temp<<=4;
temp=dat%10+temp;
I2C_start();
I2C_write_byte(0xD0);
I2C_send_ack(0);
I2C_write_byte(add);
I2C_send_ack(0);
I2C_write_byte(temp);
I2C_send_ack(1);
I2C_stop();
return (0);
}
/***********************************************************************/
unsigned char Read1307(unsigned char add) //从DS1307读取数据
{
int temp,dat;
I2C_start();
I2C_write_byte(0xD0);
I2C_send_ack(0);
I2C_write_byte(add);
I2C_send_ack(1);
I2C_stop();
I2C_start();
I2C_write_byte(0xD1);
I2C_send_ack(0);
dat=I2C_read_byte();
I2C_send_ack(1);
I2C_stop();
temp=dat/16;
dat=dat%16;
dat=dat+temp*10;
return (dat);
}
/***********************************************************************/
void Read_RTC(void)
{
unsigned char i,*p;
p=rtc_address;
for(i=0;i<7;i++)
{
read_rtc_code=Read1307(*p);
p++;
delay_nms(1);
}
}
/***********************************************************************/
void Set_RTC(void)
{
unsigned char i,*p;
p=rtc_address;
for(i=0;i<7;i++)
{
Write1307(*p,set_rtc_code);
p++;
}
}
/******************************** DS1307 PART STOP****************/
void refresh(void) //转换字符
{
Read_RTC();
second=read_rtc_code;
minute=read_rtc_code;
hour=read_rtc_code;
week=read_rtc_code;
day=read_rtc_code;
month=read_rtc_code;
year=read_rtc_code;
}
unsigned char turn_val(char newval,unsigned char flag,unsigned char s1num) //判断设定的数值是否超过限定的上界或下界
{
if(flag)
{
switch(s1num)
{
case 1:
{
if(newval>99)
newval=0;
date=newval/10+'0';
date=newval%10+'0';
Display_List_Char(0,7,date);
break;
}
case 2:
{
if(newval>12)
newval=1;
date=newval/10+'0';
date=newval%10+'0';
Display_List_Char(0,7,date);
break;
}
case 3:
{
if(newval>31)
newval=1;
date=newval/10+'0';
date=newval%10+'0';
Display_List_Char(0,7,date);
break;
}
case 4:
{
if(newval>7)
newval=1;
switch (newval)
{
case 1:weekdata='M';weekdata='o';weekdata='n';break;
case 2:weekdata='T';weekdata='u';weekdata='e';break;
case 3:weekdata='W';weekdata='e';weekdata='d';break;
case 4:weekdata='T';weekdata='h';weekdata='u';break;
case 5:weekdata='F';weekdata='r';weekdata='i';break;
case 6:weekdata='S';weekdata='a';weekdata='t';break;
case 7:weekdata='S';weekdata='u';weekdata='n';break;
}
Display_List_Char(0,16,weekdata);
break;
}
case 5:
{
if(newval>23)
newval=0;
time=newval/10+'0';
time=newval%10+'0';
Display_List_Char(1,5,time);
break;
}
case 6:
{
if(newval>59)
newval=0;
time=newval/10+'0';
time=newval%10+'0';
Display_List_Char(1,5,time);
break;
}
case 7:
{
if(newval>59)
newval=0;
time=newval/10+'0';
time=newval%10+'0';
Display_List_Char(1,5,time);
break;
}
default:break;
}
}
else
{
switch(s1num)
{
case 1:
{
if(newval<0)
newval=99;
date=newval/10+'0';
date=newval%10+'0';
Display_List_Char(0,7,date);
break;
}
case 2:
{
if(newval==0)
newval=12;
date=newval/10+'0';
date=newval%10+'0';
Display_List_Char(0,7,date);
break;
}
case 3:
{
if(newval==0)
newval=31;
date=newval/10+'0';
date=newval%10+'0';
Display_List_Char(0,7,date);
break;
}
case 4:
{
if(newval==0)
newval=7;
switch (newval)
{
case 1:weekdata='M';weekdata='o';weekdata='n';break;
case 2:weekdata='T';weekdata='u';weekdata='e';break;
case 3:weekdata='W';weekdata='e';weekdata='d';break;
case 4:weekdata='T';weekdata='h';weekdata='u';break;
case 5:weekdata='F';weekdata='r';weekdata='i';break;
case 6:weekdata='S';weekdata='a';weekdata='t';break;
case 7:weekdata='S';weekdata='u';weekdata='n';break;
}
Display_List_Char(0,16,weekdata);
break;
}
case 5:
{
if(newval<0)
newval=23;
time=newval/10+'0';
time=newval%10+'0';
Display_List_Char(1,5,time);
break;
}
case 6:
{
if(newval<0)
newval=59;
time=newval/10+'0';
time=newval%10+'0';
Display_List_Char(1,5,time);
break;
}
case 7:
{
if(newval<0)
newval=59;
time=newval/10+'0';
time=newval%10+'0';
Display_List_Char(1,5,time);
break;
}
default:break;
}
}
return newval;
}
void key_scan(void)
{
unsigned char s1num=0;
refresh();
//delay_nms(500);
if(Key1==0)
{
delay_nms(30); //按键延时去抖
if(Key1==0)
{
while(1)
{
if(Key1==0)
{
delay_nms(30);
if(Key1==0)
{
while(!Key1);
s1num++;
}
}
LCM_RW=0;
Write_Command_LCM(0x0f,1); //光标闪
if(s1num==1)
{
Write_Command_LCM(0x80+0x07,1); //年光标
if(Key2==0)
{
delay_nms(30);
if(Key2==0)
{
while(!Key2);
year++;
year=turn_val(year,1,1); //送入实时显示函数
}
}
if(Key3==0)
{
delay_nms(30);
if(Key3==0)
{
while(!Key3);
year--;
year=turn_val(year,0,1);
}
}
}
if(s1num==2)
{
Write_Command_LCM(0x80+0x0a,1); //月光标
if(Key2==0)
{
delay_nms(20);
if(Key2==0)
{
while(!Key2);
month++;
month=turn_val(month,1,2);
}
}
if(Key3==0)
{
delay_nms(20);
if(Key3==0)
{
while(!Key3);
month--;
month=turn_val(month,0,2);
}
}
}
if(s1num==3)
{
Write_Command_LCM(0x80+0x0d,1); //日光标
if(Key2==0)
{
delay_nms(20);
if(Key2==0)
{
while(!Key2);
day++;
day=turn_val(day,1,3);
}
}
if(Key3==0)
{
delay_nms(20);
if(Key3==0)
{
while(!Key3);
day--;
day=turn_val(day,0,3); //写入日寄存器
}
}
}
if(s1num==4)
{
Write_Command_LCM(0x80+0x10,1); //星期光标
if(Key2==0)
{
delay_nms(20);
if(Key2==0)
{
while(!Key2);
week++;
week=turn_val(week,1,4);
}
}
if(Key3==0)
{
delay_nms(20);
if(Key3==0)
{
while(!Key3);
week--;
week=turn_val(week,0,4);
}
}
}
if(s1num==5)
{
Write_Command_LCM(0x80+0x45,1); // //时光标
if(Key2==0)
{
delay_nms(20);
if(Key2==0)
{
while(!Key2);
hour++;
hour=turn_val(hour,1,5);
}
}
if(Key3==0)
{
delay_nms(20);
if(Key3==0)
{
while(!Key3);
hour--;
hour=turn_val(hour,0,5);
}
}
}
if(s1num==6) //调时间分
{
Write_Command_LCM(0x80+0x48,1); //定位秒
if(Key2==0)
{
delay_nms(20);
if(Key2==0)
{
while(!Key2);
minute++;
minute=turn_val(minute,1,6); //写入分寄存器
}
}
if(Key3==0)
{
delay_nms(20);
if(Key3==0)
{
while(!Key3);
minute--;
minute=turn_val(minute,0,6); //写入分寄存器
}
}
}
if(s1num==7)//调时间秒
{
Write_Command_LCM(0x80+0x4b,1); //定位秒//秒光标
if(Key2==0)
{
delay_nms(20);
if(Key2==0)
{
while(!Key2);
second++;
if(second==60)
second=0;
second=turn_val(second,1,7);
}
}
if(Key3==0)
{
delay_nms(20);
if(Key3==0)
{
while(!Key3);
second--;
second=turn_val(second,0,7);
}
}
}
if(s1num==8) //按到最后一次,数据写入DS1307
{
//miao=Read1307(0x81);
//second=miao;
//Write1307(0x80,second&0x7f);
s1num=0; //s1num清零
Write_Command_LCM(0x0c,1); //光标不闪烁
set_rtc_code= second; //重新构造set_rtc_code数组
set_rtc_code= minute;
set_rtc_code= hour;
set_rtc_code= week;
set_rtc_code= day;
set_rtc_code= month;
set_rtc_code= year;
Set_RTC(); //写入DS1307
break;
}
}
}
}
}
char COM(void)
{
unsigned char i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!DHT)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(DHT)
U8temp=1;
U8FLAG=2;
while((DHT)&&U8FLAG++); //超时则跳出for循环
if(U8FLAG==1)break; //判断数据位是0还是1
U8comdata<<=1;
U8comdata|=U8temp;
}
}
voidRH(void) //读取温湿度
{
DHT=0;
Delay(180); //主机拉低18ms
DHT=1; //总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us(); //主机设为输入 判断从机响应信号
DHT=1; //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!DHT)
{
U8FLAG=2; //判断从机是否发出 80us 的低电平响应信号是否结束
while((!DHT)&&U8FLAG++);
U8FLAG=2; //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while((DHT)&&U8FLAG++); //数据接收状态,接收温度湿度数据
COM();
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
DHT=1; //数据校验
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)//数据校验成功,则转换
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;
humi=U8RH_data_H/10+'0'; //湿度转换成字符串数组,存放于humi[]
humi=(U8RH_data_H)%10+'0';
humi=0x25;
humi='R';
humi='H';
humi='\0';
temp=U8T_data_H/10+'0'; //温度转换成字符串数组,存放于temp[]
temp=(U8T_data_H)%10+'0';
temp=0xdf;
temp='C';
temp='\0';
}
}
}
void display(void)
{
Read_RTC(); //读取时钟
RH();
//读取温湿度,
chan(); //转换函数
Display_List_Char(0,0,"Date:20");
Display_List_Char(0,7,date);
Display_List_Char(0,16,weekdata);
Display_List_Char(1,0,"Time:");
Display_List_Char(1,5,time);
Display_List_Char(2,0,"Temp:"); // 以下为屏幕显示格式
Display_List_Char(2,5,temp); //Date:2012-03-14 Wed
Display_List_Char(2,10,"Humi:"); //Time:19:16:46
Display_List_Char(2,15,humi); //Temp:21℃ Humi:28%RH
Display_List_Char(3,1,"Happy Every Day!!!");
//delay_nms(1000);
}
void main()
{ //init(); //影响按键,接在P3口串口通讯调试用
LCM_Init(); //液晶屏幕初始化
Write_Command_LCM(0x80+0x10); //清屏
//Set_RTC(); //ds1307重置,第一次使用时,
delay_nms(500);
while(1)
{
key_scan();
display();
delay_nms(300);
}
}
I2C的头文件没有加吧! 没行号?看错报在哪里啊 /主函数
//主函数 至少来点描述吧,干什么用的~~~ 你找一下 bit 是在哪个头中定义的,然后在对应的文件中加入一些错误的代码
如果编译的时候没有报错,那就是你的头文件没有正确引用到。 是IIC通信协议的一个返回ACK出问题了, AT89S52+DS1307+DHT11+LCD2004实现万年历和温湿度显示用的 shenhaiyu 发表于 2013-12-17 10:42 static/image/common/back.gif
至少来点描述吧,干什么用的~~~
你好拜托帮帮忙给改改好吗?AT89S52+DS1307+DHT11+LCD2004实现万年历和温湿度显示
页:
[1]