基于单片机和DS1302电子万年历的设计(5)

2019-06-11 00:37

武汉理工大学《单片机原理与应用》课程设计说明书

{

if(key2==0) //上调键 {

delay(10); if(key2==0) {

buzzer=0;//蜂鸣器短响一次 delay(20); buzzer=1; while(!key2); switch(key1n) {

case 1:miao++;//设置键按动1次,调秒 if(miao==60)

miao=0;//秒超过59,再加1,就归零

write_sfm(0x08,miao);//令LCD在正确位置显示\加\设定好的秒数

temp=(miao)/10*16+(miao);//十进制转换成DS1302要求的BCD码 write_1302(0x8e,0x00); //允许写,禁止写保护

write_1302(0x80,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码 write_1302(0x8e,0x80); //打开写保护

write_1602com(er+0x09);//因为设置液晶的模式是写入数据后,光标自动右移,所以要指定返回 //write_1602com(0x0b); break; case 2:fen++; if(fen==60) fen=0;

write_sfm(0x05,fen);//令LCD在正确位置显示\加\设定好的分数据 temp=(fen)/10*16+(fen);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护

write_1302(0x82,temp);//向DS1302内写分寄存器82H写入调整后的分数据BCD码 write_1302(0x8e,0x80);//打开写保护

write_1602com(er+6);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置

break; case 3:shi++; if(shi==24) shi=0;

write_sfm(2,shi);//令LCD在正确的位置显示\加\设定好的小时数据 temp=(shi)/10*16+(shi);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护

write_1302(0x84,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码 write_1302(0x8e,0x80);//打开写保护

write_1602com(er+3);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break;

case 4:week++;

21

武汉理工大学《单片机原理与应用》课程设计说明书

if(week==8) week=1;

write_1602com(yh+0x0C);//指定'加'后的周数据显示位置 write_week(week);//指定周数据显示内容

temp=(week)/10*16+(week);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护

write_1302(0x8a,temp);//向DS1302内写周寄存器8aH写入调整后的周数据BCD码 write_1302(0x8e,0x80);//打开写保护

write_1602com(yh+0x0e);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位

break; case 5:ri++; if(ri==32) ri=1;

write_nyr(9,ri);//令LCD在正确的位置显示\加\设定好的日期数据 temp=(ri)/10*16+(ri);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护

write_1302(0x86,temp);//向DS1302内写日期寄存器86H写入调整后的日期数据BCD码 write_1302(0x8e,0x80);//打开写保护

write_1602com(yh+10);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break; case 6:yue++; if(yue==13) yue=1;

write_nyr(6,yue);//令LCD在正确的位置显示\加\设定好的月份数据 temp=(yue)/10*16+(yue);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护

write_1302(0x88,temp);//向DS1302内写月份寄存器88H写入调整后的月份数据BCD码 write_1302(0x8e,0x80);//打开写保护

write_1602com(yh+7);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break; case 7:nian++; if(nian==100) nian=0;

write_nyr(3,nian);//令LCD在正确的位置显示\加\设定好的年份数据

temp=(nian)/10*16+(nian);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护

write_1302(0x8c,temp);//向DS1302内写年份寄存器8cH写入调整后的年份数据BCD码 write_1302(0x8e,0x80);//打开写保护

write_1602com(yh+4);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break; } } }

//------------------减键key3,各句功能参照'加键'注释---------------

22

武汉理工大学《单片机原理与应用》课程设计说明书

if(key3==0) {

delay(10);//调延时,消抖动 if(key3==0) {

buzzer=0;//蜂鸣器短响一次 delay(20); buzzer=1; while(!key3); switch(key1n) {

case 1:miao--; if(miao==-1)

miao=59;//秒数据减到-1时自动变成59

write_sfm(0x08,miao);//在LCD的正确位置显示改变后新的秒数

temp=(miao)/10*16+(miao);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00); //允许写,禁止写保护

write_1302(0x80,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码 write_1302(0x8e,0x80); //打开写保护

write_1602com(er+0x09);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置

//write_1602com(0x0b); break; case 2:fen--; if(fen==-1) fen=59;

write_sfm(5,fen);

temp=(fen)/10*16+(fen);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护

write_1302(0x82,temp);//向DS1302内写分寄存器82H写入调整后的分数据BCD码 write_1302(0x8e,0x80);//打开写保护

write_1602com(er+6);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置

break;

case 3:shi--; if(shi==-1) shi=23;

write_sfm(2,shi);

temp=(shi)/10*16+(shi);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护

write_1302(0x84,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码 write_1302(0x8e,0x80);//打开写保护

write_1602com(er+3);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break;

23

武汉理工大学《单片机原理与应用》课程设计说明书

case 4:week--; if(week==0) week=7;

write_1602com(yh+0x0C);//指定'加'后的周数据显示位置 write_week(week);//指定周数据显示内容

temp=(week)/10*16+(week);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护

write_1302(0x8a,temp);//向DS1302内写周寄存器8aH写入调整后的周数据BCD码 write_1302(0x8e,0x80);//打开写保护

write_1602com(yh+0x0e);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位

break; case 5:ri--; if(ri==0) ri=31;

write_nyr(9,ri);

temp=(ri)/10*16+(ri);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护

write_1302(0x86,temp);//向DS1302内写日期寄存器86H写入调整后的日期数据BCD码 write_1302(0x8e,0x80);//打开写保护

write_1602com(yh+10);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break;

case 6:yue--; if(yue==0) yue=12;

write_nyr(6,yue);

temp=(yue)/10*16+(yue);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护

write_1302(0x88,temp);//向DS1302内写月份寄存器88H写入调整后的月份数据BCD码 write_1302(0x8e,0x80);//打开写保护

write_1602com(yh+7);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break; case 7:nian--; if(nian==-1) nian=99;

write_nyr(3,nian);

temp=(nian)/10*16+(nian);//十进制转换成DS1302要求的DCB码 write_1302(0x8e,0x00);//允许写,禁止写保护

write_1302(0x8c,temp);//向DS1302内写年份寄存器8cH写入调整后的年份数据BCD码 write_1302(0x8e,0x80);//打开写保护

write_1602com(yh+4);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位 break; } }

24

武汉理工大学《单片机原理与应用》课程设计说明书

} } }

