单片机应用实例:LED显示电脑电子钟

畅学单片机 2021-04-17 00:00

本例介绍一种用LED制作的电脑电子钟(电脑万年历)。其制作完成装潢后的照片如下图:


上图中,年、月、日及时间选用的是1.2寸共阳数码管,星期选用的是2.3寸数码管,温度选用的是0.5寸数码管,也可根据个人的爱好选用不同规格的数码管。原理图如下图所示:

上图中,CPU选用的是AT89C2051,时钟芯片选用的是Dallas公司的DS1302,温度传感器选用的是Dallas公司的数字温度传感器DS1820,显示驱动芯片选用的是德州仪器公司的TPIC6B595,也可选用与其兼容的芯片NC595或国产的AMT9595。整个电子钟用两个键来调节时间和日期。一个是位选键,一个是数字调节键。按一下位选键,头两位数字开始闪动,进入设定调节状态,此时按数字调节键,当前闪动位的数字就可改变。全部参数调节完后,五秒钟内没有任何键按下,则数字停止闪动,退出设定调节状态。


源程序清单如下(无温度显示程序):


start:do;


$include(reg51.dcl)


declare (sclk,io,rst) bit at (0b3h) register; /* p33,p34,p35 */


declare (command,data,n,temp1,num) byte;


declare a(9) byte;


declare ab(6) byte;


declare aco(11) byte constant (0fdh,60h,0dah,0f2h,66h,0b6h,0beh,


0e0h,0feh,0f6h,00h);


declare week(11) byte constant (0edh,028h,0dch,7ch,39h,75h,0f5h,


2ch,0fdh,7dh,00h);


declare da literally 'p15',clk literally 'p16',ale literally 'p17',


mk literally 'p11',sk literally 'p12';


clear:procedure;


sclk=0;io=0;rst=0;


end clear;


send1302:procedure(comm);


declare (i,comm) byte;


do i=0 to 7;


comm=scr(comm,1);


io=cy;


call time(1);


sclk=0;


call time(1);


sclk=1;


end;


end send1302;


wbyt1:procedure(com,dat);/*字节写过程*/


declare (com,dat) byte;


call clear;


rst=1;


call send1302(com);


call send1302(dat);


call clear;


end wbyt1;


wbyt8:procedure;/*时钟多字节突发模式写过程*/


declare j byte;


call clear;


a(7)=A(6);a(6)=a(0);


rst=1;


call send1302(command);


do j=1 to 8;


call send1302(a(j));


end;


call clear;


end wbyt8;


RBYT1:PROCEDURE;


DECLARE I BYTE;


CALL CLEAR;


RST=1;


call send1302(0c1h);


IO=1;


DO I=0 TO 7;


SCLK=1;


SCLK=0;


CY=IO;


N=SCR(N,1);


END;


A(8)=N;


CALL CLEAR;


END RBYT1;


send595:procedure;


declare k byte;


do k=0 to 7;


data=scr(data,1);


da=cy;


clk=1;


clk=0;


end;


end send595;


send595_1:procedure;


declare k byte;


do k=0 to 7;


data=scr(data,1);


da1=cy;


clk1=1;


clk1=0;


end;


end send595_1;


rb1:procedure(abc,j);


DECLARE (I,j,abc) BYTE;


CALL CLEAR;


RST=1;


call send1302(abc);


IO=1;


DO I=0 TO 7;


SCLK=1;


SCLK=0;


CY=IO;


N=SCR(N,1);


END;


ab(j)=N;


ab(j)=dec(ab(j));


CALL CLEAR;


end rb1;


rbyt6:procedure;


call rb1(0f1h,0);


call rb1(0f3h,1);


call rb1(0f5h,2);


call rb1(0f7h,3);


call rb1(0f9h,4);


call rb1(0fbh,5);


call rb1(0fdh,6);


end rbyt6;


wbyt6:procedure;


call wbyt1(8eh,0);/* write enable */


call wbyt1(0f0h,ab(0));


call wbyt1(0f2h,ab(1));


call wbyt1(0f4h,ab(2));


call wbyt1(0f6h,ab(3));


call wbyt1(0f8h,ab(4));


call wbyt1(0fah,ab(5));


call wbyt1(0fch,ab(6));


call wbyt1(8eh,80h);/* write disable */


end wbyt6;


rbyt8:procedure;/*时钟多字节突发模式读过程*/


declare (i,j) byte;


call clear;


rst=1;


call send1302(command);


io=1;


do j=1 to 8;


do i=0 to 7;


sclk=1;


call time(1);


sclk=0;


cy=io;


n=scr(n,1);


end;


a(j)=n;


end;


call clear;


a(0)=a(6);a(6)=A(7);


a(0)=a(0) and 0fh;


if a(0)>6 then a(0)=0;


CALL RBYT1;


if (a(1)=0 and a(2)=0 and a(3)=0) then


do;


do num=0 to 35;


call time(250);


end;


temp1=1;


end;


if temp1=1 then


do;


temp1=0;


ab(4)=ab(4)+1;


if ab(4)>99h then


do;


ab(4)=0;


ab(5)=ab(5)+1;


if ab(5)>99h then ab(5)=0;


end;


call wbyt6;


end;


end rbyt8;


display:procedure; /*jieya,yima,fasong*/


declare (i,n,m) byte;


n=a(0) and 0fh; /* send week */


data=week(n);


call send595;


n=a(4);/* send date */


n=n and 0fh;


data=aco(n);


call send595;


n=a(4);


n=shr(n,4);


data=aco(n);


call send595;


do i=1 to 3; /* send second,minute,hour */


n=a(i);


n=n and 0fh;


data=aco(n);


call send595;


n=a(i);


n=shr(n,4);


data=aco(n);


call send595;


end;


do i=5 to 6; /* send month,year */


n=a(i);


n=n and 0fh;


data=aco(n);


call send595;


n=a(i);


n=shr(n,4);


data=aco(n);


call send595;


end;


n=a(8);/* send 19 or 20 */


n=n and 0fh;


data=aco(n);


call send595;


n=a(8);


n=shr(n,4);


data=aco(n);


call send595;


do m=0 to 5;


n=ab(m);


n=n and 0fh;


data=aco(n);


call send595_1;


n=ab(m);


n=shr(n,4);


data=aco(n);


call send595_1;


end;


ale=0;


ale=1;


end display;


beginset:procedure;


a(0)=06h;a(1)=58h;a(2)=59h;a(3)=23h;


a(4)=30h;a(5)=06h;a(6)=97h;a(7)=00;


a(8)=19h; /* set date/time (1997,7,1,8:00:00,week 3) */


call wbyt1(8eh,0);/* write enable*/


call wbyt1(80h,00h);/* start colock */


call wbyt1(0beh,0abh);/*两个二极管与8K电阻串联充电*/


command=0beh; /* write colock/date */


call wbyt8;


call wbyt1(0c0h,a(8));


call wbyt1(8eh,80h);/* set write protect bit */


end beginset;


key:procedure;


declare (i,time1,k1,tem) byte;


call time(100);


k1=7;time1=30;


if mk=0 then


do;


do while time1>0;


week: if k1=0 then


do;


do i=0 to 5;


/* call hz(a(0));*/


end;


do i=0 to 3;


/* call hz0; */


end;


end;


tem=a(k1);


if k1=7 then tem=a(8);


a(k1)=0aah;


if k1=7 then a(8)=0aah;


call display;


call time(254);


call time (254);


a(k1)=tem;


if k1=7 then a(8)=tem;


call display;


call time(254);


call time(254);


call time(254);


time1=time1-1;


if mk=0 then


do;call time(100);/*MOD KEY PROCESS*/


TIME1=30;


IF MK=0 THEN


DO;


k1=k1-1;


DO WHILE K1=0FFH;


K1=7;


END;


END;


end;


IF SK=0 THEN


DO;CALL TIME(100);/*SET KEY PROCESS*/


TIME1=30;


IF SK=0 THEN


DO;


tem=tem+1;


tem=dec(tem);


DO CASE K1;


DO WHILE tem=7;/*week*/


tem=0;


END;


DO WHILE tem=60H;/*scond*/


tem=0;


END;


DO WHILE tem=60H;/*minute*/


tem=0;


END;


DO WHILE tem=24H;/*hour*/


tem=0;


END;


DO WHILE tem=32H;/*date*/


