ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:18.96KB ,
资源ID:5157631      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-5157631.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(单片机万年历程序.docx)为本站会员(b****4)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

单片机万年历程序.docx

1、单片机万年历程序ATmega8单片机万年历C程序(内部RTC)作者:jdzj868 来源:机电之家下载站 录入:jdzj868 更新时间:2009-11-30 16:17:01 点击数:0 【字体: 】正文:) 调整时间和日期,只设置了四个按键a, 复位按键;b, 调整模态选择按键,切换调整不同参数;c, 上调按键,调整模式下按此键被调整值上调;d, 下调按键,调整模式下按此键被调整值下调.这shi调整年份时de显示状态,LCD第二行末尾显示yar.依此类推,调整月份时显示mth,调整日期时显示day,小时时显示hor,分钟时显示min.3) 软件部分.程序中包含一个头文件LCD1620.h,

2、此文件中包含有关LCDde一些显示函数.下面shi部分程序原代码-不知道怎么回事,今天网络速度比较慢,无法上传文件.如有需要可与我e-mail联系lhy_radio./*/* Project :Calendar */* Compiler :ICCAVR 6.31A */* Date :2008,5,31 */* Author :lhy */* Version :v1.3 */* Rework :lhy */* Rework Date :2008.6.26 */* */* Comments : */* 1,使用Atmega8内部RTC(实时时钟,32.768KHz) */* 2,显示使用LCD1

3、620 */* 3,在Timer2中断中刷新显示,精度提高1S5H */* 4,加入星期显示 */* 5,加入农历换算 */* 6,秒末位大于等于5时,显示公历:Solar 年月日 */* 7,SolarYear2099或SolarYear1900, */* 显示Out of range! */* 8,加入手动调整日期和时间 */*/i nclude i nclude #define DataPortPullup PORTD#define DataPortDirection DDRD#define ReadLCDPin PIND#define CtrlPortPullup PORTC#defi

4、ne CtrlPortDirection DDRC#define RS_Bit PC0#define RW_Bit PC1#define E_Bit PC2i nclude LCD1620.h#define ClkTcnt2 0x80/*变量声明*/ unsigned int Year = 2008;/年变量unsigned char Month = 6;/月变量unsigned char Day = 1;unsigned char Hour = 12;/小时unsigned char Min = 0;/分钟unsigned char Sec = 0;/秒unsigned char YearB

5、it1,YearBit2,YearBit3,YearBit4;unsigned char MonthBit1,MonthBit2;unsigned char DayBit1,DayBit2;unsigned char HourBit1,HourBit2;unsigned char MinBit1,MinBit2;unsigned char SecBit1,SecBit2;unsigned char Week4 = Mon,Tue,Wed,Thu,Fri,Sat,Sun;unsigned char ChangeSymbol5 = -Yar,-Mth,-Day,-Hor,-Min;unsigned

6、 char LeapYearWeekTable = 3,6,0,3,5,1,3,6,2,4,0,2;/闰年星期偏差表unsigned char UnLeapWeekTable = 4,0,0,3,5,1,3,6,2,4,0,2;unsigned char TodayWeek = 0;unsigned char LeapYearBit = 0;/为0时,平年unsigned char LunarData = 0,0,0,0;unsigned char LunarYear1,LunarYear2,LunarYear3,LunarYear4,LunarMonth1,LunARMonth2,Lunar

7、Day1,LunarDay2;unsigned char LunarConvertBit;/0,农历转换成功unsigned char CalendarStopBit;/1,时钟暂停unsigned char OldKeyNum = 0;unsigned char NewKeyNum = 0;unsigned char ModeSelect = 0;unsigned char ChangeModeBit = 0;/ModeSelect != 0时,为1,标志现在处于更改时间状态unsigned char SecOddBit = 0;/秒为偶数时,此为0,否则为1static unsigned

8、char const LunarDayCode19= 0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3;static unsigned short const LunarDayCode23=0x111,0x130,0x14e;/*子函数*/void PortInit(void) /端口初始化DDRC &= (1PC3)|(1PC4)|(1PC5);PORTC |= (1PC3)|(1PC4)|(159) Sec = 0; Min +; if (Min59) Min = 0; Hour +; if (Hour23) Hour = 0; Day +; if (

9、 ( (Month=1) | (Month=3) | (Month=5) | (Month=7) |(Month=8) | (Month=10) | (Month=12) ) & (Day31) ) Month +; Day = 1; else if ( ( (Month=4) | (Month=6) | (Month=9) | (Month=11) ) & (Day30) ) Month +; Day = 1; else if (Month=2) if (LeapYearBit = 1)/如果shi闰年 if (Day29) Month +; Day = 1; else if (Day 28

10、)/平年 Month +; Day = 1; if (Month 12) Month = 1; Year +; /计算各位de值 YearBit1 = Year /1000;YearBit2 = Year %1000/100;YearBit3 = Year %100/10;YearBit4 = Year %10;MonthBit1 = Month /10;MonthBit2 = Month %10;DayBit1 = Day /10;DayBit2 = Day %10;HourBit1 = Hour /10;HourBit2 = Hour %10;MinBit1 = Min /10;MinBi

11、t2 = Min %10;SecBit1 = Sec /10;SecBit2 = Sec %10; void DeviceInit(void)/MCU初始化CLI(); PortInit();Timer2Init();MCUCR = 0x00;GICR = 0x00;TIMSK = 0x40;LCD_Init();SEI(); /更新显示void DispUpdate(void) if(SecBit2 = 5) | (ModeSelect != 0)/秒末位大于5时,显示公历 PutStringLCD(0,0,Solar); PutNumberLCD(0,6,YearBit1); PutNum

12、berLCD(0,7,YearBit2); PutNumberLCD(0,8,YearBit3); PutNumberLCD(0,9,YearBit4); PutNumberLCD(0,11,MonthBit1); PutNumberLCD(0,12,MonthBit2); PutNumberLCD(0,14,DayBit1); PutNumberLCD(0,15,DayBit2); else if(LunarConvertBit = 1)/秒末位小于5并且农历转换成功时,显示农历 PutStringLCD(0,0,Lunar); PutNumberLCD(0,6,LunarYear1); P

13、utNumberLCD(0,7,LunarYear2); PutNumberLCD(0,8,LunarYear3); PutNumberLCD(0,9,LunarYear4); PutNumberLCD(0,11,LunARMonth1); PutNumberLCD(0,12,LunARMonth2); PutNumberLCD(0,14,LunarDay1); PutNumberLCD(0,15,LunarDay2); else PutStringLCD(0,0,Out of range!); PutNumberLCD(1,0,HourBit1); PutNumberLCD(1,1,Hour

14、Bit2); if(SecOddBit) PutOneCharLCD(1,2,:); PutNumberLCD(1,3,MinBit1); PutNumberLCD(1,4,MinBit2); if(SecOddBit) PutOneCharLCD(1,5,:); PutNumberLCD(1,6,SecBit1); PutNumberLCD(1,7,SecBit2); PutStringLCD(1,9,WeekTodayWeek); if(ChangeModeBit & SecOddBit) PutStringLCD(1,12,ChangeSymbolModeSelect - 1); voi

15、d CountWeek(void) if(LeapYearBit = 1) TodayWeek = (Year/100%4*5) + (Year%100/4*5) + (Year%4) + 1 + Day + LeapYearWeekTableMonth - 1)%7; else TodayWeek = (Year/100%4*5) + (Year%100/4*5) + (Year%4) + 1 + Day + UnLeapWeekTableMonth - 1)%7; void KeyScan(void)if(PINC&(1PC5) = 0) OldKeyNum = 1; else if(PI

16、NC&(1PC4) = 0) OldKeyNum = 2; else if(PINC&(1PC3) = 0) OldKeyNum = 3; if(PINC & (1PC5) & (PINC & (1PC4) & (PINC & (1PC3)/判断shi否有按键按下 NewKeyNum = OldKeyNum; OldKeyNum = 0; void TimeChange(void) switch(ModeSelect) case 0: if(NewKeyNum = 2) ModeSelect += 1; break; case 1:/更改年变量 switch (NewKeyNum) case

17、1: Year -; break; case 2: ModeSelect +; break; case 3: Year +; break; default:break; break; case 2:/更改月变量 switch (NewKeyNum) case 1: Month -; break; case 2: ModeSelect +; break; case 3: Month +; break; default:break; break; case 3:/更改日变量 switch (NewKeyNum) case 1: Day -; break; case 2: ModeSelect +;

18、 break; case 3: Day +; break; default:break; break; case 4:/更改小时变量 switch (NewKeyNum) case 1: Hour -; break; case 2: ModeSelect +; break; case 3: Hour +; break; default:break; break; case 5: switch (NewKeyNum) case 1: Min -; break; case 2: ModeSelect = 0; break; case 3: Min +; break; default:break;

19、break; default : break; /*主函数*/void main()DeviceInit();SEI();for (;) if(ModeSelect != 0)/判断现在shi否处于更改时间日期状态 ChangeModeBit = 1; else ChangeModeBit = 0; if(SecBit2 % 2 = 0)/如果秒末位shi偶数,SecSymbol=0 SecOddBit = 0; else SecOddBit = 1; KeyScan(); TimeChange(); if(ChangeModeBit = 1) CLI(); DispUpdate(); SEI(); 此万年历程序不足,未尽完善之处:1) 未设置闹钟,只能显示阴历阳历和星期等信息.2) 后续应加入温度显示,以测定日气温3) 没有与计算机或其他设备通讯接口4) 液晶显示处于常亮状态,影响寿命.应当设置如果一定时间未操作,显示屏应关闭.待有按键操作时再打开.这样才能使LCD寿命更为长久.5) 程序和硬件中未加入对于LCD背光de控制模块,无光亮时无法看时间.

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2