单片机应用实例: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的公众号,每天推送相关知识,希望能对你的学习有所帮助!

畅学单片机 以单片机为核心,带你全面了解和单片机相关的知识技巧,经验心得。关注我们,一起来学习吧!
评论
  • RK3506 是瑞芯微推出的MPU产品,芯片制程为22nm,定位于轻量级、低成本解决方案。该MPU具有低功耗、外设接口丰富、实时性高的特点,适合用多种工商业场景。本文将基于RK3506的设计特点,为大家分析其应用场景。RK3506核心板主要分为三个型号,各型号间的区别如下图:​图 1  RK3506核心板处理器型号场景1:显示HMIRK3506核心板显示接口支持RGB、MIPI、QSPI输出,且支持2D图形加速,轻松运行QT、LVGL等GUI,最快3S内开
    万象奥科 2024-12-11 15:42 88浏览
  • 应用环境与极具挑战性的测试需求在服务器制造领域里,系统整合测试(System Integration Test;SIT)是确保产品质量和性能的关键步骤。随着服务器系统的复杂性不断提升,包括:多种硬件组件、操作系统、虚拟化平台以及各种应用程序和服务的整合,服务器制造商面临着更有挑战性的测试需求。这些挑战主要体现在以下五个方面:1. 硬件和软件的高度整合:现代服务器通常包括多个处理器、内存模块、储存设备和网络接口。这些硬件组件必须与操作系统及应用软件无缝整合。SIT测试可以帮助制造商确保这些不同组件
    百佳泰测试实验室 2024-12-12 17:45 53浏览
  • 一、SAE J1939协议概述SAE J1939协议是由美国汽车工程师协会(SAE,Society of Automotive Engineers)定义的一种用于重型车辆和工业设备中的通信协议,主要应用于车辆和设备之间的实时数据交换。J1939基于CAN(Controller Area Network)总线技术,使用29bit的扩展标识符和扩展数据帧,CAN通信速率为250Kbps,用于车载电子控制单元(ECU)之间的通信和控制。小北同学在之前也对J1939协议做过扫盲科普【科普系列】SAE J
    北汇信息 2024-12-11 15:45 112浏览
  • 首先在gitee上打个广告:ad5d2f3b647444a88b6f7f9555fd681f.mp4 · 丙丁先生/香河英茂工作室中国 - Gitee.com丙丁先生 (mr-bingding) - Gitee.com2024年对我来说是充满挑战和机遇的一年。在这一年里,我不仅进行了多个开发板的测评,还尝试了多种不同的项目和技术。今天,我想分享一下这一年的故事,希望能给大家带来一些启发和乐趣。 年初的时候,我开始对各种开发板进行测评。从STM32WBA55CG到瑞萨、平头哥和平海的开发板,我都
    丙丁先生 2024-12-11 20:14 73浏览
  • 本文介绍瑞芯微RK3588主板/开发板Android12系统下,APK签名文件生成方法。触觉智能EVB3588开发板演示,搭载了瑞芯微RK3588芯片,该开发板是核心板加底板设计,音视频接口、通信接口等各类接口一应俱全,可帮助企业提高产品开发效率,缩短上市时间,降低成本和设计风险。工具准备下载Keytool-ImportKeyPair工具在源码:build/target/product/security/系统初始签名文件目录中,将以下三个文件拷贝出来:platform.pem;platform.
    Industio_触觉智能 2024-12-12 10:27 62浏览
  • 铁氧体芯片是一种基于铁氧体磁性材料制成的芯片,在通信、传感器、储能等领域有着广泛的应用。铁氧体磁性材料能够通过外加磁场调控其导电性质和反射性质,因此在信号处理和传感器技术方面有着独特的优势。以下是对半导体划片机在铁氧体划切领域应用的详细阐述: 一、半导体划片机的工作原理与特点半导体划片机是一种使用刀片或通过激光等方式高精度切割被加工物的装置,是半导体后道封测中晶圆切割和WLP切割环节的关键设备。它结合了水气电、空气静压高速主轴、精密机械传动、传感器及自动化控制等先进技术,具有高精度、高
    博捷芯划片机 2024-12-12 09:16 85浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-11 17:58 86浏览
  • 全球智能电视时代来临这年头若是消费者想随意地从各个通路中选购电视时,不难发现目前市场上的产品都已是具有智能联网功能的智能电视了,可以宣告智能电视的普及时代已到临!Google从2021年开始大力推广Google TV(即原Android TV的升级版),其他各大品牌商也都跟进推出搭载Google TV操作系统的机种,除了Google TV外,LG、Samsung、Panasonic等大厂牌也开发出自家的智能电视平台,可以看出各家业者都一致地看好这块大饼。智能电视的Wi-Fi连线怎么消失了?智能电
    百佳泰测试实验室 2024-12-12 17:33 53浏览
  • 在智能化技术快速发展当下,图像数据的采集与处理逐渐成为自动驾驶、工业等领域的一项关键技术。高质量的图像数据采集与算法集成测试都是确保系统性能和可靠性的关键。随着技术的不断进步,对于图像数据的采集、处理和分析的需求日益增长,这不仅要求我们拥有高性能的相机硬件,还要求我们能够高效地集成和测试各种算法。我们探索了一种多源相机数据采集与算法集成测试方案,能够满足不同应用场景下对图像采集和算法测试的多样化需求,确保数据的准确性和算法的有效性。一、相机组成相机一般由镜头(Lens),图像传感器(Image
    康谋 2024-12-12 09:45 75浏览
  • 时源芯微——RE超标整机定位与解决详细流程一、 初步测量与问题确认使用专业的电磁辐射测量设备,对整机的辐射发射进行精确测量。确认是否存在RE超标问题,并记录超标频段和幅度。二、电缆检查与处理若存在信号电缆:步骤一:拔掉所有信号电缆,仅保留电源线,再次测量整机的辐射发射。若测量合格:判定问题出在信号电缆上,可能是电缆的共模电流导致。逐一连接信号电缆,每次连接后测量,定位具体哪根电缆或接口导致超标。对问题电缆进行处理,如加共模扼流圈、滤波器,或优化电缆布局和屏蔽。重新连接所有电缆,再次测量
    时源芯微 2024-12-11 17:11 109浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-12 10:13 40浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