void init() //定时器、计数器设置函数 {

TMOD=0x11; //指定定时/计数器的工作方式为3 TH0=0; //定时器T0的高四位=0 TL0=0; //定时器T0的低四位=0 EA=1; //系统允许有开放的中断 ET0=1; //允许T0中断

TR0=1; //开启中断,启动定时器 }

//*******************主函数************************** void main() {

lcd_init(); //调用液晶屏初始化子函数

ds1302_init(); //调用DS1302时钟的初始化子函数 init(); //调用定时计数器的设置子函数 //led=0; //打开LCD的背光电源 buzzer=0;//蜂鸣器长响一次 delay(80); buzzer=1;

while(1) //无限循环下面的语句: {

keyscan(); //调用键盘扫描子函数 } }

void timer0() interrupt 1 //取得并显示日历和时间 {

//Init_DS18B20();//温度传感器DS18b2初始化子函数,在头文件中

flag=ReadTemperature();//将18b20头文件运行返回的函数结果送到变量FLAG中,用于显示 //读取秒时分周日月年七个数据(DS1302的读寄存器与写寄存器不一样): miao = BCD_Decimal(read_1302(0x81)); fen = BCD_Decimal(read_1302(0x83)); shi = BCD_Decimal(read_1302(0x85)); ri = BCD_Decimal(read_1302(0x87)); yue = BCD_Decimal(read_1302(0x89)); nian=BCD_Decimal(read_1302(0x8d)); week=BCD_Decimal(read_1302(0x8b)); //显示温度、秒、时、分数据:

write_temp(12,flag);//显示温度,从第二行第12个字符后开始显示

write_sfm(8,miao);//秒,从第二行第8个字后开始显示(调用时分秒显示子函数) write_sfm(5,fen);//分,从第二行第5个字符后开始显示 write_sfm(2,shi);//小时,从第二行第2个字符后开始显示 //显示日、月、年数据:

25

武汉理工大学《单片机原理与应用》课程设计说明书

write_nyr(9,ri);//日期,从第二行第9个字符后开始显示

write_nyr(6,yue);//月份,从第二行第6个字符后开始显示 write_nyr(3,nian);//年,从第二行第3个字符后开始显示 write_week(week); }

26


基于单片机和DS1302电子万年历的设计(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:浙江舟山五峙山列岛鸟类省级自然保护区

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: