1)设计任务:设计一个能 显示当前的年、月、日、时、分、秒,具有闹钟功能的的电子时钟。
2)指标要求
(1)可实现12小时制和24小时制转换。
(2)年、月、日、时、分均可以单独设置,设置时该项目闪烁。
(3)计时精度误差:≤1秒/日。
(4)液晶显示。
(5)能实现闹钟功能。
(6)电源:1节5号干电池(1.5V)。
一、Protues仿真图(添加温度显示功能):
二、Protues仿真图(12-24进制转换):
三、程序源码(添加温度显示功能):
因为注释非常的全,这里就不再进行讲解了。
/*******************************************************************************
================================================================================
【平 台】STC89C51平台
【编 写】Sumjess
【E-mail 】1371129880@qq.com
【软件版本】V2.0
【最后更新】2018年09月06日
【相关信息参考下列地址】
【网 站】
Sumejss博客 https://blog.csdn.net/qq_38351824
电子发烧友 http://bbs.elecfans.com/zhuti_mcu_1.html
中国电子网 http://bbs.21ic.com/icfilter-typeid-11-214.html
---------------------------------------------------------------------------------
【dev.env.】MDK4.14及以上版本
【Target 】STC89C51
第一次修订:2019/05/23
第二次修订:2018/05/24
第三次修订:2018/05/26
================================================================================
********************************************************************************/
#include #define uchar unsigned char //无符号字符型 宏定义 变量范围0~255 #define uint unsigned int //无符号整型 宏定义 变量范围0~65535 #include "E2PROM52_Sumjess.h" #include "Dateconversion_Sumjess.h" #include "intrins.h" bit flag_200ms ; bit flag_100ms ; sbit beep = P1^4; //蜂鸣器定义 bit flag_beep_en; uint clock_value; //用作闹钟用的 sbit dq = P2^0; //18b20 IO口的定义 uint temperature ; //温度变量 uchar flag_nl; //农历 阳历显示标志位 uchar menu_1,menu_2; uchar key_time,flag_value; //用做连加的中间变量 bit key_500ms ; uchar n_nian,n_yue,n_ri; //农历显示的函数 #include "DS1302_Sumjess.h" #include "LCD1602_Sumjess.h" /******************把数据保存到单片机内部eeprom中******************/ void write_eeprom() { SectorErase(0x2000); byte_write(0x2000, fen1); byte_write(0x2001, shi1); byte_write(0x2002, open1); byte_write(0x2058, a_a); } /******************把数据从单片机内部eeprom中读出来*****************/ void read_eeprom() { fen1 = byte_read(0x2000); shi1 = byte_read(0x2001); open1 = byte_read(0x2002); a_a = byte_read(0x2058); } /**************开机自检eeprom初始化*****************/ void init_eeprom() { read_eeprom(); //先读 if(a_a != 1) //新的单片机初始单片机内问eeprom { fen1 = 3; shi1 = 8; open1 = 1; a_a = 1; write_eeprom(); //保存数据 } } /***********************18b20初始化函数*****************************/ void init_18b20() { bit q; dq = 1; //把总线拿高 delay_uint(1); //15us dq = 0; //给复位脉冲 delay_uint(80); //750us dq = 1; //把总线拿高 等待 delay_uint(10); //110us q = dq; //读取18b20初始化信号 delay_uint(20); //200us dq = 1; //把总线拿高 释放总线 } /*************写18b20内的数据***************/ void write_18b20(uchar dat) { uchar i; for(i=0;i<8;i++) { //写数据是低位开始 dq = 0; //把总线拿低写时间隙开始 dq = dat & 0x01; //向18b20总线写数据了 delay_uint(5); // 60us dq = 1; //释放总线 dat >>= 1; } } /*************读取18b20内的数据***************/ uchar read_18b20() { uchar i,value; for(i=0;i<8;i++) { dq = 0; //把总线拿低读时间隙开始 value >>= 1; //读数据是低位开始 dq = 1; //释放总线 if(dq == 1) //开始读写数据 value |= 0x80; delay_uint(5); //60us 读一个时间隙最少要保持60us的时间 } return value; //返回数据 } /*************读取温度的值 读出来的是小数***************/ uint read_temp() { uint value; uchar low; //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序 init_18b20(); //初始化18b20 write_18b20(0xcc); //跳过64位ROM write_18b20(0x44); //启动一次温度转换命令 delay_uint(50); //500us init_18b20(); //初始化18b20 write_18b20(0xcc); //跳过64位ROM write_18b20(0xbe); //发出读取暂存器命令 EA = 0; low = read_18b20(); //读温度低字节 value = read_18b20(); //读温度高字节 EA = 1; value <<= 8; //把温度的高位左移8位 value |= low; //把读出的温度低位放到value的低八位中 value *= 0.625; //转换到温度值 小数 return value; //返回读出的温度 带小数 } ----由于篇幅的问题,只显示一部分,请下载后自行观看,程序非常的全----- -----关注公众号免费下载----- 四、程序源码(12-24进制转换): 因为注释非常的全,这里就不再进行讲解了。 /******************************************************************************* ================================================================================ 【平 台】STC89C51平台 【编 写】Sumjess 【E-mail 】1371129880@qq.com 【软件版本】V2.0 【最后更新】2018年09月06日 【相关信息参考下列地址】 【网 站】 Sumejss博客 https://blog.csdn.net/qq_38351824 电子发烧友 http://bbs.elecfans.com/zhuti_mcu_1.html 中国电子网 http://bbs.21ic.com/icfilter-typeid-11-214.html --------------------------------------------------------------------------------- 【dev.env.】MDK4.14及以上版本 【Target 】STC89C51 第一次修订:2019/05/23 第二次修订:2018/05/24 第三次修订:2018/05/26 ================================================================================ ********************************************************************************/ #include #define uchar unsigned char //无符号字符型 宏定义 变量范围0~255 #define uint unsigned int //无符号整型 宏定义 变量范围0~65535 #include "E2PROM52_Sumjess.h" #include "Dateconversion_Sumjess.h" #include "intrins.h" bit flag_200ms ; bit flag_100ms ; sbit beep = P1^4; //蜂鸣器定义 bit flag_beep_en; uint clock_value; //用作闹钟用的 uchar flag_nl,flag_n2; //农历 阳历显示标志位 uchar menu_1,menu_2; uchar key_time,flag_value; //用做连加的中间变量 bit key_500ms ; uchar n_nian,n_yue,n_ri; //农历显示的函数 #include "DS1302_Sumjess.h" #include "LCD1602_Sumjess.h" /******************把数据保存到单片机内部eeprom中******************/ void write_eeprom() { SectorErase(0x2000); byte_write(0x2000, fen1); byte_write(0x2001, shi1); byte_write(0x2002, open1); byte_write(0x2058, a_a); } /******************把数据从单片机内部eeprom中读出来*****************/ void read_eeprom() { fen1 = byte_read(0x2000); shi1 = byte_read(0x2001); open1 = byte_read(0x2002); a_a = byte_read(0x2058); } /**************开机自检eeprom初始化*****************/ void init_eeprom() { read_eeprom(); //先读 if(a_a != 1) //新的单片机初始单片机内问eeprom { fen1 = 3; shi1 = 8; open1 = 1; a_a = 1; write_eeprom(); //保存数据 } } /******************1ms 延时函数*******************/ void delay_1ms(uint q) { uint i,j; for(i=0;i } /******************写星期函数*******************/ void write_week(uchar hang,uchar add,uchar week)//写星期函数 { if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); switch(week) { case 1:write_data('M');//星期数为1时,显示 write_data('O'); write_data('N'); break; case 2:write_data('T');//星期数据为2时显示 write_data('U'); write_data('E'); break; case 3:write_data('W');//星期数据为3时显示 write_data('E'); write_data('D'); break; case 4:write_data('T');//星期数据为4是显示 write_data('H'); write_data('U'); break; case 5:write_data('F');//星期数据为5时显示 write_data('R'); write_data('I'); break; case 6:write_data('S');//星期数据为6时显示 write_data('T'); write_data('A'); break; case 7:write_data('S');//星期数据为7时显示 write_data('U'); write_data('N'); break; } } /*************时钟显示***************/ void init_1602_ds1302() { if(flag_n2 == 0) //显示24 { write_sfm2_ds1302(1,1,shi); //显示时 write_sfm2_ds1302(1,4,fen); //显示分 write_sfm2_ds1302(1,7,miao); //显示秒 write_week(2,12,week); } else { if(shi==0x20) shi=0x08; else if(shi==0x13) shi=0x01; else if(shi==0x14) shi=0x02; else if(shi==0x15) shi=0x03; else if(shi==0x16) shi=0x04; else if(shi==0x17) shi=0x05; else if(shi==0x18) shi=0x06; else if(shi==0x19) shi=0x07; else if(shi==0x21) shi=0x09; else if(shi==0x22) shi=0x10; else if(shi==0x23) shi=0x11; write_sfm2_ds1302(1,1,shi); //显示时 write_sfm2_ds1302(1,4,fen); //显示分 write_sfm2_ds1302(1,7,miao); //显示秒 write_week(2,12,week); } if(flag_nl == 0) //显示阳历 { write_sfm2_ds1302(2,2,nian); //显示年 write_sfm2_ds1302(2,5,yue); //显示月 write_sfm2_ds1302(2,8,ri); //显示日 } else //显示农历 { write_sfm2_ds1302(2,2,n_nian); //显示年 write_sfm2_ds1302(2,5,n_yue); //显示月 write_sfm2_ds1302(2,8,n_ri); //显示日 } } /*************定时器0初始化程序***************/ void init_time0() { EA = 1; //开总中断 TMOD = 0X01; //定时器0、工作方式1 ET0 = 1; //开定时器0中断 TR0 = 1; //允许定时器0定时 } /*************闹钟报警函数***************/ void menu_dis() { static uchar mm,value; if(flag_100ms == 1) //100ms执行一次 { flag_100ms = 0; if(open1 == 1) //如果闹钟打开 { if((miao == 0) && (fen == fen1) && (shi == shi1)) { flag_beep_en = 1; //有报警 打开蜂鸣器响的标志位 } if(flag_beep_en == 1) //闹钟以被打开 { clock_value++; if(clock_value <= 30) beep = ~beep; //蜂鸣器叫3秒 else if(clock_value > 30) { beep = 1; //蜂鸣器停1秒 if(clock_value > 40) { clock_value = 0; } } // 1 分钟后自动关闭闹钟 value ++; if(value >= 10) { value = 0; mm++; if(mm >= 60) { mm = 0; for(j=0;j<120;j++);
上一篇:课程设计题二:7人多数表决器
下一篇:课程设计题一:八人抢答器
推荐阅读
史海拾趣
Aerotronics Marketing Inc公司注重与高校和研究机构的合作,通过产学研合作的方式推动技术创新。公司与多所知名高校建立了紧密的合作关系,共同开展无人机技术的研发和应用研究。这种合作模式不仅为公司提供了源源不断的技术支持和人才储备,还推动了整个电子行业的技术进步。
Aerotronics Marketing Inc公司注重与高校和研究机构的合作,通过产学研合作的方式推动技术创新。公司与多所知名高校建立了紧密的合作关系,共同开展无人机技术的研发和应用研究。这种合作模式不仅为公司提供了源源不断的技术支持和人才储备,还推动了整个电子行业的技术进步。
为了更好地服务全球客户,Delkin Devices积极拓展海外市场。公司在欧洲设立了办事处,以便更直接地接触欧洲市场并了解当地客户需求。此外,Delkin Devices还通过参加国际展会、建立合作伙伴关系等方式,不断拓展其在全球范围内的影响力。通过这些努力,Delkin Devices成功将产品销往全球多个国家和地区,实现了国际化布局和市场拓展。
随着科技的不断进步,Delkin Devices始终保持着对新技术和新产品的敏感度和热情。公司投入大量资源进行技术研发和产品创新,不断推出具有竞争力的新产品。例如,在固态硬盘(SSD)技术兴起的时代,Delkin Devices迅速抓住机遇,成功开发出了一系列高性能、高可靠性的SSD产品,赢得了市场的广泛认可。此外,Delkin Devices还积极拓展产品线,推出了包括读卡器、存储卡等在内的多种存储配件,进一步巩固了其在电子行业中的领先地位。
在国内市场取得一定成绩后,B&B公司开始将目光投向国际市场。通过参加国际电子展会、建立海外销售网络等方式,公司逐渐打开了国际市场的大门。其产品以高品质和可靠性赢得了海外客户的信赖,为公司的进一步发展奠定了坚实的基础。
为了进一步提升技术水平和市场竞争力,C.K Magma公司积极寻求国际合作。他们与国外的知名科研机构和企业建立了战略合作关系,共同开展技术研发和市场拓展。这些合作不仅为公司带来了先进的技术和管理经验,还拓宽了公司的国际视野,为公司的长远发展奠定了坚实基础。
PPC6.1中的phonesetting中把属性页中某个原来的应用替换为我的应用,com接口是什么? PPC6.1中的phonesetting中把属性页中某个原来的应用替换为我的应用,com接口是什么? 在线等,谢谢!… 查看全部问答∨ |
|
QT版 finder -- 类似库文件的finder 能够查找 硬件IP 上次问过 如何查找 硬件设备的IP地址 非常感谢academic大侠的回复 今天晚上终于有时间可以来玩玩看了 硬件平台非8962板 但是 一样 的 跑lwip 于是 就将locator.c 移植到工程中区 并参考finder下的文件 用QT写了个简单小DEMO 可以辅助我的调 ...… 查看全部问答∨ |
|
芯片是LM4F231, ARM M4的内核,开发环境是IAR 6.3。 遇到的问题,当定义局部变量时比如 float f=1.1; 时在IAR下察看local 局部变量值时发现f变量值为<error> 也没有分配变量地址。 对于这一问题 ...… 查看全部问答∨ |