手里有幾個買東西送的充電寶,電池都老化了,于是就用充電寶的外殼做了個電子鐘。使用15單片機加DS1302,用單片機推挽直接驅動數碼管。只用了不幾個元件。
制作出來的實物圖如下:
單片機源程序如下:
- ///***使用15W408AS單片機,使用IO口直接驅動共陽數碼管顯示
- #include <STC15F2K.h>
- #include <DS1302.h>
- #define uchar unsigned char
- /********************************************************/
- unsigned char code shumg[]={
- 0x3F,/*0*/
- 0x06,/*1*/
- 0x5B,/*2*/
- 0x4F,/*3*/
- 0x66,/*4*/
- 0x6D,/*5*/
- 0x7D,/*6*/
- 0x07,/*7*/
- 0x7F,/*8*/
- 0x6F,/*9*/
- 0x00};
- /********************************************************/
- sbit LED1=P1^5; //時間指示燈
- sbit LED2=P1^6; //年月指示燈
- sbit LED3=P1^7; //日周指示燈
- sbit LED4=P1^0; //冒號閃爍
- sbit S1=P3^0; //定義按鍵
- sbit S2=P3^1;
- sbit S3=P3^2; //切換
- sbit S4=P3^3;
- sbit DIG1=P3^7; //數碼管位選
- sbit DIG2=P3^6;
- sbit DIG3=P3^5;
- sbit DIG4=P3^4;
- 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(S1==0) //加
- {
- delay(50);
- if(S1==0)
- {
- n++;
- if(n==x)
- n=0;
- while(S1==0);
- }
- }
- /********************************************************/
- if(S2==0) //減
- {
- delay(50);
- if(S2==0)
- {
- if(n==0)
- n=y;
- else
- n--;
- while(S2==0);
- }
- }
- return n; //函數返回
- }
- /********************************************************/
- void display(shi10,shi1,fen10,fen1)//顯示子程序
- { P2M1 = 0x00; P2M0 = 0xFF; //設置P3.4-7推挽模式,就不用數碼管驅動了
- P1M1 = 0x00; P1M0 = 0x01; //P1(00000000B,00000001B)
- DIG1=0;
- P2=shumg[shi10]; //顯示時的十位
- delay(1); //延時
- P2=0x00; //消隱
- DIG1=1; //消隱
-
- DIG2=0;
- P2=shumg[shi1]; //顯示時的個位
- delay(1); //延時
- DIG2=1; //消隱
- P2=0x00; //消隱
-
- DIG3=0;
- P2=shumg[fen10]; //顯示分的十位
- delay(1); //延時
- DIG3=1; //消隱
- P2=0x00; //消隱
-
- DIG4=0;
- P2=shumg[fen1]; //顯示分的個位
- delay(1); //延時
- DIG4=1; //消隱
- P2=0x00; //消隱
- }
- /********************************************************/
- 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(S3==0) //切換程序
- {
- delay(50);
- if(S3==0)
- {
- TR0=0; //有按鍵按下關閉定時器0
- miao_num=0; //冒號常亮
- flag++;
- if(flag>2) //翻頁年月日周按兩次后啟動定時器
- {
- flag=0;
- TR0=1; //啟動定時器0
- }
- }
- while(S3==0);
- }
- /*******************************************************/
- if(S4==0) //設置程序
- {
- delay(50);
- if(S4==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(S4==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)
- LED4=0;
- if(miao_num>=10)
- LED4=1;
- }
復制代碼
所有資料51hei提供下載:
15共陰.rar
(31.37 KB, 下載次數: 53)
2020-1-14 21:02 上傳
點擊文件名下載附件
|