ds1302 c52 4位数码管时钟年月日周可调 proteus仿真.rar
(87.45 KB, 下载次数: 241)
- #include <at89x52.h>
- #include <DS1302.h>
- #define uchar unsigned char
- /********************************************************/
- unsigned char code shumg[]={
- 0xc0,0xf9,0xa4,0xb0,
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0xff};
- /********************************************************/
- sbit led1=P3^4; //时间指示灯
- sbit led2=P3^5; //年月指示灯
- sbit led3=P3^7; //日周指示灯
- sbit led=P1^7; //冒号闪烁
- char miao_num; //冒号标志
- /********************************************************/
- unsigned char Time[]={0,0,0,0};//用来储存,时间
- unsigned char Dime[]={0,0,0,0};//用来储存,年月
- unsigned char Bime[]={0,0,0,0};//用来储存,日期
- unsigned char flag; //键盘入口
- /********************************************************/
- SYSTEMTIME time1;
- /********************************************************/
- void keyscan(); //按键扫描程序
- void mao_hao(); //冒号声明
- /********************************************************/
- void delay(unsigned char i) //延时子程序
- {
- unsigned char j;
- while((i--)!=0)
- {
- for(j=123;j>0;j--);
- }
- }
- /********************************************************/
- void t0_init() //定时50ms一个中断
- {
- TMOD=0x11; //总中断初始化
- TH0=0x3c; //定时50ms一个中断
- TL0=0xb0; //定时50ms一个中断
- EA=1; //开启总中断
- ET0=1;
- TR0=1; //开启定时器0
- }
- /********************************************************/
- unsigned char button_time(n,x,y) //时钟调整子程序
- unsigned char n,x,y;
- {
- if(P1_5==0) //加
- {
- delay(50);
- if(P1_5==0)
- {
- n++;
- if(n==x)
- n=0;
- while(P1_5==0);
- }
- }
- /********************************************************/
- if(P1_6==0) //减
- {
- delay(50);
- if(P1_6==0)
- {
- if(n==0)
- n=y;
- else
- n--;
- while(P1_6==0);
- }
- }
- return n; //函数返回
- }
- /********************************************************/
- void display(shi10,shi1,fen10,fen1)//显示子程序
- {
- P2=0xfe;
- P0=shumg[shi10]; //显示时的十位
- delay(1); //延时
- P0=0xff; //消隐
- P2=0xff; //消隐
-
- P2=0xfd;
- P0=shumg[shi1]; //显示时的个位
- delay(1); //延时
- P2=0xff; //消隐
- P0=0xff; //消隐
-
- P2=0xfb;
- P0=shumg[fen10]; //显示分的十位
- delay(1); //延时
- P2=0xff; //消隐
- P0=0xff; //消隐
-
- P2=0xf7;
- P0=shumg[fen1]; //显示分的个位
- delay(1); //延时
- P2=0xff; //消隐
- P0=0xff; //消隐
- }
- /********************************************************/
- void main() //主程序
- {
- Initial_DS1302(); //初始化DS1302这个时钟芯片,
- t0_init(); //中断初始化
- while(1) //大循环
- {
- mao_hao(); //冒号初始化
- keyscan(); //键盘初始化
- DS1302_GetTime(&time1); //读取时间参数
-
- Bime[3]=(time1.Week)%10; //把时的个位数据存入Bime[3]
- Bime[2]=(time1.Week)/10; //把时的个位数据存入Bime[2]
- Bime[1]=(time1.Day)%10; //把时的个位数据存入Bime[1]
- Bime[0]=(time1.Day)/10; //把时的个位数据存入Bime[0]
-
- Dime[3]=(time1.Month)%10; //把时的个位数据存入Dime[3]
- Dime[2]=(time1.Month)/10; //把时的个位数据存入Dime[2]
- Dime[1]=(time1.Year)%10; //把时的个位数据存入Dime[1]
- Dime[0]=(time1.Year)/10; //把时的个位数据存入Dime[0]
-
- Time[3]=(time1.Minute)%10; //把分的个位数据存入Time[3]
- Time[2]=(time1.Minute)/10; //把分的十位数据存入Time[2]
- Time[1]=(time1.Hour)%10; //把时的个位数据存入Time[1]
- Time[0]=(time1.Hour)/10; //把时的十位数据存入Time[0]
- }
- }
- /*******************************************************/
- void keyscan() //按键扫描程序
- {
- if(P1_3==0) //切换程序
- {
- delay(50);
- if(P1_3==0)
- {
- TR0=0; //有按键按下关闭定时器0
- miao_num=0; //冒号常亮
- flag++;
- if(flag>2) //翻页年月日周按两次后启动定时器
- {
- flag=0;
- TR0=1; //启动定时器0
- }
- }
- while(P1_3==0);
- }
- /*******************************************************/
- if(P1_4==0) //设置程序
- {
- delay(50);
- if(P1_4==0)
- {
- TR0=0; //有按键按下关闭定时器0
- miao_num=0; //冒号常亮
- flag++;
- if(flag>2) //按两次后启动定时器
- {
- TR0=1; //启动定时器0
- }
- if(flag>4) //按四次后关闭定时器
- {
- TR0=0; //关闭定时器0
- miao_num=0; //冒号常亮
- }
- if(flag>8) //显示多少位和翻页按八次启动定时器
- {
- flag=0;
- TR0=1; //启动定时器0
- }
- }
- while(P1_4==0);
- }
- switch(flag)
- {
- /*******************************************************/
-
- case 0:display(Time[0],Time[1],Time[2],Time[3]); //调用子函数display,把存入数组time的数据给显示出来
- led1=0;
- led3=1;
- break;
- case 1:display(Dime[0],Dime[1],Dime[2],Dime[3]); //调用子函数display,把存入数组Dime的数据给显示出来
- led1=1;
- led2=0;
- break;
- case 2:display(Bime[0],Bime[1],Bime[2],Bime[3]); //调用子函数display,把存入数组Bime的数据给显示出来
- led2=1;
- led3=0;
- break;
- /*******************************************************/
- case 3:time1.Hour=button_time(time1.Hour,24,23); //调整时
- DS1302_SetTime(0x84,time1.Hour);
- display(Time[0],Time[1],10,10);
- led1=0;
- led3=1;
- break;
- case 4:time1.Minute=button_time(time1.Minute,60,59); //调整分
- DS1302_SetTime(0x82,time1.Minute);
- display(10,10,Time[2],Time[3]);
- led1=0;
- led3=1;
- break;
- /*******************************************************/
-
- case 5:time1.Year=button_time(time1.Year,100,99); //调整年
- DS1302_SetTime(0x8c,time1.Year);
- display(Dime[0],Dime[1],10,10);
- led1=1;
- led2=0;
- break;
-
- case 6:time1.Month=button_time(time1.Month,13,12); //调整月
- DS1302_SetTime(0x88,time1.Month);
- display(10,10,Dime[2],Dime[3]);
- led1=1;
- led2=0;
- break;
- /********************************************************/
-
- case 7:time1.Day=button_time(time1.Day,32,31); //调整日
- DS1302_SetTime(0x86,time1.Day);
- display(Bime[0],Bime[1],10,10);
- led2=1;
- led3=0;
- break;
-
- case 8:time1.Week=button_time(time1.Week,8,7); //调整周
- DS1302_SetTime(0x8a,time1.Week);
- display(10,10,Bime[2],Bime[3]);
- led2=1;
- led3=0;
- break;
- }
- }
- /*******************************************************/
- void t0_timer() interrupt 1 //冒号中断赋值
- {
- TH0=0x3c;
- TL0=0xb0;
- miao_num++;
- }
- /*******************************************************/
- void mao_hao() //冒号子程序
- {
- if(miao_num>=20)
- {
- miao_num=0;
- }
- if(miao_num<10)
- led=0;
- if(miao_num>=10)
- led=1;
- }
复制代码
|