- /主函数
- #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 char U8FLAG,k;
- unsigned char U8count,U8temp;
- unsigned char U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
- unsigned char U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
- unsigned char U8comdata;
- unsigned char temp[5]={"****"}; //温度数组
- unsigned char humi[6]={"*****"}; //湿度数组
- unsigned char time[9]={"********"}; //时间数组
- unsigned char date[9]={"********"}; //日期数组
- unsigned char weekdata[4]={"***"}; //定义星期数组
- unsigned char set_rtc_code[7]={0,40,18,2,13,3,12}; //初始化DS1307,{秒,分钟,小时,星期, 日,月,年}
- //unsigned char reset_rtc_code[7];
- code unsigned char rtc_address[7]={0x00,0x01,0x02,0x03,0x04,0x05,0x06};
- unsigned char read_rtc_code[7]={"1234567"};
- //unsigned char ntime[2]={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++);
- }
- }
- void Delay_10us(void)
- {
- _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- }
- void chan(void) //转换字符函数
- {
- time[0]=read_rtc_code[2]/10+'0';
- time[1]=read_rtc_code[2]%10+'0'; //小时
- time[2]=':';
- time[3]=read_rtc_code[1]/10+'0';
- time[4]=read_rtc_code[1]%10+'0'; //分钟
- time[5]=':';
- time[6]=read_rtc_code[0]/10+'0';
- time[7]=read_rtc_code[0]%10+'0'; //秒
- time[8]='\0';
- date[0]=read_rtc_code[6]/10+'0';
- date[1]=read_rtc_code[6]%10+'0'; //年
- date[2]='-';
- date[3]=read_rtc_code[5]/10+'0';
- date[4]=read_rtc_code[5]%10+'0'; //月
- date[5]='-';
- date[6]=read_rtc_code[4]/10+'0';
- date[7]=read_rtc_code[4]%10+'0'; //日
- date[8]='\0';
- switch (read_rtc_code[3]) //星期
- {
- case 1:weekdata[0]='M';weekdata[1]='o';weekdata[2]='n';break;
- case 2:weekdata[0]='T';weekdata[1]='u';weekdata[2]='e';break;
- case 3:weekdata[0]='W';weekdata[1]='e';weekdata[2]='d';break;
- case 4:weekdata[0]='T';weekdata[1]='h';weekdata[2]='u';break;
- case 5:weekdata[0]='F';weekdata[1]='r';weekdata[2]='i';break;
- case 6:weekdata[0]='S';weekdata[1]='a';weekdata[2]='t';break;
- case 7:weekdata[0]='S';weekdata[1]='u';weekdata[2]='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[i]=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[i]);
- p++;
- }
- }
- /******************************** DS1307 PART STOP ****************/
- void refresh(void) //转换字符
- {
- Read_RTC();
- second=read_rtc_code[0];
- minute=read_rtc_code[1];
- hour=read_rtc_code[2];
- week=read_rtc_code[3];
- day=read_rtc_code[4];
- month=read_rtc_code[5];
- year=read_rtc_code[6];
- }
- unsigned char turn_val(char newval,unsigned char flag,unsigned char s1num ) //判断设定的数值是否超过限定的上界或下界
- {
- if(flag)
- {
- switch(s1num)
- {
- case 1:
- {
- if(newval>99)
- newval=0;
- date[0]=newval/10+'0';
- date[1]=newval%10+'0';
- Display_List_Char(0,7,date);
- break;
- }
- case 2:
- {
- if(newval>12)
- newval=1;
- date[3]=newval/10+'0';
- date[4]=newval%10+'0';
- Display_List_Char(0,7,date);
- break;
- }
- case 3:
- {
- if(newval>31)
- newval=1;
- date[6]=newval/10+'0';
- date[7]=newval%10+'0';
- Display_List_Char(0,7,date);
- break;
- }
- case 4:
- {
- if(newval>7)
- newval=1;
- switch (newval)
- {
- case 1:weekdata[0]='M';weekdata[1]='o';weekdata[2]='n';break;
- case 2:weekdata[0]='T';weekdata[1]='u';weekdata[2]='e';break;
- case 3:weekdata[0]='W';weekdata[1]='e';weekdata[2]='d';break;
- case 4:weekdata[0]='T';weekdata[1]='h';weekdata[2]='u';break;
- case 5:weekdata[0]='F';weekdata[1]='r';weekdata[2]='i';break;
- case 6:weekdata[0]='S';weekdata[1]='a';weekdata[2]='t';break;
- case 7:weekdata[0]='S';weekdata[1]='u';weekdata[2]='n';break;
- }
- Display_List_Char(0,16,weekdata);
- break;
- }
- case 5:
- {
- if(newval>23)
- newval=0;
- time[0]=newval/10+'0';
- time[1]=newval%10+'0';
- Display_List_Char(1,5,time);
- break;
- }
- case 6:
- {
- if(newval>59)
- newval=0;
- time[3]=newval/10+'0';
- time[4]=newval%10+'0';
- Display_List_Char(1,5,time);
- break;
- }
- case 7:
- {
- if(newval>59)
- newval=0;
- time[6]=newval/10+'0';
- time[7]=newval%10+'0';
- Display_List_Char(1,5,time);
- break;
- }
- default:break;
- }
- }
- else
- {
- switch(s1num)
- {
- case 1:
- {
- if(newval<0)
- newval=99;
- date[0]=newval/10+'0';
- date[1]=newval%10+'0';
- Display_List_Char(0,7,date);
- break;
- }
- case 2:
- {
- if(newval==0)
- newval=12;
- date[3]=newval/10+'0';
- date[4]=newval%10+'0';
- Display_List_Char(0,7,date);
- break;
- }
- case 3:
- {
- if(newval==0)
- newval=31;
- date[6]=newval/10+'0';
- date[7]=newval%10+'0';
- Display_List_Char(0,7,date);
- break;
- }
- case 4:
- {
- if(newval==0)
- newval=7;
- switch (newval)
- {
- case 1:weekdata[0]='M';weekdata[1]='o';weekdata[2]='n';break;
- case 2:weekdata[0]='T';weekdata[1]='u';weekdata[2]='e';break;
- case 3:weekdata[0]='W';weekdata[1]='e';weekdata[2]='d';break;
- case 4:weekdata[0]='T';weekdata[1]='h';weekdata[2]='u';break;
- case 5:weekdata[0]='F';weekdata[1]='r';weekdata[2]='i';break;
- case 6:weekdata[0]='S';weekdata[1]='a';weekdata[2]='t';break;
- case 7:weekdata[0]='S';weekdata[1]='u';weekdata[2]='n';break;
- }
- Display_List_Char(0,16,weekdata);
- break;
- }
- case 5:
- {
- if(newval<0)
- newval=23;
- time[0]=newval/10+'0';
- time[1]=newval%10+'0';
- Display_List_Char(1,5,time);
- break;
- }
- case 6:
- {
- if(newval<0)
- newval=59;
- time[3]=newval/10+'0';
- time[4]=newval%10+'0';
- Display_List_Char(1,5,time);
- break;
- }
- case 7:
- {
- if(newval<0)
- newval=59;
- time[6]=newval/10+'0';
- time[7]=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[0]= second; //重新构造set_rtc_code数组
- set_rtc_code[1]= minute;
- set_rtc_code[2]= hour;
- set_rtc_code[3]= week;
- set_rtc_code[4]= day;
- set_rtc_code[5]= month;
- set_rtc_code[6]= 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;
- }
- }
- void RH(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[0]=U8RH_data_H/10+'0'; //湿度转换成字符串数组,存放于humi[]
- humi[1]=(U8RH_data_H)%10+'0';
- humi[2]=0x25;
- humi[3]='R';
- humi[4]='H';
- humi[5]='\0';
- temp[0]=U8T_data_H/10+'0'; //温度转换成字符串数组,存放于temp[]
- temp[1]=(U8T_data_H)%10+'0';
- temp[2]=0xdf;
- temp[3]='C';
- temp[4]='\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);
- }
- }
复制代码
|