关于单片机上for循环中运用ACC的隐蔽错误

单片机仿真工具全攻略:从Keil+Proteus到Wokwi在线仿真 嵌入式开发入门阶段,单片机仿真工具是连接理论与实践的桥梁。它通过建立CPU、寄存器与外围电路的数学模型,让开发者无需真实硬件即可执行指令、观察引脚电平变化。这类工具不仅降低了学习门槛,还能安全验证定时器、中断、串口等外设逻辑,成为工程调试前的重要步骤。无论是经典的Keil+Proteus本地组合,还是Wokwi、Tinkercad等在线平台,都能帮助初学者快速搭建LED闪烁等最小案例。本文围绕这一核心场景,对比常见仿真工具的适用边界,并给出从环境配置到问题排查的实战路径,帮助读者高效上手单片机开发。 阅读详情

     最近写了几个程序,一个是用51单片机读取模数传感器adc0832的电压值,一个是读取ds1302的时间值,结果都出现了读数一直为0的情况。我调试了近一个星期,修改了一个我认为不可能会错的句子,程序运行成功了,这才发现了一个极其隐蔽的错误。(我用的是xp系统,用keil4软件编译)

 

     先上代码:第一个为错误代码,第二个为正确代码。这是用来向ds1302芯片写入命令或数据的函数。实现把8位的数据dat一位一位地写入ds1302的io口。其中ACC0为ACC的第0位。

 

 

     认真对比这两个代码,可能会觉得没区别,而且这两个代码都可以通过编译(加上reg52.h和一些宏定义)。我也是一直认为for()这里边没有错误,结果。。。试着修改时钟信号,增加延时之类的,调了好久还是错,严重打击我的自信心。这两个代码的区别就只有for(i=0;i<8;i++)和for(i=8;i>0;i--)了。学过c语言的人都知道,这两个句子都是实现一个8次的循环,功能一模一样。怎么会因为这个句子的区别就导致单片机控制的错误呢?神奇!

    接着我试着把错误程序中的ACC改为51芯片的寄存器B,烧录进单片机,程序运行成功,跟“for(i=8;i>0;i--),ACC版”一样,lcd在很嚣张地显示着正确的时间( for(i=0;i<8;i++),ACC版lcd的时间显示为0)。附:

 

   这样就知道原因了,使用for(i=0;i<8;i++)的运算中可能有累加器ACC参与了,导致修改了ACC的值,使写入的命令出现错误。但为什么for(i=8;i>0;i--)就没有ACC的参与呢?一个大大的问号。基于我调试了一个星期的程序,皆因为这一个神奇的错误,我实在不甘心,决定研究到底。于是,分别查看了这三个程序代码用 keil4 编译后得到的 汇编代码。(学过汇编就是爽啊,哈)
   

 

 

     对比后,可以发现,出错的原因是for(i=0;i<8;i++)ACC版中,用ACC接收了实参(存储的为要写入的指令),然后在 for 循环前要给变量  “ i  "   赋值时,要用到ACC清零,再把ACC中的零赋给 R7 ("i"的值存储在R7)。这样的话,原来存储在ACC中的写入指令就被清零,自然会导致控制出现错误,最终没法读取ds1302芯片的时间,故显示为零。

    而在for(i=8;i>0;i--)ACC版中,也用ACC接收了实参的值,但在 for 循环前,给变量“ i ” 赋值时,赋值为8,不需要用到ACC,所以ACC一直是存储着实参中的指令,没有被清零,所以能够顺利地向ds1302发送指令,从而能够读取到时间。

   总结:

     因为用for(i=0;i<n;i++)类的指令会重复使用ACC而可能导致出错,而且,即使其它程序可能不会有这种用ACC来接收实参值的情况,但前者比for(i=n;i>0;i--)类的指令多了 CLR A  和 INC R7 两条指令,CJNE 指令又比较DJNZ指令多了一个字节的程序代码存储空间,在频率为12M的51单片机上体现为执行同样功能的程序,要多用2us,代码空间花多一字节。所以前者是毫无优势的,以后应养成用

for(i=n;i>0;i--)的习惯。

 

    请不要反驳我用了这么长的时间去研究,只能使单片机执行快2us,而说我钻牛角尖,只是因为,这个错误导致我整个程序无法正常运行,这不是一件小事。

 

   至于为什么要用到累加器ACC来接收实参,是因为后面的程序要把一个8位的实参一位一位地输出到一个io口,自定义一个变量的话,按位寻址好像比较麻烦,要经过一系列 位运算 ,或者用bit定义8个位(有好的方法请告诉我,哈),而且我写不出来。而用ACC的话,可以很轻易地操作ACC的任意一位,如ACC0,ACC7。在网上查了一下,好像还有一种方法是定义 一种叫 位域 的东东,我看的c语言的书都没介绍,所以还不是很了解。

 

 

/************************************************************/

刚刚想了一下,不用ACC 的方法,作一个位运算dat &0x01,修改如下:

想到了这个方法后,觉得自己好白痴,以后都不用ACC了。

 

 

我也对比了用寄存器 B 时的情况,在这里不再赘述。想了解的可以找我探讨。QQ:772406599

 

 

 

 

 

 

 

 

 

 

 

 

 

51单片机实现工程级DDS信号发生器 DDS(直接数字频率合成)是一种基于相位累加与波形查表的高精度频率合成技术,其核心原理在于通过数字方式控制输出波形的频率、相位与形状,具备分辨率高、切换无跳变、多波形复用等优势。在嵌入式系统中,51单片机虽资源有限,却因其寄存器透明、成本低廉、教学穿透力强,成为理解DDS底层机制与开展硬件-固件协同设计的理想平台。该方案兼顾工程实用性与学习深度,适用于电子类毕设、实验室低成本测试设备及维修工程师自制工具,尤其适合需兼顾确定性时序、抗干扰设计与实测校准的入门级信号源开发场景。 阅读详情

相关推荐

嵌入式开发中的定点数:原理、MLIB库应用与FIR滤波器实战

在嵌入式系统开发中,定点数是一种核心的数值表示方法,尤其适用于没有硬件浮点单元(FPU)的资源受限环境。其基本原理是通过一个固定的缩放因子(如2的幂次),将小数运算转换为高效的整数运算,从而在保持精度的同时大幅提升计算速度。这种技术对于实现实时信号处理、电机控制等算法具有重要价值。定点数的常见表示格式是Q格式(如Q1.15),它明确了整数和小数部分的位数。在实际工程中,NXP的MLIB库提供了优化的定点数类型(如frac16_t)和转换宏,简化了开发流程。本文以FIR滤波器实现为例,展示了如何利用定点数进行

dianwonin4433的博客 388

利用Keil C51与Proteus进行51单片机仿真的核心要点

手把手带你打通Keil C51编程与Proteus仿真51单片机的全流程:从工程配置、HEX文件生成,到Proteus中加载固件、调试外设交互。重点解决常见联调失败、源码级调试不生效等问题,让proteus仿真51单片机真正成为开发提效利器。

weixin_36474001的博客 717

51单片机头文件管理避坑指南:为什么你的reg51.h和reg52.h会冲突?

本文深入剖析51单片机开发中reg51.h与reg52.h头文件冲突的本质,揭示其源于寄存器符号的重复定义。通过分析直接包含、间接嵌套及第三方库冲突等常见场景,提供建立工程级核心头文件、规范自定义头文件及利用Keil工程配置的系统性解决方案,从根本上杜绝此类编译错误,提升代码管理质量。

weixin_29190651的博客 281

关于keil软件中采用for循环写的延时被软件编译器优化的问题

关于keil软件中采用for循环写的延时被软件编译器优化的问题

qq_42526196的博客 1116

巨量千川M-API实战:5分钟搞定短视频计划数据自动获取(Python版)

本文详细介绍了如何利用巨量千川M-API和Python快速搭建自动化工具,实现短视频计划数据的自动获取。通过实战代码演示了从环境准备、Token管理到核心数据接口调用的完整流程,帮助电商运营和技术开发者告别手动导出,高效完成数据汇总与分析。

weixin_29325515的博客 1357

企业微信群机器人配置全攻略:从零到消息推送的完整流程

