C语言与汇编语言在单片机教学中的融合应用
汇编和C语言相结合的51单片机编程技巧

汇编和C语言相结合的51单片机编程技巧
本文主要是关于汇编和C语言的相关介绍,并着重对汇编和C语言的不同及其编程技巧进行了详尽的阐述。
汇编和C语言C语言和汇编语言的区别在于他们之间优缺点几乎是相反的。
C语言和汇编语言的优缺点:以c来举例
优点:
c的运行效率高;
c可以实现硬件的直接访问;
c代码的移植性好;
缺点:
c的代码复用性差;
c的代码维护性差;
c的扩展性差,即如果想增加新功能,需要修改较多的代码;
c语言的可读性差;
C语言是一门通用计算机编程语言,应用广泛。
C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言;尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
汇编语言:是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。
在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。
普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。
汇编和C语言相结合的51单片机编程技巧c语言和汇编语言之间主要存在:相互调用、。
单片机C语言与汇编混合编程讲解

(1)、C51语言中调用汇编语言程序;C51语言调用汇编语言程序要注意以下几点:1:在文件栏选中File Group和C51程序原文件,在配置文件选项中激活“产生汇编(SRC)文件,“编译(SRC)文件”和“创建工程(目标)时包含”三个选项。
2:根据选择的编译模式,把相应的库文件(如SMALL模式,库文件为KEIL\C51\LIB\)加入工程中。
3:在C51语言中必须声明需要调用的函数为外部函数。
extern void DELAY(void);4:在汇编语言程序中必须声明被调用子程序为公共子程序,在被调用的文件中还需要声明此文件是可从新定位的。
PUBLIC DELAY,DELDELAYY SEGMENT CODERSEG DELAYY实例如下:C51语言文件:#include ""extern void DELAY(void);extern void DEL(void);void main(void){P1=0x00;DELAY();DEL();P1=0xff;}汇编语言文件:PUBLIC DELAY,DELDELAYY SEGMENT CODERSEG DELAYYDELAY: MOV R2,#3HDJNZ R2,$RETDEL: MOV R3,#03HDJNZ R3,$RETEND(2)、C51语言中调用外部的C51函数;C51语言调用外部的C51函数的注意事项如下:1:在主调函数中必须声明被调用的函数为外部类型的函数,其余都一样。
实例如下:主调函数A:#include ""extern void delay(void);sbit P1_1=P1^1;void main(void){P1_1=0;delay();P1_1=1;}被调用的函数B:delay(){unsigned char i;i=0;}(3)、C51语言中嵌入汇编程序;在C51语言中嵌套使用汇编语言编写程序要注意以下的几个问题:1:在文件栏选中File Group和C51程序原文件,在配置文件选项中激活“产生汇编(SRC)文件,“编译(SRC)文件”和“创建工程(目标)时包含”三个选项。
浅谈单片机中C语言与汇编语言的转换

