430单片机中C语言与汇编语言混合编程
1. C语言函数和汇编语言函数相互调用
在这个示例中C语言函数main()调用汇编语言函数get_rand()以得到一个随机数;汇编语言函数get_rand()首先调用C语言的标准库函数rand()得到一个整型随机值,然后用调用C语言函数mult()的方法把这个随机值乘以main()函数传递给自己的实参,并把乘积值返回给main()函数。
1.1 C语言源文件
#include
extern unsigned long get_rand(unsigned char seed);
void main( void )
{
unsigned char seed;
unsigned long value;
// === 系统初始化 ==========================================
IFG1 = 0;
WDTCTL = WDTPW+WDTHOLD;
P1DIR = 0xff;
// === 系统初始化结束========================================
seed = 0x55;
value = get_rand(seed);
while(1);
}
// === 主程序结束 ==================================================
unsigned long mult(int x , int y)
{
return (x *y);
}
// === 乘法子程序结束 ================================================
1.2 汇编语言源程序
; ******************************************************************
; 文件名: asm_source.s43
; C语言和汇编语言混合编程,汇编语言源程序
; 这段源程序调用两个C语言函数,标准库函数rand()和用户自定义函数mult()
; *******************************************************************
#include "msp430x14x.h" ; 头文件
NAME asmfile
EXTERN rand ; C语言标准库函数rand()
EXTERN mult ; c_source.c中用户自定义函数
;====================================================================
; get_rand
;====================================================================
PUBLIC get_rand ; 导出函数名给C语言函数
RSEG CODE
get_rand;
push R11 ; 普通寄存器入栈保护
mov.b R12,R11 ; C 函数传递的实参在R12中,送入R16暂存
Call #rand ; 调用 C 函数 rand()
; 函数值为整型返回在R12中
; rand()函数值作为mult()函数的第一实参
; 送入R12进行参数传递
mov R11,R14 ; C 函数传递的实参作为mult()函数的第二实参
; 送入R14进行参数传递
Call #mult ; mult()值返回在 R12 / R13寄存器对
pop R11 ; 出栈恢复寄存器内容
ret
END
2.汇编语言编写中断服务程序
为了提高整个系统响应速度,要求中断服务程序的执行时间较短,执行速度较快,因此最好的方法就是用汇编语言编写中断服务程序。但要注意:1、中断服务程序不能有参数传递和返回值。2、中断服务程序中所有被用到的寄存器都需要保护。本示例用汇编语言编写了看门狗定时器的中断服务程序,用C语言编写了主程序。
2.1 C语言主程序
#include
void main( void )
{
// === 系统初始化 =============================================
IFG1=0;
WDTCTL=WDT_MDLY_32;
P1DIR = 0x01;
IFG1 &= ~WDTIFG;
IE1 |= WDTIE;
_EINT();
// === 系统初始化结束===========================================
while(1); /*主程序是一段死循环
}
// === 主函数结束 ==============================================
2.2 汇编语言中断服务程序
;**********************************************************************
; 文件名: wdt_int.s43
; C语言和汇编语言混合编程,汇编语言源程序
; 看门狗定时器中断服务程序
;***********************************************************************
NAME WDT_ISR
#include "msp430x14x.h" ; 头文件
; ==============================================================
; 看门狗定时器中断服务程序
;================================================================
PUBLIC wdt_isr ; 导出函数名给C语言函数
RSEG CODE
wdt_isr
xor.b #001h,&P1OUT ; 触发 P1.0,led 亮灭转换
reti ; 中断返回
;================================================================
COMMON INTVEC(1) ; 中断向量段
;================================================================
ORG WDT_VECTOR
DW wdt_isr
END
关键字:单片机 C语言 汇编语言 混合编程
引用地址:
单片机程序C语言与汇编语言混合编程
推荐阅读最新更新时间:2024-03-16 14:31
我用单片机写的电子时钟
学习单片机半个月了,学得也差不多了,今天写一个写程序练习练习哈哈 跟电子表的功能一模一样,可以进行设置,准确度非常高哈哈,用的是1602型号的液晶显示器,大家只需要简单的修改一下端口就能应用到你自己的设计上去了. 下面是源代码: #include REG52.h #define uchar unsigned char #define uint unsigned int uchar code year_table = 2010-04-11 SUN ; uchar code time_table = 00:00:00 ; uchar time_count,key_count; char hour,minute,se
[单片机]
MCS-51单片机与无线调制器的综合应用
GPS是目前技术上最成熟且已实用的一种定位系统,但是在GPS定位系统中,由于其是一个单向导航系统,他是把星历数据等传给地面接收机,可在许多具体应用时,例如在车辆调度系统中,一般都需要把利用GPS测得的信息数据传到调度中心,由于其系统由一个基准站和多个用户台组成,基准站与用户台之间的联系,即由基准站计算出的各种校正值发送到用户台,上边这一切都需要用到数据链来完成数据的传输。其中,数据链由调制解调器和电台组成。在无线数据传输系统中,调制解调器足一个关键部分,调制解调器(Modem)是将数据进行编码和调制,然后输入到电台发射出去,用户台将其接收下来,并将数据解调后,送入GPS接收机进行改正。本文介绍了单片机控制Modem的原理和方法。
[应用]
ColdFire单片机在 Clinux上的应用
ColdFire系列处理器介绍 飞思卡尔32位处理器分为PowerPC系列、ColdFire系列以及DragonBall系列等。ColdFire系列是重要的组成部分之一,它可以应用于工业控制、仪器仪表、民用产品、网络产品等领域。ColdFire系列具有很好的性价比,它的价格从2美金到20美金不等。ColdFire系列处理器拥有许多开发工具并为使用者提供了一些现成的解决方案,这使得使用者能够快速地开发出自己的应用产品。 ColdFire处理器有V2核和V4核之分,52系列为V2核架构,54系列为V4架构。下面以V2核为例介绍其性能: V2核拥有变长的RISC指令集;有2个独立的流水线;用3个长字的FIFO缓冲区将流水线彼此分离
[单片机]
PIC单片机16F84的内部硬件资源
上期笔者介绍的PIC16F84单片机点亮一只发光二极管的源程序实例是为了说明PIC单片机16F84具体应用时的基本格式。 现在我们已经知道要单片机工作,就需用汇编语言编制程序。而对某个PIC单片机编程时,还需对选用的PIC单片机内部硬件资源有所了解。这里介绍PIC16F84单片机的内部结构,如图1所示的框图。由图1看出,其基本组成可分为四个主要部分,即运算器ALU和工作寄存器W;程序存储器;数据存储器和输入/输出(I/O)口;堆栈存储器和定时器等。现分别介绍如下。 1运算器ALU及工作寄存器W 运算器ALU是一个通用算术、逻辑运算单元,用它可以对工作寄存器W和任何通用寄存器中的两个数进行算术(如加、减、乘、除等)和逻辑
[单片机]
C语言中##的用法
今天看linux操作系统源码是有这么一段: #define _syscall0(type,name) \ type name(void) \ { \ long __res; \ __asm__ volatile ( int $0x80 \ // 调用系统中断0x80。 : =a (__res) \ // 返回值??eax(__res)。 :
[单片机]
51单片机驱动1602液晶(4线串行)
/*单片机I/O口使单片机资源的重要组成部分,也是用来扩展外围设备的必选资源,尽可能以更少的I/O口实现更多的功能是单片机工程师追求的目标,现在的一些串行器件也为这一目标的实现添加了更多的可能性,比如I2C总线,MAXIM力推的1-WIRE等等,都可以以很少的I/O口实现更多的功能,当然这是以降低一定的速度为代价的。 废话少说,进入正题。 显示器件多见的是LED数码管,LCD液晶屏等。一般的数码管成本低廉,在显示内容要求不多的时候适用;LCD液晶屏以更多的显示空间得到了许多人的爱好,不过成本上要高的多(市场价在20元左右),本文以LCD1602为例说明如何驱动液晶屏。 LCD1602外接的控制接口有RS,R/W,E;数据接口为D
[单片机]
基于51单片机超声波测距器设计
一、设计要求 设计一个超声波测距器,可以应用于汽车倒车、建筑施工工地以及一些工业现场的位置监控,也可用于如液位、井深、管道长度的测量等场合。要求测量范围在0.10-3.00m,测量精度1cm,测量时与被测物体无直接接触,能够清晰稳定地显示测量结果。 二、设计思路 超声波传感器及其测距原理 超声波是指频率高于20KHz的机械波。为了以超声波作为检测手段,必须产生超生波和接收超声波。完成这种功能的装置就是超声波传感器,习惯上称为超声波换能器或超声波探头。超声波传感器有发送器和接收器,但一个超声波传感器也可具有发送和接收声波的双重作用。超声波传感器是利用压电效应的原理将电能和超声波相互转化,即在发射超声波的
[单片机]
基于SPCE061A单片机的数控直流电流源设计
本文设计的数控直流电流源能够很好地降低因元器件老化、温漂等原因造成的输出误差,输出电流在20mA~2000mA可调,输出电流可预置、具有“+”、“-”步进调整、输出电流信号可直接显示和语音提示等功能。 硬件电路采用凌阳单片机SPCE061A为控制核心,利用闭环控制原理,加上反馈电路,使整个电路构成一个闭环,在软件方面主要利用PID算法来实现对输出电流的精确控制。该系统可靠性高、体积小、操作简单方便、人机界面友好。 系统硬件实现方案 本设计采用单片机作为主要控制部件,通过键盘预置输出电流值并采用液晶模块实时显示。整个系统硬件部分由微控制器、电压-电流转换、键盘、显示、直流稳压电源和语音提示等模块组成。系统组成框图
[电源管理]