本文详细介绍了企业微信群机器人的配置与使用全流程,从零开始指导如何创建机器人、获取Webhook地址,到通过HTTP请求发送文本、Markdown、图片及模板卡片等多种消息类型。内容涵盖核心的接口配置、安全实践及实战应用场景,帮助开发与运维团队快速构建自动化消息推送中枢,提升协作效率。

weixin_29231725的博客 842

DS1302读写错误、读写失败的其中一种解决方法

这是我人生中的第一篇博客,文笔粗糙,还请见谅。本人大三狗,在做项目中使用到DS1302,碰到了许多问题,查阅许多资料找到解决方案,特此写一篇博客记录,方便自己日后查阅,也希望这篇文章可以帮助到大家调试DS1302。...

何三多的博客 7435

高光谱知识(1)-高光谱成像技术的理解

系列文章目录 高光谱技术可以获得待观测目标或场景的连续单色光谱图像,并通过空间维(x, y)数据和光谱维(λ)数据共同组成三维观测数据立方体,从而为研究人员提供探测目标或场景中的每一个点的空间和光谱特征细节。这种兼具相机的高分辨成像能力和光谱仪的高光谱分辨能力使得高光谱被广泛应用于测绘遥感、目标识别、环境监测与评估、临床影像诊断、过程监控等任务中,并在地理、空间、海洋、气候、大气、农业、植被、生态、医药、安防、制造与色度等多个领域中发挥巨大作用。 文章目录系列文章目录前言一、按获取数据的过程划分二、按照光

Echo_Code的博客 1万+

关于单片机延时程序中参数类型对延时的影响_Devin_新浪博客

今天别人问了一个关于天祥延时程序的问题。 void delay(unsigned int z) { unsigned int x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } 对于此延时函数中,系统时钟为11.0592MHz,当z取1...

Devin的博客 649

用户画像标签维度_搭建电商平台用户画像标签体系

01 整体思路电商平台连接了卖家和买家两端,最终目的都是促进交易,从而追求更高的销售额。提高人货匹配度是促进交易的关键,而提高人货匹配度的关键就是“让买家找到想要的货物”。本文结合“人、货、场”理论模型,尝试建立电商平台的用户画像标签体系。02 三类标签用户在平台购物的整体流程可以概括为:进入平台、选择商品、下单付款。可以将该过程抽象为“人、货、场”。即用户通过什么途径进入什么商品的页面...

weixin_31668621的博客 1642

macOS Jdk1.8安装(目前主流版本的jdk)

添加环境环境变量,类似于windows的高级设置中path配置的环境变量。查看 JAVA_HOME 目录。查看 JDK 版本信息。一直下一步安装就好了。在终端的根目录下运行。

m0_50207524的博客 9353

{51单片机}之延时的哪点事儿

我说的是单片机C,书上的延时是这样的,如: void delay02() {     unsigned char i,j,k;    for(i=2;i>0;i--)      for(j=200;j>0;j--)        for(k=250;k>0;k--); } 它的时间是:2usX250X200X2=200 000us=0.5s 而这个时间是不精确的,我在家里总结出了

拒绝黑盒,享受开源 768

瑞芯微RK3576上手实测:8nm新U配6TOPS NPU,做AIoT项目选它还是RK3588/RK3568?

本文深度评测瑞芯微RK3576芯片在中高端AIoT项目中的表现,对比RK3588和RK3568的性能差异。RK3576采用8nm工艺,配备6TOPS NPU,在解码能力、AI推理效率和功耗控制方面表现均衡,是中端项目的黄金选择。实测数据显示其在多路视频解码和AI加速性能上优势明显,特别适合智能摄像头和工业HMI设备。

weixin_42627853的博客 716

【51单片机】延时函数delay的坑——关于无符号整型数据for语句“x >= 0“变成死循环

