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

news2024/11/17 11:30:26

本例介绍一种用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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1323020.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能中不可预测的潜在错误可能是灾难性的——数学解释

一、说明 有没有人研究评估AI的错误产生的后果有多么严重,是否存在AI分险评估机制?更高维度上,人工智能的未来是反乌托邦还是乌托邦?这个问题一直是争论的话题,各大阵营都支持。我相信我们无法准确预测这两种结果。这是…

画图之C4架构图idea和vscode环境搭建篇

VS Code 下C4-PlantUML安装 安装VS Code 直接官网下载安装即可,过程略去。 安装PlantUML插件 在VS Code的Extensions窗口中搜索PlantUML,安装PlantUML插件。 配置VS Code代码片段 安装完PlantUML之后,为了提高效率,我们最好安装PlantUML相关的代码片段。 打开VS Cod…

React心理健康测试网站系统源码

帮助需要的人更好地了解自己的心理健康状态和人格特征。本模板提供了一个最小的配置,使得React可以在Vite中启用HMR,并且包含了几个ESLint规则。只需要使用react antd-mobile即可轻松部署完成。 源码下载:https://download.csdn.net/downlo…

操作系统系列:Unix进程系统调用fork,wait,exec

操作系统系列:Unix进程系统调用 fork系统调用fork()运用的小练习 wait系统调用Zombiesexec 系列系统调用 开发者可以查看创建新进程的系统调用,这个模块会讨论与进程相关的Unix系统调用,下一个模块会讨论Win32 APIs相关的进程。 fork系统调用…

智能优化算法应用:基于学生心理学算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于学生心理学算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于学生心理学算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.学生心理学算法4.实验参数设定5.算法…

VS+Qt 打包Python程序

书接上回,调用C调用python,下面来谈谈随exe文件打包。 先说下环境vs2019Qt5.12.11python3.8,这里需要注意如果你要适配Win7的系统,python最好是9以下,以上不兼容,也没时间找方法,找到评论说下 如…

实现个人日志命令行工具(C语言)

〇、前言 中午上课的时候,打开 github 看了一下个人主页,虽然最近很忙,但是这个活动记录有点过于冷清: 于是我就想着写一个日志命令行工具,输入以下命令就能将我的日志立即同步到 github 上: mylog toda…

Jenkins+Docker+Gitee搭建自动化部署平台

目录 服务器准备 Docker安装 yum 包更新到最新 设置yum源 安装docker 启动和开机启动 验证安装是否成功 Jenkins安装 拉取镜像 创建映射目录 运行镜像 运行出错 修正权限 重新运行镜像 新建安全组,放通8080端口 激活Jenkins Jenkins插件 Jenkins全…

el-form与el-upload结合上传带附件的表单数据(前端篇)

1.写在之前 本文前端采用Vue element-plus技术栈,前端项目参考yudao-ui-admin-vue3项目与Geeker-Admin项目。 这篇文章是el-form与el-upload结合上传带附件的表单数据(后端篇)-CSDN博客姐妹篇,后端篇文章主要讲的是后端的实现逻…

限流原理与实践:固定窗口、滑动窗口、漏桶与令牌桶解析

方案一、固定窗口限流算法 这里我们通过一个 demo 来介绍固定窗口限流算法。 创建一个 FixWindowRateLimiterService 类。 Service public class FixWindowRateLimiterService {Resourceprivate StringRedisTemplate stringRedisTemplate;private static final DefaultRedisSc…

新手上路:自动驾驶行业快速上手指南

文章目录 1.自动驾驶技术的发展1.1 工业革命驱动自动驾驶技术发展1.2 想象中的未来:科幻作品中的自动驾驶汽车1.3 自动驾驶技术萌芽与尝试1.4 百花争鸣:自动驾驶科技巨头与创业公司并进 2.个人开发者,如何玩转自动驾驶?2.1 灵活易…

Opencv实验合集——实验六:模板匹配

1.概念 模板匹配旨在在图像中找到与给定模板最相似的部分。其核心思想是通过滑动模板,计算每个位置与模板的相似性,然后找到最匹配的位置。这一过程常涉及选择匹配度量方法,如平方差匹配、归一化平方差匹配、相关性匹配等。模板匹配在目标检…

git缓存区、本地仓库、远程仓库的同步问题(初始化库无法pull和push)

git新建库与本地库同步 gitee使用教程,git的下载与安装接不在叙述了。 新建远程仓库 新建远程仓库必须要使用仓库提供的api,也就是仓库门户网站,例如gitee,github,gitlab等。在上图中使用gitee网址中新建了一个test仓…

【无语】Microsoft Edge 浏览器不显示后台返回的数值数据

Microsoft Edge 禁用 JSON 视图 写在前面禁用 JSON 视图 写在前面 遇到一个有意思的事情,在用 Microsoft Edge 浏览器发送请求测试时发现,后端返回的数值数据没有正常展示,而是类似查看源码的结果,只显示了一个行号1,…

SpringMVC01

SpringMVC 1. 学习⽬标2. 什么叫MVC?3. SpringMVC 框架概念与特点4. SpringMVC 请求流程5. Spring MVC 环境搭建6. URL 地址映射配置7. 参数绑定8. JSON 数据开发JSON普通数组步骤1:pom.xml添加依赖步骤2: 修改配置⽂件步骤3. 注解使⽤ 1. 学习⽬标 2. 什…

Android Studio: 解决Gradle sync failed 错误

文章目录 1. 前言2. 错误情况3. 解决办法3.1 获取gradle下载地址3.2 获取gradle存放目录3.3 替换并删除临时文件3.4 触发Try Again 4. 执行成功 1. 前言 今天调试项目,发现新装的AS,在下载gradle的过程中,一直显示连接失败,Gradl…

Zookeeper-快速开始

Zookeeper介绍 简介:ZooKeeper 是一个开源的分布式协调框架,是Apache Hadoop 的一个子项目,主要用来解决分布式集群中应用系统的一致性问题。 设计目标:将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效…

数据可视化---饼图、环形图、雷达图

类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统计学检验箱…

linux:掌握systemctl命令控制软件的启动和关闭、掌握使用ln命令创建软连接

掌握使用systemctl命令控制软件的启动和关闭 一:systemctl命令: Linux系统很多软件(内置或第三方)均支持使用systemctl命令控制:启动停止、开机自启 能够被systemctl管理的软件一般也称之为:服务 语法: systemctl | start | stop | status | enable …

JDK各个版本特性讲解-JDK17特性

JDK各个版本特性讲解-JDK17特性 一、JAVA17概述二、语法层面的变化1.JEP 409:密封类2.JEP 406:switch模式匹配(预览) 三、API层面变化1.JEP 414:Vector API(第二个孵化器)2.JEP 415:…