浅谈单⽚机中C语⾔与汇编语⾔的转换⼀、单⽚机课设题⽬要求与软件环境介绍做了⼀单⽚机设计,要⽤C语⾔与汇编语⾔同时实现,现将这次设计的感受和收获,还有遇到的问题写下,欢迎感兴趣的朋友交流想法,提出建议。
单⽚机设计:基于51单⽚机的99码表设计软件环境:Proteus8.0 + Keil4要求:1,开关按⼀下,数码管开始计时。
2,按两下,数码管显⽰静⽌。
3,按三下,数码管数值清零。
⼆、C语⾔程序1 #include<reg51.h>2#define uint unsigned int3#define uchar unsigned char4 uchar shi,ge,aa,keycount=0,temp;5 sbit anjian=P1^7;6 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};7void display(shi,ge);8void key ();9void init();10void delay(uint z);11/*-----主程序-----*/12void main()13 {14 init(); //初始化15while(1)16 {17 key ();18if(keycount==1)19 TR0=1; //开中断20if(keycount==2)21 TR0=0;22if(keycount==3)23 {24 temp=0;25 keycount=0;26 }27if(aa==10){aa=0;28if(temp<=99)29 {30 temp++;display(shi,ge);31 }32else33 temp=0;}34 }35 }363738/*------初始化程序-------*/39void init()40 {41 keycount=0;42 temp=0;43 TMOD=0x01;44 TH0=(65536-50000)/256;45 TL0=(65536-50000)%256;46 EA=1;47 ET0=1;48//TR0=0;49 }50/*-----定时器中断-----*/51void timer0() interrupt 152 {53 TH0=(65536-50000)/256;54 TL0=(65536-50000)%256;55 aa++;56 }57/*-----显⽰⼦程序-----*/58void display(shi,ge)59 {60 shi=temp/10;61 ge=temp%10;62 P0=table[shi];;delay(70);63 P2=table[ge]; ;delay(70);64 }65/*-----按键检测⼦程序-----*/66void key ()67 {68if(anjian==0)69 {70 delay(5); //消抖71if(anjian==0)72 keycount++;73 }74//while(anjian==0);75//display(shi,ge); //等待按键弹起76 }77/*-----延时⼦程序-----*/78void delay(uint z) //延时约1ms79 {80uint x,y;81for(x=z;x>0;x--)82for(y=100;y>0;y--);83 }电路仿真结果如下:三、C语⾔转汇编语⾔步骤好了,那么接下来我们就开始C语⾔——>汇编语⾔之旅(1)C语⾔1-10⾏改为1 ORG 0000H //汇编起始伪指令,功能是规定程序存储器中源程序或数据块存放的起始地址2 ajmp STAR //ajmp⽆条件跳转指令3 ORG 000bh4 ajmp timer05 anjian equ P1.7 //位定义6 keycount equ 40h7 shi equ 41h8 gewei equ 42h9 aa equ 43h10 temp equ 44h11tab: db 3fh,6h,5bh,4fh,66h //建表12 db 6dh,7dh,7h,7fh,6fh(2)C语⾔中的初始化函数 12-14⾏和39-49⾏改为1STAR:2 acall init //⼦程序近程调⽤指令,功能是主程序调⽤⼦程序,调⽤⼦程序的范围为2kb1init:2mov keycount,#0 //keycount=03mov temp,#0 //temp=14mov tmod,#01h //TMOD=0x015mov TH0,#606mov TL0,#1767setb EA //位置位指令,对操作数所指出的位进⾏置1操作8setb ET09setb TR010retacall为⼦程序近程调⽤指令,返回⽤ret。
MSP430单片机C语言和汇编语言混合编程刍议

信 息都 是按照堆栈结构方式进行传递实现 ,并且堆栈结构形
成过程 中, 也是按照从右到左 的顺序形成的 。并且, 在堆栈传 递的过程 中,如果传递函数中最左 边的两个 函数是结构或者
关键 词: MS P 4 3 0 单片机 ; C语 言; 汇编语 言; 编程设计; 软件开发 ; 分析 中图分类号 : T G 8 4 文献标识码 : A 文章编号 ; 1 6 7 3 — 1 1 3 1 ( 2 0 1 3 ) 0 1 — 0 0 7 2 — 0 2
根据上文所 述的 C语言与汇编语 言混合编程方法 ,以及
1 C语言 和汇 编语 言 的特点 以及 混合编 程 方法
1 . 1 C语 言和 汇编 语言 编程 设计 的特 点
在进行计算机应用程序 以及软件系统程序的编写设计应
目前进行 MS P 4 3 0 单片机 芯片软件开发设计的常用 L A R E m 。
b e d d e d Wo r k b e n c h软件系统 , 该系统在进行 MS P 4 3 0单片机
该 寄存器功能在进行 C语 言编译程序 的传递调用时不需要进 行保护 。此外 , L A R系统 中普通寄存器则主要是对 C语 言编 译器 的程序编译变量 以及编译过程进行 寄存保护实现 ,这组 寄存器 中的C语言编译信 息, 在进行混合编程 调用 时, 需要进
行保护 , 保护 功能由 C语言编译器 自动实现进行 。 在L AR系统 中, C语 言编译器 中的 C语言编译程序数据 参数在被调用过程 中, 没进行一次函数的调用, 就会建立一个
KEILC51中C语言加入汇编语言的使用方法

