基于单片机的万年历源代码程序.docx
- 文档编号:4597393
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:43
- 大小:21.88KB
基于单片机的万年历源代码程序.docx
《基于单片机的万年历源代码程序.docx》由会员分享,可在线阅读,更多相关《基于单片机的万年历源代码程序.docx(43页珍藏版)》请在冰豆网上搜索。
基于单片机的万年历源代码程序
基于单片机的万年历源代码程序
源程序代码如下:
#include
#include
unsignedcharcodedisplaywelcome[]={"WelcomeToMyLcdTimer"};//欢迎界面
unsignedcharcodedisplaywish[]={"HappyEveryDay^_^"};//欢迎界面
unsignedcharcodeovertemperature[]={"OVERTEMPERATURE!
"};
unsignedcharcodedigit[]={"0123456789"};//数字代码
unsignedcharmode,TH,TL,TN,TD,length,tempswitch,Maxtemp=40,amode,alarmmode,minutes,hours,
minutea,seconds,houra=12;
sbitSCLK=P1^0;//DS1302时钟输入
sbitDATE=P1^1;//DS1302数据输入
sbitREST=P1^2;//DS1302复位端口
sbitSET=P1^4;//DS1302设置模式选择位
sbitADD=P1^5;//增加
sbitRED=P1^6;//减小
sbitCANL=P1^7;
voiddelay1ms(inti)//1毫秒延时
{
intj,k;
while(i--)
for(j=76;j>1;j--);
for(k=29;k>1;k--);
}
voiddelaynus(unsignedcharn)//延时若干微秒
{
unsignedchari;
for(i=0;i } /***********蜂鸣器模块************/ sbitbeep=P3^6;//位定义,定义P.6位fmp voiddely500(void) { unsignedchari; for(i=250;i>0;i--) { _nop_(); } } voidbaojing(unsignedcharn) { unsignedcharx,i; while(n--) { for(i=0;i<5;i++) { for(x=0;x<200;x++) { beep=~beep; dely500(); } } for(i=0;i<3;i++) { for(x=0;x<200;x++) { beep=~beep; dely500(); dely500(); } } } } /*******DS1302模块*************/ voidWrite1302(unsignedchardate)//向1302写数据 { unsignedchari; SCLK=0; delaynus (2); for(i=0;i<8;i++) { DATE=date&0x01; SCLK=1; delaynus (2); SCLK=0; delaynus (2); date>>=1; } } voidWriteSet1302(unsignedcharcmd,unsignedchardate)//根据相应的命令输入相应的数据 { REST=0; SCLK=0; REST=1; Write1302(cmd); delaynus(5); Write1302(date); SCLK=1; REST=0; } unsignedcharRead1302(void)//读取1302数据 { unsignedchari,date; delaynus (2); for(i=0;i<8;i++) { date>>=1; if(DATE==1) date|=0x80; SCLK=1; delaynus (2); SCLK=0; delaynus (2); } returndate; } unsignedcharReadSet1302(unsignedcharcmd)//根据命令读取1302相应的值 { unsignedchardate; REST=0; SCLK=0; REST=1; Write1302(cmd); delaynus (2); date=Read1302(); SCLK=1; REST=0; returndate; } voidIntDS1302(void)//DS1302初始化 { unsignedcharflag; flag=ReadSet1302(0x81); if(flag&0x80){//判断时钟芯片是否关闭 WriteSet1302(0x8E,0x00);//根据写状态寄存器命令字,写入不保护指令 WriteSet1302(0x80,((0/10)<<4|(0%10)));//根据写秒寄存器命令字,写入秒的初始值 WriteSet1302(0x82,((0/10)<<4|(0%10)));//根据写分寄存器命令字,写入分的初始值 WriteSet1302(0x84,((0/10)<<4|(0%10)));//根据写小时寄存器命令字,写入小时的初始值 WriteSet1302(0x86,((0/10)<<4|(0%10)));//根据写日寄存器命令字,写入日的初始值 WriteSet1302(0x88,((0/10)<<4|(0%10)));//根据写月寄存器命令字,写入月的初始值 WriteSet1302(0x8c,((10/10)<<4|(10%10)));//根据写年寄存器命令字,写入年的初始值 WriteSet1302(0x90,0xa5);//打开充电功能选择2K电阻充电方式 WriteSet1302(0x8E,0x80);//根据写状态寄存器命令字,写入保护指令 } } /***************液晶显示模块*****************/ sbitRS=P2^5; sbitRW=P2^6; sbitE=P2^7; sbitBF=P0^7; /*液晶忙检测*/ bitBusyTest(void) { bitresult; RS=0; RW=1; E=1; _nop_(); _nop_(); _nop_(); result=BF; _nop_(); _nop_(); _nop_(); E=0; returnresult; } /*写指令*/ voidWrite_com(unsignedcharcommand) { while(BusyTest()! =0); RS=0; RW=0; E=0; _nop_(); _nop_(); _nop_(); P0=command; _nop_(); _nop_(); _nop_(); E=1; _nop_(); _nop_(); _nop_(); E=0; } /*写地址*/ voidWrite_Address(unsignedcharaddress) { Write_com(address|0x80); delay1ms (1); } /*写数据*/ voidWrite_Date(unsignedchardate) { RS=1; RW=0; E=0; _nop_(); _nop_(); _nop_(); P0=date; _nop_(); _nop_(); _nop_(); E=1; _nop_(); _nop_(); _nop_(); E=0; delay1ms (1); } /*初始化*/ voidLcd_Int(void) { Write_com(0x38); delay1ms (1); Write_com(0x38); delay1ms (1); Write_com(0x06); delay1ms (1); Write_com(0x0c); delay1ms (1); Write_com(0x01); } voiddisplaymainpart(void)//显示液晶主要部分(不变化部分) { Write_Address(0x01); delay1ms (1); Write_Date('D'); Write_Date('A'); Write_Date('T'); Write_Date('E'); Write_Date(': '); delay1ms (1); Write_Address(0x0A); delay1ms (1); Write_Date('-'); Write_Address(0x0D); Write_Date('-'); Write_Address(0x42); Write_Date('T'); Write_Date('I'); Write_Date('M'); Write_Date('E'); Write_Date(': '); Write_Address(0x4A); Write_Date('-'); Write_Address(0x4D); Write_Date('-'); Write_Address(0x06); Write_Date('2'); Write_Date('0'); } voiddisplay_Second(unsignedcharsecond)//在液晶上显示秒 { unsignedchari,j; i=second/10; j=second%10; Write_Address(0x4E); Write_Date(digit[i]); Write_Date(digit[j]); delay1ms (1); } voiddisplay_Minute(unsignedcharminute)//在液晶上显示分 { unsignedchari,j; i=minute/10; j=minute%10; Write_Address(0x4B); Write_Date(digit[i]); Write_Date(digit[j]); delay1ms (1); } voiddisplay_Hour(unsignedcharhour)//在液晶上显示时 { unsignedchari,j; i=hour/10; j=hour%10; Write_Address(0x48); Write_Date(digit[i]); Write_Date(digit[j]); delay1ms (1); } voiddisplay_Day(unsignedcharday)//在液晶上显示日 { unsignedchari,j; i=day/10; j=day%10; Write_Address(0x0E); Write_Date(digit[i]); Write_Date(digit[j]); delay1ms (1); } voiddisplay_Month(unsignedcharmonth)//在液晶上显示月 { unsignedchari,j; i=month/10; j=month%10; Write_Address(0x0B); Write_Date(digit[i]); Write_Date(digit[j]); delay1ms (1); } voiddisplay_Year(unsignedcharyear)//在液晶上显示年 { unsignedchari,j; i=year/10; j=year%10; Write_Address(0x08); Write_Date(digit[i]); Write_Date(digit[j]); delay1ms (1); } voiddisplay_houra(unsignedcharx)//闹钟小时部分显示 { unsignedchari,j; i=x/10; j=x%10; Write_Address(0x44); Write_Date(digit[i]); Write_Date(digit[j]); } voiddisplay_minutea(unsignedcharx)//闹钟分钟部分显示 { unsignedchari,j; i=x/10; j=x%10; Write_Address(0x47); Write_Date(digit[i]); Write_Date(digit[j]); } voiddisplay_Time(void)//显示实时时间 { unsignedcharvalue,day,month,year; Write_com(0x0c); value=ReadSet1302(0x81); seconds=(((value&0x70)>>4)*10+(value&0x0f)); display_Second(seconds); value=ReadSet1302(0x83); minutes=(((value&0x70)>>4)*10+(value&0x0f)); display_Minute(minutes); value=ReadSet1302(0x85); hours=(((value&0x70)>>4)*10+(value&0x0f)); display_Hour(hours); value=ReadSet1302(0x87); day=(((value&0x70)>>4)*10+(value&0x0f)); display_Day(day); value=ReadSet1302(0x89); month=(((value&0x70)>>4)*10+(value&0x0f)); display_Month(month); value=ReadSet1302(0x8D); year=(((value&0xf0)>>4)*10+(value&0x0f)); display_Year(year); } voiddisplaystar(void)//显示欢迎界面 { unsignedchari,j; Write_Address(0x0f); while(displaywelcome[i]! ='\0') { Write_Date(displaywelcome[i]); i++; delay1ms (1); } i=0; Write_Address(0x4f); while(displaywish[i]! ='\0') { Write_Date(displaywish[i]); i++; delay1ms (1); } j=40; while(j--) { Write_com(0x18);//循环左移 delay1ms(700); } Write_com(0x01); delay1ms(10); } voidgbdisplay(unsignedcharaddress)//时间调整时光标闪烁 { Write_Address(address); delay1ms(5); Write_com(0x0f); delay1ms(5); } voiddisplaymaxt(unsignedcharx)//显示最大温度 { unsignedchari,j,k; Write_com(0x0c); delay1ms (2); Write_Address(0x44); i=x/100; j=x/10; k=x%10; Write_Date(digit[i]); Write_Date(digit[j]); Write_Date(digit[k]); } /*****************时间调整部分*********************/ voidhourset(void)//调时 { unsignedchartimevalue,hour; delay1ms(500);//防止多次触发 WriteSet1302(0x8e,0x00);//将写保护去掉,确保能正常将调整后的数值写入DS1302 timevalue=ReadSet1302(0x85);//读取此时的数值 hour=(((timevalue&0x70)>>4)*10+(timevalue&0x0f)); while (1) { if(ADD==0) { delay1ms(50); if(ADD==0) { hour++; delay1ms(300); while(ADD==0); } } if(RED==0) { delay1ms(50); if(RED==0) { hour--; delay1ms(300); if(hour==0)hour=23; while(RED==0); } } timevalue=(((hour)/10)<<4|(hour%10)); WriteSet1302(0x84,timevalue); delay1ms (1); display_Hour(hour); Write_Address(0x49); delay1ms(5); if(hour>=24)hour=0; delay1ms(5); if(CANL==0) { mode=0; Write_com(0x0c); break; } if(SET==0)break; } WriteSet1302(0x8e,0x80); } voidminuteset(void)//调分 { unsignedchartimevalue,minute; delay1ms(500); WriteSet1302(0x8e,0x00); timevalue=ReadSet1302(0x83); minute=(((timevalue&0x70)>>4)*10+(timevalue&0x0f)); while (1) { if(ADD==0) { delay1ms(10); if(ADD==0) { minute++; if(minute>=60)timevalue=0; while(ADD==0); } } if(RED==0) { delay1ms(10); if(RED==0) { minute--; delay1ms(300); if(minute==0)minute=59; while(RED==0); } } timevalue=((minute/10)<<4|(minute%10)); WriteSet1302(0x82,timevalue); delay1ms (1); display_Minute(minute); Write_Address(0x4c); delay1ms(5); if(minute>=60)minute=0; delay1ms(5); if(CANL==0) { mode=0; Write_com(0x0c); break; } if(SET==0)break; } WriteSet1302(0x8e,0x80); } voidsecondset(void)//秒归零 { unsignedcharsecond; delay1ms(500); WriteSet1302(0x8e,0x00); while (1) { if(ADD==0) { delay1ms(10); if(ADD==0) { second=0; WriteSet1302(0x80,0x00); while(ADD==0); } } delay1ms (1); display_Second(second); Write_Address(0x4f); delay1ms(5); if(CANL==0) { mode=0; Write_com(0x0c); break; } if(SET==0)break; } WriteSet1302(0x8e,0x80); } voidyearset(void)//调年 { unsignedchardatevalue,year; delay1ms(500); WriteSet1302(0x8e,0x00); datevalue=ReadSet1302(0x8d); year=(((datevalue&0x70)>>4)*10+(datevalue&0x0f)); while (1) { if(ADD==0) { delay1ms(10); if(ADD==0) { year++; while(ADD==0); } } if(RED==0) { delay1ms(10); if(RED==0) { year--; delay1ms(300); while(RED==0); } } datevalue=((year/10)<<4|(year%10)); WriteSet1302(0x8c,datevalue); delay1ms(5); display_Year(year); del
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 万年历 源代码 程序