keil编译51单片机

2020-02-09 23:30:54 zhouga 阅读数 251

原来我是先装keilC51,后装keilMDK的,装在不同的目录里,装完之后不管是51工程还是stm32工程默认都会用keilMDK打开,这样打开51工程时会出错,所以要打开51的工程必须先打开keilC51程序,然后再程序里打开工程文件。
下面这个方法可以让keilMDK兼容51的工程,只要一个keil就都能编译51和stm32的工程了:
1、安装keilC51,并破解,安装目录 C:\keilC51
2、安装keilMDK,并破解,安装目录 C:\keilMDK
3、把 C:\keilC51\ 里面的 C51 文件夹复制到 C:\keilMDK\ 里
4、把 C:\keilC51\ 里面的 UV4 文件夹复制到 C:\keilMDK\ 里,提示有同名文件都不要覆盖
5、把 C:\keilC51\TOOLS.INI 文件里面的内容复制到 C:\keilMDK\TOOLS.INI 文件后面,并且把所有的 “keilC51”替换为“keilMDK”
6、OK

2019-12-25 17:34:58 qq_40993639 阅读数 628

安装KEIL5成功后,打开51单片机程序很多按钮都是灰色,或者编写51单片机程序的时候不能预编译,此时需要下载51单片机PACK包,要么去官网下载(但是要填写个人信息很烦),网上的答案几乎就是这个,要么就是要C币下载(有点坑),刚才帮舍友搞了下,幸好发现我百度云上有C51依赖包,所以在这里分享给大家:
https://pan.baidu.com/s/1qVXVi1-Aj-6UzRCFsl1IOQ
密码:yp9l
双击运行安装到KEIL目录底下就可以了。

2014-04-30 18:23:22 tripleCC 阅读数 525
#include<reg52.h>

//#define TL(x) ((1<<16) - x) % 256;
//#define TH(x) ((1<<16) - x) / 256;
#define uint unsigned int
int main( void )
{
  uint  a;
a = (65536 - 250) / 256;  //这里1
        a = ((1<<16) - 250) / 256; //还有这里2
return 0;
}

如上程序:
1输出结果正确
2输出结果为0
原因分析(不确定):
反汇编中1存入a中的值正确
2中存入a中的值为0
对于2,keil编译器默认常数1为16位(int),当执行1<<16时便溢出,实际上变成了0.(以前看过用这个方法测量机器是几位的),如果改为(long)1<<16,则执行结果正确。
编译器将65536看为long型,与1<<16有实质上的区别,所以在51上(8位单片机,int为16位)不能等同。只要左边的表达式能放下65536便不会溢出(uint不能,要用long或以上)。
实际上初始化定时器的值应该是65535,而不是65536
2017-11-09 18:05:37 mao_hui_fei 阅读数 43406

目前我们通常编写51程序使用的是keil4,而好多编写STM32等单片机程序的使用keil5。那么如何在keil5中兼容51和STM32程序编写,省去切换版本的繁琐呢?
很简单只需两步就可以完成。
下面这个方法针对已破解keil5的stm32等一系列。这个肯定是最常见的,因为破解keil5然后编写32工程的教程一大把。

1、首先下载编写51的相关东西。
可以在官网上下载,例如百度keil官网。
这里写图片描述

点击右上角的DOWNLOADS进入相关的下载界面,下载你需要的安装包。MDK5、c51、c166等,这里只需要下载c51的。

这里写图片描述

当然也可以在下面这个百度网盘链接里下载:
51相关: 链接:http://pan.baidu.com/s/1skMv2Nz 密码:9env
破解机:链接:http://pan.baidu.com/s/1o8h0v5w 密码:tusa

下载好然后直接双击安装
这里写图片描述

2、破解
现在打开keil5,切记以管理员身份运行,关掉安全软件。
点击file——license management
这里写图片描述

找到这个CID号,复制一下
这里写图片描述

双击打开破解机,第一步复制进来刚才的CID号,记得第二步要选C51,最后将生成的序列号复制出去

这里写图片描述

最后又回到kiel5,将刚才复制的序列号,放到下图位置,添加序列号。

这里写图片描述

配置成功界面

这里写图片描述

新建工程,点project——new project,记得切换
这里写图片描述

然后就可以找到51系列芯片了。

2017-03-23 13:29:00 weixin_33840661 阅读数 85

先做一个实验,对比一下。

1、第一次编译:

2、在main()函数中添加

char test1[10]={0};
xdata char test2[5]={0};

再次编译:

 

3、在其他函数中定义局部变量,编译后data和xdata是不会改变的,有兴趣可以验证。

4、keil memory mode是什么?

Small:变量存储在内部ram里;

Compact:变量存储在外部ram里,使用页8位间接寻址;

Large:变量存储在外部Ram里,使用16位间接寻址;

使用Small的模式:也不是说变量就不可以存储在外部,一样可以存储在外部,只是你要指定,比如:

unsigned char xdata a;//变量a存储在外部的ram。

unsigned char a;//变量a存储在内部ram

使用Large的模式

unsigned char xdata a;//变量a存储在外部的ram。

unsigned char a;//变量a存储在外部ram。

5、判断单片机的RAM、ROM能否满足代码需要的资源?

  编译工程,查看资源分配情况。stc15w4k32包含256字节RAM,3840字节XRAM(保存xdata)。

6、检查程序调用嵌套,是否会导致堆栈溢出

     下图是使用keil编译工程后,生成的.M51文件。

      其中,?STACK就是堆栈的分配。LENGTH虽为1,但不用担心因为长度不够,这个1并非真正的堆栈空间长度,它会自增,在bit和data分配完地址后,data区域(00H-7FH)内剩余空间都是堆栈区域。该担心的是BASE基地址,因为从007FH自增不可以超出00FFH(data的最大范围)。考虑中断程序和程序嵌套调用,需精确计算出来程序需要多少堆栈,再和.M51对比,是否能够保证堆栈不溢出。

      

      类型        基地址        长度          单位                 段名

  

 

7、data、idata、bdata地址分配?

type              base              length

--------------------------------------------

data              0x0               0x7F           //直接寻址   

bdata            0x20              0x0F          //位寻址

idata             0x0                0xFF          //0x00-0x7F和data重合,间接寻址

xdata            0x0                0xFFFF       //外部扩展RAM,使用DPTR访问

pdata            0x0                0xFF          //外部扩展RAM低256字节,

 

转载于:https://www.cnblogs.com/isha2088/p/6604645.html