如何在自己公司的网站上做宣传,网上购物网站开发报价,施工企业会计心得体会,简报格式模板1.分析原理图 由上图可以看到#xff0c;芯片的时钟引脚SCK接到了P17,数据输出输入引脚IO接到P23,复位引脚RST接到P13。
2.查阅DS1302芯片手册
具体细节还需自行翻阅手册#xff0c;我只截出重点部分 总结#xff1a;数据在上升沿写出#xff0c;下降沿读入#xff0c;…1.分析原理图 由上图可以看到芯片的时钟引脚SCK接到了P17,数据输出输入引脚IO接到P23,复位引脚RST接到P13。
2.查阅DS1302芯片手册
具体细节还需自行翻阅手册我只截出重点部分 总结数据在上升沿写出下降沿读入读时序命令字节结束的下降沿读出数据
3.代码封装库
请自行阅读芯片手册理解记忆即可
#include ds1302.hvoid DS1302_writebyte(u8 command,u8 byte)
{u8 i;RST1;for(i0;i8;i){IOcommand (0x01i); //低位在前SCK1; //提供上升沿输出数据SCK0;}for(i0;i8;i){IObyte (0x01i); //低位在前SCK1; //提供上升沿输出数据SCK0;}RST0;
}u8 DS1302_readbyte(u8 command)
{u8 i,byte0x00;RST1;command;for(i0;i8;i){IOcommand (0x01i); //低位在前SCK0; //提供上升沿输出数据SCK1;}for(i0;i8;i){SCK1; //在下降沿读入数据SCK0;if(IO) byte|(0x01i); //低位在前}RST0;IO0; //复位return byte;
}//时间数组,分别为年、月、日、时、分、秒、星期
u8 DS1302_Time[]{24,1,28,00,00,30,7};//写入初始时间
void Init_DS1302()
{RST0;SCK0; //复位DS1302_writebyte(0x8e,0x00);//写保护关//十进制转BCD码后写入DS1302_writebyte(0x8c,DS1302_Time[0]/10*16DS1302_Time[0]%10); //年DS1302_writebyte(0x88,DS1302_Time[1]/10*16DS1302_Time[1]%10); //月DS1302_writebyte(0x86,DS1302_Time[2]/10*16DS1302_Time[2]%10); //日DS1302_writebyte(0x84,DS1302_Time[3]/10*16DS1302_Time[3]%10); //时DS1302_writebyte(0x82,DS1302_Time[4]/10*16DS1302_Time[4]%10); //分DS1302_writebyte(0x80,DS1302_Time[5]/10*16DS1302_Time[5]%10); //秒DS1302_writebyte(0x8a,DS1302_Time[6]/10*16DS1302_Time[6]%10); //星期DS1302_writebyte(0x8e,0x80);
}//读取后的时间存放于数组DS1302_Time[]
void DS1302_ReadTime()
{//BCD码转十进制后读取u8 Temp;TempDS1302_readbyte(0x8c);DS1302_Time[0](Temp4)*10Temp%16;TempDS1302_readbyte(0x88);DS1302_Time[1](Temp4)*10Temp%16;TempDS1302_readbyte(0x86);DS1302_Time[2](Temp4)*10Temp%16;TempDS1302_readbyte(0x84);DS1302_Time[3](Temp4)*10Temp%16;TempDS1302_readbyte(0x82);DS1302_Time[4](Temp4)*10Temp%16;TempDS1302_readbyte(0x80);DS1302_Time[5](Temp4)*10Temp%16;TempDS1302_readbyte(0x8a);DS1302_Time[6](Temp4)*10Temp%16;
}
4.使用示例
我这里使用之前封装的数码管显示函数来显示时间
#include main.hextern u8 DS1302_Time[];//0~6:年月日时分秒星期void System_Init(void);
void Timer0_Init(void);void main()
{System_Init();Timer0_Init();Init_DS1302();while(1){Nixie_Display(1,DS1302_Time[3]/10); //时Nixie_Display(2,DS1302_Time[3]%10);Nixie_Display(3,DS1302_Time[4]/10); //分Nixie_Display(4,DS1302_Time[4]%10);Nixie_Display(5,DS1302_Time[5]/10); //秒Nixie_Display(6,DS1302_Time[5]%10);Nixie_Display(7,16); //.Nixie_Display(8,DS1302_Time[6]); //星期天}
}void Timer0_Isr() interrupt 1
{static u16 count10;if(count11000){P10!P10;Set_Leds(1,P10);DS1302_ReadTime();count10;}
}void Timer0_Init() //1毫秒12.000MHz
{AUXR 0x7F; //12T模式TMOD 0xF0; //定时器016位自动重装载TL0 0x18; //设置定时初始值TH0 0xFC;TF0 0; //清除TF0标志ET0 1; //使能定时器0中断EA 1; //开总中断TR0 1; //定时器0开始计时
}void System_Init()//系统上电初始化
{//先锁存蜂鸣器,继电器所在573输出低电平防止上电乱叫P251;P260;P271; //74HC138--Y50,else1--Y5C1,else0P040;P060; //ULN2003输入经过非门送入达林顿管低电平有效P250;P260;P270;//锁存数据//关闭所有LED灯P250;P260;P271; //74HC138--Y40,else1--Y4C1,else0P00XFF;P250;P260;P270;//锁存数据
}