可移植到任何数字时钟程序中,根据单片机型号以及晶振频率修改TH0和TL0的值。
智能日期时间累加,平闰年判断,当月天数判断功能,年计数值0~9999。
使用1秒的延迟函数,再加上时间判断计数函数的时间,误差非常大。
采用5毫秒定时器中断计数,中断触发后重置计数值并且5毫秒计数加1。
处理5毫秒计数以及时间判断计数函数,定时器仍在计数,准确触发高精度的5毫秒中断。
5毫秒计数加到200时,5毫秒计数清零并且触发时间计数函数,包含所有判断日期时间的指令在5毫秒内完成,如5毫秒内无法完成请改成更长毫秒时间中断1次,避免出现中断重入等问题。
若发现bug或其他建议意见请及时在楼下回复。
下面是源码:
#include "reg51.h"
#include "intrins.h"
sfr AUXR = 0x8E;
sbit led=P3^2; //秒闪烁指示灯
#define ui unsigned int
#define uc unsigned char
ui y; //定义变量年
uc m,d,h,i,s,w; //定义变量月、日、时、分、秒、周
uc ms5; //5毫秒定时器中断计数
void InitTimer0(void){ //初始化5毫秒定时器,根据晶振频率修改TH0和TL0的值。
TMOD = 0x01;
TH0 = 0x28;
TL0 = 0x00;
EA = 1;
ET0 = 1;
TR0 = 1;
}
bit if_leap_year(ui y){ //平闰年检测,闰年返回1,平年返回0
//闰年是4的倍数且不是100的倍数或者是400的倍数,否则是平年。
if((y%4 == 0 && y%100 != 0) || y%400 == 0){
return 1; //返回1表示闰年
} else { //否则就是平年
return 0; //返回0表示平年
}
}
uc get_mon_day_nbr(ui y,uc m){ //通过年月获取该月有多少天
if(m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) { //大
月则31天
return 31;
}
if(m == 4 || m == 6 || m == 9 || m == 11){ //小月则30天
return 30;
}
if(m == 2){ //2月
if(if_leap_year(y) == 1){ //闰年29天
return 29;
} else { //平年28天
return 28;
}
}
return 0;
}
bit dt_is_ok(ui y,uc m,uc d,uc w,uc h,uc i,uc s){ //检测设置的日期时间格式是否有效 1有
效0无效
if(w > 7 || w < 1) return 0; //星期大于7或小于1 返回0
if(y > 9999 || m > 12 || m < 1 || d < 1) return 0; //年大于999 或 月大于12 或
月小于1 或日小于1 返回0
if(d > get_mon_day_nbr(y,m)) return 0; //通过年月获取当月天数 大于该值 返回0
if(h > 23 || i > 59 || s > 59) return 0; //时大于23 或 分大于59 或秒大于59 返回
0
return 1; //检测有效 返回1
}
bit set_time(ui yy,uc mm,uc dd,uc ww,uc hh,uc ii,uc ss){ //设置日期时间
if(dt_is_ok(yy,mm,dd,ww,hh,ii,ss) == 1){ //检查日期时间格式有效
y=yy;m=mm;d=dd;w=ww; //设置年月日周
h=hh;i=ii;s=ss; //设置时分秒
return 1; //设置成功 返回1
} else { //格式无效 返回0
return 0;
}
}
void add_time(){ //时间步进1秒
s++; //秒加1
if(s>=60){ //秒加到60
s=0; //秒清零
i++; //分加1
if(i>=60){ //分加到60
i=0; //分清零
h++; //时加1
if(h>=24){ //时加到24
h=0; //时清零
d++; //日加1
w++; //星期加1
if(w > 7){ //星期超过7
w=1; //星期等于1
}
if(d > get_mon_day_nbr(y,m)){ //日超过当前年月的天数
d=1; //日清1
m++; //月加1
if(m > 12){ //月加到12以上
m=1; //月清1
y++; //年加1
if(y >= 10000){ //年加到10000
y=0; //年清零
}
}
}
}
}
}
}
void main(){ //入口函数,上电复位后在此开始执行指令。
P3=0xFF; //设置P3口全部为高电平
set_time(2000,1,1,6,0,0,0); //设置日期时间
AUXR |= 0x80; //关闭定时器0的12分频
InitTimer0(); //初始化5毫秒定时器
//死循环内可添加其他程序,只有中断触发后退出,中断返回后继续在原地运行程序。
while(1);
}
void Timer0Interrupt(void) interrupt 1{ //5毫秒定时器中断
//重置TH0与TL0的值,根据晶振频率修改TH0和TL0的值。
TH0 = 0x28;
TL0 = 0x00;
ms5++; //5毫秒中断计数加1
if(ms5%100 == 0)led=~led;
//5毫秒中断计数加到200 200*5=1000毫秒 1秒触发1次
if(ms5 >= 200){
ms5=0; //5毫秒计数清零
add_time(); //时间步进1秒
}
}
上一篇:单片机+LCD1602+HR-04显示屏显示超声波测距工作原理
下一篇:STC15408AS单片机的EEPROM测试程序
推荐阅读
史海拾趣
在电子行业中,FINDER公司(即Finder芬德)的发展历程充满了创新与进取的故事。以下是五个关于FINDER公司发展起来的相关故事,每个故事均基于事实进行描述:
1. 创立与初步发展
故事背景:FINDER公司由Piero Giordanino于1954年创立,当时他凭借对电子技术的深刻理解和远见卓识,决定投身于继电器制造领域。在成立初期,FINDER专注于研发和生产高质量的继电器产品,以满足当时市场对电子元器件日益增长的需求。
关键事实:Giordanino在1949年就已经获得了第一步继电器的专利,这为他后来创立FINDER公司奠定了坚实的基础。随着技术的不断积累和市场的逐步开拓,FINDER逐渐在继电器领域崭露头角。
2. 产品多样化与技术创新
故事背景:在成立后的几十年里,FINDER公司不断推出新产品,实现了产品线的多样化。从最初的单一继电器产品,逐步扩展到包括步进继电器、光敏继电器、工业继电器、微型和超薄继电器、功率继电器、定时器继电器插座和配件等多个领域。
关键事实:截至当前,FINDER已生产超过14,500种不同类型的机电和电子设备,产品广泛应用于工业自动化、建筑、家庭和办公室等多个领域。同时,FINDER还致力于技术创新,不断研发出具有更高性能、更可靠性的新产品。
3. 全球化布局与市场拓展
故事背景:随着公司规模的扩大和产品线的丰富,FINDER开始将目光投向全球市场。通过设立分支机构、建立销售网络以及与国际知名企业的合作,FINDER逐步实现了全球化布局。
关键事实:目前,FINDER已经在全球范围内设立了多个分支机构和销售网络,覆盖欧洲、美洲、亚洲和非洲等地区。同时,FINDER还与德国SIEMENS、日本OMRON等世界知名电子企业并列为全球三大继电器制造商之一,在欧洲市场享有极高的盛誉。
4. 质量控制与环保生产
故事背景:在快速发展的同时,FINDER始终将产品质量放在首位。通过严格的质量控制体系和环保生产标准,FINDER确保了产品的卓越品质和可持续发展。
关键事实:FINDER的每个产品在出厂前都经过两个彻底的测试周期以确保最高水平的质量。此外,FINDER还尊重国家和欧盟的环保规范,确保其产品符合现行立法要求。在生产过程中采用环保材料和技术减少对环境的影响。
5. 行业认可与荣誉
故事背景:由于卓越的产品质量和持续的技术创新,FINDER在电子行业中获得了广泛的认可和赞誉。公司不仅赢得了众多客户的信赖和支持还获得了多项行业荣誉和认证。
关键事实:FINDER的产品已经通过了三十多个国家四十多个产品安全认证这充分证明了其在产品质量和安全方面的卓越表现。同时FINDER还被评为全球拥有最多质量认证的继电器制造商之一这进一步巩固了其在行业中的领先地位。
这些故事共同展现了FINDER公司在电子行业中的发展历程和成就。从创立初期的艰难起步到如今的全球知名企业FINDER凭借其卓越的产品质量、持续的技术创新以及全球化布局赢得了广泛的认可和赞誉。
EPSON公司,原名精工爱普生,成立于1942年,最初以制造手表起家。然而,随着技术的不断进步和市场需求的变化,EPSON逐渐将业务扩展到电子领域。在创始人及其团队的带领下,EPSON凭借其卓越的技术创新能力,成功研发出了一系列具有划时代意义的电子产品,如世界上第一台微型打印机和喷墨打印机,奠定了其在电子行业的领先地位。
雅特力在追求经济效益的同时,也高度重视企业社会责任和可持续发展。公司积极参与社会公益事业,通过捐款、捐物等方式支持教育、环保等领域的发展。此外,雅特力还注重环境保护和资源利用,采用环保材料和节能技术,努力降低生产过程中的能耗和排放。这些举措不仅有助于提升公司的社会形象,也为实现可持续发展做出了积极贡献。
2023年,永源微电子成功完成了A轮融资,这是公司发展过程中的一个重要里程碑。此次融资由深圳英集芯科技股份有限公司领投,为公司带来了丰富的资金支持和市场资源。通过与英集芯科技的战略合作,永源微电子在微电子领域的技术创新和产品研发上取得了新的突破。双方共同开展研发项目,推动技术的突破和应用场景的拓展,为公司的未来发展注入了强大的动力。
随着电子产品的日益复杂化,FCT Electronics意识到技术创新是保持竞争力的关键。公司投入大量资源进行研发,成功开发出一系列高性能的测试设备。其中,一款多功能集成电路测试系统因其高效、稳定、可靠的特点,被众多电子制造商所采纳,为FCT Electronics赢得了极高的声誉。
时间、地点:7月5日13:00-18:00 西安 交通大学学术报告厅 会议内容: 一. JTAG仿真器在项目研发中的应用,游刃有余完成任务!详细讲解JTAG仿真器的工作原理详细讲解基于ARM芯片的JTAG调试原理高效使用JTAG仿真器完成项 ...… 查看全部问答∨ |
本文提出了一种新型以太电话机的设计,采用SDA80D51芯片作为主控单元,同时使用RTL8019AS作为网络接口模块,实现了高度集成、具有较高性价比的话机。同时,还针对嵌入式系统硬件资源受限的特点,提出了一系列优化代码和数据存储空间的方法和技巧。… 查看全部问答∨ |
在QUARTUS里设置全局信号,是不是只要在ASSIGNMENT EDITOR把某一信号设置成全局信号就成,我这么设置,为什么编译的时候说没有声明?… 查看全部问答∨ |
|
---〓×〓×〓×〓×〓---Addr/DATA 请问上述地址与数据复用时序图中,为什么会有上下两根信号线? 一般的不都是一根的信号线吗,如:s0 s1 s2____/---\\_______ 不知道哪有芯片时序图的详细介绍书籍没?麻烦知道的给指点下,谢谢… 查看全部问答∨ |
贪便宜,在淘宝上买了个山寨的ST-LINK。 现在出现了奇怪的问题。 我用的是STM8S207S6,单片机工作电压是5V. ST-LINK的SWIM口,其供电电压时3.3V。 当我的板子不供电的时候,我直接连ST-LINK,由它来供电,我可以把软件down到单片机,并且在 ...… 查看全部问答∨ |
本帖最后由 paulhyde 于 2014-9-15 03:17 编辑 希望 大家有啥好资料 能分享,, 另外为了下载里面的资料 本尊只有给宝典定个价了,希望大家理解 … 查看全部问答∨ |
|
亮点:Haskell迅速接近前20上个月我们问道哪种语言将会成为下一个新的热门语言?我们提出了Scala,Erlang和Clojure。很明显,新语言来自函数式编程领域。一 种面向过程的语言,Haskell没有被明显得提及。这个月它从35名上升到25名。从Tiobe趋势图来 ...… 查看全部问答∨ |
设计资源 培训 开发板 精华推荐
- 能源区块链未来前景如何?在能源互联网应用上具有哪些优势?
- 教学机器人的出现并不会让教师失业
- 纯电、e-POWER架构并行!英菲尼迪发表新电动动力系统
- 致力研发安全驾驶科技 斯巴鲁将开始5G科技发展
- Cepton将激光雷达与MechaSpin处理引擎结合 可对车辆即时分类
- 英飞凌赋能Flex Power Modules全新开关式电容中间总线转换器, 为48V数据中心应用提供高功率密度
- 上汽通用五菱将推出“五菱芯片”
- WNEVC 2021 | 中国科学院物理研究所高级工程师俞海龙:全固态锂二次电池的技术挑战
- 全包裹式4轴桌面机械臂---小象码垛机械臂抢先正式发售!
- 全包裹式4轴桌面机械臂---小象码垛机械臂抢先正式发售