KEILC51中C语言加入汇编语言的使用方法一、为什么使用汇编语言?汇编语言是一种底层的编程语言,其主要目的是实现对硬件的直接控制,具有高度灵活性和效率。
在开发单片机程序时,通常使用高级语言来编写大部分的代码,但是在一些特定的情况下,使用汇编语言能够更好地满足需求,例如对一些硬件寄存器的操作、实现高速计算等。
二、C语言与汇编语言相结合的方法在KEILC51中,可以通过使用内联汇编或者使用汇编模块的方式将C 语言与汇编语言相结合。
1.内联汇编内联汇编是将汇编代码直接嵌入到C语言代码中。
使用内联汇编可以获得更高的性能和灵活性,但也增加了代码的可读性和可维护性。
在C语言中使用内联汇编需要使用__asm关键字,并在括号中编写要嵌入的汇编代码。
以下是一个示例:```void delay(unsigned int count)__asmMOVR1,loop:INCR1CJNE R1, count, loop}```在上述示例中,使用了__asm关键字将一段简单的汇编代码嵌入到了C函数delay中,以实现一个延时功能。
2.汇编模块另一种将C语言与汇编语言相结合的方法是使用汇编模块。
汇编模块是一个独立的文件,其中包含了汇编语言代码。
可以通过使用extern关键字将C语言代码与汇编模块连接起来。
首先,需要创建一个汇编模块的文件,例如delay.asm,其中包含了要实现的汇编代码:```; delay.asmPUBLIC delaydelay PROCMOVR1,loop:INCR1CJNE R1, R2, loopRETdelay ENDP```在上述示例中,创建了一个名为delay的汇编函数,该函数实现了一个简单的延时功能。
接下来,在C语言代码中使用extern关键字声明要调用的汇编函数:```// main.cextern void delay(unsigned int count);void maindelay(1000);```在上述示例中,使用extern关键字声明了一个名为delay的汇编函数。
单片机C语言与汇编语言的混合编程

单片机C语言与汇编语言的混合编程(选自《单片机C语言编程应注意的若干问题》)在绝大多数场合采用C语言编程即可完成预期的目的,但是对实时时钟系统、要求执行效率高的的系统就不适合采用C语言编程,对这些特殊情况进行编程时要结合汇编语言。
汇编语言具有直接和硬件打道、执行代码的效率高等特点,可以做到C语言所不能做到的一些事情,例如对时钟要求很严格时,使用汇编语言成了唯一的选择。
这种混合编程[2]的方法将C语言和汇编语言的优点结合起来,已经成为目前单片机开发最流行的编程方法。
目前大多数据单片机系统,在C语言中使用汇编语言有两种情况:一种是汇编程序部分和C程序部分为不同的模块,或不同的文件,通常由C程序调用汇编程序模块的变量和函数(也可称为子程序或过程);另一种是嵌入式汇编,即在C语言程序中嵌入一段汇编语言程序。
当汇编程序和C程序为不同模块时程序一般可分为若于个C程序模块和汇编程序模块,C程序模块通常是程序的主体框架,而汇编程序模块通常由用C语言实现效率不高的函数组成,也可以是已经成熟的、没有必要再转化成C语言的汇编子程序。
在这种混合编程技术中,关键是参数的传递和函数的返回值。
它们必须有完整的约定,否则数据的交换就可能出错。
对于嵌入式汇编,可以在C程序中使用一些关键字嵌入下些汇编程序,这种方法主要用于实现数学运算或中断处理,以便生成精练的代码,减少运行时间。
当汇编函数不大,且内部没有复杂的跳转时,可以用嵌入式汇编实现。
下面就以AT89C2051单片机在模拟电压检测中的应用为例说明C语言程序与汇编语言程序的调用。
电路图如图1所示:AT89C2051单片机内置模拟比较器,13脚即P1.1是比较器的负输入端,12脚即P1.0是比较器的正输入端,比较器的输出端做在了CPU内部即P3.6未被引出,CPU可以直接读取P3.6状态来判定两输入端比较的结果其和一个外部电阻及一个外部电容器就可以设计成一个A/D转换器,采用RC模拟转换的原理,来检测外部P1.1引脚的输入电压。
KEIL C51所支持的C语言和汇编语言混合编程的方法

