当前位置:文档之家› ds1302数码管显示应用

ds1302数码管显示应用

DS1302应用刚学单片机,好多好奇,所以想做个简单的时钟。

下面是PROTEUS仿真电路和电路图,简单易懂。

文笔不好,说了多余。

下面是程序。

#include<reg52.h>#include<intrins.h>#include<ds1302.h>#define uint unsigned int#define uchar unsigned char#define BCDTUAN(str) (str/10*16+str%10) //定义宏,将要写入DS1302的时间转化为BCD码#define Write_Sec 0x80#define Write_Min 0x82#define Write_Hou 0x84#define Write_Dat 0x86#define Write_Mon 0x88#define Write_day 0x8a#define Write_Yea 0x8c#define Write_WP 0x8e //写保护位#define Write_TCR 0x90#define Read_Sec 0x81#define Read_Min 0x83#define Read_Hou 0x85#define Read_Dat0x87#define Read_Mon 0x89#define Read_Day 0x8b#define Read_Yea 0x8d#define CLK_BurstW 0xbf //时钟突发模式写#define CLK_BurstR 0xbf //时钟突发模式读#define Write_RAM_Begin 0xc0 //RAM第一个字节写指令#define Read_RAM_Begin 0xc1 //RAM第一个字节读指令#define RAM_BurstW 0xfe //突发模式写RAM#define RAM_BurstR 0xff //突发模式读RAMsbit _74hc154_A = P1^0;sbit _74hc154_B = P1^1;sbit _74hc154_C = P1^2;sbit _74hc154_D = P1^3;sbit CE =P1^6;sbit SCLK=P1^5;sbit IO =P1^4;uchar code scan[][4]={{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},{0,1,0,0},{0,1,0,1},{0,1,1,0},{0,1,1,1},{1,0,0,0},{1,0,0,1},{1,0,1,0},{1,0,1,1},{1,1,0,0},{1,1,0,1},{1,1,1,0},{1,1,1,1}};uchar scanbuff[]={0,0,0,0,0,0,0,0,0,0,0,0};uchar code dispdate[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void WriteDS1302(void); //向DS1302写入时间。

void ReadDS1302(void); //读取DS1302中的年,月,日,星期几,小时,分钟和秒.void SendCmd(unsigned char cmd); //传送地址void delayus(unsigned char tt);void delay(uchar z){uchar x,y;for(x=z;x>0;x--)for(y=120;y>0;y--);}void _74hc154(uchar k) //位扫描设定{_74hc154_A=scan[k][0];_74hc154_B=scan[k][1];_74hc154_C=scan[k][2];_74hc154_D=scan[k][3];}void main(){uchar i;while(1){WriteDS1302();ReadDS1302() ;for(i=0;i<12;i++){_74hc154(i); //位扫描P0=~dispdate[scanbuff[i]];//数据送P0口delay(10);}}}void WriteDS1302(void){WriteByte(Write_Yea,BCDTUAN(13)); //写13年}//读取DS1302中的年,月,日,星期几,小时,分钟和秒.void ReadDS1302(void){unsigned char buff;//将读取的数据送入缓存数组,住输出数据为16进制buff=ReadByte(Read_Yea); //年scanbuff[10]=buff/16; //十位scanbuff[11]=buff%16; //个位buff=ReadByte(Read_Mon); //月scanbuff[6]=buff/16; //十位scanbuff[7]=buff%16; //个位buff=ReadByte(Read_Dat); //日scanbuff[8]=buff/16; //十位scanbuff[9]=buff%16; //个位buff=ReadByte(Read_Hou); //时scanbuff[0]=buff/16; //十位scanbuff[1]=buff%16; //个位buff=ReadByte(Read_Min); //分scanbuff[2]=buff/16; //十位scanbuff[3]=buff%16; //个位buff=ReadByte(Read_Sec); //秒scanbuff[4]=buff/16; //十位scanbuff[5]=buff%16; //个位}//读取地址RCmd的时间/数据unsigned char ReadByte(unsigned char RCmd){unsigned char valu=0x00,temp;CE=0; //初使化SCLK=0; //初使化,并为rise edge做准备CE=1; //初使化,传输开始。

