【proteus经典实战】VB上位机程序控制DS1302时钟的proteus仿真

一、简介:

VB上位机程序控制DS1302时钟是一种常见的应用,DS1302是一款实时时钟芯片,通常用于计算机、电子设备或其他系统中,以提供时间戳和其他时间相关功能,DS1302时钟芯片通常需要外部电源供电,并且具有有限的存储空间和数据传输速率。因此,在控制DS1302时钟时,需要考虑到这些因素,并采取适当的措施以确保芯片的正常运行和数据的安全。

二、头文件与变量定义:

主要用于初始化一些硬件接口,例如实时时钟(DS1302)和一些控制芯片的引脚设置。具体来说,它包括了一些特殊功能寄存器(SFR)的定义和一些用于连接硬件的位定义。这些定义在微控制器的开发中非常常见,它们使得开发者能够更好地控制硬件并与之交互。
首先包含了头文件reg52.h,它包含了8051微控制器的特殊功能寄存器的定义。然后定义了一些位定义,如实时时钟的时钟线、数据线、复位线等引脚,以及一些控制芯片的输入/输出引脚。
此外,代码中还定义了一个字节型的数组tab,它包含了数字0到9的ASCII码值。这个数组可能用于显示实时时钟的时间。

#include <reg52.h>

sbit T_CLK = P2^4; /*实时时钟时钟线引脚 */
sbit T_IO = P2^3; /*实时时钟数据线引脚 */
sbit T_RST = P2^2; /*实时时钟复位线引脚 */
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^7;
sbit setd=P3^2;
sbit sett=P3^3;
sbit add=P2^5;
sbit enter=P2^6;
sbit speaker=P3^7;
unsigned char code tab[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};

三、各函数模块介绍:

用于处理实时时钟输入字节的函数。函数`v_RTInputByte`接收一个无符号字符类型的参数`ucDa`,并将这个字节的值存储在`ACC`寄存器中。
然后,函数会通过循环8次(每次循环都把ACC寄存器的内容右移一位)来实现对输入字节的循环右移操作。循环右移的操作是用汇编语言中的`RRC`指令实现的,`RRC`是"右循环移位寄存器"的意思,它会把最低位移动到最高位,其余位则向左移动一位。
在每次循环中,都会通过`T_IO = ACC0;`来更新时钟线`T_IO`的值,可能是在启动或结束一次时钟操作。在8次循环后,原始的输入字节被左移8位并重新装载到ACC寄存器中。

3.1 v_RTInputByte

void v_RTInputByte(unsigned char ucDa) 
{ 
    unsigned char i;
    ACC = ucDa;
    for(i=8; i>0; i--)
    {
        T_IO = ACC0; /*相当于汇编中的 RRC */
        T_CLK = 1;
        T_CLK = 0;
        ACC = ACC >> 1; 
    } 
}

3.2 uc_RTOutputByte

函数 uc_RTOutputByte,返回一个无符号字符(unsigned char)类型的值。
函数通过循环将一个8位变量 ACC 的值右移一位,并将最低位的值设置为 T_IO 的值。然后,通过控制时钟线 T_CLK 的状态,进行时钟信号的产生,完成一次数据的传输。具体来说,循环中的操作相当于汇编中的循环右移(RRC)指令。
最后,函数返回变量 ACC 的值。
该函数是用于读取外部设备通过串行通信接口传输的一个字节的数据。
unsigned char uc_RTOutputByte(void) 
{ 
    unsigned char i;
    for(i=8; i>0; i--)
    {
        ACC = ACC >>1; /*相当于汇编中的 RRC */
        ACC7 = T_IO;
        T_CLK = 1;
        T_CLK = 0;
    } 
    return(ACC); 
}

3.3 v_W1302

定义了一个函数 v_W1302,该函数负责向某个设备(可能是一种RTC,例如DS1302实时时钟模块)写入数据。函数接受两个参数,一个是地址(ucAddr),另一个是要写入的数据(ucDa)。

