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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue+ElementUI前端添加展开收起搜索框按钮

1、搜索框添加判断 v-if"advanced" <el-form-item label"创建日期" v-if"advanced"><el-date-pickerv-model"daterangeLedat"size"small"style"width: 240px"value-format"yyyy-MM-dd"type&q…

基于grpc从零开始搭建一个准生产分布式应用(7) - 01 - 附:GRPC拦截器源码

开始前必读&#xff1a;​​基于grpc从零开始搭建一个准生产分布式应用(0) - quickStart​​ 一、源码目录结构 二、GRPC拦截器源码 2.1、com.zd.baseframework.core.core.common.interceptor package com.zd.baseframework.core.core.common.interceptor;import com.zd.ba…

element plus 表格el-table行多选单选

1 行多选-点击checkbox 添加一个 el-table-column&#xff0c;设 type 属性为 selection 即可 <template><div class"box"><el-table :data"tableData" selection-change"handleSelectionChange"><el-table-column type&…

docker小白第六天

docker小白第六天 容器数据卷是什么 首先&#xff0c;容器卷有个坑&#xff1a;容器卷需要加入privilegedtrue&#xff0c;如下图所示&#xff0c;是为了解决permission denied的问题。其中“挂载”的意思是相当于一个硬盘插到主机上。使用该命令。是扩大容器的权限解决挂载目…

路由器设置代理IP教程,http代理怎么固定IP地址?

路由器设置代理IP教程 一、确定代理IP地址 首先&#xff0c;你需要确定你要使用的代理IP地址。你可以从代理服务提供商处获取代理IP地址和端口号。 二、登录路由器管理界面 在浏览器中输入路由器的IP地址&#xff0c;输入账号和密码&#xff0c;进入路由器的管理界面。 三、设置…

高级桌面编程(二)

一、前言 文章的续作前文是&#xff1a; 高级桌面编程&#xff08;一&#xff09;-CSDN博客https://blog.csdn.net/qq_71897293/article/details/135072204?spm1001.2014.3001.5502 二、自定义控件 1创建自定义控件&#xff0c;如下图所示&#xff1a; 2 在创建的页面可以…

架构设计系列之前端架构和后端架构的区别和联系

前端架构和后端架构都是软件系统中最关键的架构层&#xff0c;负责处理不同方面的任务和逻辑&#xff0c;两者之间是存在一些区别和联系的&#xff0c;我会从以下几个方面来阐述&#xff1a; 一、定位和职责 前端架构 主要关注用户界面和用户体验&#xff0c;负责处理用户与…

10000字讲解TCP协议(确认应答,超时重传,三次握手,四次挥手等等众多机制)以及UDP协议(UDP报文,校验和)

文章目录 UDP协议&#xff1f;什么是校验和&#xff1f;基于UDP的应用层协议(了解) TCP协议确认应答(可靠性机制)超时重传(可靠性机制)连接管理(可靠性机制)三次握手(重点)四次挥手(重点) 三次握手和四次挥手时客户端和服务器的状态滑动窗口(效率机制)流量控制(效率机制)窗口探…

大型语言模型:SBERT — Sentence-BERT

slavahead 一、介绍 Transformer 在 NLP 方面取得了进化进步&#xff0c;这已经不是什么秘密了。基于转换器&#xff0c;许多其他机器学习模型已经发展起来。其中之一是BERT&#xff0c;它主要由几个堆叠的变压器编码器组成。除了用于情感分析或问答等一系列不同的问题外&#…

国产ToolLLM的课代表---OpenBMB机构(清华NLP)旗下ToolBench的安装部署与运行(附各种填坑说明)

ToolBench项目可以理解为一个能直接提供训练ToolLLM的平台&#xff0c;该平台同时构建了ToolLLM的一个开源训练指令集。&#xff0c;该项目是OpenBMB机构&#xff08;面壁智能与清华NLP联合成立&#xff09;旗下的一款产品&#xff0c;OpenBMB机构名下还同时拥有另外一款明星产…