只能说,网上的东西是个人都能写(比如像我这种废物csdn就有好几万的访问量,经不住考验,一定要持有怀疑的态度。也请大家以后把代码跑通了再发上去吧,毕竟像我这种新手真的很痛苦。我懒得写delay函数,直接去csdn嫖代码,我一直以为别人肯定是跑通了才发出来,就一直奉为圭臬。x和y定义的是无符号整形,如果等于0的话它还在执行一次减一,以至于for变成while死循环。请认真看看以下延时函数是否正确,并且指出错误:(考考C语言功底)Proteus是否有问题,还加了晶振电路。研究Keil是否配置错误。

m0_48808835的博客 1088

【专栏必读】王道考研408操作系统+Linux系统编程万字笔记使用说明及章节导航

王道408考研操作系统)第一章计算机系统概述-第一节1、2:操作系统概念、概念和特征1:理解fork的作用prinf("还没有执行fork函数的本进程为:%d\n" , getpid());//其返回值是pid类型的 sleep(1);if(ret > 0) //父进程返回的是子进程ID {printf("我是父进程,我的id是:%d,我的孩子id是%d\n" , getpid() , ret);sleep(1);} } else if(ret == 0) //子进程fork返回值是0 {.........

快乐江湖的博客 3万+

YOLO26涨点改进 | 全网独家创新,注意力改进篇 | TGRS 2025 | 引入APCM自适应像素级协同机制,动态增强目标区域、抑制背景噪声,助力YOLO26做红外小目标检测有效涨点

本文提出一种基于APCM模块改进的YOLO26网络模型,通过像素级局部-全局协同建模动态增强目标特征并抑制背景噪声。APCM模块采用轻量化设计,无需复杂参数,在特征提取阶段有效提升目标区域特征表达质量,尤其适用于低对比度和复杂场景下的目标检测。实验表明,该方法能显著提高小目标检测精度和模型鲁棒性,同时保持较低计算开销。模块通过局部特征分支和全局特征分支的协同融合,实现了对红外小目标的有效增强,在NUAA-SIRST和IRSTD-1K数据集上性能优于现有方法。文章还提供了完整的代码实现和配置指南。

Ai缝合怪、助力小伙伴高效发论文 188

failed building wheel for termcolor_关于单片机上for循环中运用ACC的隐蔽错误

先上代码:第一个为错误代码,第二个为正确代码。这是用来向ds1302芯片写入命令或数据的函数。实现把8位的数据dat一位一位地写入ds1302的io口。其中ACC0为ACC的第0位。认真对比这两个代码,可能会觉得没区别,而且这两个代码都可以通过编译(加上reg52.h和一些宏定义)。我也是一直认为for()这里边没有错误,结果。。。试着修改时钟信号,增加延时之类的,调了好久还是错,严重打...

weixin_39805906的博客 144

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Keil5安装教程51单片机:图解说明每一步骤

手把手带你完成Keil5安装教程,专为51单片机开发环境配置设计。从官网下载、许可证激活到新建工程验证,每步配图说明,避开常见坑点。覆盖keil5安装教程51单片机核心场景,助你快速上手嵌入式开发。

weixin_35755188的博客 173

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

蓝桥杯国赛单片机稳定性实战:DAC7578与按键扫描深度优化

在资源受限的51单片机系统中,实时控制的可靠性远不止于功能实现,更取决于对硬件时序、中断调度与外设物理特性的深度理解。DAC7578并非普通SPI器件,其输出精度受参考电压温漂、负载匹配及SCLK建立时间制约;而‘蓝桥杯按键扫描程序’若依赖全局定时消抖,将抢占ADC等关键中断,引发PID失控等连锁故障。真正的嵌入式工程能力,体现在用硬件滤波+状态机解耦响应、用NOP级时序加固SPI通信、用页映射与断电电容延长EEPROM寿命等防御式设计中。本文基于STC15W4K平台,聚焦国赛高频模块——DAC7578驱动

weixin_29189363的博客 260

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

新手必看:AT89S52单片机中断系统配置避坑指南(附完整代码)

本文详细解析了AT89S52单片机中断系统的配置技巧与常见陷阱,涵盖TCON、IE、IP寄存器的关键设置、中断服务程序优化及外部中断扩展方案。通过实战案例和完整代码,帮助开发者避开典型错误,提升中断系统的实时性和可靠性,特别适合单片机初学者和嵌入式开发者参考。

