导读: 
   一、#pragma asm是什么意思? 
  #pragma asm 
  MOV P1,R7 
  NOP 
  NOP 
  MOV P1,#0 
  #pragma endasm 
  实际上就是一个在C51中内嵌汇编语言的开关 
   二、一个 hex to bcd 的算法程序 
  HEX_BCD:CLR A 
  MOV 30H,A 
  MOV 31H,A 
  MOV 32H,A 
  MOV R2,#15 
  H_B0: MOV A,R1 
  RLC A 
  MOV R1,A 
  MOV A,R0 
  RLC A 
  MOV R0,A 
  MOV A,32H 
  RLC A 
  ACALL BCD_ADJ 
  MOV 32H,A 
  MOV A,31H 
  RLC A 
  ACALL BCD_ADJ 
  MOV 31H,A 
  MOV A,30H 
  RLC A 
  ACALL BCD_ADJ 
  MOV 30H,A 
  DJNZ R2,H_B0 
  MOV A,R0 
  RLC A 
  MOV A,32H 
  RLC A 
  MOV 32H,A 
  MOV A,31H 
  RLC A 
  MOV 31H,A 
  MOV A,30H 
  RLC A 
  MOV 30H,A 
  RET 
  BCD_ADJ:PUSH PSW 
  PUSH ACC 
  CJNE A,#50H,$+2 
  JC B1 
  POP ACC 
  ADD A,#30H 
  PUSH ACC 
  B1: ANL A,#0FH 
  CJNE A,#5,$+2 
  JC B2 
  POP ACC 
  ADD A,#3 
  PUSH ACC 
  B2: POP ACC 
  POP PSW 
  RET 
   三、有关单片机ALE引脚的问题 
  "单片机不访问外部锁存器时ALE端有正脉冲信号输出,此频率约为时钟振荡频率的1/6.每当访问外部数据存储器是,在两个机器周期中ALE只出现一次,即丢失一个ALE脉冲."这句话是不是有毛病.我觉得按这种说法,应该丢失3个ALE脉冲才对,我一直想不通是怎么回事,希望大虾们帮帮我.小弟感激涕零. 
  答: 
  其他所有指令每6个机器周期发出一个ALE,而MOVX指令占用12个机器周期只发出一个ALE 
   四、如何将一个INT型数据转换成2个CHAR型数据? 
  经keil优化后,char1=int1/256,char2=int1%256或char1=int1>>8,char2=int1&0x00ff效率是一样的。 
   五、在KEIL C51上仿真完了,怎样生成HEX文件去烧写? 
  右键点项目中Target 1,选第二个,在OUTPUT中选中CREAT HEX 
   六、typedef 和 #define 有何不同? 
  typedef 和 #define 有何不同? 如 
  typedef unsigned char UCHAR 
  #define unsigned char UCHAR 
  typedef命名一个新的数据类型,但实际上这个新的数据类型是已经存在的,只不过是定义了一个新的名字. 
  #define只是一个标号的定义. 
  你举的例子两者没有区别,但是#define还可以这样用 
  #define MAX 100 
  #define FUN(x) 100-(x) 
  #define LABEL 
  等等,这些情况下是不能用typedef定义的 
   七、请问如何设定KELC51的仿真工作频(时钟) 
  用右键点击左边的的target 1,然后在xtal一栏输入 
   八、不同模块怎样共享sbit变量,extern不行? 
  把SBIT定义单独放到一个.H中,每个模块都包含这个.h文件 
  九、C51中对于Px.x的访问必须自己定义吗? 
  是的。如sbit P17 = 0x97;即可定义对P1.7的访问 
   十、SWITCH( )语句中表达式不可以是位变量对吗? 
  可以用位变量: 
  #include 
  #include 
  void main() 
  { 
  bit flag; 
  flag=0; 
  switch(flag) 
  { 
  case '0':{printf("0/n");break;} 
  case '1':{printf("1/n");break;} 
  default:break; 
  } 
  } 
  bit 变量只有两种状态,if 语句足够啦,!!! 
   十一、const常数声明占不占内存??? 
  const 只是用来定义“常量”,所占用空间与你的定义有关,如: 
  const code cstStr[] = {"abc"}; 
  占用代码空间;而如: 
  const char data cstStr[] = {"abc"}; 
  当然占用内存空间。 
  另外,#define 之定义似乎不占用空间。 
   十二、philips的单片机P89C51RD+的扩展RAM在C51中如何使用? 
  试一试将auxr.1清0,然后在c语言中直接声明xdata类型的变量 
   十三、BUG of Keil C51 
  程序中用如下语句: 
  const unsigned char strArr[] = {"数学"}; 
  结果发现strArr[] 内容为 {0xCA,0xD1,0xA7},真奇怪! 
  凡是有0xfd,则会通通不见了,所以只能手工输入内码了,例如 uchar strArr[]={0xCA,0xfd,0xd1,0xa7}(用Ultraedit会很方便)。 
   十四、Keil C51中如何实现代码优化? 
  菜单Project下Option for target "Simulator"的C51. 
  看到Code optimization了吗? 
   十五、请教c的!和 ~ 符号有甚区别? 
  !是逻辑取反,~是按位取反。 
   十六、c51编程,读端口,还要不要先输出1? 
  我怎么看到有的要,有的不要,请高手给讲讲,到底咋回事?谢了 
  要输出1的,除非你能保证之前已经是1,而中间没有输出过其他值。 
   十七、当定时器1(T1)用于产生波特率时,P3^5还是否可以用作正常的I/O口呢? 
  p3.5完全可以当普通的io使用 
   十八、C51中 INT 转换为 2个CHAR? 
  各位高手: 
  C51中 INT 转换为 CHAR 如何转换诸如: 
  X = LOW(Z); 
  Y = HIGH(Z); 
  答: 
  x=(char)z; 
  y=(char)(z>>8); 
   十九、如果我想使2EH的第7位置1的话,用位操作可以吗? 
  现在对位操作指令我一些不太明白请各位多多指教: 
  如 SETB 07H 表示的是20H.7置1,对吗?(我在一本书上是这么看到的)那么如果我想使2EH的第7位置1的话,象我举的这个例子怎么表示呢?谢谢! 
  SETB 77H 
  setb (2eh-20h)*8+7 
  20h-2fh每字节有8个可位操作(00h-7fh),其它RAM不可位直接操作 
   二十、char *addr=0xc000 和char xdata *addr=0xc000有何区别? 
  char *addr=0xc000; 
  char xdata *addr=0xc000; 
  除了在内存中占用的字节不同外,还有别的区别吗? 
  char *addr=0xc000; 是通用定义,指针变量 addr 可指向任何内存空间的值; 
  char xdata *addr=0xc000; 指定该指针变量只能指向 xdata 中的值; 
  后一种定义中该指针变量(addr)将少占用一个存储字节。 
  uchar xdata *addr=0xc000;指针指向外ram; 
  如果:data uchar xdata *addr=0xc000;指针指向外ram但指针本身存在于内ram(data)中,以此类推可以idata uchar xdata *addr=0xc000;pdata uchar xdata *addr=0xc000; 
  data uchar idata *addr=0xa0;......... 
   二十一、while(p1_0)的执行时间? 
  假设,P1_0为单片机P1口的第一脚,请问, 
  while(P1_0) 
  { 
  P1_0=0; 
  } 
  while(!P1_0) 
  { 
  P1_0=1; 
  } 
  以上代码,在KEIL C中,需要多长时间,执行完。能具体说明while(P1_0)的执行时间吗? 
  仿真运行看看就知道了, 
  我仿真了试了一下,约14个周期 
   二十二、怎样编写C51的watchdog程序? 
  各位大虾,我用KEIL C51 编写了一个带外部开门狗的程序,可程序无法运行起来,经过查找,发现程序在经过C51编译后,在MAIN()函数的前部增加了一端初始化程序,等到进入主程序设置开门狗时,开门狗已经时间到,将我的程序复位了,请问我怎样才能修改这一端 
  初始花程序,使他一运行,就设置开门狗? 
  可以在startup.a51中加入看门狗刷新指令,当然用汇编,然后重新编译startup.a51,将他和你的程序连接即可。新的startup.a51会自动代替系统默认的启动模块。 
   二十三、keil C51 怎样把修改的startup.a51 加到工程文件中? 
  直接加入即可。注意不要改动?STACK,?C_START,?C_STARTUP等符号。startup.a51直接加入项目,不用修改也可。可在内面自己修改汇编的一些限制或堆栈指针。 
   二十四、关于波特率的设置? 
  我在设定串口波特率时发现一个问题:在晶体震荡器为11.0592MHz时,若设9600BPS的话,TH1=0XFD,TL1=0XFD,而要设19200BPS的话,TH1、TL1有否变化,如果没变,为什么?如果变了,又为什么?(因为我看书上俩个是一样的),希望大家点拨。 
  答: 
  当电源控制寄存器(PCON)第BIT7(SMOD)为1时波特率加倍。TH1和TL1的值不变. 
   二十五、如何在C中声明保留这部分RAM区不被C使用? 
  我不知道在C源程序中怎么控制这个,但在汇编程序中加入下面一段就行: 
  DSEG AT 20H 
  AA: DS 10 
  这样C51就不会占用20H--29H了 
  或者在c51里这样定义: 
  uchar data asm_buff[10] _at_ 0x20; 
   二十六、问浮点运算问题 
  我在用C51时发现它对传递浮点参数的个数有限制,请问: 
  1)参数是以全局变量的形式传递的,请问以全局变量的形式传递的参数也有限制吗? 
  2)这种传递浮点参数的限制有多少呢? 
  3)float*float的结果是float类型还是double类型?能否直接赋值给float类型的变量? 
  答: 
  由于KEIL C51的参数传递是通过R0-R7来传递的,所以会有限制。不过KEIL提供了一个编译参数,可以支持更多参数的传递。具体 
  的内容见KEIL的PDF文档。我建议你把多个要传递的参数定义到指针或结构体中去,传递参数通过指针或结构进行,这样好一些。 
  第3个问题回答是YES,你自己试试不就知道了。 
   二十七、如何在某一个地址定义ram? 
  用_at_ 命令,这样可以定位灵活一点的地址 
  uchar xdata dis_buff[16] _at_ 0x6020 //定位RAM 
  将dis_buff[16]定位在0x6020开始的16个字节 
   二十八、keil c中,用什么函数可以得到奇偶校验位? 
  例如32位数据,将四个字节相互异或后检查P即可,若耽心P被改变,可用内嵌汇编。 
  #include 
  unsigned char parity(unsigned char x){ 
  x^=x; 
  if(P)return(1); 
  else return(0); 
  } 
  unsigned char parity2(unsigned int x){ 
  #pragma asm 
  mov a,r7 
  xrl ar6,a 
  #pragma endasm 
  if(P)return(1); 
  else return(0); 
  }

