1:C51编译器如何区分位地址和字节地址
是靠预定义实现的,比如:sfr P0 = 0x80; sbit P0_0 = 0x80;前者声明了P0端口地址位于0x80,后者说明了P0端口的bit0,即P0.0位于位地址空间0x80处。这2个0x80具有完全不同的含义,靠关键字sfr和sbit来区别。这样当程序被编译时,编译器会依此编译成相应的汇编语言。例如:
C51语句: P0 = 1;
P0声明为sfr,因此编译成:mov 80h,01h,将把0x01数据送入0x80单元,由于0x80单元物理上对应P0端口,因此,P0.0脚将输出高电平(其实是呈现高阻态,P0口独有的),其他.1-.7脚输出低电平。
C51语句: P0_0 = 1;
P0_0声明为sbit,因此编译成:setb 80h,这将把位地址空间的0x80地址的bit的值置1。这个位正是P0口的bit0,执行后,P0.0将输出高阻态。而P0.1-.7不会变化。
2:C51为什么要嵌套汇编
51单片机一个显着优点就是指令执行时间固定,因此可以适应时序要求严格的场合。例如符合ISO7816协议的cpu卡的读写,对时序要求比较严格。其实就是用io脚做出来的同步半双工串口。支持cpu卡的程序一般比较庞大,需要用c51来组织,但是由于c编译的不确定性,必须把底层程序封装成汇编语言模块嵌入到工程中。这就带来几个问题:如何声明函数、参数如何传递等。限于篇幅,不能说得很细。下面举例:
汇编程序单独保存一个文件,加入到工程中,函数如下:
_proc_a:
mov a, r7
inc a
mov r7, a
ret
用c语言在.h文件中声明: extern unsigned char proc_a(unsigned char val);
调用时形如: retvalue = proc_a(0x11);
说明:
a:汇编程序如果带参数,则需要在汇编程序前多加一个下划线。而声明它的地方不用加(伟福编译器这么要求的)。
b:函数的形参中第一参数用R7传递,函数返回值用R7返回,这是C51的通用规范。其他参数都有相应规定。函数可以返回一个位,用psw的c位返回。c:上面的语句,执行顺序是把0x11给R7,然后跳转子程序,子程序将它加1后送回。
d:函数跳转到汇编程序时,本区的R0-R7,A,B,PSW,DPTR等寄存器可以供子程序使用,不必考虑调用后是否要恢复这些常规资源。上例中,A的值被函数使用了,编程者不必恢复调用前的值。
② 单片机是怎样编程的
在电脑上敲进去代码,一般用C语言或者汇编,然后让编译器编译,然后现在验证。
③ 利用单片机,如何才能正确的编写出一段程序,编写的步骤是什么
51之类的入门级单片机搭建的小程序可以用Keil来编比较方便,C语言记得导入头文件reg51.h或者reg52.h,然后后面用类似普通的C语言语法,注意这里的Keil C51和普通的C不同,比如sbit之类的,因为是交叉编译,所以要注意各个接口,深入学习一定需要看书的。KeilC步骤:1、下载Keil42、project选择芯片类型3、导入头文件4、编程
④ 往51单片机里写程序,用C语言写,写好后用什么软件编译并且写进去
用keil软件写程序,编辑、编译、运行。程序没有问题后,用STC_ISP_V479下载程序
⑤ 单片机程序是用哪种语言编译的
你要看是哪种呀,我们一般的支持C和汇编,一般我们常见是都是这种。有少数的几个支持C++。
你想知道多一点的话,找几个论坛看看。
目前用于单片机开发的语言有:C,汇编,Basic,其他很少。
作为低级语言,汇编毫无疑问是最适合开发硬件的语言,因为利用生产单片机的厂家提供的指令系统和开发工具能开发出性能最佳的产品。
但是用汇编语言有个前提,你必须是非常熟悉指令系统,但目前来看达到这个程度的人少之又少,所以,一般人都直接采用高级语言开发单片机,这样可以降低开发难度,减少软件失误造成的损失。
C语言移植性非常好,基本上所有单片机都有C语言接口,而一般人只要有C语言基础就能很快上手,开发效率明显高于用汇编语言。所以,如果你是初学者,建议你打好C语言基础。
C++是C的超集,在一定环境下可以代替C语言。由于采用面向对象的设计方法,程序员可以集中精力于单片机的性能而不是单片机的指令流程。这里不是说C语言不如C++,而是说这两种语言不是对立的关系,而是递进的关系。你如果有过开发单片机系统的经验的话,会有很深的感触的。据我所知,AVR单片机的开发环境WINAVR支持C++语言。其他好像有Basic开发的,不过我没用过,不太了解。
⑥ 单片机:怎么从asm文件编译出hex文件,用keil
用KEIL建立工程,设置工程
选项卡
的options
fot
target
再点OUTPUT选项卡,把Creat
hex前打勾,然后将你的ASM文件添加到工程中进行编译构造目标,在ASM的文件夹里就会产生你要的
HEX文件
了
⑦ linux下怎么编译单片机c代码,怎么下载到51单片机上呢
1.编译软件用sdcc
2.sdcc不支持keil51c 的一些语法。要做以下修改:
sbitled1=P1^0; 改为 #define led1 P1_0
中断函数interrupt改为__interrupt
单个位 P1^0 改为P1_0
若vim安装插件YCM的话,要在.ycm_extra_conf.py加入以下两个路径
/usr/share/sdcc/include
/usr/share/sdcc/include/mcs51
没创建一个工程都要拷贝一份.ycm_extra_conf.py到该工程的目录下。
3.编译用命令
` sdcc 目标文件
4.烧录软件用stcflash.py,该软件只能支持stc89c52rc,不支持stc89c52。我自己亲自试过。
sudo python ./stcflash.py 目标文件