介绍一下KEIL C51所支持的C语言和汇编语言混合编程的方法!51单片机是最早的单片机,也是在国内应用最广泛的单片机,为大家所喜爱!但执行速度较其它单片机较慢。
因此在编程时更加要注重程序的执行效率及编程上的技巧处理,最大限度的发挥其性能,满足项目开发的实际需要。
在嵌入式开发中,C语言具有可移植性强和可读性好等优点,而汇编语言的高效、快速及可直接对硬件进行操作等优点又是C语言所难以达到的,本帖为大家介绍一下KEIL C51所支持C和汇编混合编程的方法,将这两种语言的优点完美的结合,更大限度的发挥51单片机的性能,加快我们的产品开发周期!如用此方法实现6时钟(6T)的51单片机对320kbps mp3文件的流畅播放,就是这种混合编程的方法的一个很好的应用实例!下面就为大家介绍一下混合编程的方法。
所谓混合编程,就是在一个项目中,同时使用C和汇编两种语言。
C语言和汇编语言混合编程的方法形式多样,可以是以汇编语言为主体,在其中内嵌入部分C语言;也可以是以C语言为主体在其中加入部分汇编语言(此方法实用价值较高,而被工程师们广泛的采用)。
在此方法中,用汇编语言编写对有关硬件的驱动和处理、复杂的算法、实时性要求较高等底层的东西,来满足单片机对某些硬件高效、快速、精确的处理等性能上的要求。
用C语言来编写程序的主体部分。
这样就将C语言的可移植性强和可读性好与汇编语言的高效、快速及可直接对硬件进行操作等优点相结合。
两者优劣互补、相得益彰,加快我们产品的开发周期,具有极高的现实意义和实用价值!在KEIL C51中加入的汇编代码需按照其编译器中约定的规则才可以实现C语言程序对汇编代码的调用。
即KEIL C51的命名规则和参数传递规则。
一、KEIL C51的命名规则在KEIL C51中,编译器对C语言程序中的函数会自动的进行转换,转换规则如下表:函数属性函数举例段中的函数名无参数或无寄存器参数传递的函数 void func1(void) func1含通过寄存器传递的参数 void func2(int) _func2可重入函数 void func3(char)reentrant _?func3二、KEIL C51函数的参数传递规则(一)通过寄存器传递的函数参数表参数长度第1个形参第2个形参第3个形参1字节(char) R7 R5 R32字节(int) R6(H) R7 R4(H) R5 R2(H) R33字节(通用指针) R1(H)~R34字节(long) R4(H)~R7(二)函数返回值使用的寄存器列表返回类使用的寄存器位数据(bit)位累加器CY1字节(char)R72字节(int)R6(H) R73字节(通用指针)R3(类型)R2(H) R14字节(long)R4(H)~R74字节(float)R4(H)~R7,32位IEEE格式,指数和符号位在R7在混合编程中,最常用也是最实用的方法是在C语言中加入部分汇编语言的代码,分为两种方法。
C语言与汇编语言相互结合的嵌套汇编语言

