子程序设计时需注意以下几点:1)要给每个子程序赋予一个名字,子程序的名字实际上就是其入口地址的代号。因此,在子程序使用这些寄存器之前,要将其中的内容保存起来,即保护现场。当子程序执行完成后,即在返回主程序之前,再将这些内容取出,送至相应的寄存器,这一过程称为恢复现场。4)为了使子程序具有一定的通用性,子程序中的操作对象应尽量用地址或寄存器形式,而不用立即数。子程序设计时应注意什么?......
2025-09-30
在涉及精确计算指令消耗时间等特殊情况时,最好用汇编语言(Assembly Language)来编写代码。单片机C语言编程中也可以嵌入汇编语言,CVAVR嵌入C语言的方式如下:
在一行中使用多条汇编指令可以用“\”分开。
上面程序中“nop”指令是AVR单片机汇编语言的空执行指令,即什么都不做,只是消耗了一个时钟周期的时间。“sei”是AVR单片机汇编语言的打开全局中断开关的指令,即便在C语言编程时,也是用这条指令打开全局中断的。
C语言程序中也可以调用汇编语言编制的函数,下面这段C语言调用汇编语言的代码,对我们理解单片机的工作过程和原理是非常有益的:
这个汇编函数的主要任务是完成两个整型变量及一个无符号字符型变量的求和。在C语言中调用函数时,将函数中要用到的3个参数压入堆栈。在堆栈中,整型变量占用两个字节,字符型变量占用1个字节内存。变量a先压入堆栈,其次压入变量b,最后变量c被压入堆栈。进入汇编函数后,堆栈指针y指向最后压入堆栈的字节,即变量c,y+1指向变量b的低字节,y+2指向b的高字节,y+3指向变量a的低字节,y+4指向a的高字节。汇编程序先把变量a的高字节和低字节分别送给寄存器R31和R30,然后将b的高字节和低字节分别送给寄存器R27和R26。接着将两个整型变量的高低字节分别相加,结果存在寄存器R31和R30中。最后把字符型变量c扩展为整型,并把高低字节分别送给寄存器R27和R26。同样将上次求和结果与c的高低字节分别相加,最终结果仍然存在寄存器R31和R30中。
CVAVR中规定,汇编函数使用寄存器返回计算结果(从LSB到MSB)如下:(https://www.chuimin.cn)
R30用于返回字符型和无符号字符型数据;
R30、R31用于返回整型和无符号整型数据;
R30、R31、R22、R23用于返回长整型和无符号长整型数据。
所以这个汇编函数将整型计算结果作为函数返回值,存储在寄存器R30、R31中,而在C语言程序中,直接将寄存器R30、R31中的返回值送给了整型变量r。
相关文章
子程序设计时需注意以下几点:1)要给每个子程序赋予一个名字,子程序的名字实际上就是其入口地址的代号。因此,在子程序使用这些寄存器之前,要将其中的内容保存起来,即保护现场。当子程序执行完成后,即在返回主程序之前,再将这些内容取出,送至相应的寄存器,这一过程称为恢复现场。4)为了使子程序具有一定的通用性,子程序中的操作对象应尽量用地址或寄存器形式,而不用立即数。子程序设计时应注意什么?......
2025-09-30
循环程序是指在程序中有一段程序需要重复执行的一种程序结构。循环程序可以缩短程序,减少程序所占的内存空间。循环控制在程序中还需根据循环计数器的值或其他循环条件,来控制循环是否该结束。假设内循环用两条NOP指令以及一条DJNZ指令,需要4个机器周期。循环24次,需要96个机器周期。显然这是一个双重循环程序。4)多重循环的嵌套,应当注意嵌套的形式。......
2025-09-30
由于AT89S52单片机内部没有集成I2C总线模块,采用C语言编写I2C总线技术的通信协议,实现单片机与AT24C02存储器的密码读出与写入功能。图20-13 数据传送时序图I2C总线发送器送到SDA线上的每个字节必须为8位长,传送时高位在前,低位在后。图20-14 完整的数据传送过程2.AT24C02读写操作本系统设计中利用P1.2,P1.3作为SDA、SCL串行通信线,实现对AT24C02芯片内某一地址数据的读写操作。......
2025-09-30
◎内容提要本章讲述MCS-51单片机的C51程序的基础知识,主要包括C51数据类型及存储类型、C51运算符及其表达式、C51流程控制语句、C51构造数据类型、C51指针的定义及使用、C51函数的定义及使用和预编译的用法。◇C51函数的定义、调用及使用时应注意的事项。※重点及难点◇C51存储类型和存储模式的区别。◇C51函数中参数的传递问题。教学目标:掌握MCS-51单片机的C51程序设计的基础知识。通过编程实例,快速掌握C51程序设计的思路和方法。......
2025-09-30
评价程序优劣的因素1)正确性,容错性。程序设计过程与基本设计方法1)模块化;结构化;自顶而下与自底而上。4)从原理到程序实现:原理→模型→算法→流程→程序设计→调试→优化→验证→建档。常用的程序调试方法1)原则:先硬后软;先局部,后整体。程序的优化与文件编制1)参照评价因素,修改程序结构、数据结构、算法及程序等。5)使用说明功能、操作方法、出错信息与排除方法、注意事项等。......
2025-09-30
图7-4 独立按键控制程序流程图在独立按键控制程序流程图的基础上书写按键控制LED程序代码如下:结合2.3节关于单片机开发环境Keil C51的学习,建立工程button文件,并将上述代码在Keil环境下进行编译,程序成功编译结果如图7-5所示。同时在创建工程路径button文件夹下生成一个扩展名为.hex文件,供下载软件将生成的.hex文件下载到单片机中。......
2025-09-30
GPIO是一组可编程控制的引脚,由多个寄存器同时控制。应用程序都能够通过相应的接口使用GPIO。GPIO驱动主要作用就是读取GPIO口的内容,或者设置GPIO口的状态。GPIO与硬件体系密切相关,在Linux内核目录下的相关文件中我们可以发现针对不同硬件芯片的GPIO定义和使用方法,如本书涉及的S5PV210芯片Linux内核中也有相应的驱动程序支持。本章主要讲的就是如何使用Linux内核封装好的GPIO接口函数在驱动开发中需要操作GPIO时候的使用。......
2025-09-30
8051类单片机最早由Intel公司推出的8051/31类单片机,也是世界上用量最大的几种单片机之一。SHT10温湿度传感器是利用CMOSens专利技术制成,确保产品有极高的可靠性和长期的稳定性。它是目前在国内外应用最为普遍的一种集成温湿度传感器,典型产品有SHT10、SHT11、SHT75等。西门子公司推出的QFM2160、QFM3160温湿度传感器,也是目前国内普遍使用的一种温湿度传感器,是由一个PT1000温度敏感元件和一个电容式湿度传感器组成,其工作电压24V,功耗0.5V·A,湿度范围10%~90%RH。......
2025-09-30
相关推荐