在混合程式设计中,最常用也是最实用的方法是在C语言中加入部分组合语言的程式码,分为两种方法。
方法1)在Keil C51的函式中直接插入汇编语句
方法2)按照Keil C51介面规则,编写汇编模组
方法1是利用编译控制命令#pragma a *** (用来标识所插入的汇编语句的起始位置) 和 #pragma enda *** (用来标识所插入的汇编语句的结束位置) ,这两条命令必须成对出现,并可以多次出现。在Keil C51中不对插入的汇编程式码做任何的处理。
方法2编写汇编模组,需对KEIL编译器的编译过程做些了解。Keil编译器的编译过程是首先将专案中的一个个原始档编译为目的码(obj档案),然在再通过联结器产生为最终可执行的hex档案。
目的码将其中的程式码、资料、常量放在不同的“段”中,储存程式的段称为“程式码段”,储存资料的段称为“资料段”,最终目的码经过Keil的联结器按照“段”的要求转换为程式和资料地址固定的可执行档案。
在Keil软体中,“段”按定位属性分为:“可重定位段”和“绝对段”。
“可重定位段”:程式和资料在其分别所对应的储存单元(FLASH和RAM)中的储存地址是浮动的、可重定义的、相对可变的。
“绝对段”:其地址在连线前就已确定不变,联结器据此为它分配地址。
经Keil编译器生成的“段”具有如下属性:
1)段的储存属性(program code data pdata xdata bdata bit等);
2)段的起始地址;3)段的长度;
4)段的定位要求:绝对段地址固定,可重定位段定位的要求如要求程式码段在2K范围内,资料段定位在可位定址区等;
5)段名:包括程式和资料(变数和常量)的段的储存属性及段所属的程式模组(档案)。程式码段: ?PR? funame?Filename
资料段如:?DT? funame?Filename?BI? funame?Filename
标准段名字首列表
段字首 储存型别 含义
?PR? Program 程式储存区的程式码
?CO? code 程式储存区的常量
?BI? Bit 内部资料储存区的可位定址的位变数
?BA? Bdata 内部资料储存区的可位定址的位元组变数
?DT? Data 内部资料储存区的变数
?ID? Idata 内部资料储存区可间接定址的变数
?PD? Pdata 外部资料储存区的页变数
?XD? Xdata 外部资料储存区的变数
如何将微控制器的组合语言转成微控制器的c语言只有自己重新编写
写stc微控制器的程式,用汇编语言用什么软体来程式设计呢51微控制器系列一般都用KEIL程式设计 汇编 C语言都可以
在keil-c51中如何将汇编程式载入微控制器我来回答,首先生成(.害克思)档案,然后各家微控制器载入方法都不一样,初学者以stc微控制器载入最简单,慢慢学,在以后就明白了为什么它载入简单,可买尽量支援微控制器型号多得烧写器,美名曰程式设计器,stc基本不用,为什么不用,可能是stc耍了个小聪明,在里面加了点小程式,就可以串列埠下载拉,制作stc下载线很简单,网上一搜就知道,经济紧张用stc,方便又快捷
如何用c语言编写微控制器程式。使用微控制器专用的编译器,比如AVR微控制器要用ICC for AVR、AVR Studio 等。然后在选项中选择微控制器型号,比如ATmega16、ATmega128。最后要查询微控制器所对应的库,也就是标头档案。包含对应的标头档案,标头档案中有定义好的微控制器的变数名和函式,写程式要用到,比如引脚可能定义为PORTA,这些要记住,不可以写其他的变数名。具体写程式,和普通的C程式没有什么区别。
基本与普通C语言差不多,只不过微控制器标头档案肯定是与各自微控制器相关了,不是一般C所多用的STDIO.H,像51,一般是
#include<reg51.h>
51微控制器的程式设计软体(Keil)用汇编语言程式设计,如何将它汇入到isis 中?你是想模拟吗????只要生成hex档案,在proteus拖入的晶片点右键选择edit(一般第二个选项) 然后将hex得路径汇入,就可以模拟。。。生成hex档案的方法是在keil选项卡中的output中设定,hexcreate打勾。。。。。
如何用keil软体编写微控制器程式Keil系列教程:
:blog.csdn./column/details/13472.
使用汇编语言编写微控制器程式^_^,这个可以用两个红外对管来实现,进去的时候1,2依次得到低电平,暂存器加1;有人出来的时候2,1依次得到低电平,暂存器减1
当暂存器等于0的时候,灯灭,不等于0的时候灯亮
^_^
程式很简单
就是怕学生会故意捣鬼,要是有一个人背著另一个走出去,灯就不会灭了
^_^
微控制器如何用C语言以及组合语言写滤波程式?滤波,关键问题是演算法,有了演算法剩下的就是coding了
说白了,汇编与C,程式结构是一样的,也就是C一句话汇编要几句语句而已
模块内接口:使用如下标志符:
#pragma
asm
汇编语句
#pragma
endasm
注意:如果在c51程序中使用了汇编语言,注意在Keil编译器中需要激活Properties中的
“Generate
Assembler
SRC
File”
和“Assembler
SRC
File
”两个选项
1、把"xx.c"加入工程中,右击"xx.c"选择“options
for
file"xx.c"
选择
“Generate
Assembler
SRC
File”和“Assemble
SRC
File”打上黑勾有效;
2、根据选择的编译模式,把相应的库文件象加"xx.c"一
样加入工程中并放在"xx.c"下面,如smail模式下选"keil\c51\lib\c51s.lib"
加入工程中,如果要进行浮点运算把"keil\c51\lib\c51fpl.lib"也加入工程中。
即:
在
Keil
安装目录下的
\C51\LIB\
目录的LIB
文件如下:
C51S.LIB
-
没有浮点运算的
Small
model
C51C.LIB
-
没有浮点运算的
Compact
model
C51L.LIB
-
没有浮点运算的
Large
model
C51FPS.LIB
-
带浮点运算的
Small
model
C51FPC.LIB
-
带浮点运算的
Compact
model
C51FPL.LIB
-
带浮点运算的
Large
model
3、在"xx.c"头文件中加入优化:比如#pragma
OT(4,speed)
4、在"xx.c"中加入汇编代码
#pragma
ASM
Assembler
Code
Here
#pragma
ENDASM
5、编译生成xx.hex
例:
#include
void
delay(void)
{
#pragma
asm
MOV
R5,#5
DEL:
MOV
R6,#2
DEL1:
MOV
R7,#255
DJNZ
R7,$
DJNZ
R6,DEL1
DJNZ
R5,DEL
MOV
A,P1
CPL
A
MOV
P1,A
#pragma
endasm
}
void
delay1(unsigned
int
cnt)
{
while(cnt--)
}
void
main()
{
while(1)
{
delay1(1000)
P1=0x55
delay()
}
}
keil C 语言中嵌入汇编语言进行混合编程,方法如下:
1、在C 文件中要嵌入汇编代码片以如下方式加入汇编代码
#pragma ASM
Assembler Code Here
#pragma ENDASM
2、在Project 窗口中包含汇编代码的C 文件上右键,选择“Options for ...”
在d出的对话框中,点击右边的
“Generate Assembler SRC File”
和“Assemble SRC File”
使检查框由灰色变成黑色(有效)状态
3 、根据选择的编译模式, 把相应的库文件( 如Small 模式时, 是
Keil\C51\Lib\C51S.Lib)加入工程中, 该文件必须作为工程的最后文件,在默认
安装盘KEIL/C51/LIB/C51S.Lib
4、编译,即可生成目标代码
实例:
#include<reg52.h>
#define uchar unsigned char
sbit LED1=P1^0
//C 嵌入汇编例程
void delay_ms(void)
{
#pragma asm
MOV R0,#0FFH
MOV R1,#0FFH
D_LOOP1:
DJNZ R0,D_LOOP1
MOV R0,#0FFH
DJNZ R1,D_LOOP1
#pragma endasm
}
void main(void)
{
uchar i
P1 = 0xFF
while(1)
{
i++
delay_ms()
if(i>=7)
{
LED1 =~LED1
i=0
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)