本文转自 
http://www.dzkf.cn/html/qianrushixitong/2006/0810/253.html

keil c51问答相关推荐

  1. 配置Keil C51配置开发 STC51单片机过程

    内容 1. Keil C51 下载 2. 配置开发STC51单片机 配置 Keil IDE与TEASOFT编辑 1. 配置Keil编辑器 2. 设置Keil自动开打文件 参考博文 1. Keil C5 ...

  2. 如何让Keil MDK兼容Keil C51?

    原来用51单片机,使用的是Keil C51 uVision V4.02:最近搞STM32,装了keilMDK uVision V4.23. 原来我是先装keilC51,后装keilMDK的,装在不同的 ...

  3. keil c51的内部RAM(idata)动态内存管理程序(转)

    源:keil c51的内部RAM(idata)动态内存管理程序 程序比较简单,但感觉比较有意思,个人认为有一定应用价值,希望大家有更好的思路和方法,互相促进. 程序的基本思路是:在CPU堆栈指针SP以 ...

  4. 【Keil C51】使用 watch1 来查看变量的值

    在使用Keil C51,进行软件调试时,对变量观察的办法如下: 在变量处单击右键,选择添加至watch1窗口,即可看到R6变量在代码调试运行时,具体的数值变化.

  5. Keil C51软件的使用教程

    keil uvision2 C51软件我们在前面有所介绍,是目前功能最强大的单片机c语言集成开发环境,如果您没有此软件可以从这里下载:http://www.51hei.com/keil%CF%C2%D ...

  6. Keil C51的库函数

    转自:http://www.dwenzhao.cn/profession/mcu/mcu51clib.html Keil C51有丰富的可直接调用的库函数,灵活使用库函数可使程序代码简单.结构清晰,并 ...

  7. c51语言bit函数,keil C51中的本征函数库及使用说明

    本征函数(intrinsicroutines)是指编译时直接将固定代码插入当前行,而不用ACALL和LCALL 来实现(无需堆栈操作?),可大大提高函数的访问效率. 函数原型 extern void  ...

  8. 关于keil c51与keil mdk同时安装、合并解决办法

    下面的方法可以解决keilMDK兼容C51工程的问题: 1 首先,准备好两个软件的安装文件,建议你用以下两个版本 Keil Realview MDK 4.12版本或更高版本,Keil C51 V9.0 ...

  9. c语言lst文件,Keil C51 之LST文件

    Keil C51编译器在编译程序时,会生成一个扩展名为LST的列表文件,也被称为listing file. 这个文件包含了有关编译过程的丰富信息,该文件由多个段组成,其中Symbol Listing ...

