长期以来,一直想做一个大数码管万年历,但大数码管笔段大都为几个LED串联组成,显示部分需要较高的电压,不能与单片机共用5v电源。这将使电路复杂化。前些时候受本论坛一个网友的启发,时间显示部分用多只LED并联组成8字形“数码管”,公历农历日期温度都用0.8吋数码管,制作万年历成功,用手机充电器供电,十分方便。单片机用STC89c52RC,时间获取用DS12C887,显示驱动用三支7219级联完成。电路图手工谅解制作,画的不好,望网友们谅解。
电路原理图如下:
单片机源程序如下:
- /*************说明*************************************************
- 1.程序主体部分参照ds1302+max7219级联驱动24位数码管万年历程序编辑修改
- 2.7219初始化要设置0x09,0x0a,0x0b,0x0c,0x0f五个控制寄存器,并且要在
- 显示之前初始化,否则可能出现显示错误
- 3.ds12c887初始化程序两项主要内容1为控制寄存器参数,2为初次设置的时间
- 日期。两项可合为一函数,887初始化仅限1次,一旦开启887运行,由于887由
- 芯片内部电池供电,数据不会丢失,因此不需要再次写入
- 4.由于7219选择不译码和语音报时函数都需要十进制数据,887设置为二进制,
- 即B寄存器设置DM=1 (要注意,一些中文资料DM=0是错误的)
- *************************************************************************/
- #include <reg52.h>
- #include <intrins.h>
- #include <yyxp.h>
- #include <string.h>
- #include <absacc.h> //头文件
- #include "eeprom52.h"
- #include "ds18b20.h"
- #include "max7219.h"
- #define uc unsigned char //宏定义
- #define ui unsigned int
- #include "gton.h"
- /*----定义DS12C887数据线---*/
- //#define Ds_DATA P0 //DS12CR887数据总线,P0.0-P0.7对应连接AD0-AD7
- sbit ds_cs = P2^4;
- sbit ds_as = P2^5;
- sbit ds_rw = P2^6;
- sbit ds_ds = P2^7;
- /*----定义其它数据线---*/
- sbit s1=P1^4; //按键设置+确认
- sbit s2=P1^5; //加 ,运行状态下为语音播报模式设置
- sbit s3=P1^6; //减, 运行状态下为闹钟开关设置
- sbit s4=P1^7; //运行状态下为语音报时开关
- sbit s5=P3^4; //运行状态下为关闭报警
- sbit LED1 =P3^6; //闹钟指示灯
- sbit deng=P3^7; //秒灯
- sbit fmq=P2^3; //蜂鸣器
- sbit ACC0=ACC^0;
- sbit ACC7=ACC^7;
- void display(); //显示函数
- void sec_led(); //控制秒灯的函数
- void bofang(uc ms,uc *df);
- // 0 1 2 3 4 5 6 7 8 9
- uc code tab[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x00,0x0d}; //不译码段选
- uc code tab1[]={0xfe,0xb0,0xed,0xf9,0xb3,0xdb,0xdf,0xf0,0xff,0xfb}; //带小数点
- uc code dxy[]={0,1,2,1,0,1,0,1,1,0,1,0,1};
- uc set=0,ee; //设置键按下次数(菜单),定时器溢出次数
- char nian,yue,ri,xq,shi,fen,miao,nz_shi,nz_fen; //定义公历年月日星期时分秒(十进制码)
-
- bit bdata bs,tt,h; //整点报时标志位,设置完成标志位,秒灯控制标志位
- bit bj=0; //闹铃标志位
- bit zdbj=0; //中断报警标志
- bit bjkg=0; //闹铃开关
-
- uc mode=0; //语音播报模式:1报时间;2报日期和时间;3报时间和温度;4三项全报;5关闭
- uc disbuff[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //数组用于存放时间温度距离等信息
- uc nl_nian,nl_yue,nl_ri; // 定义农历年,月,日
- bit bdata bs,tt,h; //语音报时标志,时间设置完成标志位,秒灯标志位,
-
-
- /******************把数据保存到单片机内部eeprom中******************/
- void write_eeprom()
- {
- SectorErase(0x2000);
- byte_write(0x2000, nz_shi);
- byte_write(0x2001, nz_fen);
- byte_write(0x2002, bjkg);
- byte_write(0x2003, mode);
- byte_write(0x2060, a_a);
- }
- /******************把数据从单片机内部eeprom中读出来*****************/
- void read_eeprom()
- {
- nz_shi = byte_read(0x2000);
- nz_fen = byte_read(0x2001);
- bjkg = byte_read(0x2002);
- mode = byte_read(0x2003);
- a_a = byte_read(0x2060);
- }
-
- /**************开机自检eeprom初始化*****************/
- void init_eeprom()
- {
- read_eeprom(); //先读
- if(a_a != 1) //新的单片机初始单片机内问eeprom
- {
- nz_shi = 12;
- nz_fen = 30;
- bjkg=0;
- mode=4;
- a_a = 1;
- write_eeprom(); //保存数据
- }
- }
- void delayms(ui x) //延时x毫秒
- {
- ui i,j;
- for(i=0;i<x;i++)
- for(j=0;j<110;j++);
- }
-
-
- /*****ds12c887函数*****/
- void write_ds12c887(uc add,uc date) //写入地址和数据
- {
-
- //date=((date/10)*16)+(date%10); // 十进制转换成DCB码(仅在887设置为BCD数据格式时使用)
- ds_cs=0;
- ds_as=1;
- ds_ds=1;
- ds_rw=1;
- P0=add;
- ds_as=0;
- ds_rw=0;
- P0=date;
- ds_rw=1;
- ds_as=1;
- ds_cs=1;
- }
- uc read_ds12c887(uc add) //读数据
- {
- uc time;
- ds_as=1;
- ds_ds=1;
- ds_rw=1;
- ds_cs=0;
- P0=add;
- ds_as=0;
- ds_ds=0;
- P0=0xff;
- time=P0;
- ds_as=1;
- ds_ds=1;
- ds_cs=1;
- // time=time/16*10+time%16; //BCD转十进制
- return time;
- }
- void ds12c887() //读取写入ds12c887函数
- {
- if((tt==1)&&(set==0)) //当退出时间设定时,首先将设定的时间写入芯片
- {
- tt=0;
- write_ds12c887(0x00,miao); //秒
- write_ds12c887(0x02,fen); //分
- write_ds12c887(0x04,shi); //时
- write_ds12c887(0x06,xq); //星期
- write_ds12c887(0x07,ri); //日
- write_ds12c887(0x08,yue); //月
- write_ds12c887(0x09,nian); //年
-
- }
- if(set==0)
- {
- miao=read_ds12c887(0x00);
- fen=read_ds12c887(0x02);
- shi=read_ds12c887(0x04);
- xq=read_ds12c887(0x06);
- ri=read_ds12c887(0x07);
- yue=read_ds12c887(0x08);
- nian=read_ds12c887(0x09);
-
- }
-
- }
- /*void DS12C887_init() //887初始化,设置887寄存器初始参数,仅限初次上电使用
- {
- write_ds12c887(10, 0x20); //DS12CR887寄存器A功能设置,开启时钟振荡器
- write_ds12c887(11, 0x06); //寄存器B功能设置,不开启闹钟中断使能,数据模式为二进制,24小时模式。
- write_ds12c887(9, 22);
- write_ds12c887(8, 10);
- write_ds12c887(7, 6);
- write_ds12c887(6, 4);
- write_ds12c887(4, 12);
- write_ds12c887(2, 55);
- write_ds12c887(0, 58);
- } */
- /*****按键函数*****/
- void key()
- {
- ui out_set=0; //退出设置时间记数
- //out_clear=0;
-
- if(s1==0) //如果s1设置键按下
- { //
- delayms(5); //延时消抖 ()
- if(s1==0) //确认s1按下
- {
- while((s1==0)&&(set!=0)) //已确认s1按下并弹回时
- {
- display(); //显示初始化数据
- out_set++; //
- if(out_set==300) // 如果设置键弹开时间达300毫秒
- {
- set=0;
- out_set=0;
- tt=0;
- fmq=0; //蜂鸣器短响一声
- delayms(20);
- fmq=1;
- delayms(100);
- fmq=0;
- delayms(20);
- fmq=1;
- goto x;
- }
- }
-
- set++; //进入设置方式1
- if(set<10) //如果设置次数小于8
- {
- out_set=0; //退出设置
- fmq=0;
- delayms(10);
- fmq=1;
- }
- else
- {
- set=0; //设置次数归0
- tt=1; //设置完成
- fmq=0;
- delayms(200);
- fmq=1;
- }
- x: while(!s1) //等待s1弹起
- {
- display();
- sec_led();
- }
- }
- }
-
- if(set!=0)
- {
- if(s2==0) //如果加键按下
- {
- delayms(5);
- if(s2==0)
- {
- fmq=0;
- delayms(10);
- fmq=1;
- if(set==1) //如果设置键按下次数为1(菜单1,设置年)
- {
- nian++; //年增加(随着加键按下)
- if(nian==100)
- nian=0;
- if((dxy[yue]==2)&&(nian%4!=0)&&(ri>28)==1)//当平年二月day大于28时
- ri=28;
- }
- if(set==2) //如果设置菜单为2(设置月)
- {
- yue++; //月增加
- if(yue==13)
- yue=1;
- if((dxy[yue]==0)&&(ri>30)==1) //当小月day大于30时
- ri=30;
- if((dxy[yue]==2)&&(nian%4==0)&&(ri>28)==1)//当平年二月day大于28时
- ri=28;
- if((dxy[yue]==2)&&(nian%4!=0)&&(ri>29)==1)//当闰年二月day大于29时
- ri=29;
- }
- if(set==3) //如果设置菜单为3(设置日)
- {
- ri++; //日增加
-
- if((dxy[yue]==0)&&(ri==31)==1) //当小月day被加到了31时
- ri=1;
- if((dxy[yue]==1)&&(ri==32)==1) //当大月day被加到32时
- ri=1;
- if((dxy[yue]==2)&&(nian%4==0)&&(ri==29)==1) //当平年二月day被加到29时
- ri=1;
- if((dxy[yue]==2)&&(nian%4!=0)&&(ri==30)==1) //当闰年二月day被加到30时
- ri=1;
- }
- if(set==4) //如果设置菜单为4(设置星期)
- {
- xq++;
- if(xq==8)
- xq=1;
-
- }
- if(set==5) //如果设置菜单为5(设置时)
- {
- shi++;
- if(shi==24)
- shi=0;
-
- }
- if(set==6) //如果设置菜单为6(设置分)
- {
- fen++;
- if(fen==60)
- fen=0;
- }
- if(set==7) //如果设置菜单为7(设置秒)
- {
- miao++;
- if(miao==60)
- miao=0;
- }
- if(set==8) //如果设置菜单为8(设置闹钟时)
- {
- nz_shi++;
- if(nz_shi==24)
- nz_shi=0;
- write_eeprom(); //保存数据
- }
- if(set==9) //如果设置菜单为9(设置闹钟分)
- {
- nz_fen++;
- if(nz_fen==60)
- nz_fen=0;
- write_eeprom();
- }
- while(!s2) //等待加按键弹起
- {display();} //正常显示
- }
- }
- if(s3==0) //如果减键按下
- {
- delayms(5);
- if(s3==0)
- {
- fmq=0;
- delayms(10);
- fmq=1;
- if(set==1) //如果设置菜单为1
- {
- nian--; //年减少
- if(nian==(-1))
- nian=99;
- if((dxy[yue]==2)&&(nian%4==0)&&(ri>28)==1)
- ri=28;
- }
- if(set==2)
- {
- yue--;
- if(yue==0)
- yue=12;
- if((dxy[yue]==0)&&(ri>30)==1)
- ri=30;
- if((dxy[yue]==2)&&(nian%4==0)&&(ri>28)==1)
- ri=28;
- if((dxy[yue]==2)&&(nian%4!=0)&&(ri>29)==1)
- ri=29;
- }
- if(set==3)
- {
- ri--;
-
- if((dxy[yue]==0)&&(ri==0)==1)
- ri=30;
- if((dxy[yue]==1)&&(ri==0)==1)
- ri=31;
- if((dxy[yue]==2)&&(nian%4==0)&&(ri==0)==1)
- ri=28;
- if((dxy[yue]==2)&&(nian%4!=0)&&(ri==0)==1)
- ri=29;
- }
- if(set==4)
- {
- xq--;
- if(xq==0)
- xq=7;
- }
- if(set==5)
- {
- shi--;
- if(shi==(-1))
- shi=23;
-
- }
- if(set==6)
- {
- fen--;
- if(fen==(-1))
- fen=59;
- }
- if(set==7) //如果设置菜单为7
- {
- miao--;
- if(miao==(-1))
- miao=59;
- }
- if(set==8)
- {
- nz_shi--;
- if(nz_shi==(-1))
- nz_shi=23;
- write_eeprom(); //保存数据
- }
- if(set==9)
- {
- nz_fen--;
- if(nz_fen==(-1))
- nz_fen=59;
- write_eeprom(); //保存数据
- }
- while(!s3)
- {display();}
- }
- }
- }
- if(set==0) //如果设置菜单为0,时日设置完成
- {
- if(s2==0) //如果s2按下
- {
- delayms(5);
- if(s2==0) //如果确认s2按下,语音报时模式选择
- {
- fmq=0; //蜂鸣器短鸣一声
- delayms(10);
- fmq=1;
- mode++;
- if(mode>5)
- mode=1;
- write_eeprom(); //保存数据
- }
- while(!s2);
- {display();}
- }
- if(s3==0) //如果s3按下,报警开关
- {
- delayms(5); //延时5毫秒
- if(s3==0)
- {
- fmq=0; //蜂鸣器短鸣一声
- delayms(10);
- fmq=1;
- bjkg=~bjkg;
- write_eeprom();
- }
- while(!s4);
- {display();}
- }
- if(s4==0)
- {
- bofang(mode,disbuff);
- }
- if((s5==0)&&(bj==1)) //按键关闭闹钟
- {
- zdbj=1;
- bj=0;
- fmq=1;
- }
- }
- }
- //=====================================================================================
- //=====================================================================================
- /*****主显示函数*****/
- void display()
- { // 年 月 日 时 分 温度 秒
- uc x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15;
- //农历月农历日 闹钟时闹钟分
- uc y1,y2,y3,y4,y5,y6,y7,y8;
-
- x1=nian/10; //年十位
- x2=nian%10; //年个位
- x3=yue/10;
- x4=yue%10;
- x5=ri/10;
- x6=ri%10;
- x7=shi/10; //时十位
- x8=shi%10;
- x9=fen/10; //分十位
- x10=fen%10;
- x11=wendu/100; //温度十位
- x12=(wendu%100)/10;
- x13=(wendu%100)%10;
- x14=miao/10; //秒十位
- x15=miao%10;
- y5=nz_shi/10; //闹钟时十位
- y6=nz_shi%10;
- y7=nz_fen/10; //闹钟分十位
- y8=nz_fen%10;
- InitDis_3();
- if(set!=1) // 设置年数据
- {
- WriteWord_3(0x07,tab[2]);
- WriteWord_3(0x08,tab[0]);
- WriteWord_3(0x01,tab[x1]);
- WriteWord_3(0x02,tab[x2]);
- }
- else if(set==1) // 写入年数据
- {
- if(h==0) // 秒灯灭时写入
- {
- WriteWord_3(0x07,tab[2]); //显示2
- WriteWord_3(0x08,tab[0]); //显示0
- WriteWord_3(0x01,tab[x1]); //显示x1
- WriteWord_3(0x02,tab[x2]); //显示x2
- }
- else // 秒灯亮时不显示(秒灯闪烁显示数据随着闪烁)
- {
- WriteWord_3(0x07,tab[10]); //不显示
- WriteWord_3(0x08,tab[10]); //
- WriteWord_3(0x01,tab[10]); //
- WriteWord_3(0x02,tab[10]); //不显示
- }
- }
- if(set!=2) // 设置月数据
- {
- if(x3==0)
- { //如果月十位为0
- WriteWord_3(0x03,tab[10]); //不显示
- WriteWord_3(0x04,tab[x4]);
- }
- else
- { //否则
- WriteWord_3(0x03,tab[x3]); //显示x3
- WriteWord_3(0x04,tab[x4]);
- } //显示x4
- }
- else if(set==2) // 写入月数据
- {
- if(h==0)
- {
- if(x3==0)
- {
- WriteWord_3(0x03,tab[10]);
- WriteWord_3(0x04,tab[x4]);
- }
- else
- {
- WriteWord_3(0x03,tab[x3]);
- WriteWord_3(0x04,tab[x4]);
- }
- }
- else
- {
- WriteWord_3(0x03,tab[10]);
- WriteWord_3(0x04,tab[10]);
- }
- }
- if(set!=3) // 设置日数据
- {
-
- if(x5==0)
- {
- WriteWord_3(0x05,tab[10]);
- WriteWord_3(0x06,tab[x6]);
- }
- else
- WriteWord_3(0x05,tab[x5]);
- WriteWord_3(0x06,tab[x6]);
- }
- else if(set==3) // 写入日数据
- {
- WriteWord_3(0x05,tab[x5]);
- WriteWord_3(0x06,tab[x6]);
-
- if(h==0)
- {
- if(x5==0)
- {
- WriteWord_3(0x05,tab[10]);
- WriteWord_3(0x06,tab[x6]);
- }
- else
- WriteWord_3(0x05,tab[x5]);
- WriteWord_3(0x06,tab[x6]);
- }
- else
- {
- WriteWord_3(0x05,tab[10]);
- WriteWord_3(0x06,tab[10]);
- }
- }
- InitDis_2();
-
- if(set!=4)
- {
- if(xq!=7)
- WriteWord_2(0x07,tab[xq]);
- else
- WriteWord_2(0x07,tab[(xq+1)]);
- }
- else if(set==4)
- {
- if(h==0)
- {
- if(xq!=7)
- WriteWord_2(0x07,tab[xq]);
- else
- WriteWord_2(0x07,tab[(xq+1)]);
- }
- else
- {
- WriteWord_2(0x07,tab[10]);
- }
- }
- if(set!=5) //设置时数据
- {
- if(x7==0)
- { //如果时十位是0
- WriteWord_2(0x01,tab[10]); //不显示
- WriteWord_2(0x02,tab[x8]);
- }
- else //否则
- WriteWord_2(0x01,tab[x7]); //显示时十位
- WriteWord_2(0x02,tab[x8]); //显示时个位
- }
- else if(set==5) //写入时数据
- {
- if(h==0) //秒灯灭写入
- {
- if(x7==0)
- {
- WriteWord_2(0x01,tab[10]);
- WriteWord_2(0x02,tab[x8]);
- }
- else
- WriteWord_2(0x01,tab[x7]);
- WriteWord_2(0x02,tab[x8]);
- }
- else //秒灯亮不显示
- {
- WriteWord_2(0x01,tab[10]);
- WriteWord_2(0x02,tab[10]);
- }
- }
- if(set!=6) //设置分
- {
- WriteWord_2(0x03,tab[x9]);
- WriteWord_2(0x04,tab[x10]);
- }
- else if(set==6) //写入分
- {
- if(h==0)
- {
- WriteWord_2(0x03,tab[x9]);
- WriteWord_2(0x04,tab[x10]);
- }
- else
- {
- WriteWord_2(0x03,tab[10]);
- WriteWord_2(0x04,tab[10]);
- }
- }
-
- if(set!=7)
- {
- WriteWord_2(0x05,tab[x14]);
- WriteWord_2(0x06,tab[x15]);
- }
- else if(set==7)
- {
- if(h==0)
- {
- WriteWord_2(0x05,tab[x14]);
- WriteWord_2(0x06,tab[x15]);
- }
- else
- {
- WriteWord_2(0x05,tab[10]);
- WriteWord_2(0x06,tab[10]);
- }
-
- }
-
- InitDis_1();
- if(set==8)
- {
- WriteWord_1(0x05,tab[y5]);
- WriteWord_1(0x06,tab[y6]);
- }
- if(set==9)
- {
- WriteWord_1(0x07,tab[y7]);
- WriteWord_1(0x08,tab[y8]);
- }
- if(set==0) //如果时钟走时时间设置菜单为0 ,时日设置完成
- {
-
- SunToMoon(nian,yue,ri); //调用农历转换
-
- y1=month_moon/10; //农历月十位
- y2=month_moon%10;
- y3=day_moon/10; //农历日十位
- y4=day_moon%10;
- if(y1==0)
- {
- WriteWord_1(0x01,tab[10]);
- WriteWord_1(0x02,tab[y2]);
- }
- else
- {
- WriteWord_1(0x01,tab[y1]); //显示农历月
- WriteWord_1(0x02,tab[y2]);
- }
- if(y3==0)
- {
- WriteWord_1(0x03,tab[10]);
- WriteWord_1(0x04,tab[y4]);
- }
- else
- {
- WriteWord_1(0x03,tab[y3]); //显示农历日
- WriteWord_1(0x04,tab[y4]);
- }
- if(x11==0)
- {
- WriteWord_1(0x05,tab[10]); //温度十位为0不显示
- WriteWord_1(0x06,tab1[x12]);
- WriteWord_1(0x07,tab[x13]);
- WriteWord_1(0x08,tab[11]); //显示C
- }
- else //否则
- {
- WriteWord_1(0x05,tab[x11]); //显示温度
- WriteWord_1(0x06,tab1[x12]);
- WriteWord_1(0x07,tab[x13]);
- WriteWord_1(0x08,tab[11]); //显示C
- }
- if(bjkg==1)
- LED1=0; //显示闹钟开
- else
- LED1=1;
-
- }
- disbuff[0]=x1; //年十位值 数组0号数据
- disbuff[1]=x2; //年个位值 数组1号数据
- disbuff[2]=x3; //月十位值 数组2号数据
- disbuff[3]=x4; //月个位值 数组3号数据
- disbuff[4]=x5;
- disbuff[5]=x6; //日个位值
- disbuff[6]=xq; //星期 数组6号数据
- disbuff[7]=x7; //时十位值 数组7号数据
- disbuff[8]=x8; //时个位值
- disbuff[9]=x9; //分十位值
- disbuff[10]=x10; //分个位值
- disbuff[11]=x14; //秒十位值
- disbuff[12]=x15;
- disbuff[13]=x11; //温度十位值
- disbuff[14]=x12; //温度个位值
- disbuff[15]=x13; //温度小数位值
-
-
- }
- /*****闹钟函数*****/
- void clock_dis()
- {
- if(zdbj==0&&bjkg==1&&set==0)
- {
- if(shi==nz_shi&&fen==nz_fen)
- bj=1;
- else
- {
- fmq=1;
- bj=0;
- }
- }
-
- }
- /*****语音报时函数*****/
- void bofang(uc broadcast,uc *str) //两个参数(节目,数组指针)
- {
- uc length,length_finish; //根据芯片秒数声明播放语句数(大约每句1秒)?
- // length=1;
- if(broadcast==1) //播放模式1 只报时间
- {
- length=15; //从第15句开始
- length_finish=26; //到第26句结束
- }
- else if(broadcast==2) //播放模式2 报时间和日期
- {
- length=0;
- length_finish=26;
- }
- else if(broadcast==3) //播放模式3 报时间和温度
- {
- length=15;
- length_finish=33;
- }
- else if(broadcast==4) //播放模式4 报时间和日期 温度
- {
- length=0; //从第0句开始
- length_finish=33; //到第33句结束
- }
- else //否则不播放 模式0
- {
- length=1; //从第1句开始
- length_finish=1; //到第1句结束
- }
-
- if(length<length_finish)
- {
- TR0=0; //关闭定时器
- //speak(25); //车站大厅音乐-------开机音乐 */
- while(length<length_finish/*&&flag_bofang*/) //最大32
- {
- if(yyxp_busy==1) //
- {
- if(length==15||length==26) //如果播报从15句或26句开始
- delayms(200); //延时0.2秒
- switch (length)
- { //x?
-
- case 0:speak(25);length++;break; //报时音乐
- case 1:speak(27); length++;break; //今天是
- case 2:if(*str!=0) speak(*str+1); else speak(1);length++;break; //年十位
- case 3:if(*(str+1)!=0) speak(*(str+1)+1); else speak(1);length++;break; //年个位
- case 4:speak(16);length++;break; //年
- case 5:if(*(str+2)!=0) {speak(11);length++;} else length++; break;//月十位 为1时播报十,为0时不播报
- case 6:if(*(str+3)!=0) {speak(*(str+3)+1);length++;} else length++;break; //月个位
- case 7:speak(17);length++;break; //月
- case 8:if(*(str+4)==1) length++; else if(*(str+4)>1) {speak(*(str+4)+1);length++;}else length+=2;break;//日十位 为1时跳到case 10播报十,大于1时播报数字并跳到case 10播报十,为0十时不播报跳到case 11
- case 9:speak(11);length++;break; //十
- case 10:if(*(str+5)!=0) {speak(*(str+5)+1);length++;} else length++;break; //日个位
- case 11:speak(18);length++;break; //日
- case 12:speak(19);length++;break; //星期
- case 13:if(*(str+6)==7) length++; else {speak(*(str+6)+1);length=16;} break; //
- case 14:speak(18);length+=2;break; //日
- case 15:speak(25);length++;break; //音乐1,3模式报
- case 16:speak(22);length++;break; //现在时刻北京时间
- case 17:if(*(str+7)==1) length++; else if(*(str+7)>1) {speak(*(str+7)+1);length++;}else length+=2;break; //
- //时十位 为1时跳到case 17播报十,大于1时播报数字并跳到case 17播报十,为0十时不播报跳到case 15
- case 18:speak(11);length++;break; //十
- case 19:if(*(str+8)!=0) speak(*(str+8)+1);if(*(str+7)==0&&*(str+8)==0)speak(1);length++;break; //时个位
- case 20:speak(13);length++;break; //点 ---此处修改speak(22为speak(13)
-
- case 21:
- if(*(str+9)==1)
- length++;
- else if(*(str+9)>1)
- {
- speak(*(str+9)+1);
- length++;
- }
- else if((*(str+9))==0&&(*(str+10))==0)
- {
- if((*(str+11))==0&&(*(str+12))==0)
- length=25;
- else
- length+=2;
- }
- else if((*(str+9))==0&&(*(str+10))!=0)
- {
- speak(1);length+=2;
- }
- break;
- //分十位 为1时跳到case 10播报十,大于1时播报数字并跳到case 10播报十,为0十时不播报跳到case 19
- case 22:speak(11);length++;break; //十
- case 23:if(*(str+10)!=0)speak(*(str+10)+1); if(*(str+9)==0&&*(str+10)==0)speak(1);length++;break; //分个位
- case 24:speak(14);length+=2;break; //分
-
- /*case 21:if(*(str+11)==1) length++; //不播报秒
- else if(*(str+11)>1) {speak(*(str+11)+1);length++;}
- else if(*(str+11)==0&&*(str+12)!=0){speak(1);length+=2;}
- else if(*(str+11)==0&&*(str+12)==0){length+=2;}break;
- //秒十位 为1时跳到case 22播报十,大于1时播报数字并跳到case 22播报十,秒十位为0秒个位不为0时播报0跳到case 23,
- //秒数据为0时不播报跳到case 23
- //case 22:speak(11);length++;break; //十
- //case 23:if(*(str+12)!=0) speak(*(str+12)+1);if(*(str+11)==0&&*(str+12)==0)speak(1);length++;break; //秒个位
- //case 24:speak(15);length=26;break; //秒 ---此处修改speak(24)为speak(15) */
- case 25:speak(26);length++;break; //整 ---此处修改speak(21)为speak(26)
-
- case 26:speak(23);length++;break; //当前温度 ---- 此处修改speak(15)为speak(23)
-
- case 27:if(*(str+13)==1) length++; else if(*(str+13)>1) {speak(*(str+13)+1);length++;}else length+=2;break;//温度十位 为1时跳到case 10播报十,大于1时播报数字并跳到case 10播报十,为0十时不播报跳到case 11
- case 28:speak(11);length++;break; //十
- case 29:if(*(str+14)!=0) speak(*(str+14)+1);length++;break; //温度个位
- case 30:speak(13);length++;break; //点 ----此处修改speak(22)为speak(13)
- case 31:if(*(str+15)!=0) speak(*(str+15)+1);else speak(1);length++;break; //温度小数位
- case 32:speak(20);length++;break; // 度----此处修改speak(16)为speak(20)
-
- }
- yydelay(2);
- }
- }
- TR0=1;
- while(!yyxp_busy); //等待播完
-
- bs=0;
- delayms(100);
- }
- }
- /*****秒灯控制函数*****/
- void sec_led(void)
- {
- if(set==0)
- deng=h; //秒灯闪烁
- if(set==1)
- deng=1; //按下set键关秒灯
-
- }
-
- /*****定时器T0*****/
- void init()
- {
- EA=1;
- ET0=1;
- TMOD=0x01;
- TH0=0x3c; //12M 50ms
- TL0=0xb0;
- TR0=1;
-
-
- }
-
- /*****主函数*****/
- void main()
- {
- uc aa;
- init(); //定时器初始化,启动定时器0
- // DS12C887_init() // 初始化ds12c887,仅限初次使用,以后不必写入
- // InitDis (); //初始化7219
-
-
- for(aa=0;aa<30;aa++) //10毫秒读取一次温度,读取30次
- {
- ds18b20();
- delayms(10);
- }
- fmq=0; //蜂鸣器长鸣
- delayms(200);
- fmq=1;
- delayms(100);
- init_eeprom(); //eeprom初始化
- while(1) //循环执行
- {
- key(); //按键扫描
- ds12c887(); //获取时间
- ds18b20(); //获取温度
- sec_led();
- display(); //显示
- clock_dis(); //闹钟输出
- if((fen==0)&&(miao==0)&&set==0) // hour,min,sec
- {
- if(shi>=7&&shi<=21) //7点到21点播报
- bs=1;
- if(bs==1)
- bofang(mode,disbuff);
- }
-
- /* if(shi>=7&&shi<=21) //白天亮度
- {
- WriteWord_1 (Intensity,11);
- WriteWord_2 (Intensity,10);
- WriteWord_3 (Intensity,11);
- }
- else if(shi<7||shi>21) //夜间节能模式
- {
- WriteWord_1 (Intensity,0);
- WriteWord_2 (Intensity,0);
- WriteWord_3 (Intensity,0);
- } */
- }
- }
- void time() interrupt 1 //中断函数
- {
-
- TH0=0x3c; //12M 50ms
- TL0=0xb0; //定时50毫秒(晶振12M)
- ee++; //记录溢出次数
- if(ee==10) //溢出达到10次
- {
- h=~h; //秒点每秒闪烁一次
- ee=0;
- if(bj==1)
- fmq=!fmq; //蜂鸣器每秒短叫一次
-
- }
-
- }
复制代码
Keil代码下载:
LED万年历.zip
(257.94 KB, 下载次数: 43)
|