需要一个C或C++编成的单片机万年历程序,有矩阵键盘作计算器,用1602,不必温度,不用时间芯片。要闹钟。

不想打字的可以发我邮箱[email protected],请在3天内给我,急需,谢谢。万年历只要阳历,4x4矩阵键盘只需加减,然后用来查时间,设闹钟,其他功能随意,反正不能用时钟芯片。急需,3天。1602显示。89c52单片机。USB2.0接口供电。谢谢。
要求能记录掉电前1秒的时间,急需。。。。

第1个回答  2012-12-03
无分啊发送给您
DS1302 + DS18B20 1602显示
我在PROTUES仿真你
程序的程序很简单的画电路图模块化的方式
/ *初始化* / BR />#定义uint无符号整数
定义UCHAR无符号的字符
“UCHAR代码”选项卡[] =“20 - ”
码表UCHAR [] =“::”;
> UCHAR代码的TTable [] = {“现在温度:”};
SBIT RS = P3 ^ 0;
SBIT E = P3 ^ 1;
SBIT按钮1 = P1 ^ 0; ...... /> SBIT按钮2 = P1 ^ 3;
SBIT将Button3 = P1 ^ 6;
SBIT RST = P2 ^ 5;
SBIT SCLK = P2 ^ 6;
SBIT IO = P2 ^ 7;
SBIT ACC7 = ACC ^ 7;
SBIT DQ = P3 ^ 6;
字符的小时,分??钟,秒,N,K,周,日,月,YEAR1 = 20,年,NN,标志;
UCHAR键= 0;
UINT温度,;
无效延迟(UINT X)
{
而( - ); BR />}
:无效write_zl(UCHAR ZL)
{E = 0;
RS = 0;
P0 = ZL;
E = 1;
>延迟(500);
E = 0;
}
:无效write_sj(UCHAR SJ)
{E = 0;
RS = 1;
P0 = SJ
E = 1;
延迟(500);
E = 0;
}
的无效init_lcd()
{
write_zl(0x38);/ /打开显示
write_zl(0X01);/ /清除屏幕
write_zl(0X06)/ /整个屏幕不动,
write_zl(0x0C)的; / /打开的游标
}
/ * 18B20 * /部分
无效init_18b20()
{DQ = 1;
延迟(8); / /延时 BR /> DQ = 0;
延迟(80);
DQ = 1;的
延迟的(20); BR />}
的无效write_dat(UCHAR DAT) BR /> {UCHAR我,K;
K = DAT
用于(i = 0; <8; i + +)
{DQ = 0;
DQ = K &0x01; / /开始从低
延迟(5);
DQ = 1;
K >> = 1;
}
延迟(4 );
}

read_sj()
{
UCHAR J,日
(J = 0,J <8; + + )
{
DQ = 1;
延迟时间(1);
DQ = 0;
日期=日期>> 1;
DQ = 1;
(DQ == 1)/ /
日期| = 0X80;
延迟(4);}
回报率(日);

}
的无效temperaturechange(至)
{UINT tempH的tempL;一个
init_18b20的();的
write_dat(0XCC);/ /只有一个操作系统跳过读序号操作
write_dat(0×44)/ /启动温度转换
的延迟(60000);
的延迟(33750);/ /需要93.75ms
init_18b20(); BR /> write_dat的(0XCC);
write_dat(从0xBE);/ /读取温度寄存器

tempL = read_sj();/ /读取温度LSB
tempH = read_sj ();/ /读取温度高MSB
(tempH 0x80)的/ /高5平1负
{A = 1;
(温度= tempH);
TEM <<; = 8; / / 16
温度,温度tempL; / /合并高,低的中位数
温度=??TEM +1;
透射电子显微镜TEM(0.0625);
}
其他
{
= 0;
温度=((tempH * 256)+ tempL)* 0.0625 ;/ /转换成实际温度
} }
的无效write_temperature(UINT临时)/ /函数调用必须是第一个
{UINT白石,GE的
白= temp/100
石= temp% 100/10;
GE = temp%10;
(== 1)
{(市> 0)
{write_zl(0X80 +0 X50 + 3)
write_sj(“ - ”);
write_zl(0X80 +0 X50 +4);
write_sj(0X30 +石);}
其他
{ /> write_zl(0X80 +0 X50 +3);
write_sj(0X00);
write_zl(0X80 +0 X50 +4);
write_sj(' - ');} }

其他
{
(白> 0)/ /如果白石肯定有
{
write_zl地址(0x80 + 0x50的+3);
write_sj(0X30 +白);
write_zl(0X80 +0 X50 +4);
write_sj(0X30 +市);
} </其他

{
(市> 0)/ /或决定是否施
{
write_zl(0X80 +0 X50 +4); ...... /> write_sj(0X30 +石);
}
其他
{
write_zl(0X80 +0 X50 +4);
write_sj(0×00);
>}
write_zl(0X80 +0 X50 +3);
write_sj(0X00);
}
}

write_zl地址(0x80 +0×50 +5)/ /位市民总显示
write_sj(0X30 +通用电气公司);
}

