欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
用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.raoushi.com/bbs/)
Powered by Discuz! X3.1