一种基于IWR6843雷达的跌倒检测系统的设计和实现(TI文档)

摘要 随着年龄增长&#xff0c;人体各项生理机能退化严重&#xff0c;老年人很容易发生跌倒&#xff0c;导致身体受到严重的伤害。近年来&#xff0c;随着国内人口老龄化越来越严重&#xff0c;主要针对老年人的跌倒检测系统正受到越来越多的关注。和常用的加速度传感器和视觉技…

vue el-date-picker中datetime类型对今天之后的日期包含时分禁用

vue el-date-picker中datetime类型对今天之后的日期包含时分禁用 目前对选择秒那一列未禁用 <template><div><el-date-pickerv-model"deactivateTime"type"datetime"format"yyyy-MM-dd HH:mm:ss"value-format"yyyy-MM-dd HH…

Unity 通过代码将一张大图切成多个小图的方法

在Unity 中要通过代码将一张贴图切割成多张小图&#xff0c;可以使用以下方法&#xff1a; /// <summary>/// 把一张图片切割成多张使用/// </summary>/// <param name"texture">原图</param>/// <param name"rows">切割的行…

SQL进阶理论篇(十三):数据库的查询优化器是什么?

文章目录 简介什么是查询优化器查询优化器的两种优化方式总结参考文献 简介 事务可以让数据库在增删改查的过程中&#xff0c;保证数据的正确性和安全性&#xff0c;而索引可以帮数据库提升数据的查找效率。查询优化器&#xff0c;则是帮助我们获取更高的SQL查询性能。 本节我…

持续集成交付CICD:K8S 自动化完成前端项目应用发布与回滚

目录 一、实验 1.环境 2.GitLab新建项目存放K8S部署文件 3.Jenkins手动测试前端项目CD 流水线代码&#xff08;下载部署文件&#xff09; 4. 将K8S master节点配置为jenkins从节点 5.K8S 手动回滚前端项目版本 6.Jenkins手动测试前端项目CD 流水线代码&#xff08;发布应…

空间转录组 多样本整合分析—stlearn

大家好&#xff0c;今天介绍一款空间转录组整合分析的python软件——stlearn。 如果你还不会安装&#xff0c;可以看下之前的推文&#xff0c;windows系统本地安装stlearn&#xff1a;本地安装jupyterlab&#xff0c;并创建conda小环境——以空间转录组细胞互作之stlearn安装为…

设计模式——0前言目录

1 设计模式介绍 应当站在产品经理的角度来学习设计模式 是软件设计中常见问题的典型解决方案&#xff0c;可用于解决代码中反复出现的设计问题 学习效果一般的原因在于自己没有站在产品经理的角度学习&#xff0c;仅仅是为了学习怎么实现&#xff0c;用什么算法实现。 分类&…

telnet的交互原理(wireshark分析)

telnet的交互原理&#xff08;wireshark篇&#xff09; telnet的协议类型是tcp&#xff0c;他的密钥用的是明文的&#xff0c;容易被捕获&#xff0c;所以后来的windows基本弃用了telnet服务端但依然保留了客户端。 下面是他的交互抓包&#xff1a; 这里面的前三条运用的是tc…

一种基于外观-运动语义表示一致性的视频异常检测框架 论文阅读

A VIDEO ANOMALY DETECTION FRAMEWORK BASED ON APPEARANCE-MOTION SEMANTICS REPRESENTATION CONSISTENCY 论文阅读 ABSTRACT1. INTRODUCTION2. PROPOSED METHOD3. EXPERIMENTAL RESULTS4. CONCLUSION阅读总结&#xff1a; 论文标题&#xff1a;A VIDEO ANOMALY DETECTION FRA…

【工作流Activiti】MyActivit的maven项目

1、Idea新建一个项目MyActivit的maven项目 2、安装插件 在 idea 里面&#xff0c;activiti 的插件叫 actiBPM&#xff0c;在插件库里面把它安装好&#xff0c;重启 idea 就行了。 3、 maven 项目中&#xff0c;并更改 pom.xml。pom 中依赖如下&#xff1a; <?xml version…