最新文章

  1. python统计文件中的中文字数-Python实现统计文本文件字数的方法
  2. jquery表单数据反序列化为字典
  3. GO编程程序员修炼秘籍:十本经典书单
  4. 数据科学家 数据工程师_发展数据科学家和工程师
  5. delphi dbgrideh 遍历每一个单元格_真香!我用Python 制作了一个迷宫游戏
  6. [leetcode]1375. 灯泡切换器III
  7. Atitit 格式转换的艺术 以excel转换txt为例
  8. Path接口与Files工具类
  9. SpringBoot整合jsp技术
  10. python拼接sql语句字符串 无效字符,Python拼接SQL字符串的方法
  11. 视频教程-JQuery全套视频-jQuery
  12. Postman安装以及使用
  13. 笔记记本显卡Radeon 680M、mx570和mx450差距 680M、mx570和mx450对比
  14. 词频统计以及分析(词云制作)
  15. 无监督-主题模型(TM)/隐语义模型(LFM)(四):LDA(隐狄利克雷分布)【 数据(似然)(多项分布)+先验分布(狄雷分布)-> 后验分布(狄雷分布),后验分布作为下一轮的先验分布】【广泛使用】
  16. 三大统计平台流量对比,百度偏高,51la与CNZZ持平
  17. 微信游戏6周年活动来袭/华为手机发布最新5G手机,以上为今日内容
  18. 游戏客户端--个人学习路线总结、指北
  19. 如何高效开发海外客户将开发信递送到真正的买家手里
  20. Maven引入本地jar包,解决打包时找不到本地jar包

热门文章

  1. JavaScript点击事件换字体颜色
  2. python excel单元格坐标_python简单Excel操作
  3. matlab模拟巴特沃斯滤波器设计,巴特沃斯滤波器matlab实现
  4. 正则匹配指定字符串后面的内容
  5. DatePart知多少
  6. iPad 上进行 Python 开发是怎样的体验?
  7. python 判断字符串是否为数字或字母
  8. 【世界环境日特辑】大数据如何拯救地球?
  9. 破解某助手刺探功能---第一篇hook实现
  10. 热门流量主小程序王者重复空白名昵称头像生成系统开发