资源描述:
《DS1302读写程序》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、/*日期:2010年10月10日文件名:DS1302功能:第三步,实现单片机对DS1302的读写,将时间信息显示在数码管上,断电后仍能正常计时*/unsignedcharrec_time[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};//定义一个数组存储秒,分,时,日,月,周,年unsignedcharled[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//定义数码管的0~9的段码//对DS1320的三个和单片机的接口进行字符常量定义#define SCLK PORTC0_bit#define IO
2、 PORTC1_bit#define RST PORTC2_bit//初始化和DS1302连接的三个端口voidds1302_init(){ DDRC
3、=0x07;//设置PC0,1,2为输出 SCLK=0; //设置SCLK初始值为0 IO=1; //设置IO初始值为1 RST=0; //设置RST初始值为0}//写入一个字节voidds1302_write_byte(unsignedchardat){ unsignedchari; for(i=0;i<8;i++) { SCLK=0; //时钟信号拉低 if(dat&0x01) IO=1; //判断地址字节的最低位
4、,1位为1则拉高IO else IO=0;//1位为0,则输入数据为0,拉低IO delay_us(1); SCLK=1;//时钟信号拉高,产生上升沿 delay_us(1); dat>>=1; //字节右移一位 }}//读出一个字节unsignedchards1302_read_byte(){ unsignedchari,dat=0; DDC1_bit=0; //设置IO的方向为输入 PORTC1_bit=0; //设置IO为高阻态 for(i=0;i<8;i++) { dat>>=1;//数据右移一位 SCLK=1;//设置SCLK为高电平 delay_us
5、(1); SCLK=0; //设置SCLK为低电平,产生下降沿 delay_us(1); if(PINC1_bit==1) //如果读出的数据为1 dat
6、=0x80; //数据位1,则写入1 } DDC1_bit=1;//将IO口的方向改为输出 returndat;//返回得到的数据}//向DS1302写入一个地址和数据voidds1302_write(unsignedcharadd,unsignedchardat){ RST=0; //将RST拉低 SCLK=0; //将SCLK拉低 RST=1; //将RST拉高 ds1302_write_byte(a
7、dd);//写入地址字节 ds1302_write_byte(dat);//写入数据 SCLK=1; //将SCLK拉高 RST=0; //将RST拉低}unsignedchards1302_read(unsignedcharadd){ unsignedchar shuju; //定义一个变量,存储返回的数据 RST=0; //将RST拉低 SCLK=0; //将SCLK拉低 RST=1; //将RST拉高 ds1302_write_byte(add); //写入地址字节 shuju=ds1302_read_byte();//读取该地址字节的数据 SCLK=1; //
8、将SCLK拉高 RST=0; //将RST拉低 returnshuju; //返回读到的数据}//数码管显示时间的程序voidds1302_display(){ unsignedcharj; unsignedchartime[13]; //定义一个数组存放时间信息的每一位 unsignedcharposition[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//设置位选信号数组 time[0]=rec_time[0]&0x0f; //提取秒的个位 time[1]=(rec_time[0]&0x70)>>4;//提取秒的十位 time[
9、2]=rec_time[1]&0x0f; //提取分的个位 time[3]=(rec_time[1]&0x70)>>4;//提取分的十位 time[4]=rec_time[2]&0x0f; //提取小时的个位 time[5]=(rec_time[2]&0x30)>>4;//提取小时的十位 time[6]=rec_time[3]&0x0f; //提取日的个位 time[7]=(rec_time