|
今天發(fā)現(xiàn)了一個(gè)CaKen-51-1寸數(shù)碼管時(shí)鐘。現(xiàn)在分享給大家,先上幾張圖。附件里有兩套程序和原理圖
~F[(~3MG34JW77L}~HWSI$X.jpg (71.37 KB, 下載次數(shù): 21)
下載附件
2018-4-4 22:39 上傳
$]AL0QW}NLC4J9`I_Y[4CTJ.jpg (87.86 KB, 下載次數(shù): 28)
下載附件
2018-4-4 22:39 上傳
LED時(shí)鐘使用說(shuō)明
1、安裝完成后,給電路進(jìn)行復(fù)位一下時(shí)鐘才能正常工作,方法如下:(首次通電未復(fù)位前,顯示的是隨機(jī)數(shù))
(1)通電,先按住加按鍵不放,同時(shí)再按住OK按鍵,松開。這時(shí)顯示11:59,表示復(fù)位成功。5秒后顯示12:00。
2、顯示溫度:按一下OK按鍵,此時(shí)顯示溫度,精度為0.1。如想退出可按加按鍵退出到時(shí)鐘界面;
3、調(diào)時(shí):在溫度界面下,再按一下ok鍵,(小時(shí)數(shù)碼管在閃爍),按加鍵修改;
4、調(diào)分:再按一下ok鍵,(分鐘數(shù)碼管在閃爍),按加鍵修改;
5、調(diào)鬧鐘時(shí):再按一下功能鍵(時(shí)數(shù)碼管閃爍),按加鍵修改鬧鐘時(shí);
6、調(diào)鬧鐘分:再按一下功能鍵(分?jǐn)?shù)碼管閃爍),按加鍵修改鬧鐘分;
設(shè)定鬧鐘是否開:再按一下功能鍵(時(shí)、分、兩點(diǎn)數(shù)碼管顯示不動(dòng)),按加按鍵,第四數(shù)碼管右下角的指示點(diǎn)亮(鬧鐘開),指示點(diǎn)滅(鬧鐘關(guān))。
7、設(shè)定整點(diǎn)報(bào)時(shí)間:再按一下OK鍵(時(shí)數(shù)碼管閃爍),按加按鍵修改整點(diǎn)報(bào)時(shí)開始時(shí)間(如調(diào)到7,就是早上7點(diǎn)開始有整點(diǎn)報(bào)時(shí));再按一下OK鍵(分?jǐn)?shù)碼管閃爍),按加按鍵修改整點(diǎn)報(bào)時(shí)結(jié)束時(shí)間(如調(diào)到23,就是早上8點(diǎn)到晚上22點(diǎn)有整點(diǎn)報(bào)時(shí))按OK鍵退出。設(shè)定完成。
單片機(jī)源程序如下:
- #include <reg51.h>
- #include <math.h>
- #include "ADC.H"
- #include "ds1302.h"
- bit flag, Bell_Swh=1,Hourb,Minb,Kgb,flag_read,dot_Bell=1,Bell_Swh1=1;//鬧鐘調(diào)時(shí)閃爍標(biāo)志位
- bit sec=0,min=0,hour=0,year=0,mon=0,day=0,weekk=0,hour_Bell=0,min_Bell=0,hour_time=0,min_time=0;flag_bell=0,bell_bug = 0; //閃爍標(biāo)志位
- unsigned char id,id2,d,e,S_1302,S1_1302,H_1302,H_Bell,S_Bell,H_time,S_time; //
- unsigned char disbuff[4] ={0};
- unsigned char time=0;
- unsigned int temp[1];
- unsigned int temp_num = 0;
- unsigned char code LEDData1 [ ] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff }; //正0-9LED數(shù)值
- unsigned char code LEDData2 [ ] = { 0xc0,0xcf,0xA4,0x86,0x8B,0x92,0x90,0xc7,0x80,0x82,0xff }; //反0-9LED數(shù)值
- void Delayms(unsigned int di) //延時(shí)
- {
- unsigned int da,db;
- for(da=0;da<di;da++)
- for(db=0;db<10;db++);
- }
- void Display(void) //掃描方式led1~led4循環(huán)點(diǎn)亮
- {
- time++;
- if(time==1)
- {
- if(dot_Bell)
- {
- P2=LEDData1[disbuff[0]]&0x7f;// 0x7F點(diǎn)亮DP小數(shù)點(diǎn)
- LED1=0; LED4=1;
- }
- else
- {
- P2=LEDData1[disbuff[0]];
- LED1=0; LED4=1;
- }
- }
- if(time==2)
- {
- if(id>=3)
- {
- P2=(LEDData2[disbuff[1]])&0x7F;
- LED1=1; LED2=0;
- }
- else
- if(flag)
- {
- P2=(LEDData2[disbuff[1]])&0x7F;
- LED1=1; LED2=0;
- }
- else
- {
- P2=LEDData2[disbuff[1]];
- LED1=1; LED2=0;
- }
- }
- if(time==3)
- {
- if(id>=3)
- {
- P2=LEDData1[disbuff[2]]&0x7f;
- LED2=1; LED3=0;
- }
- else
- if(flag)
- {
- P2=LEDData1[disbuff[2]]&0x7f;
- LED2=1; LED3=0;
- }
- else
- {
- P2=LEDData1[disbuff[2]];
- LED2=1; LED3=0;
- }
- }
-
- if(time==4)
- {
- time=0;
- if(disbuff[3]==0)
- {
- P2=LEDData1[10];
- LED3=1; LED4=0;
- }
- else
- {
- P2=LEDData1[disbuff[3]];
- LED3=1; LED4=0;
- }
- }
- }
- /******************************************************************************/
- void Disp(void)//顯示和閃爍函數(shù)
- {
- unsigned int i=0;
- unsigned char a=0,b=0,c=0,f=0;
- if(hour==1) //小時(shí)閃爍標(biāo)志位
- {
- if(flag==1)
- {
- b=read_clock(0x85);//讀小時(shí)
- a=b;
- b=b>>4;
- a=a&0x0f;
- disbuff[3]=b;
- disbuff[2]=a;
- }
- else
- {
- disbuff[2]=10;
- disbuff[3]=10;
- }
- }
- else
- {
- if(flag_read==1)//250MS 讀一次
- {
- H_1302=read_clock(0x85);//讀小時(shí)
- b=read_clock(0x85);//讀小時(shí)
- a=b;
- b=b>>4;
- a=a&0x0f;
- disbuff[3]=b;
- disbuff[2]=a;
- }
- }
-
- if(min==1) //分鐘閃爍標(biāo)志位
- {
- if(flag==1)
- {
- d=read_clock(0x83);//讀分鐘
- e=d;
- d=d>>4;
- e=e&0x0f;
- disbuff[1]=d;
- disbuff[0]=e;
- }
- else
- {
- disbuff[1]=10;
- disbuff[0]=10;
- }
- }
- else
- {
-
- if(flag_read==1) //250MS讀寫一次
- {
- S1_1302=read_clock(0x81);//讀秒
- S_1302=read_clock(0x83);//讀分鐘
- d=read_clock(0x83);//讀分鐘
- e=d;
- d=d>>4;
- e=e&0x0f;
- disbuff[1]=d;
- disbuff[0]=e;
- }
- }
-
- }
- /******************************************************************************/
- void Disp2(void)//顯示和閃爍函數(shù)
- {
- unsigned int i=0;
- unsigned char a=0,b=0,c=0,f=0;
- if(hour_Bell==1) //小時(shí)閃爍標(biāo)志位
- {
- if(flag==1)
- {
- b=read_clock(0xc3);//讀小時(shí)
- a=b;
- b=b>>4;
- a=a&0x0f;
- disbuff[3]=b;
- disbuff[2]=a;
-
- }
- else
- {
- disbuff[2]=10;
- disbuff[3]=10;
- }
- }
- else
- {
- if(flag_read==1)
- {
- H_Bell=read_clock(0xc3);//讀取鬧鐘的時(shí)
- S_Bell=read_clock(0xc5);//讀取鬧鐘的分
- b=read_clock(0xc3);//讀小時(shí)
- a=b;
- b=b>>4;
- a=a&0x0f;
- disbuff[3]=b;
- disbuff[2]=a;
- }
- }
-
-
- if(min_Bell==1) //分鐘閃爍標(biāo)志位
- {
- if(flag==1)
- {
- d=read_clock(0xc5);//讀分鐘
- e=d;
- d=d>>4;
- e=e&0x0f;
- disbuff[1]=d;
- disbuff[0]=e;
- }
- else
- {
- disbuff[1]=10;
- disbuff[0]=10;
- }
- }
- else
- {
-
- if(flag_read==1) //250MS讀寫一次
- {
- d=read_clock(0xc5);//讀分鐘
- e=d;
- d=d>>4;
- e=e&0x0f;
- disbuff[1]=d;
- disbuff[0]=e;
- }
- }
-
- }
- /******************************************************************************/
- void Disp3(void)//顯示和閃爍函數(shù)
- {
- unsigned int i=0;
- unsigned char a=0,b=0,c=0,f=0;
- if(hour_time==1) //小時(shí)閃爍標(biāo)志位
- {
- if(flag==1)
- {
- b=read_clock(0xc7);//讀小時(shí)
- a=b;
- b=b>>4;
- a=a&0x0f;
- disbuff[3]=b;
- disbuff[2]=a;
-
- }
- else
- {
- disbuff[2]=10;
- disbuff[3]=10;
- }
- }
- else
- {
- if(flag_read==1)
- {
- H_time=read_clock(0xc7);//讀取鬧鐘的時(shí)
- S_time=read_clock(0xc9);//讀取鬧鐘的分
-
- if(H_time>S_time)
- {
- unsigned char i;
- i=H_time;
- H_time=S_time;
- S_time=i;
- }
-
- b=read_clock(0xc7);//讀小時(shí)
- a=b;
- b=b>>4;
- a=a&0x0f;
- disbuff[3]=b;
- disbuff[2]=a;
- }
- }
-
-
- if(min_time==1) //分鐘閃爍標(biāo)志位
- {
- if(flag==1)
- {
- d=read_clock(0xc9);//讀分鐘
- e=d;
- d=d>>4;
- e=e&0x0f;
- disbuff[1]=d;
- disbuff[0]=e;
- }
- else
- {
- disbuff[1]=10;
- disbuff[0]=10;
- }
- }
- else
- {
-
- if(flag_read==1) //250MS讀寫一次
- {
- d=read_clock(0xc9);//讀分鐘
- e=d;
- d=d>>4;
- e=e&0x0f;
- disbuff[1]=d;
- disbuff[0]=e;
- }
- }
-
- }
- /******************************************************************************/
- void id_case1_key(void)//id為1時(shí)的下一級(jí)選擇
- {
- if(Add_Key == 0) //增加
- {
- Delay(4000);
- if(Add_Key == 0) {while(Add_Key ==0); Set_time(id,0); }
- //調(diào)用Set_time函數(shù)
-
- }
-
- }
- /******************************************************************************/
- void id_case2_key(void)//id為1時(shí)的下一級(jí)選擇
- {
- if(Add_Key == 0) //增加
- {
- Delay(4000);
- if(Add_Key == 0) {while(Add_Key ==0); Set_Bell(id,0);}
- // Set_Bell(id,0); //調(diào)用Set_Bell函數(shù)
- //while(Add_Key ==0);
- }
- }
- void id_AD_scan_key(void)
- {
- if(Add_Key == 0)
- {
- Delay(4000);
- if(Add_Key == 0)
- {
- ET1 = 0;
- id = 0;
- ET0 = 1;
- // return;
- }
- }
- }
- /******************************************************************************
- void id_case3_key(void)//id為1時(shí)的下一級(jí)選擇
- {
- if(Add_Key == 0) //增加
- {
- Delay(300);
- if(Add_Key == 0)
- {
- dot_Bell=~dot_Bell;
- Bell_Swh=dot_Bell;
- write_clock(0x8e,0x00);//允許寫操作
- write_clock(0xc8,Bell_Swh);
- write_clock(0x8e,0x80);//寫保護(hù),禁止寫操作
- }
- while(Add_Key ==0);
- }
-
- }
- /******************************************************************************/
- void Set_Bell(unsigned char sel, bit sel_1)//根據(jù)選擇調(diào)整相應(yīng)項(xiàng)目
- {
- signed char address,item;
- signed char max,mini;
- //if(sel==4) {address=0xc6; max=59;mini=0;} //秒
- if(sel==4) {address=0xc2; max=23; mini=0;} //時(shí)
- if(sel==5) {address=0xc4; max=59;mini=0;} //分
- if(sel==6) //標(biāo)志位
- {
- // address=0xc8;//for read
- // if(Add_Key ==0 || Dec_Key ==0)
- // Bell_Swh=~Bell_Swh;
- // write_clock(address,Bell_Swh);
- //address=0xc8;
- dot_Bell=~dot_Bell;
- Bell_Swh=dot_Bell;
- write_clock(0x8e,0x00);//允許寫操作
- write_clock(0xca,Bell_Swh);
- write_clock(0x8e,0x80);//寫保護(hù),禁止寫操作
- } //開關(guān)
- if(sel==7) {address=0xc6; max=23;mini=0;} //分
- if(sel==8) {address=0xc8; max=23; mini=0;} //時(shí)
- if(sel==9) //標(biāo)志位
- {
- // address=0xc8;//for read
- // if(Add_Key ==0 || Dec_Key ==0)
- // Bell_Swh=~Bell_Swh;
- // write_clock(address,Bell_Swh);
- //address=0xc8;
- dot_Bell=~dot_Bell;
- Bell_Swh1=dot_Bell;
- write_clock(0x8e,0x00);//允許寫操作
- write_clock(0xcc,Bell_Swh1);
- write_clock(0x8e,0x80);//寫保護(hù),禁止寫操作
- } //開關(guān)
- item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
- if(sel_1==0)
- item++;
- else
- item--;
- if(item>max) item=mini;
- if(item<mini) item=max;
- write_clock(0x8e,0x00);//允許寫操作
- write_clock(address,(item/10)*16+item%10);//轉(zhuǎn)換成16進(jìn)制寫入1302
- write_clock(0x8e,0x80);//寫保護(hù),禁止寫操作
- }
- /******************************************************************************/
- void Timer0_Init(void)//定時(shí)器0初始化
- {
- /*
- AUXR &= 0x7F; //定時(shí)器時(shí)鐘12T模式
- TMOD &= 0xF0; //設(shè)置定時(shí)器模式
- TL0 = 0x18; //設(shè)置定時(shí)初值
- TH0 = 0xFC; //設(shè)置定時(shí)初值
- TF0 = 0; //清除TF0標(biāo)志
- TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
- ET0= 1;*/
-
- /*
- //2毫秒@6.000MHz
- AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式
- TMOD &= 0xF0; //設(shè)置定時(shí)器模式
- TL0 = 0x20; //設(shè)置定時(shí)初值
- TH0 = 0xD1; //設(shè)置定時(shí)初值
- TF0 = 0; //清除TF0標(biāo)志
- TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
- ET0 = 1; //enable timer0 interrupt*/
-
- //2毫秒@12.000MHz
- AUXR |= 0x80; //定時(shí)器時(shí)鐘1T模式
- TMOD &= 0xF0; //設(shè)置定時(shí)器模式
- TL0 = 0x40; //設(shè)置定時(shí)初值
- TH0 = 0xA2; //設(shè)置定時(shí)初值
- TF0 = 0; //清除TF0標(biāo)志
- TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
- ET0 = 1; //enable timer0 interrupt
- }
- void Timer1Init(void) //20毫秒@12.000MHz
- {
- AUXR &= 0xBF; //定時(shí)器時(shí)鐘12T模式
- TMOD &= 0x0F; //設(shè)置定時(shí)器模式
- TL1 = 0xE0; //設(shè)置定時(shí)初值
- TH1 = 0xB1; //設(shè)置定時(shí)初值
- TF1 = 0; //清除TF1標(biāo)志
- TR1 = 1; //定時(shí)器1開始計(jì)時(shí)
- }
- /******************************************************************************/
- void Timer0(void) interrupt 1 using 1//中斷入口,冒號(hào)閃爍
- {
- static unsigned char timecount = 0;//
- timecount++;
- if(timecount > 125)
- {
- flag_read = ~flag_read;
-
- }
- if(timecount > 250)//500MS
- {
- timecount = 0;
- flag = ~flag;
- }
- Display();
- }
- void Timer1(void) interrupt 3 using 1
- {
- temp_num++;
- if(temp_num > 40)
- {
- temp_num = 0;
- }
-
- }
- void ADC_convert(void)
- {
-
- //EA = 0;//關(guān)中斷
-
- ET0 = 0;
-
- if(temp_num == 0)
- {
- GetADCResult(6,&temp[0]);
-
- //temp[0] = (unsigned int) ( ( 3950.0 / ( 11.33657 + log( 6.04 * (float)temp[0] / ( 1024.0 - (float)temp[0] ) ) ) - 273.15 ) * 100 );
- temp[0]=(unsigned int) ((1/(log(((float)temp[0]*4700/(1024-(float)temp[0]))/10000)/3950+1/298.15)-273.15)*100);
-
- temp_num = 1;
- }
-
- P2 = LEDData1[temp[0]/1000]; //千位
- LED4 = 0;
- Delayms(50);
- LED4 = 1;
- P2 = (LEDData1[temp[0]%1000/100])&0x7F;//百位
- LED3 = 0;
- Delayms(50);
- LED3 = 1;
- P2 = LEDData2[temp[0]%1000%100/10];//十位
- LED2 = 0;
- Delayms(50);
- LED2 = 1;
-
- P2 = 0xa7;//c
- LED1 = 0;
- Delayms(50);
- LED1 = 1;
-
- // id = 0;
-
- ET1 = 1;//啟動(dòng)定時(shí)器1
-
- }
- /******************************************************************************/
- void main(void)//主函數(shù)
- {
- P3M1=0x00;
- P3M0=0x08;
- H_Bell=read_clock(0xc3);//讀取鬧鐘的時(shí)
- S_Bell=read_clock(0xc5);//讀取鬧鐘的分
- H_time=read_clock(0xc7);//讀取鬧鐘的時(shí)
- S_time=read_clock(0xc9);//讀取鬧鐘的分
-
- dot_Bell= Bell_Swh;
-
- InitADC(); //初始化ADC
- Timer0_Init();//定時(shí)器T0初始化
- Timer1Init();
- EA=1;
- while(1)//主循環(huán)
- {
- //設(shè)置時(shí)鐘的初始值,顯示14年4月5號(hào)11:59:55
- if(OK_Key == 0 && Add_Key == 0)
- {
- Delay(1000);
- if(OK_Key == 0 && Add_Key == 0)
- {
- while(OK_Key == 0);//等待鍵松開
- Init_1302();
- H_Bell=read_clock(0xc3);//讀取鬧鐘的時(shí)
- S_Bell=read_clock(0xc5);//讀取鬧鐘的分
- H_time=read_clock(0xc7);//讀取鬧鐘的時(shí)
- S_time=read_clock(0xc9);//讀取鬧鐘的分
-
- dot_Bell= Bell_Swh;
-
- }
- }
- /*****************************************/
- // MF: //返回主界面
- /*****************************************/
- if (OK_Key == 0) // 設(shè)置和選擇項(xiàng)目鍵
- {
- Delay(1000);
- if(OK_Key == 0)
- {
- id++;
- if(id == 2)
- {
- ET1 = 0;
- ET0 = 1;
- }
- if(id>9)id=0;
- }
-
- while(OK_Key == 0);//等待鍵松開
- }
- /***************************************/
- switch( id )
- {
- case 0:hour=0;min=0;Disp( ); dot_Bell= Bell_Swh;break;//正常顯示
- case 1:hour=0;min=0;ADC_convert();id_AD_scan_key(); dot_Bell= Bell_Swh;break;//顯示溫度
- case 2:hour=1;id_case1_key();Disp(); dot_Bell=0;break; //小時(shí)
- case 3:hour=0;min=1;id_case1_key();Disp(); dot_Bell=0;break; //分鐘
- case 4:hour_Bell=1;id_case2_key();Disp2(); dot_Bell= Bell_Swh;break;
- case 5:hour_Bell=0;min_Bell=1;id_case2_key();Disp2();dot_Bell= Bell_Swh;break;
- case 6:hour_Bell=0;min_Bell=0;id_case2_key();Disp2();dot_Bell= Bell_Swh;break;
- case 7:hour_time=1;id_case2_key();Disp3(); dot_Bell= Bell_Swh1;break;
- case 8:hour_time=0;min_time=1;id_case2_key();Disp3();dot_Bell= Bell_Swh1;break;
- case 9:hour_time=0;min_time=0;id_case2_key();Disp3();dot_Bell= Bell_Swh1;break;
- default:break;
- }
- if(Bell_Swh == 1)//鬧鐘為開
- {
-
- if(H_Bell == H_1302)
- {
- if(S_Bell == S_1302) //分相等
- {
-
- if(S1_1302==0) //秒等于0才開鬧鐘
- {
- flag_bell=1;
- }
- if(Add_Key ==0 )//按加退出
- {
- flag_bell=0;
- }
-
- }
- else
- {
- flag_bell=0;
- }
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
CaKen-51-1寸數(shù)碼管時(shí)鐘.rar
(19.62 MB, 下載次數(shù): 47)
2018-4-4 22:47 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|