The SCLK must be low when CE is driven to high level.SendCmd(RCmd); //传送地址for(temp=0;temp<8;temp++){valu>>=1;SCLK=0;if(IO==1)valu|=0x80;delayus(1);SCLK=1;delayus(1);}CE=0; //结束传输return valu;}//向WCmd地址写入时间/数据若写入时间,则时间用#define BCD(time) (time/10*16+time%10)处理.void WriteByte(unsigned char WCmd,unsigned char valu){unsigned char temp;CE=0;SCLK=0; //初使化,并为rise edge做准备CE=1; //初使化,传输开始。

SendCmd(WCmd);for(temp=0;temp<8;temp++){SCLK=0;IO=valu&0x01;delayus(2);SCLK=1;delayus(2);valu>>=1;}CE=0; //结束传输}//突发模式读RAM num个字节void BurstRead_CLK(unsigned char *ptr){unsigned char temp,temp2,valu;CE=0;SCLK=0;CE=1;SendCmd(RAM_BurstR); //突发模式读取CLK开始for(temp2=0;temp2<8;temp2++){for(temp=0;temp<8;temp++) //读取到的分别是秒,分,时,日,月,星期几,年,写保护位,注意,TCR是不可以突发模式的。

{valu>>=1;SCLK=0;if(IO==1)valu|=0x80;delayus(2);SCLK=1;delayus(2);}*ptr=valu;ptr++;}CE=0; //结束突发模式读}void BurstRead_RAM(unsigned char *ptr,unsigned char num){unsigned char temp1,temp2,valu;CE=0;SCLK=0;CE=1;SendCmd(CLK_BurstR); //突发模式读取CLK开始for(temp2=0;temp2<num;temp2++){for(temp1=0;temp1<8;temp1++) //读取到的分别是秒,分,时,日,月,星期几,年,写保护位,注意,TCR是不可以突发模式的。

{valu>>=1;SCLK=0;if(IO==1)valu|=0x80;delayus(2);SCLK=1;delayus(2);}*ptr=valu;ptr++;}CE=0; //结束突发模式读}//突发模式写RAMvoid BurstWrite_RAM(unsigned char Data[]){unsigned char size=sizeof(Data),temp1,temp2,valu;if(size>31)size=31;CE=0;SCLK=0;CE=1;SendCmd(RAM_BurstW);for(temp2=0;temp2<size;temp2++){valu=Data[temp2];for(temp1=0;temp1<8;temp1++){SCLK=0;IO=valu&0x01;delayus(2);SCLK=1;delayus(2);valu>>=1;}}CE=0;}void BurstWrite_CLK(unsigned char Time[]){unsigned char size=sizeof(Time),temp1,temp2,valu;if(size>8)size=8;CE=0;SCLK=0;CE=1;SendCmd(CLK_BurstW);for(temp2=0;temp2<size;temp2++){valu=Time[temp2];for(temp1=0;temp1<8;temp1++){SCLK=0;IO=valu&0x01;delayus(2);SCLK=1;delayus(2);valu>>=1;}}CE=0;}//传送指令void SendCmd(unsigned char cmd){unsigned char temp;for(temp=0;temp<8;temp++){SCLK=0; //为下一个上升沿做准备IO=cmd&0x01;SCLK=1;delayus(1);cmd>>=1;}}void delayus(unsigned char tt) //tt=2,延时为2us{tt--;}这个是ds1302.h头文件内容,建个txt文档将下面内容复制进去,改后缀为.h即可添加了#ifndef DS1302_H#define DS1302_Hextern unsigned char ReadByte(unsigned char RCmd);extern void WriteByte(unsigned char WCmd,unsigned char valu);extern void BurstRead_CLK(unsigned char *ptr);extern void BurstRead_RAM(unsigned char *ptr,unsigned char num);extern void BurstWrite_CLK(unsigned char Time[]);extern void BurstWrite_RAM(unsigned char Data[]);#endif。

相关主题