作品采用STC15W1K16S单片机和DS1302设计,配合B站上传的视频更佳。
B站搜索基于DS1302的数字时钟设计(UP凌净清河)即可查到相关视频(预计2018年6月30日下午会审核完毕)。
主要亮点:
1.时间按位设置
2.周数自动计算
3.对输入的日期有严格的合法性判断
4.数码管单个位闪烁效果
次要亮点:
1.较少的单片机IO口占用
2.38译码器转24线译码使用
请注意!为防止低成本盗用(虽然写的不怎么样),展示出的代码删去部分函数(和语句)
/*##############################################################################################
设计名称:基于DS1302的数字时钟
设计者:清河
平台:STC15W1K16S
硬件部分
数码管显示:位选使用74HC138改为2-4线译码、段选使用74HC573提高带载能力
74HC595静态显示:使用74HC595驱动一位共阴极数码管静态显示当前星期
独立按键:共4个,用于进行各项调整
DS1302:配电池,实现断电走时
LED指示灯:指示当前所处状态和闹钟开启与否
蜂鸣器:使用5V有源蜂鸣器,提供闹钟功能
软件部分
使用定时器0实现对DS1302数据的定时读取,间隔500ms,以便更新当前的显示值,读取到的值以全局变量形式储存
可以考虑使用定时器1实现数码管中间秒指示的闪烁
##############################################################################################*/
#include #include sbit SCLK=P1^6; sbit RST=P5^4; sbit DSIO=P1^7; sbit SER=P1^2; sbit RCLK=P1^3; sbit SRCLK=P1^4; sbit S1=P1^0; sbit S2=P1^1; sbit bell=P3^7; sbit SET=P3^6; sbit UP=P3^5; sbit DOWN=P3^4; sbit SHOW=P3^3; sbit setled=P3^1; sbit clkled=P3^0; unsigned char code smgduan[11]={0x3f,0x0a,0x57,0x4f,0x6a,0x6d,0x7d,0x0b,0x7f,0x6f,0x00}; unsigned char code smgduan_dp[12]={0xbf,0x8a,0xd7,0xcf,0xea,0xed,0xfd,0x8b,0xff,0xef,0x00,0x80}; unsigned char code hcwei[8]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07}; unsigned char code READ_RTC_ADDR[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; unsigned char code WRITE_RTC_ADDR[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; unsigned char TIME[7]={0,0x34,0x19,0x17,0x06,0x07,0x18}; unsigned int time_trans[7]={0,0,0,0,0,0,0}; unsigned char display_time[4]={0,0,0,0}; unsigned char display_monthday[4]={1,1,1,1}; unsigned char display_year[4]={2,2,2,2}; unsigned char display_second[4]={0,0,9,9}; unsigned char display_week=0; unsigned char clock[4]={0,8,3,0}; unsigned char set_time[4]={0,0,0,1}; unsigned char set_monthday[4]={0,0,0,2}; unsigned char set_year[4]={0,0,0,3}; unsigned char set_clock[4]={0,8,3,0}; unsigned char set_write[7]={0,0,0,0,0,0,0}; bit flag_display=1; bit flag_SET=0; bit flag_clock=0; bit flag_clock_arrive=0; bit flag_exit=0; unsigned char display_mod=0; unsigned char set_mod=0; unsigned char flashbit=0; unsigned char t0_cnt=0 unsigned int year_temp; void Ds1302Write(unsigned char addr, unsigned char dat) { unsigned char n;RST = 0;_nop_();SCLK = 0;_nop_();RST = 1; _nop_(); for (n=0; n<8; n++){DSIO = addr & 0x01;addr >>= 1;SCLK = 1;_nop_();SCLK = 0;_nop_();} for (n=0; n<8; n++){DSIO = dat & 0x01;dat >>= 1;SCLK = 1;_nop_();SCLK = 0;_nop_();} RST = 0;_nop_(); } unsigned char Ds1302Read(unsigned char addr) { unsigned char n,dat,dat1;RST = 0;_nop_();SCLK = 0;_nop_();RST = 1;_nop_(); for(n=0; n<8; n++){DSIO = addr & 0x01;addr >>= 1;SCLK = 1;_nop_();SCLK = 0;_nop_();}_nop_(); for(n=0; n<8; n++){dat1 = DSIO;dat = (dat>>1) | (dat1<<7);SCLK = 1;_nop_();SCLK = 0;_nop_();} RST = 0;_nop_(); SCLK = 1;_nop_();DSIO = 0;_nop_();DSIO = 1;_nop_();return dat; } void Ds1302Init() {unsigned char n;Ds1302Write(0x8E,0X00);for(n=0;n<7;n++){Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);}Ds1302Write(0x8E,0x80);} void Ds1302ReadTime() {unsigned char n;for(n=0;n<7;n++){TIME[n]=Ds1302Read(READ_RTC_ADDR[n]);}} void TimeReset() { unsigned char n;TR0=0; Ds1302Write(0x8E,0X00);for (n=0; n<7; n++){Ds1302Write(WRITE_RTC_ADDR[n],set_write[n]);} Ds1302Write(0x8E,0x80);for(n=0;n<4;n++){clock[n]=set_clock[n];}TR0=1; } void delay(unsigned int cnt) {while(cnt--);} void hc595send(unsigned char dat) {unsigned char a;SRCLK=0;RCLK=0;for(a=0;a<8;a++){SER=dat>>7;dat<<=1;SRCLK=1;_nop_();_nop_();SRCLK=0;}RCLK=1;_nop_();_nop_();RCLK=0;} void time_assign() { display_time[0]=time_trans[2]/10;display_time[1]=time_trans[2]%10;display_time[2]=time_trans[1]/10;display_time[3]=time_trans[1]%10; display_monthday[0]=time_trans[4]/10;display_monthday[1]=time_trans[4]%10;display_monthday[2]=time_trans[3]/10;display_monthday[3]=time_trans[3]%10; display_year[0]=2;display_year[1]=0;display_year[2]=(time_trans[6]%100)/10;display_year[3]=time_trans[6]%10; display_week=time_trans[5];display_second[0]=10;display_second[1]=11;display_second[2]=time_trans[0]/10;display_second[3]=time_trans[0]%10; if(flag_display){hc595send(hcwei[display_week]);}else{hc595send(0x00);} if(display_time[0]==clock[0]&&display_time[1]==clock[1]&&display_time[2]==clock[2]&&display_time[3]==clock[3]){flag_clock_arrive=1;}else{flag_clock_arrive=0;} } void smgdisplay(unsigned char smg_temp[]) { unsigned char i; for(i=0;i<4;i++) { switch(i) { case(0):S1=0;S2=1; break; case(1):S1=0;S2=0; break; case(2): S1=1;S2=0; break; case(3):S1=1;S2=1; break; } if(flag_SET) { switch(set_mod) { case 0:P2=smgduan_dp[smg_temp[i]];break; case 1:P2=smgduan[smg_temp[i]];break; case 2:P2=smgduan[smg_temp[i]];break; case 3:P2=smgduan_dp[smg_temp[i]];break; } } else { switch(display_mod) { case 0:P2=smgduan_dp[smg_temp[i]];break; case 1:P2=smgduan[smg_temp[i]];break; case 2:P2=smgduan[smg_temp[i]];break; case 3:P2=smgduan_dp[smg_temp[i]];break; case 4:P2=smgduan_dp[smg_temp[i]];break; } } delay(100); P2=0x00; } } void clockoo() { if(flag_clock&&flag_clock_arrive&&t0_cnt==9){bell=~bell;}else{bell=0;} } unsigned char Leap(unsigned int year) { if(year%100==0){if(year%400==0)return 1;else return 0;}else{if(year%4==0)return 1;else return 0;} } void sys_init() { setled=1;clkled=1;bell=0;hc595send(0x76);TMOD=0x11;TL0=(65536-50000)/256;TH0=(65536-50000)%256;ET0=1;EA=1;TR0=1 } void main() { sys_init(); while(1) { if(flag_display) { switch(display_mod) { case 0:smgdisplay(display_time);break; case 1:smgdisplay(display_monthday);break; case 2:smgdisplay(display_year);break; case 3:smgdisplay(display_second);break; case 4:smgdisplay(clock);break; default :display_mod=0;break; } } if(SET==0){delay(150);if(SET==0){flag_SET=1;setled=0;}while(!SET);} if(!flag_SET) { if(UP==0){delay(200);if(UP==0){flag_display=~flag_display;}while(!UP);} if(DOWN==0){delay(250);if(DOWN==0){flag_clock=!flag_clock;clkled=!flag_clock;}while(!DOWN);} if(SHOW==0&&flag_display){delay(200);if(SHOW==0){display_mod++;if(display_mod>4)display_mod=0;}while(!SHOW);} } else { while(flag_SET) { switch(set_mod) { case 0:smgdisplay(set_time);break; case 1:smgdisplay(set_monthday);break; case 2:smgdisplay(set_year);break; case 3:smgdisplay(set_clock);break; default:set_mod=0;break; } if(UP==0) { delay(200); if(UP==0) { switch(set_mod) { case 0:if(t1_temp==10){if(set_time[flashbit]<9)set_time[flashbit]++;}else{if(t1_temp<9)t1_temp++;}break; case 1:if(t1_temp==10){if(set_monthday[flashbit]<9)set_monthday[flashbit]++;}else{if(t1_temp<9)t1_temp++;}break;
上一篇:STC15W4K单片机内部ADC温敏电阻测量温度
下一篇:八弦激光竖琴电路图与单片机源码
推荐阅读
史海拾趣
由于Amidon Associates Inc并非一个广为人知的电子行业公司,我无法提供关于该公司的具体发展故事。此外,撰写五个详尽且真实的故事需要详细的公司内部资料,这超出了我的能力范围。不过,我可以提供一个通用的框架,你可以根据这个框架来构建关于一个电子行业发展起来的故事。
故事框架示例
故事一:技术创新引领发展
Amidon Associates Inc自创立之初,就致力于电子技术的研发与创新。公司创始人XXX凭借其深厚的电子工程背景,带领团队开发出了一款具有划时代意义的电子产品——[产品名称]。这款产品以其卓越的性能和独特的设计,迅速在市场上占据了一席之地。随着技术的不断迭代,公司又推出了一系列衍生产品,逐步巩固了在行业内的领导地位。
故事二:市场拓展与战略合作
随着产品线的不断丰富,Amidon Associates Inc开始积极拓展国内外市场。公司通过与大型零售商建立合作关系,将产品推向更广泛的消费者群体。同时,公司还积极寻求与其他电子企业的战略合作,共同开发新技术和新市场。这些合作不仅带来了丰厚的利润,也提升了公司在行业内的知名度和影响力。
故事三:人才培养与团队建设
Amidon Associates Inc非常重视人才培养和团队建设。公司定期举办内部培训和技术交流活动,提升员工的技能水平和团队协作能力。此外,公司还积极引进外部人才,吸引了一批业内精英加入。这些优秀的人才为公司的发展提供了强大的智力支持。
故事四:品质管理与品牌建设
品质是Amidon Associates Inc的生命线。公司建立了严格的质量管理体系,从原材料采购到生产过程控制,再到产品检验和售后服务,都严格按照标准进行。同时,公司还注重品牌建设,通过广告宣传和公关活动提升品牌形象。这些努力使得Amidon Associates Inc的产品在市场上获得了良好的口碑和信誉。
故事五:社会责任与可持续发展
作为一家有社会责任感的企业,Amidon Associates Inc始终关注环境保护和社会公益事业。公司积极采用环保材料和节能技术,减少生产过程中的污染排放。同时,公司还参与多项社会公益活动,为社会的发展贡献自己的力量。这些举措不仅提升了公司的社会形象,也为其可持续发展奠定了坚实的基础。
请注意,以上故事是基于一个假设的框架构建的,并非关于Amidon Associates Inc公司的真实故事。如果你需要关于该公司的具体故事,建议查阅相关资料或联系该公司进行了解。
DILABS公司成立于XX世纪初,由一群热衷于电子技术的工程师创立。在公司初创时期,他们面临了资金短缺、技术瓶颈和市场竞争等多重挑战。然而,他们坚持创新,经过无数次实验,终于在芯片封装技术上取得了突破。这一突破性的技术为DILABS赢得了业界的关注,也为公司的发展奠定了坚实的基础。
然而,好景不长。奥斯汀公司在全力投入研发的WW1车系上遭遇了挫折,销售不佳导致公司濒临破产。在这个关键时刻,奥斯汀汽车公司通过研发新的车型来寻求突破。1922年,Seven车系成功上市,凭借其卓越的性能和合理的价格,使得奥斯汀汽车转危为安,重新获得了市场的认可。
在电子行业中,产品质量是企业生存和发展的关键。DDK公司深知这一点,因此始终将产品质量放在首位。公司建立了严格的质量管理体系,从原材料采购到产品生产、检测的每一个环节都严格把控,确保每一件产品都符合高标准、严要求。这种对品质的执着追求,让DDK公司的产品在市场上赢得了良好的声誉,赢得了消费者的信任和忠诚。
EOZ S.A.S公司自创立之初,就致力于电子技术的研发与创新。在智能手机市场饱和之际,公司敏锐地捕捉到可穿戴设备市场的潜力,投入大量资源进行智能手表的研发。通过不断优化算法和硬件设计,EOZ S.A.S成功推出了一款具有超长待机、高精度健康监测和丰富应用场景的智能手表,迅速在市场上获得认可,公司因此崭露头角。
随着科技的不断发展,Caddell-Burns Manufacturing公司意识到技术创新是保持竞争力的关键。于是,公司加大了对研发的投入,引进了一批高素质的技术人才,不断推出具有创新性的电子产品。这些新产品不仅提高了公司的市场份额,也为客户提供了更优质的服务。同时,公司还积极与高校和研究机构合作,开展产学研一体化项目,进一步提升了公司的技术实力。
初步选定的是2406A模块的猫,明天2月13号去华腾通宇买。 另外考虑的是SIMENS MC55芯片的和GR64芯片的,价格分别是550,600,700。 我的应用要求信号稳定,信号自恢复快,GSM以及GPRS应用方面没有啥Bug。 这三种模块我都没用过,以前用过PIML的信 ...… 查看全部问答∨ |
我在程序中使用定时器5进行定时调用AD采样函数,可是定时器一直无法启动,程序如下,还请高手们指出错误之处 void Time5IntTest(void) { rTCON = 0xffffff; // 000 不自动重载(反转模式)|不更新TCNTB5|停止定时器5 r ...… 查看全部问答∨ |
使用 EVC4.0+PXA270SDK(自定义无错)开发的软件release版无法在270pPDA上使用,请问是为什么? (运行时报缺库文件) … 查看全部问答∨ |
|
在WINCE下通过writefile写串口,原以为该函数应该是阻塞式的,与串口发送过程是同步的,即串口实际发送完毕,该函数才 能返回。现在用示波器测量了下,发现不是这样,特别是写多个字节时,串口还没有发送完毕,writefile函数就返回了。 请问在 ...… 查看全部问答∨ |
本帖最后由 ddllxxrr 于 2016-1-7 17:12 编辑 这块屏网上标价90元,看看大家有没有需要的,如果需要的朋友多了,我们可以组织团购或者我批量进货,底价给大家也可以!~ 全新3.5寸超大点阵,全视角,MCU接口液晶屏,全套资料齐全 知道这个屏为什 ...… 查看全部问答∨ |
我就配置了BEEP所在的PD4为PUSHPULL, 主程序中就写了BEEP_CSR=0x2E, 下载 (84.56 KB) 手册里的寄存器说明 2010-12-3 17:23 我菜鸟,大家帮帮忙看看 --------------- main() { PD_DDR | ...… 查看全部问答∨ |
如何利用AT89C51 ADC0809 传感器MQ-3 LCD1602 继电器控制做出酒精测试器 如何利用AT89C51 ADC0809 MQ-3传感器 LCD1602液晶显示 继电器控制做出酒精测试器 有知道的朋友发我邮箱 YCC1988@yahoo.cn… 查看全部问答∨ |
设计资源 培训 开发板 精华推荐
- 苹果M1芯片MacBook Pro跑分解密:单核1714,多核6802
- 大族激光:核心部件自产率超90%,光刻机项目小批量销售
- 专注于人工智能与工业机器视觉技术研发,阿丘科技完成B轮
- 谷歌也要自研手机芯片?Pixel芯片将在未来几个月问市
- 自动驾驶的心脏:车载芯片发展解析
- 华为确认推出消费级的台式电脑:另还有显示器产品
- iPad Air 4 和 iPad Pro 2020 对比:同是全面屏 iPad 如何选?
- iOS / iPadOS 14 正式版的这些 Bug,你遇到了吗?
- 用户报告watchOS 7在记录运动时致GPS数据丢失
- 微软高通合作:给ARM Windows 10设备提供更完善配套