tem=1;


END;


DO WHILE tem=13H;/*month*/


tem=1;


END;


DO while tem=100h; /* YEAR */


tem=00;


END;


DO WHILE TEM>=21H;


tem=19H;


END;


END;


A(K1)=tem;


if k1=7 then a(8)=tem;


END;


END;


END;


END;


end key;


main$program:


mk=1;sk=1;temp1=0;num=0;p32=1;


if sk=0 then call beginset;


clk=0;da=0;ale=1;


loop:


do while mk=1 ;


if a(0)>6 then a(0)=0;


command=0bfh;


call rbyt8;


call display;


do while mk=0;


call key;


call wbyt1(8eh,0);


command=0beh;


call wbyt8;


call wbyt1(0C0H,A(8));


call wbyt1(8eh,80h);


end;


end;


goto loop;


end start;

为了方便大家更好的学习,您还可以关注畅学电子和EDA的公众号,每天推送相关知识,希望能对你的学习有所帮助!

畅学单片机 以单片机为核心,带你全面了解和单片机相关的知识技巧,经验心得。关注我们,一起来学习吧!
评论
  • 临近春节,各方社交及应酬也变得多起来了,甚至一月份就排满了各式约见。有的是关系好的专业朋友的周末“恳谈会”,基本是关于2025年经济预判的话题,以及如何稳定工作等话题;但更多的预约是来自几个客户老板及副总裁们的见面,他们为今年的经济预判与企业发展焦虑而来。在聊天过程中,我发现今年的聊天有个很有意思的“点”,挺多人尤其关心我到底是怎么成长成现在的多领域风格的,还能掌握一些经济趋势的分析能力,到底学过哪些专业、在企业管过哪些具体事情?单单就这个一个月内,我就重复了数次“为什么”,再辅以我上次写的:《
    牛言喵语 2025-01-22 17:10 68浏览
  • 2024年是很平淡的一年,能保住饭碗就是万幸了,公司业绩不好,跳槽又不敢跳,还有一个原因就是老板对我们这些员工还是很好的,碍于人情也不能在公司困难时去雪上加霜。在工作其间遇到的大问题没有,小问题还是有不少,这里就举一两个来说一下。第一个就是,先看下下面的这个封装,你能猜出它的引脚间距是多少吗?这种排线座比较常规的是0.6mm间距(即排线是0.3mm间距)的,而这个规格也是我们用得最多的,所以我们按惯性思维来看的话,就会认为这个座子就是0.6mm间距的,这样往往就不会去细看规格书了,所以这次的运气
    wuliangu 2025-01-21 00:15 201浏览
  •  光伏及击穿,都可视之为 复合的逆过程,但是,复合、光伏与击穿,不单是进程的方向相反,偏置状态也不一样,复合的工况,是正偏,光伏是零偏,击穿与漂移则是反偏,光伏的能源是外来的,而击穿消耗的是结区自身和电源的能量,漂移的载流子是 客席载流子,须借外延层才能引入,客席载流子 不受反偏PN结的空乏区阻碍,能漂不能漂,只取决于反偏PN结是否处于外延层的「射程」范围,而穿通的成因,则是因耗尽层的过度扩张,致使跟 端子、外延层或其他空乏区 碰触,当耗尽层融通,耐压 (反向阻断能力) 即告彻底丧失,
    MrCU204 2025-01-17 11:30 187浏览
  • 高速先生成员--黄刚这不马上就要过年了嘛,高速先生就不打算给大家上难度了,整一篇简单但很实用的文章给大伙瞧瞧好了。相信这个标题一出来,尤其对于PCB设计工程师来说,心就立马凉了半截。他们辛辛苦苦进行PCB的过孔设计,高速先生居然说设计多大的过孔他们不关心!另外估计这时候就跳出很多“挑刺”的粉丝了哈,因为翻看很多以往的文章,高速先生都表达了过孔孔径对高速性能的影响是很大的哦!咋滴,今天居然说孔径不关心了?别,别急哈,听高速先生在这篇文章中娓娓道来。首先还是要对各位设计工程师的设计表示肯定,毕竟像我
    一博科技 2025-01-21 16:17 105浏览
  • 现在为止,我们已经完成了Purple Pi OH主板的串口调试和部分配件的连接,接下来,让我们趁热打铁,完成剩余配件的连接!注:配件连接前请断开主板所有供电,避免敏感电路损坏!1.1 耳机接口主板有一路OTMP 标准四节耳机座J6,具备进行音频输出及录音功能,接入耳机后声音将优先从耳机输出,如下图所示:1.21.2 相机接口MIPI CSI 接口如上图所示,支持OV5648 和OV8858 摄像头模组。接入摄像头模组后,使用系统相机软件打开相机拍照和录像,如下图所示:1.3 以太网接口主板有一路
    Industio_触觉智能 2025-01-20 11:04 162浏览
  • Ubuntu20.04默认情况下为root账号自动登录,本文介绍如何取消root账号自动登录,改为通过输入账号密码登录,使用触觉智能EVB3568鸿蒙开发板演示,搭载瑞芯微RK3568,四核A55处理器,主频2.0Ghz,1T算力NPU;支持OpenHarmony5.0及Linux、Android等操作系统,接口丰富,开发评估快人一步!添加新账号1、使用adduser命令来添加新用户,用户名以industio为例,系统会提示设置密码以及其他信息,您可以根据需要填写或跳过,命令如下:root@id
    Industio_触觉智能 2025-01-17 14:14 125浏览
  •     IPC-2581是基于ODB++标准、结合PCB行业特点而指定的PCB加工文件规范。    IPC-2581旨在替代CAM350格式,成为PCB加工行业的新的工业规范。    有一些免费软件,可以查看(不可修改)IPC-2581数据文件。这些软件典型用途是工艺校核。    1. Vu2581        出品:Downstream     
    电子知识打边炉 2025-01-22 11:12 82浏览
  • 嘿,咱来聊聊RISC-V MCU技术哈。 这RISC-V MCU技术呢,简单来说就是基于一个叫RISC-V的指令集架构做出的微控制器技术。RISC-V这个啊,2010年的时候,是加州大学伯克利分校的研究团队弄出来的,目的就是想搞个新的、开放的指令集架构,能跟上现代计算的需要。到了2015年,专门成立了个RISC-V基金会,让这个架构更标准,也更好地推广开了。这几年啊,这个RISC-V的生态系统发展得可快了,好多公司和机构都加入了RISC-V International,还推出了不少RISC-V
    丙丁先生 2025-01-21 12:10 131浏览
  •  万万没想到!科幻电影中的人形机器人,正在一步步走进我们人类的日常生活中来了。1月17日,乐聚将第100台全尺寸人形机器人交付北汽越野车,再次吹响了人形机器人疯狂进厂打工的号角。无独有尔,银河通用机器人作为一家成立不到两年时间的创业公司,在短短一年多时间内推出革命性的第一代产品Galbot G1,这是一款轮式、双臂、身体可折叠的人形机器人,得到了美团战投、经纬创投、IDG资本等众多投资方的认可。作为一家成立仅仅只有两年多时间的企业,智元机器人也把机器人从梦想带进了现实。2024年8月1
    刘旷 2025-01-21 11:15 530浏览
  • 本文介绍瑞芯微开发板/主板Android配置APK默认开启性能模式方法,开启性能模式后,APK的CPU使用优先级会有所提高。触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。源码修改修改源码根目录下文件device/rockchip/rk3562/package_performance.xml并添加以下内容,注意"+"号为添加内容,"com.tencent.mm"为AP
    Industio_触觉智能 2025-01-17 14:09 167浏览
  • 数字隔离芯片是一种实现电气隔离功能的集成电路,在工业自动化、汽车电子、光伏储能与电力通信等领域的电气系统中发挥着至关重要的作用。其不仅可令高、低压系统之间相互独立,提高低压系统的抗干扰能力,同时还可确保高、低压系统之间的安全交互,使系统稳定工作,并避免操作者遭受来自高压系统的电击伤害。典型数字隔离芯片的简化原理图值得一提的是,数字隔离芯片历经多年发展,其应用范围已十分广泛,凡涉及到在高、低压系统之间进行信号传输的场景中基本都需要应用到此种芯片。那么,电气工程师在进行电路设计时到底该如何评估选择一
    华普微HOPERF 2025-01-20 16:50 76浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