//DS3231某宝买的模块,5块不到的样子。麻烦大家下载一下,不要直接复制。89c52不能用1t的单片机。
//此修正版的文件可以解决之前的word下载后不能打开的蛋疼问题。1602数据端口是P2如果需要修改,只有2个地方需要改。 #include
#define uchar unsigned char #define uint unsigned int
#define yh 0x80 //第一行的初始位置 #define er 0x80+0x40 //第二行初始位置
sbitrs=P0^7;//1602的3个端口 sbitwr=P0^6; sbit en=P0^5;
sbit SDA=P1^6; //模拟I2C数据传送位SDA 模块只使用了2个端口 sbit SCL=P1^7; //模拟I2C时钟控制位SCL //sbit INT=P3^2;
sbit key1=P3^5; //功能键,修改键这是3个按键,低电平有效,串联个4到10千欧的电阻到按键开关上,然后接地就行 sbit key2=P3^4; //上调键 sbit key3=P3^3; //下调键 //sbit RESET=P3^3;
bit ack; //应答标志位
#define DS3231_WriteAddress 0xD0 //器件写地址 #define DS3231_ReadAddress 0xD1 //器件读地址 #define DS3231_SECOND 0x00 //秒 #define DS3231_MINUTE 0x01 //分 #define DS3231_HOUR 0x02 //时 #define DS3231_WEEK 0x03 //星期 #define DS3231_DAY 0x04 //日 #define DS3231_MONTH 0x05 //月 #define DS3231_YEAR 0x06 //年 //闹铃1
#define DS3231_SALARM1ECOND 0x07 //秒 #define DS3231_ALARM1MINUTE 0x08 //分 #define DS3231_ALARM1HOUR 0x09 //时
#define DS3231_ALARM1WEEK 0x0A //星期/日 //闹铃2
#define DS3231_ALARM2MINUTE 0x0b //分 #define DS3231_ALARM2HOUR 0x0c //时
#define DS3231_ALARM2WEEK 0x0d //星期/日 #define DS3231_CONTROL 0x0e //控制寄存器
#define DS3231_STATUS 0x0f //状态寄存器 #define BSY 2 //忙
#define OSF 7 //振荡器停止标志 #define DS3231_XTAL 0x10 //晶体老化寄存器
#define DS3231_TEMPERATUREH 0x11 //温度寄存器高字节(8位) #define DS3231_TEMPERATUREL 0x12 //温度寄存器低字节(高2位)
uchar a,miao,shi,fen,ri,yue,nian,week,temp1,temp2,key1n,temp; uchar code tab1[]={\ - FRI%uchar code tab2[]={\ : : .\ /*
uchar HEX2BCD(ucharval) //B码转换为BCD码 {
uchar k; k=(val)/10*16+(val); return k; } */
ucharBCD_Decimal(ucharbcd) {
uchar Decimal; Decimal=bcd>>4;
return(Decimal=Decimal*10+(bcd&=0x0F)); }
void delayus(uint us) {
while (us--); }
void Start_I2C() {
SDA=1; //发送起始条件的数据信号 delayus(1); SCL=1;
delayus(5); //起始条件建立时间大于4.7us,延时
SDA=0; //发送起始信号
delayus(5); // 起始条件锁定时间大于4μs
SCL=0; //钳住I2C总线,准备发送或接收数据 delayus(2); }
void Stop_I2C() {
SDA=0; //发送结束条件的数据信号 delayus(1); //发送结束条件的时钟信号
SCL=1; //结束条件建立时间大于4us delayus(5);
SDA=1; //发送I2C总线结束信号 delayus(4); }
void SendByte(uchar c) {
ucharBitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) {
if((c< SDA=1; else SDA=0; delayus(1); SCL=1; 据位 delayus(5); SCL=0; } delayus(2); SDA=1; 答位 delayus(2); SCL=1; delayus(3); if(SDA==1) ack=0; else ack=1; SCL=0; delayus(2); } ucharRcvByte() //要传送的数据长度为8位 //判断发送位 //置时钟线为高,通知被控器开始接收数//保证时钟高电平周期大于4μs //8位发送完后释放数据线,准备接收应 //判断是否接收到应答信号 { ucharretc; ucharBitCnt; retc=0; SDA=1; //置数据线为输入方式 for(BitCnt=0;BitCnt<8;BitCnt++) { delayus(1); SCL=0; //置时钟线为低,准备接收数据位 delayus(5); //时钟低电平周期大于4.7μs SCL=1; //置时钟线为高使数据线上数据有效 delayus(3); retc=retc<<1; if(SDA==1) retc=retc+1; //读数据位,接收的数据位放入retc中 delayus(2); } SCL=0; delayus(2); return(retc); } void Ack_I2C(bit a) { if(a==0) SDA=0; //在此发出应答或非应答信号 else SDA=1; delayus(3); SCL=1; delayus(5); //时钟低电平周期大于4μs SCL=0; //清时钟线,钳住I2C总线以便继续接收 delayus(2); } ucharwrite_byte(ucharaddr, ucharwrite_data) { Start_I2C(); SendByte(DS3231_WriteAddress); if (ack == 0) return 0; SendByte(addr); if (ack == 0) return 0; SendByte(write_data); if (ack == 0) return 0; Stop_I2C(); delayus(10); return 1; } ucharread_current() { ucharread_data; Start_I2C(); SendByte(DS3231_ReadAddress); if(ack==0) return(0); read_data = RcvByte(); Ack_I2C(1); Stop_I2C(); return read_data; } ucharread_random(ucharrandom_addr) { Start_I2C(); SendByte(DS3231_WriteAddress); if(ack==0) return(0); SendByte(random_addr); if(ack==0) return(0);