基于51单片机的温湿度及万年历设计 课程设计 for (i=12;i<16;i++) {
write_12864dat(table4[d]); d++;
delay_50us(1); } }
void display3() {
uchar a;
if (disp[10]==0x31) a=0; if (disp[10]==0x32) a=1; if (disp[10]==0x33) a=2; if (disp[10]==0x34) a=3; if (disp[10]==0x35) a=4; if (disp[10]==0x36) a=5; if (disp[10]==0x37) a=6; write_12864com(0x88); write_12864dat(0x32); write_12864dat(0x30); write_12864dat(disp[12]); write_12864dat(disp[11]); write_12864dat(0xa3); write_12864dat(0xad); write_12864dat(disp[9]); write_12864dat(disp[8]); write_12864dat(0xa3); write_12864dat(0xad); write_12864dat(disp[7]); write_12864dat(disp[6]); write_12864dat(0x20); write_12864dat(0x20); write_12864dat(0xa2); write_12864dat(0xe5+a); }
void display4() {
write_12864com(0x98); write_12864dat(0x20); write_12864dat(0x20); write_12864dat(disp[5]); write_12864dat(disp[4]); write_12864dat(0xa1); write_12864dat(0xc3);
//显示日期
//2 //0
//显示时间
29
基于51单片机的温湿度及万年历设计 课程设计 write_12864dat(disp[3]); write_12864dat(disp[2]); write_12864dat(0xa1); write_12864dat(0xc3); write_12864dat(disp[1]); write_12864dat(disp[0]); write_12864dat(0x20); write_12864dat(0x20); write_12864dat(0x20); write_12864dat(0x20); }
/****************DHT11程序****************/ void Delay (uint z) {
uchar x,y;
for(x=z;x>0;x--)
For(y=110;y>0;y--); }
void delay_10us() {
uchar i; i--; i--; i--; i--; i--; i--; }
void jieshou (void) //数据0 1确认 {
uchar i; zijie=0;
for(i=0;i<8;i++) { flag=2;
while((!SJ)&&flag++); //1bit是否结束 delay_10us(); delay_10us(); delay_10us(); if(SJ) {
wei=1; // 超过28us依然为高电平 表示为1 flag=2;
30
基于51单片机的温湿度及万年历设计 课程设计 while((SJ)&&flag++); } else
wei=0;
zijie<<=1; zijie|=wei; } }
void read (void) {
SJ=0;
Delay(34); //主机拉低高于18ms SJ=1;
delay_10us(); delay_10us(); delay_10us(); delay_10us();
SJ=1; //主机设为输入 判断从机响应信号 if(!SJ) { flag=2;
while((!SJ)&&flag++);//判断从机是否发出 80us 的低电平响应号是否结束 flag=2;
while((SJ)&&flag++); //判断从机是否发出 80us 如发据接收状态 jieshou(); //数据接收状态 sdzs=zijie; //湿度整数8位 jieshou();
sdxs=zijie;//湿度小数8位 jieshou();
wdzs=zijie; //温度整数8位 jieshou();
wdxs=zijie; //温度小数8位 jieshou();
jiaoyan=zijie; //校验位 SJ=1;
JY=(sdzs+sdxs+wdzs+wdxs);
if(JY==jiaoyan) //数据校验 正确执行 { SZ=sdzs; SX=sdxs; WZ=wdzs; WX=wdxs; //JY=jiaoyan; }
31
基于51单片机的温湿度及万年历设计 课程设计 } table3[0]=0x3a;
table3[1]=(char)(0x30+WZ/10); table3[2]=(char)(0x30+WZ); table3[3]=0x63;
table4[0]=0x3a;
table4[1]=(char)(0x30+SZ/10); table4[2]=(char)(0x30+SZ); table4[3]=0x25; }
/***************DS1302程序*********************/
void write_1302_byte(uchar dat) //写字节 {
uchar i;
for (i=0;i<8;i++) { sck=0;
io=dat&0x01; dat>>=1; sck=1; } }
void write_1302(uchar add,uchar dat) { rst=0; _nop_(); sck=0; _nop_(); rst=1; _nop_();
write_1302_byte(add); write_1302_byte(dat); rst=0; _nop_(); io=1; sck=1; }
uchar read_1302(uchar add) { uchar i,value; rst=0; _nop_(); sck=0; _nop_();
32
基于51单片机的温湿度及万年历设计 课程设计 rst=1; _nop_();
write_1302_byte(add); for (i=0;i<8;i++) {
value>>=1; sck=0; if(io)
value=value|0x80; sck=1; } rst=0; _nop_(); sck=0; _nop_(); sck=1; io=1;
return value; }
void set_rct(void)//设置时间 { uchar i;
for(i=0;i<7;i++) //10进制转换16进制 {
t ime_data1[i]=time_data[i]+time_data[i]/10*16; }
write_1302(0x8e,0x00);//去除写保护 for(i=0;i<7;i++) {
write_1302(write_add[i],time_data1[i]); }
write_1302(0x8e,0x80);//添加写保护 }
void read_rct(void) //对时间 { uchar i;
for(i=0;i<7;i++) {
time_data2[i]=read_1302(read_add[i]); //此时数组里面是从里面读出来的时间(16进制的) } }
void time_pros(void) //处理函数 {
disp[0]=(char)(time_data2[6]+0x30); //6表示秒 disp[1]=(char)(time_data2[6]/16+0x30);
disp[2]=(char)(time_data2[5]+0x30); //5表示分
33