/ * DS1302部分* / />的无效DS1302_write(UCHAR shju)
{UCHAR,J;
= shju方法;
为(J = 0,J <8; + +)
{IO = &0x01;
SCLK = 0;
SCLK = 1;

S = S >> 1;
}
:UCHAR DS1302_readbyte() BR /> {UCHAR I,R = 0;
SCLK = 0;
延迟(10);
为(I = 8;> 0; I - )
{
ACC = ACC >> 1;
ACC7 = IO;
SCLK = 1;
SCLK = 0;
}
回报率(ACC); BR /> / * {
R = R >> 1;
(IO == 1)
R = R | 0X80;
SCLK = 1;
SCLK = 0;
}
回报率(R); * /}

的的无效DS1302write(UCHAR DZ,UCHAR;门头沟区)/ /初始化1302
{RST = 1;
SCLK = 0;
DS1302_write(DZ);
DS1302_write(;门头沟区);
SCLK = 1;
RST = 0;
}
无效start1302()
{UCHAR数;
为(NUM = 0;数<13; NUM + +)
{write_sj(标签[NUM]);}
(NUM = 13;数<16; NUM + +)
{write_sj(标签[NUM]);}
write_zl地址(0x80 +0×40);
(NUM = 0;数<12; NUM + +)
{write_sj(表[NUM]);
}}
无效write_hms(UCHAR添加,UCHAR SJ)/ /调用函数必须是前 BR /> {UCHAR市,GE
市= sj/10;
GE = SJ 10%;
write_zl地址(0x80 +0 X40 + ADD);
write_sj(0X30 +市);
write_sj(0X30 + GE);}
无效write_nyr(UCHAR添加,UCHAR SJ)
{UCHAR市,GE
石=(sj/10)
GE =(SJ 10%);
write_zl地址(0x80 +添加);
write_sj(0X30 +石);
write_sj(0X30 + GE);} 无效write_XQ(UCHAR周)
{write_zl地址(0x80 +13);
的开关(周)
{2:write_sj('M'); write_sj('O'); write_sj ('N');突破;
3:write_sj('T'); write_sj('U'); write_sj('E');突破;
情况4:write_sj('W' ); write_sj('E'); write_sj('D');突破;
5:write_sj('T'); write_sj('H'); write_sj('U');突破;
的情况下:write_sj('F'); write_sj('R'); write_sj('I');突破;
案例7:write_sj('S'); write_sj('A'); write_sj ('T');休息;
情况1:write_sj('S'); write_sj('U'); write_sj('N');休息;
}
}
无效write_day(UCHAR RUE)
{
开关(真)
{
案件1:NN = 31;打破;
案例2:如果((年%4 == 0 &&年%100 = 0)| |一年%400 == 0)
NN = 29;
其他
NN = 28;打破;
情况下, 3:NN = 31;打破;
情况下,4:NN = 30;打破;
案例5:NN = 31;打破;
案例6:NN = 30;打破;
>个案7:NN = 31;打破;
8:NN = 31;打破;
9:NN = 30;打破;
情况下,10:NN = 31;休息; BR />案例11:NN = 30;打破;
情况下,12:NN = 31;打破;
}
无效键盘(){

(按钮== 0)
{延迟(5);
(按钮== 0)
{(按钮== 0);
键+ +;标志= 1
开关(钥匙)
{1:write_zl地址(0x80 +0×40 +10);
write_zl(为0x0F);/ /山硕
案例2:write_zl地址(0x80 +0×40 +7);休息;
案例3:write_zl地址(0x80 +0×40 +4);突破;
情况4:write_zl地址(0x80 +10);突破;
案例5:write_zl地址(0x80 +7);突破;
情况6:write_zl(0x80的+4);突破;
案例7:write_zl(0X80 +2);突破;
情况下, :关键= 0;
write_zl(0X0C);
标志= 0;
DS1302write(80H时,第二);
DS1302write(0X82分);
DS1302write(的0x84小时);
DS1302write(0x86,每天);
DS1302write(均为0x88,月);
DS1302write(0x8A,周);
DS1302write(0x8C,今年);突破;
}
}
(button2的== 0)
{延迟(10);
(button2的== 0)
{ (button2的== 0);
开关(钥匙)
{案例1:第二+ +;(第二== 60)= 0;
write_hms(10秒); write_zl地址(0x80 +0×40 +10);休息;
情况下,2分钟+ +;(分钟== 60)分钟= 0;
write_hms(7分钟); write_zl(0x80的+0 X40 +7);休息;
情况下,3小时+ +;如果(小时== 24)小时= 0;
write_hms(4小时); write_zl(0X80 +0×40 +4);突破
案例4:日+ +;周+ +;
(周== 8)= 1星期write_XQ(周);
write_day(个月),如果(日== NN +1)天= 1;
write_nyr(10天); write_zl(0X80 +10);突破;
情况下,5个月+ +;如果(月== 13)个月= 1;
write_nyr(7月); write_zl(0X80 +7);突破;
情况下,6年+ +;如果(== 100)年= 0;
write_nyr(4,一年); write_zl(0x80的+4);突破;
个案7:YEAR1 + +;如果(YEAR1 == 100)YEAR1 = 0;
write_nyr次(2 YEAR1); write_zl(0X80 +2 );突破;
}}}
(Button3的== 0)
{延迟(10);
(Button3的== 0)
{( Button3的== 0);
开关(钥匙)
{案例1:第二 - (第二个<0)= 59;
write_hms(10秒); write_zl(0X80 + 0×40 +10);休息;
情况下,2分钟 - 如果(分钟)分钟= 59;
write_hms(7分钟); write_zl地址(0x80 +0×40 +7);突破
案例3:小时 - (小时)小时= 23;
write_hms(4小时); write_zl(0X80 +0×40 +4);突破;
情况下, :周 - 如果== 0)周(周= 7; write_XQ(周);
一天 - write_day(个月),如果(日== 0)天= NN;:
write_nyr(10 ,日); write_zl地址(0x80 +10);突破;
情况下,5个月 - 如果== 0)(月月= 12;
write_nyr(7月); write_zl(0x80的+7
情况下,6年 - 如果(年)年= 99;
write_nyr(4年); write_zl(0x80的+4);突破;
情况下,7);突破; :YEAR1 - 如果(YEAR1 <0)YEAR1 = 99;
write_nyr(2 YEAR1); write_zl(0X80 +2);打破;}
}}

}

无效DS1302_sfm()
{UCHAR A,B;的
RST = 1; / /在启动过程中的数据转换
DS1302_write(0x81表示高)
第二DS1302_readbyte();
RST = 0 ;/ /结束转换
= second/16 ;/ / BCD码转换器
B =第二个%16;
> = A * 10 + B;
write_hms(10秒);
/ /子
RST = 1;
DS1302_write(0X83);
分钟DS1302_readbyte();
一个= minute/16;
B =分钟16%;
分钟= A * 10 + B;
write_hms(7分钟); ...... / RST = 0;

/ / RST = 1;
DS1302_write的(0x85);
小时= DS1302_readbyte();
RST = 0; BR />一个= hour/16;
B =小时16%;
小时= A * 10 + B;
write_hms(4小时); RST = 1; BR /> / /日

天的
DS1302_write的(87H的); = DS1302_readbyte();
RST = 0;
= day/16;
B = 16天;
天= A * 10 + B;
write_nyr(10天);

/ /一月RST = 1;
DS1302_write(0x89)
月DS1302_readbyte();
RST = 0;
一个= month/16;
B =个月的16%;
月= A * 10 + B ;
write_nyr(7个月);
/ /周
RST = 1;
DS1302_write的(0x8B);
本周DS1302_readbyte(); / RST = 0;
一个= week/16;
B =周16%;
周= A * 10 + B;
write_XQ(周IO); ...... /> / /
SCLK = 0;
延迟(5);
RST = 1;
DS1302_write的(0x8D);
= 1; BR />年= DS1302_readbyte();
RST = 0;
延迟(5);
SCLK = 1;
一个= year/16;
B = %16年;
年= A * 10 + B;
write_nyr(4年);
}
/ *总计划* /
包括 reg51.h>
包括
包括

无效的主要()
{
init_lcd();

start1302();
(1)
{
RST = 0;
键盘();
(标志== 0)/ /标志为0,否则读1302的关键是无效
DS1302_sfm();

write_zl地址(0x80 +0×10); BR />(N = 0,N <16,N + +)
write_sj(TTable的[N]);
temperaturechange();
write_temperature(TEM);
}
}
第2个回答  2012-12-14
http://blog.csdn.net/yangluoning/article/details/8041071
自己下载,没有掉电保存功能
第3个回答  2012-12-03
这么庞杂的东西,在这里要人和盘托出,不现实。。。。。。
相似回答