C语言与汇编语言相互结合的嵌套汇编语言
在单片机学习的过程中,掌握一点汇编语言是非常有必有的,作为低级语言汇编语言在单片机开发中有它不可取代的作用,比如每条指令可以精确的确定延时时间,便于理解非常适合硬件工程师学习。
但是要提高单片机技能,必须掌握 C 语言编程,因为 C 语言有强大的模块化管理思想。
我想在很多人学习的过程中即学了汇编语言,又学习了C 语言,那么一个问题便随之而产生,如果将C 语言与汇编语言相互结合,达到更好的编程效果,本次讲解就是基于这个问题而生成的。
大家可以看到,我的延时函数用的汇编。
然而编译后无法创建目标。
此时大家右键左边的工作组1:Source Group 1。
然后点击第一个OpTIons for Group Source Group 1。
将对话框右边红圈内两个选项各点两次,使对勾成为黑色。
点击OK后就可以编译了。
如果大家在编译时出现两个警告:
警告内容如下:
*** WARNING L1:UNRESOLVED EXTERNAL SYMBOL
SYMBOL:?C_START
MODULE:STARTUP.obj (?C_STARTUP)
*** WARNING L2:REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL:?C_START
MODULE:STARTUP.obj (?C_STARTUP)
ADDRESS:0038H。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言与汇编语言在单片机教学中的融合应用
作者:程娅荔王巧玲
来源:《科技视界》2012年第14期
【摘要】本文讲述了在《单片机原理及应用》课程教学的特点,根据C语言和汇编语言各自的优点,提出了在单片机教学中融合应用C语言与汇编语言的教学方法。
【关键词】C语言;汇编语言;教学方式0引言
各高等院校普及单片机及其相关知识,对增加学生知识面,开拓学生就业面,起到了积极有效的促进作用。
但是,单片机这门课程综合性强,内容抽象,学起来艰涩难懂,对实验设备和多媒体综合运用的能力要求高,教与学都遇到了很大的困难。
“单片机原理及应用”是工科专业的一门主要专业课程,并且主要以8位51单片机为基础,长期以来国内高校都在该课程的教学创新上苦下功夫,使单片机的应用在学生的就业上获取优势,并且此课程的创新教育对人才创新有良好的促进作用。
1单片机课程教学的现状
目前,我国高等院校在单片机的教学中普遍的教学手段都是以理论讲解为主,大部分时间都是老师在讲理论知识,学生虽然也能听懂,但是往往是一知半解,学完以后还是对单片机的概念很模糊,要求自己独立开发程序就更是不可能完成的任务。
笔者所在学校的电子信息专业培养方案上《单片机原理与应用》一直开设在大学三年级下学期,即第六个学期。
在大学的前几个学期的课程教育中,C语言的学习和汇编语言的学习是两个独立的课程。
C语言在大学课程中是最早学习的编程语言,是建立在计算机编程的基础上进行讲解学习的。
而汇编语言在微机原理课程中的学习中会有大量应用。
笔者曾经用汇编语言贯穿整个单片机课程的教学,结果教学效果一般,而且因为汇编语言的冗长和庞杂,讲解一个稍微复杂的程序非常耗时,在短短的一个学期内,很难完成单片机及其外围模块电路应用的教学任务。
此后,笔者所采用的是使用Proteus单片机仿真软件与Keil C51相结合采取案例教学的方法,该方法教学效果突出,有一个很大的优势就是能使学生较快的掌握单片机的一些基本应用,并独立完成编程设计。
笔者所教电子系学生,更注重的是对硬件的掌握和开发,但是因为C51语言未对单片机的内部硬件结构模块直接操作,只是加速了学生的编程思维,导致对硬件学习的间接忽视,而且因为对硬件结构没有一个形象和深入的认识,常常在单片机课程学习结束后学生仍然对单片机内部硬件模块原理一知半解,对单片机和外围模块的应用设计能力的提高有不小的影响。
2C语言和汇编语言的特点
C语言和汇编语言是单片机应用系统开发常用的编程工具。
C语言作为一种高级语言,其优点是C程序由函数构成、数据类型和运算符丰富、面向应用、结构简洁和较强的可移植功能。
汇编语言比较直观,能够直接对硬件进行操作,目标代码质量高,程序的执行效率高;生成的机器代码简洁、占ROM空间少,适用于一些对时序要求特别精确的场合;是学习如DSP (数字信号处理)等后续课程的基础,有利于学生深入理解单片机的内部结构及工作原理。
3C语言与汇编语言融合应用的方法
笔者在单片机课程教学中通过对两种语言的融合使用,更加系统、全面地丰富单片机课程的内涵,使学生从整体上更好地理解和应用单片机。
在整个单片机课程的学习中抓住各章节的重点,在不同章节使用不同的语言进行讲解,章节讲解遵循的原则为:用汇编语言讲解的章节着重分析单片机的内部硬件原理,用C51讲解的章节着重单片机硬件的具体应用与功能实现。
3.1存储器结构
51系列单片机的存储器有ROM和RAM大小之分,由于单片机的RAM和CPU速度的限制,在编程时尤其要兼顾到单片机硬件基础。
在以往C语言的学习中,学生很少会注意到数据类型定义的差别给程序执行带来的影响,常常使用范围较广的数据类型,如无符号整形,就要占用16位的空间,而且也不会注意数据是存放在片内还是片外扩展空间。
图151单片机I/O口中P1口单引脚结构
51系列处理器皆以8位为主,所以在汇编语言中的数据的存放是以8位为一个单元,因此在C语言中定义时大都以8位的数据范围为主要的数据类型结构。
汇编语言中有MOV,MOVX,MOVC三条存储器数据传递指令,由于内部和外部ROM的地址是连续的,故用MOVC一条指令即可;片内数据存储器与片外数据存储器的地址部分(0000H-00FFH)是重叠的,所以用MOV和MOVX加以区分。
在讲解存储器结构时,使用汇编语言可以利用指令上的差异,使学生对单片机存储器的逻辑和物理结构都有一个深入的认识。
对课程后期单片机外围模块存储器扩展的硬件连接和软件编程的理解有良好的促进作用。
3.2I/O口结构
这是 51单片机I/O口中P1口单引脚结构,I/O口都有输入和输出双向功能,输入功能有一种是读锁存器的内容,进行处理后再写到锁存器中,这种操作即读—修改—写操作,
在汇编语言中JBC(逻辑判断)、CPL(取反)、INC(递增)、DEC(递减)、ANL(与逻辑)和ORL(逻辑或)指令均属于这类操作。
这类操作的执行大都要有内部寄存器A辅助,汇编语言可以加深对读锁存器的了解。
输入功能另一种便是直接读取I/O口上的状态,常常在键盘设计的编程中使用,据以往的教学经验,因为C语言赋值语句的直接性,学生们常常会忘记先要读入I/O口引脚状态,而直
接赋值,导致程序出错还往往不知道原因何在。
运用汇编语言中专门的数据传递指令,可以形象得知该I/O口是输入或是输出用,在汇编语言中可以很清晰地得知目的操作数和源操作数的区别,学生们在对引脚状态判断时,会自动读取I/O口的数据,所以在教学I/O口输入输出基本应用时,先通过汇编语言的简单编程使学生们对I/O口双向性的应用和不同的编程方式有一个具体的了解,再转换为C语言编程会达到事半功倍的效果。
在学习51单片机的学习中对
I/O口方向性的学习加以重视,对以后学习PIC和AVR等需确定方向性嵌入式应用有很大的帮助。
4结语
笔者所教学的是电子专业的学生,对硬件的熟悉掌握更甚于软件的使用,通过C语言与汇编语言在单片机教学中的融合应用,是学生对单片机内部硬件模块原理熟练掌握,并且举一反三,在类似元器件应用设计中可以借鉴运用。
通过汇编和C语言在教学中的融合应用,培养学生快速的低级和高级语言的转换思维,提高对汇编语言和C语言编程能力。
【参考文献】
[1]马斌,韩忠华,王长涛,夏兴华.单片机原理及应用:C语言程序设计与实现[M].北京:人民邮电出版社,2009.
[2]赵念强,鲍可进.单片机原理及应用教学改革实践[J].计算机教育,2008(24):9.。