初始化通信界面:

T_RST = 0; 首先将复位(RST)引脚设为低电平。
T_CLK = 0; 然后将时钟(CLK)引脚设为低电平。
T_RST = 1; 接着将复位(RST)引脚设为高电平,以启动与目标设备的通信。

发送地址和命令:

v_RTInputByte(ucAddr); 发送地址或命令给目标设备。这里的 v_RTInputByte 函数可能是用于发送一个字节的数据,但是具体的实现在这段代码中没有给出。
写入数据:

v_RTInputByte(ucDa); 发送实际的数据字节给目标设备。
结束通信:

T_CLK = 1; 把时钟(CLK)引脚设为高电平。
T_RST =0; 最后将复位(RST)引脚设为低电平,结束与目标设备的通信。
这个函数的作用是通过特定的通信协议(可能是SPI或类似的串行通信协议),向一个外部设备写入数据。根据函数名称和参数,可以推测这段代码可能用于操作DS1302或类似的实时时钟(RTC)模块。DS1302等RTC模块常用于提供精确的时间和日期信息,并可通过SPI等串行接口与微控制器通信。

void v_W1302(unsigned char ucAddr, unsigned char ucDa)
{
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    v_RTInputByte(ucAddr); /* 地址,命令 */
    v_RTInputByte(ucDa); /* 写1Byte数据*/
    T_CLK = 1;
    T_RST =0;
}

3.4 uc_R1302

定义了一个函数 uc_R1302,该函数负责从某个设备(可能是一种RTC,例如DS1302实时时钟模块)读取数据。函数接受一个参数 ucAddr,表示要读取的数据的地址。

初始化通信界面:

T_RST = 0; 首先将复位(RST)引脚设为低电平。
T_CLK = 0; 然后将时钟(CLK)引脚设为低电平。
T_RST = 1; 接着将复位(RST)引脚设为高电平,以启动与目标设备的通信。

发送地址和命令:

v_RTInputByte(ucAddr); 发送地址或命令给目标设备。这里的 v_RTInputByte 函数可能是用于发送一个字节的数据,但是具体的实现在这段代码中没有给出。

读取数据:

ucDa = uc_RTOutputByte(); 调用 uc_RTOutputByte 函数从目标设备读取一个字节的数据,并将其保存到变量 ucDa 中。

结束通信:

T_CLK = 1; 把时钟(CLK)引脚设为高电平。
T_RST =0; 最后将复位(RST)引脚设为低电平,结束与目标设备的通信。

返回数据:

return(ucDa); 将读取的数据字节返回给调用者。
这个函数的作用是通过特定的通信协议(可能是SPI或类似的串行通信协议),从一个外部设备读取数据。根据函数名称和参数,可以推测这段代码可能用于操作DS1302或类似的实时时钟(RTC)模块,从中读取特定地址的数据。
unsigned char uc_R1302(unsigned char ucAddr)
{
    unsigned char ucDa;
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    v_RTInputByte(ucAddr); /* 地址,命令 */
    ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
    T_CLK = 1;
    T_RST =0;
    return(ucDa);
}

3.5 v_BurstW1302T

参数解析: 函数接受一个指针*pSecDa作为参数,这个指针指向一个包含待写入数据的数组。这个数组预期包含DS1302实时钟模块的时间和日期数据,以及可能的控制字节。

写保护关闭: 首先,函数使用v_W1302(0x8e,0x00);调用来关闭写保护。0x8e是DS1302的写保护控制寄存器的地址,写入0的操作是为了确保可以向DS1302写入数据。

初始化通信: 通过设置T_RST和T_CLK的状态,初始化与DS1302的通信。T_RST = 0;和T_CLK = 0;用于确保开始前总线是清晰的。随后T_RST = 1;开启DS1302的通信。

发送写命令: 通过调用v_RTInputByte(0xbe);发送0xbe命令至DS1302,这个命令是时钟多字节写操作的命令。这允许连续写入多个字节到DS1302而不需要每次写入都发送地址。