weixin_33721427的博客 398

代码之外的时序艺术:51单片机中断与定时器在实时系统中的设计陷阱与最佳实践

本文深入探讨51单片机中断与定时器在实时系统中的设计陷阱与最佳实践,涵盖中断优先级管理、定时器精度优化及多中断协调策略。针对外部中断和定时计数等核心机制,提供防御性编程技巧和系统级优化方案,帮助开发者构建高可靠性的嵌入式实时系统。

jenkins8butler的博客 179

51单片机外部中断原理与实战:从寄存器配置到工程应用

中断是嵌入式系统中实现实时响应的核心机制,它允许处理器暂停当前任务,优先处理紧急事件,再返回原任务继续执行。其原理基于硬件自动检测特定信号,并调用预设的中断服务函数。这一机制的技术价值在于极大提升了系统效率与实时性,避免了低效的轮询等待。在单片机开发中,外部中断常用于处理按键输入、传感器信号等异步事件。本文以51单片机为例,深入解析外部中断的寄存器配置,包括中断允许寄存器(IE)、触发控制(TCON)与优先级设置(IP),并探讨了中断嵌套、共享数据保护等工程实践中的关键问题。通过具体代码示例,展示了如何实现

weixin_34082695的博客 404

蓝桥杯单片机CT107D板卡硬件抽象层深度解析

单片机硬件抽象层(HAL)是嵌入式开发中连接软件逻辑与物理外设的关键桥梁,其核心在于准确映射芯片寄存器、时序约束与外围电路行为。在蓝桥杯等工程导向竞赛中,HAL并非通用封装,而是高度绑定特定平台——如STC15F2K60S2与CT107D开发板的组合,要求开发者理解IO复用规则、锁存器使能时序、ADC参考电压配置及中断优先级调度等底层契约。这种‘板卡级HAL’直接决定功能正确性与资源利用率,是突破‘能烧录但功能异常’困局的技术支点。本文聚焦CT107D真实硬件约束,结合第15届省赛代码,详解LED动态扫描、

weixin_30666401的博客 376

8051单片机变量内存定位技术与实战经验

内存管理是嵌入式开发的核心基础,尤其在资源受限的8051单片机中。通过哈佛架构的DATA/IDATA/XDATA分区,开发者可以精准控制变量物理地址,这对硬件寄存器交互、内存映射IO等场景至关重要。变量绝对定位技术能优化访问速度、防止内存冲突,在电机控制、智能电表等实时系统中具有关键作用。本文基于ADC采样缓冲区对齐等实战案例,详解直接地址绑定法与绝对段定义法的工程实践,并分享混合编程、寄存器组控制等进阶技巧,帮助开发者构建稳定可靠的嵌入式系统。

weixin_31916125的博客 295

蓝桥杯单片机CT107D备忘录:Keil C51工程与硬件隐性规则实战指南

单片机竞赛开发本质上是受限环境下的确定性工程实践。理解STC15F2K60S2芯片特性、CT107D开发板硬件约束及Keil C51编译器行为,是实现稳定功能输出的前提。其核心原理在于存储模型选择(small/compact/large)、中断现场保护机制、IO驱动能力边界与外设时序补偿等底层技术决策。这些知识直接决定代码在真实硬件上的可运行性与鲁棒性,尤其在蓝桥杯等封闭命题、固定平台、逐项评分的赛事中,技术价值远超理论学习——它把‘能编译’转化为‘必得分’。典型应用场景包括数码管动态扫描优化、DS1302

weixin_30920513的博客 344

中断处理中的寄存器战争:C语言与汇编的隐秘对话

本文深入探讨了MCS-51单片机中断处理中C语言与汇编的隐秘对话。重点分析了中断现场保护时ACC、PSW等寄存器的保护与恢复策略,揭示了C编译器自动生成的代码可能带来的性能陷阱和内存冲突风险,并提供了手写汇编进行精细优化以及混合编程的实用技巧。

q3r4s5t的博客 411
上一篇: 51单片机学习笔记(五)
下一篇: 野火图片
0木木0
博客等级 码龄17年 458粉丝 58原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值