- /************************************************
- 跳線設置:默認跳線位
- 晶振:11.0592M
- 硬件結構框架:
- 1,四位八段數碼管
- 2,MCU STC89C52
- 顯示效果:
- 1,數碼管上顯示:時,分
- 2,數碼管分位的小數點閃爍表示秒
- 3,時間初始值10.59.50秒
- 相關知識點:
- 1,DS1302實時時鐘的操作
- ************************************************/
- #include"AT89x52.h"
- #define uchar unsigned char
- #define unint unsigned int
- sbit T_CLK=P1^0; /* 實時時鐘的時鐘線引腳*/
- sbit T_IO=P1^1; /* 實時時鐘的數據線*/
- sbit T_RST=P2^0; /* 實時時鐘的復位線引腳*/
- sbit DUAN=P2^6; //74HC573的LE端 LED的段選端
- sbit WEI=P2^7; //74HC573的LE端 LED的位選端
- unint a[6];//={0,0,0,0,0,0}; /*位段的數字*/
- uchar code ledk[]=
- {
- 0x3f,/*0*/
- 0x06,/*1*/
- 0x5b,/*2*/
- 0x4f,/*3*/
- 0x66,/*4*/
- 0x6d,/*5*/
- 0x7d,/*6*/
- 0x07,/*7*/
- 0x7f,/*8*/
- 0x6f,/*9*/
- 0x40,}; /*-*/
- unint ucCurtime[7]={50,59,10,6,4,1,9}; // 秒 分 時 日 月 星期 年
- unint temp;
- uchar jg1,jg2,temp1;
- void delay() //延時
- {
- uchar m,n;
- for(m=10;m>0;m--)
- for(n=100;n>0;n--);
- }
- void wei_1(uchar wei) //鎖存器573的數碼管位控制
- {
- WEI=1;
- P0=wei;
- WEI=0;
- }
- void duan_1(uchar duan) //鎖存器573的數碼管段控制
- {
- unint i;
- DUAN=1;
- P0=ledk[duan];
- DUAN=0;
- for(i=200;i>0;i--);
- }
- void v_RTInputByte(uchar ucDa) //寫
- {
- uchar i;
- ACC=ucDa;
- for(i=8;i>0;i--)
- {
- if((ACC&0x01)==1)
- //T_IO=ACC0; /* 相當于匯編中的RRC */
- T_IO=1;
- else T_IO=0;//if((ACC&0x01)==0)
- T_CLK=1;
- T_CLK=0;
- ACC=ACC>>1;
- }
- }
- uchar uc_RTOutputByte(void) //讀
- {
- uchar i,ACC;
- ACC=0;
- for(i=0;i<8;i++)
- {
- ACC=ACC>>1; /*相當于匯編中的RRC*/
- if(T_IO==1)
- ACC=ACC|0x80;
- T_CLK=1;
- T_CLK=0;
- }
- return(ACC);
- }
- void v_W1302(uchar ucAddr,uchar ucDa) //指定地址寫數據
- {
- T_RST=0;
- T_CLK=0;
- T_RST=1;
- v_RTInputByte(ucAddr); /*地址,命令*/
- v_RTInputByte(ucDa); /*寫1Byte數據*/
- T_CLK=1;
- T_RST=0;
- }
- uchar uc_R1302(uchar ucAddr) //指定地址讀數據
- {
- unsigned char ucDa,k; //BCD轉換成16進制
- k=0x00;
- T_RST=0;
- T_CLK=0;
- T_RST=1;
- v_RTInputByte(ucAddr); /*地址,命令*/
- ucDa=uc_RTOutputByte(); /*讀取1Byte數據*/
- T_CLK=1;
- T_RST=0;
- k=ucDa/16;
- ucDa=ucDa%16;
- ucDa=ucDa+k*10;
- return(ucDa);
- }
- void v_Set1302()//uchar *pSecDa) 設置初始時間值
- {
- uchar i,j;
- uchar ucAddr=0x80; //秒寫地址
- v_W1302(0x8e,0x00); /* 控制命令,WP=0,寫操作?*/
- for(i=0;i<7;i++) //連續寫入7個時間
- {
- j=ucCurtime[i]; //代入初始時間
- v_W1302(ucAddr,j); /* 秒 分 時 日 月 星期 年 */
- ucAddr +=2; //地址+2
- }
- v_W1302(0x8e,0x80); /* 控制命令,WP=1,寫保護?*/
- }
- void v_Get1302() //記錄時間
- {
- uchar i;
- uchar ucAddr=0x81; //秒讀地址
- for (i=0;i<7;i++) //連續讀數據
- {
- ucCurtime[i]=uc_R1302(ucAddr);/*格式為: 秒 分 時 日 月 星期 年 */
- ucAddr +=2;
- }
- }
- void t2_10() //數碼管段數字顯示內容
- {
- unint k;
- a[5]=temp1/10;
- a[4]=temp1%10;
- a[3]=temp/1000;
- k=temp%1000;
- a[2]=k/100;
- k=k%100;
- a[1]=k/10;
- a[0]=k%10;
- }
- void display2() //顯示
- {
- t2_10();
- wei_1(0x7f); /*秒*/
- duan_1(a[0]);
- wei_1(0xbf);
- duan_1(a[1]);
- wei_1(0xdf); /*-*/
- duan_1(10);
- wei_1(0xef); /*分*/
- duan_1(a[2]);
- wei_1(0xf7);
- duan_1(a[3]);
- wei_1(0xfb); /*-*/
- duan_1(10);
- wei_1(0xfd); /*時*/
- duan_1(a[4]);
- wei_1(0xfe);
- duan_1(a[5]);
- wei_1(0xff); /*滅*/
- }
- void main2(void)
- {
- v_Get1302(); //記錄時間
- temp1=ucCurtime[2]; //時
- temp=ucCurtime[1]*100+ucCurtime[0]; //分+秒
- display2(); //顯示
- }
- void main()
- {
- unint i,k;
- for(i=0;i<7;i++) //將10進制轉換成16進制
- {
- k=ucCurtime[i]/10;
- ucCurtime[i]=ucCurtime[i]%10;
- ucCurtime[i]=ucCurtime[i]+16*k;
- }
- v_Set1302(); //時間初值
- while(1)main2();
- }
復制代碼 |