批量写数据: 使用for循环和v_RTInputByte(*pSecDa);将数组pSecDa指向的8字节数据写入到DS1302。这8字节通常包含了秒、分、时、日、月、星期和年的信息,以及一个控制字节。

结束通信: 最后,通过设置T_CLK = 1;和T_RST =0;结束与DS1302的通信。

点击【proteus经典实战】VB上位机程序控制DS1302时钟的proteus仿真——古月居可查看全文

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

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

相关文章

ROS2仿真工具-gazebo

gazebo独立于ROS2&#xff0c;就像插件一样&#xff0c;需要安装。 1.安装 sudo apt install gazebo sudo apt install ros-humble-gazebo-* 2.运行测试demo gazebo /opt/ros/humble/share/gazebo_plugins/worlds/gazebo_ros_diff_drive_demo.world 查看所有话题 ros2 top…

6月份上海二手房卖疯了,暴涨四成,反价房东被抛弃

6月份刚刚结束&#xff0c;北京、上海两大城市的房市成交情况纷纷出炉&#xff0c;从成交量来看上海房市明显比北京火热许多&#xff0c;同时与其他城市类似&#xff0c;消费者偏向于二手房。 6月份上海二手房往前高达2.6万套&#xff0c;环比增加超四成&#xff0c;创下2021年…

Windows下Visual Studio 中配置第一个CUDA工程

今天整NVIDIA 的CUDA 安装和第一个CUDA 代码&#xff0c;顺便添加一个有CUDA工程的空框架。 &#xff08;1&#xff09;首先确认自己的CUDA 已经安装成功 >>cmd 进入命令窗&#xff0c;在窗口输入查看cuda 是否安装成功&#xff0c;能查到CUDA的版本号&#xff0c;表示安…

在CenteOs7上安装mysql8.0(Super详细版)

在CenteOs7上安装mysql8.0 为什么用Mysql8.0&#xff1f;如何下载下载地址需要提前准备下载步骤 服务器上安装如何上传到服务器&#xff1f;通过wget下载到服务器并解压 开始安装非必须安装如果全部安装执行顺序 安装完后&#xff0c;启动mysql使用“systemctl”检测mysqld服务…

基于YOLOv10深度学习的CT扫描图像肾结石智能检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

《企业实战分享 · 常用运维中间件》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; 近期刚转战 CSDN&#xff0c;会严格把控文章质量&#xff0c;绝不滥竽充数&#xff0c;如需交流&#xff…

《昇思25天学习打卡营第6天|网络构建》

文章目录 前言&#xff1a;今日所学&#xff1a;1. 定义模型类2. 模型层3. 模型参数 前言&#xff1a; 在第六节中我们学习了网络构建&#xff0c;了解了神经网络模型是由神经网络层和Tensor操作构成&#xff0c;我们使用的mindspore.nn中提供了常见的升级网络层的实现&#x…

Spark on k8s 源码解析执行流程

Spark on k8s 源码解析执行流程 1.通过spark-submit脚本提交spark程序 在spark-submit脚本里面执行了SparkSubmit类的main方法 2.运行SparkSubmit类的main方法&#xff0c;解析spark参数&#xff0c;调用submit方法 3.在submit方法里调用doRunMain方法&#xff0c;最终调用r…

Python学习速成必备知识,(20道练习题)!

基础题练习 1、打印出1-100之间的所有偶数&#xff1a; for num in range(1, 101):if num % 2 0:print(num) 2、打印出用户输入的字符串的长度&#xff1a; string input("请输入一个字符串&#xff1a;")print("字符串的长度为&#xff1a;", len(str…

PHP验证日本手机电话号码

首先&#xff0c;您需要了解手机号码的规格。 根据 &#xff0c;手机和PHS&#xff08;个人手持电话系统&#xff09;可以理解为以“070”、“080”和“090”开头的11位数字。 此外&#xff0c;以“050”开头的11位特定IP电话号码也将包含在该目标中。 关于以“060”开头的F…

