今天发现了一个CaKen-51-1寸数码管时钟。现在分享给大家,先上几张图。附件里有两套程序和原理图
LED时钟使用说明
1、安装完成后,给电路进行复位一下时钟才能正常工作,方法如下:(首次通电未复位前,显示的是随机数)
(1)通电,先按住加按键不放,同时再按住OK按键,松开。这时显示11:59,表示复位成功。5秒后显示12:00。
2、显示温度:按一下OK按键,此时显示温度,精度为0.1。如想退出可按加按键退出到时钟界面;
3、调时:在温度界面下,再按一下ok键,(小时数码管在闪烁),按加键修改;
4、调分:再按一下ok键,(分钟数码管在闪烁),按加键修改;
5、调闹钟时:再按一下功能键(时数码管闪烁),按加键修改闹钟时;
6、调闹钟分:再按一下功能键(分数码管闪烁),按加键修改闹钟分;
设定闹钟是否开:再按一下功能键(时、分、两点数码管显示不动),按加按键,第四数码管右下角的指示点亮(闹钟开),指示点灭(闹钟关)。
7、设定整点报时间:再按一下OK键(时数码管闪烁),按加按键修改整点报时开始时间(如调到7,就是早上7点开始有整点报时);再按一下OK键(分数码管闪烁),按加按键修改整点报时结束时间(如调到23,就是早上8点到晚上22点有整点报时)按OK键退出。设定完成。
单片机源程序如下:
- #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;//闹钟调时闪烁标志位
- 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; //闪烁标志位
- 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数值
- unsigned char code LEDData2 [ ] = { 0xc0,0xcf,0xA4,0x86,0x8B,0x92,0x90,0xc7,0x80,0x82,0xff }; //反0-9LED数值
- void Delayms(unsigned int di) //延时
- {
- unsigned int da,db;
- for(da=0;da<di;da++)
- for(db=0;db<10;db++);
- }
- void Display(void) //扫描方式led1~led4循环点亮
- {
- time++;
- if(time==1)
- {
- if(dot_Bell)
- {
- P2=LEDData1[disbuff[0]]&0x7f;// 0x7F点亮DP小数点
- 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)//显示和闪烁函数
- {
- unsigned int i=0;
- unsigned char a=0,b=0,c=0,f=0;
- if(hour==1) //小时闪烁标志位
- {
- if(flag==1)
- {
- b=read_clock(0x85);//读小时
- 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);//读小时
- b=read_clock(0x85);//读小时
- a=b;
- b=b>>4;
- a=a&0x0f;
- disbuff[3]=b;
- disbuff[2]=a;
- }
- }
-
- if(min==1) //分钟闪烁标志位
- {
- 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)//显示和闪烁函数
- {
- unsigned int i=0;
- unsigned char a=0,b=0,c=0,f=0;
- if(hour_Bell==1) //小时闪烁标志位
- {
- if(flag==1)
- {
- b=read_clock(0xc3);//读小时
- 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);//读取闹钟的时
- S_Bell=read_clock(0xc5);//读取闹钟的分
- b=read_clock(0xc3);//读小时
- a=b;
- b=b>>4;
- a=a&0x0f;
- disbuff[3]=b;
- disbuff[2]=a;
- }
- }
-
-
- if(min_Bell==1) //分钟闪烁标志位
- {
- 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)//显示和闪烁函数
- {
- unsigned int i=0;
- unsigned char a=0,b=0,c=0,f=0;
- if(hour_time==1) //小时闪烁标志位
- {
- if(flag==1)
- {
- b=read_clock(0xc7);//读小时
- 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);//读取闹钟的时
- 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);//读小时
- a=b;
- b=b>>4;
- a=a&0x0f;
- disbuff[3]=b;
- disbuff[2]=a;
- }
- }
-
-
- if(min_time==1) //分钟闪烁标志位
- {
- 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时的下一级选择
- {
- if(Add_Key == 0) //增加
- {
- Delay(4000);
- if(Add_Key == 0) {while(Add_Key ==0); Set_time(id,0); }
- //调用Set_time函数
-
- }
-
- }
- /******************************************************************************/
- void id_case2_key(void)//id为1时的下一级选择
- {
- if(Add_Key == 0) //增加
- {
- Delay(4000);
- if(Add_Key == 0) {while(Add_Key ==0); Set_Bell(id,0);}
- // Set_Bell(id,0); //调用Set_Bell函数
- //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时的下一级选择
- {
- 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);//写保护,禁止写操作
- }
- while(Add_Key ==0);
- }
-
- }
- /******************************************************************************/
- void Set_Bell(unsigned char sel, bit sel_1)//根据选择调整相应项目
- {
- 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;} //时
- if(sel==5) {address=0xc4; max=59;mini=0;} //分
- if(sel==6) //标志位
- {
- // 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);//写保护,禁止写操作
- } //开关
- if(sel==7) {address=0xc6; max=23;mini=0;} //分
- if(sel==8) {address=0xc8; max=23; mini=0;} //时
- if(sel==9) //标志位
- {
- // 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);//写保护,禁止写操作
- } //开关
- 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);//转换成16进制写入1302
- write_clock(0x8e,0x80);//写保护,禁止写操作
- }
- /******************************************************************************/
- void Timer0_Init(void)//定时器0初始化
- {
- /*
- AUXR &= 0x7F; //定时器时钟12T模式
- TMOD &= 0xF0; //设置定时器模式
- TL0 = 0x18; //设置定时初值
- TH0 = 0xFC; //设置定时初值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- ET0= 1;*/
-
- /*
- //2毫秒@6.000MHz
- AUXR |= 0x80; //定时器时钟1T模式
- TMOD &= 0xF0; //设置定时器模式
- TL0 = 0x20; //设置定时初值
- TH0 = 0xD1; //设置定时初值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- ET0 = 1; //enable timer0 interrupt*/
-
- //2毫秒@12.000MHz
- AUXR |= 0x80; //定时器时钟1T模式
- TMOD &= 0xF0; //设置定时器模式
- TL0 = 0x40; //设置定时初值
- TH0 = 0xA2; //设置定时初值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- ET0 = 1; //enable timer0 interrupt
- }
- void Timer1Init(void) //20毫秒@12.000MHz
- {
- AUXR &= 0xBF; //定时器时钟12T模式
- TMOD &= 0x0F; //设置定时器模式
- TL1 = 0xE0; //设置定时初值
- TH1 = 0xB1; //设置定时初值
- TF1 = 0; //清除TF1标志
- TR1 = 1; //定时器1开始计时
- }
- /******************************************************************************/
- void Timer0(void) interrupt 1 using 1//中断入口,冒号闪烁
- {
- 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;//关中断
-
- 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;//启动定时器1
-
- }
- /******************************************************************************/
- void main(void)//主函数
- {
- P3M1=0x00;
- P3M0=0x08;
- H_Bell=read_clock(0xc3);//读取闹钟的时
- S_Bell=read_clock(0xc5);//读取闹钟的分
- H_time=read_clock(0xc7);//读取闹钟的时
- S_time=read_clock(0xc9);//读取闹钟的分
-
- dot_Bell= Bell_Swh;
-
- InitADC(); //初始化ADC
- Timer0_Init();//定时器T0初始化
- Timer1Init();
- EA=1;
- while(1)//主循环
- {
- //设置时钟的初始值,显示14年4月5号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);//读取闹钟的时
- S_Bell=read_clock(0xc5);//读取闹钟的分
- H_time=read_clock(0xc7);//读取闹钟的时
- S_time=read_clock(0xc9);//读取闹钟的分
-
- dot_Bell= Bell_Swh;
-
- }
- }
- /*****************************************/
- // MF: //返回主界面
- /*****************************************/
- if (OK_Key == 0) // 设置和选择项目键
- {
- 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; //小时
- 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;
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
CaKen-51-1寸数码管时钟.rar
(19.62 MB, 下载次数: 47)
|