标题:
用LED制作数码管万年历 单片机+ds12c887+max7219 附源程序
[打印本页]
作者:
kz0018
时间:
2022-10-23 11:05
标题:
用LED制作数码管万年历 单片机+ds12c887+max7219 附源程序
长期以来,一直想做一个大数码管万年历,但大数码管笔段大都为几个LED串联组成,显示部分需要较高的电压,不能与单片机共用5v电源。这将使电路复杂化。前些时候受本论坛一个网友的启发,时间显示部分用多只LED并联组成8字形“数码管”,公历农历日期温度都用0.8吋数码管,制作万年历成功,用手机充电器供电,十分方便。单片机用STC89c52RC,时间获取用DS12C887,显示驱动用三支7219级联完成。电路图手工谅解制作,画的不好,望网友们谅解。
电路原理图如下:
万年历原理图.PNG
(94.48 KB, 下载次数: 35)
下载附件
2022-10-23 11:00 上传
单片机源程序如下:
/*************说明*************************************************
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, 下载次数: 49)
2022-10-23 11:03 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1