Git 基础-创建版本库 git init、添加到暂存区git add、查看状态git status、查看改动git diff

1.创建版本库 git init 在目录中创建新的 Git 仓库。 你可以在任何时候、任何目录中这么做&#xff0c;完全是本地化的。 在目录中执行 git init&#xff0c;就可以创建一个 Git 仓库了。 注意: 没事不要手动修改 .git 目录里面的文件&#xff0c;不然改乱了&#xff0c;可能就…

初识Java(复习版)

一. 什么是Java Java是一种面向对象的编程语言&#xff0c;和C语言有所不同&#xff0c;C语言是一门面向过程的语言。偏底层实现&#xff0c;比较注重底层的逻辑实现。不能一味的说某一种语言特别好&#xff0c;每一种语言都是在特定的情况下有自己的优势。 二.Java语言发展史…

Redis哨兵和集群模式

特性哨兵模式集群模式高可用性是是数据分片否是水平扩展否是配置复杂度低高管理复杂度低高多键操作支持是否&#xff08;有限制&#xff09; 哨兵模式 原理&#xff1a; Redis 哨兵模式是一种高可用性解决方案&#xff0c;它通过监控 Redis 主从架构&#xff0c;自动执行故障…

JavaSEJava8 时间日期API + 使用心得

文章目录 1. LocalDate2. LocalTime3. LocalDateTime3.1创建 LocalDateTime3.2 LocalDateTime获取方法 4. LocalDateTime转换方法4.1 LocalDateTime增加或者减少时间的方法4.2 LocalDateTime修改方法 5. Period6. Duration7. 格式转换7.1 时间日期转换为字符串7.2 字符串转换为…

怎么导出等长,差分对的走线长度?

简介 今天需要导出等长组&#xff0c;差分对的走线长度&#xff1f;这个需要怎么做呢&#xff1f; 差分对和等长组 先来熟悉一下等长组和差分对的概念&#xff08;表现在软件上&#xff09; 差分对&#xff0c;是一对两个网等长组&#xff0c;多个网络 导出各自的数据 打开…

马斯克宣布xAI将在8月份推出Grok-2大模型 预计年底推出Grok-3

在今年内&#xff0c;由特斯拉创始人马斯克创立的人工智能初创公司xAI将推出两款重要产品Grok-2和Grok-3。马斯克在社交平台上透露了这一消息&#xff0c;其中Grok-2预计在今年8月份面世&#xff0c;而Grok-3则计划于年底前亮相。 除此之外&#xff0c;马斯克还表示&#xff0c…

LLM指令微调Prompt的最佳实践(二):Prompt迭代优化

文章目录 1. 前言2. Prompt定义3. 迭代优化——以产品说明书举例3.1 产品说明书3.2 初始Prompt3.3 优化1: 添加长度限制3.4 优化2: 细节纠错3.5 优化3: 添加表格 4. 总结5. 参考 1. 前言 前情提要&#xff1a; 《LLM指令微调Prompt的最佳实践&#xff08;一&#xff09;&#…

初试总分409分,专业课143,西电821专业

非常感谢自己考研409分上岸西安电子科技大学&#xff0c;杭州研究院&#xff0c;专业课143分&#xff0c;跟的研梦&#xff0c;讲课以及答疑还是非常专业的。 821专业课课本总共有四本&#xff0c;都在官网考纲的参考书里写了&#xff0c;不过主要参考其中两本&#xff0c;一本…

Go GMP:并发编程实践

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

速锐得解码汽车以太网技术特点接口定义数据传输及应用

在当前的汽车工业中&#xff0c;随着技术的飞速发展&#xff0c;车载网络技术也在不断进步与更新。其中&#xff0c;具备以太网的车型已成为一个新兴趋势&#xff0c;这主要归功于车载以太网技术在车内带宽需求较高的系统上的应用&#xff0c;如高级驾驶辅助系统&#xff08;AD…