陕西理工学院毕业设计
45 46 47 44 40 43 07 15 09 16 19 0d 0c 18 5e 08 1c 5a 42 52 4a
*******************************************/
/***********100us的延时函数***12M晶振**************/ void delay_100us(uchar z) { //12M uchar x,y;
for(x=0;x /*************写一个数据到对应的地址里***************/ void write_ds1302(uchar add,uchar dat) { rst = 1; //把复位线拿高 for(i=0;i<8;i++) { //低位在前 clk = 0; //时钟线拿低开始写数据 io = add & 0x01; add >>= 1; //把地址右移一位 clk = 1; //时钟线拿高 } for(i=0;i<8;i++) { clk = 0; //时钟线拿低开始写数据 io = dat & 0x01; dat >>= 1; //把数据右移一位 clk = 1; //时钟线拿高 } rst = 0; //复位线合低 clk = 0;io = 0; } /*************从对应的地址读一个数据出来***************/ uchar read_ds1302(uchar add) { uchar value,i;rst = 1; //把复位线拿高 for(i=0;i<8;i++) { //低位在前 clk = 0; //时钟线拿低开始写数据 io = add & 0x01; add >>= 1; //把地址右移一位 clk = 1; //时钟线拿高 第 40 页 共 66页 陕西理工学院毕业设计 } for(i=0;i<8;i++) { clk = 0; //时钟线拿低开始读数据 value >>= 1; if(io == 1) value |= 0x80; clk = 1; //时钟线拿高 } rst = 0; //复位线合低 clk = 0; io = 0; return value; //返回读出来的数据 } /*************把要的时间 年月日 都读出来***************/ void read_time() { miao = read_ds1302(read_add[0]); //读秒 fen = read_ds1302(read_add[1]); //读分 shi = read_ds1302(read_add[2]); //读时 ri = read_ds1302(read_add[3]); //读日 yue = read_ds1302(read_add[4]); //读月 nian = read_ds1302(read_add[5]); //读年 week = read_ds1302(read_add[6]); //读星期 } /*************把要写的时间 年月日 都写入ds1302里***************/ void write_time() { write_ds1302(0x8e,0x00); //打开写保护 write_ds1302(write_add[0],miao); //写秒 write_ds1302(write_add[1],fen); //写分 write_ds1302(write_add[2],shi); //写时 write_ds1302(write_add[3],ri); //写日 write_ds1302(write_add[4],yue); //写月 write_ds1302(write_add[5],nian); //写星期 write_ds1302(write_add[6],week); //写年 write_ds1302(0x8e,0x80); //关闭写保护 } /*************把数据保存到ds1302 RAM中**0-31*************/ void write_ds1302ram(uchar add,uchar dat) { add <<= 1; //地址是从第二位开始的 add &= 0xfe; //把最低位清零 是写的命令 add |= 0xc0; //地址最高两位为 1 write_ds1302(0x8e,0x00); write_ds1302(add,dat); 第 41 页 共 66页 陕西理工学院毕业设计 write_ds1302(0x8e,0x80); } /*************把数据从ds1302 RAM读出来**0-31*************/ uchar read_ds1302ram(uchar add) { add <<= 1; //地址是从第二位开始的 add |= 0x01; //把最高位置1 是读命令 add |= 0xc0; //地址最高两位为 1 return(read_ds1302(add)); } /*************初始化ds1302时间***************/ void init_ds1302() { uchar i; rst = 0; //第一次读写数据时要把IO品拿低 clk = 0; io = 0; i = read_ds1302ram(30); if(i != 3) { i = 3; write_ds1302ram(30,i); //4050 4100 3080 write_ds1302(0x8e,0x00); //打开写保护 for(i=0;i<7;i++) write_ds1302(write_add[i],init_ds[i]); //把最高位值0 允许ds1302工作 write_ds1302(0x8e,0x80); //关写保护 } read_time(); //读时间 if(miao >= 0x60) { write_ds1302(0x8e,0x00); //打开写保护 write_ds1302(write_add[0],init_ds[0]); //把最高位值0 允许ds1302工作 write_ds1302(0x8e,0x80); //关写保护 } } /**********************设置ds1302时间函数**********************/ void set_ds1302time(uchar num,uchar *shi,uchar dat) //调时 { if(num == 1) { *shi+=0x01; if((*shi & 0x0f) >= 0x0a) *shi = (*shi & 0xf0) + 0x10; 第 42 页 共 66页 陕西理工学院毕业设计 if(*shi >= dat) *shi = 0; } else { if(*shi == 0x00) *shi = dat; if((*shi & 0x0f) == 0x00) *shi = (*shi | 0x0a) - 0x10; *shi -=0x01 ; } } /******************把数据保存到DS1302RAM中******************/ void write_eeprom() { write_ds1302ram(1, flag_zd_sd); write_ds1302ram(2, k_shi); write_ds1302ram(3, k_fen); write_ds1302ram(4, g_shi); write_ds1302ram(5, g_fen); write_ds1302ram(6, t_high); write_ds1302ram(7, guanxian_set); write_ds1302ram(8, bjdj_value); write_ds1302ram(10, a_a); } /******************把数据从DS1302RAM中读出来*****************/ void read_eeprom() { flag_zd_sd = read_ds1302ram(1); k_shi = read_ds1302ram(2); k_fen = read_ds1302ram(3); g_shi = read_ds1302ram(4); g_fen = read_ds1302ram(5); t_high = read_ds1302ram(6); guanxian_set = read_ds1302ram(7); bjdj_value = read_ds1302ram(8); a_a = read_ds1302ram(10); } /**************开机自检DS1302RAM初始化*****************/ void init_eeprom() { read_eeprom(); //先读 if(a_a != 3) //新的单片机初始单片机内问eeprom { 第 43 页 共 66页 陕西理工学院毕业设计 flag_zd_sd = 0; k_shi = 0x8; k_fen = 0x10; g_shi = 0x15; g_fen = 0x30; t_high = 50; guanxian_set = 40; bjdj_value = 0; a_a = 3; write_eeprom(); //保存数据 } } /******************1ms 延时函数*******************/ void delay_1ms(uint q) { uint i,j; for(i=0;i for(j=0;j<120;j++); } /***********************延时函数************************/ void delay_uint(uint q) { while(q--); } /***********************lcd1602写命令函数************************/ void write_com(uchar com) { e=0; rs=0; rw=0; P0=com; delay_uint(3); e=1; delay_uint(25); e=0; } /***********************lcd1602写数据函数************************/ void write_data(uchar dat) { e=0; rs=1; rw=0; P0=dat; delay_uint(3); 第 44 页 共 66页