‘壹’ 单片机Keil问题
先回答你第一个问题:
DATALOOP: MOV @R0,A
DJNZ R0,IDATALOOP
第一条是将A中的内容放入R0所指的地址中,如果R0的数值比较大的话,用单步运行就需要很长时间。有个方法可以解决,即在KEIL调试时,修改R0里的数值,将它变成1或者01H,就可以出循环了。
第二个问题:
你的程序是实现P1循环→P3循环→P2循环→P0循环,然后又返回P1循环,连续往复。
你的程序,我用软件调试了,逻辑上没问题,能实现。
不过建议你用移位指令来完成。这样更简单。
回答完毕,谢谢。
‘贰’ Keil C51下如何让编译器优先使用片内RAM
C51内存结构深度剖析
在编写应用程序时,定义一个变量,一个数组,或是说一个固定表格,到底存储在什么地方;当定义变量大小超过MCU的内存范围时怎么办;如何控制变量定义不超过存储范围;以及如何定义变量才能使得变量访问速度最快,写出的程序运行效率最高。以下将一一解答。
1 六类关键字(六类存储类型)
data idata xdata pdata code bdata
code: code memory (程序存储器也即只读存储器)用来保存常量或是程序。code memory 采用16位地址线编码,可以是在片内,或是片外,大小被限制在64KB
作用:定义常量,如八段数码表或是编程使用的常,在定义时加上code 或明确指明定义的常量保存到code memory(只读)
使用方法:
char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
此关键字的使用方法等同于const
data data memory (数据存储区)只能用于声明变量,不能用来声明函数,该区域位于片内,采用8位地址线编码,具有最快的存储速度,但是数量被限制在128byte或更少。
使用方法:
unsigned char data fast_variable=0;
idata idata memory(数据存储区)只能用于声明变量,不能用来声明函数. 该区域位于片内,采用8位地址线编码,内存大小被限制在256byte或更少。该区域的低地址区与data memory地址一致;高地址区域是52系列在51系列基础上扩展的并与特殊功能寄存器具有相同地址编码的区域。即:data memory是idata memory的一个子集。
xdata xdata memory 只能用于声明变量,不能用来声明函数,该区域位于MCU
外部,采用16位地址线进行编码,存储大小被限制在64KB以内。
使用方法:
unsigned char xdata count=0;
pdata pdata memory 只能用于声明变量,不能用来声明函数,该区域位于MCU外部,采用8位地址线进行编码。存储大小限制在256byte. 是xdata memory的低256byte。为其子集。
使用方法
unsigned char pdata count=0;
bdata bdata memory 只能用于声明变量,不能用来声明函数。该区域位于8051内部位数据地址。定义的量保存在内部位地址空间,可用位指令直接读写。
使用方法:
unsigned char bdata varab=0
注:有些资料讲,定义字符型变量时,在缺省unsigned 时,字符型变量,默认为无符号,与标准C不同,但我在Keil uVision3中测试的时候发现并非如此。在缺省的情况下默认为有符号。或许在以前的编译器是默认为无符号。所以看到有的资料上面这样讲的时候,要注意一下,不同的编译器或许不同。所以我们在写程序的时候,还是乖乖的把unsigned signed 加上,咱也别偷这个懒。
2函数的参数和局部变量的存储模式
C51 编译器允许采用三种存储器模式:SMALL,COMPACT 和LARGE。一个函数的存储器模式确定了函数的参数的局部变量在内存中的地址空间。处于SMALL模式下的函数参数和局部变量位于8051单片机内部RAM中,处于COMPACT和LARGE模式下的函数参数和局部变量则使用单片机外部RAM。在定义一个函数时可以明确指定该函数的存储器模式。方法是在形参表列的后面加上一存储模式。
示例如下:
#pragma large //此预编译必须放在所有头文前面
int func0(char x,y) small;
char func1(int x) large;
int func2(char x);
注:
上面例子在第一行用了一个预编译命令#pragma 它的意思是告诉c51编译器在对程序进行编译时,按该预编译命令后面给出的编译控制指令LARGE进行编译,即本例程序编译时的默认存储模式为LARGE.随后定义了三个函数,第一个定义为SMALL存储模式,第二个函数定义为LARGE第三个函数未指定,在用C51进行编译时,只有最后一个函数按LARGE存储器模式处理,其它则分别按它们各自指定的存储器模式处理。
本例说明,C51编译器允许采用所谓的存储器混合模式,即允许在一个程序中将一些函数使用一种存储模式,而其它一些则按另一种存储器模式,采用存储器混合模式编程,可以充分利用8051系列单片机中有限的存储器空间,同时还可以加快程序的执行速度。
3绝对地址访问 absacc.h(相当重要)
#define CBYTE ((unsigned char volatile code *) 0)
#define DBYTE ((unsigned char volatile data *) 0)
#define PBYTE ((unsigned char volatile pdata *) 0)
#define XBYTE ((unsigned char volatile xdata *) 0)
功能:CBYTE 寻址 CODE区
DBYTE 寻址 DATA区
PBYTE 寻址 XDATA(低256)区
XBYTE 寻址 XDATA区
例: 如下指令在对外部存储器区域访问地址0x1000
xvar=XBYTE[0x1000];
XBYTE[0x1000]=20;
#define CWORD ((unsigned int volatile code *) 0)
#define DWORD ((unsigned int volatile data *) 0)
#define PWORD ((unsigned int volatile pdata *) 0)
#define XWORD ((unsigned int volatile xdata *) 0)
功能:与前面的一个宏相似,只是它们指定的数据类型为unsigned int .。
通过灵活运用不同的数据类型,所有的8051地址空间都是可以进行访问。
如
DWORD[0x0004]=0x12F8;
即内部数据存储器中(0x08)=0x12; (0x09)=0xF8
注:用以上八个函数,可以完成对单片机内部任意ROM和RAM进行访问,非常方便。还有一种方法,那就是用指钟,后面会对C51的指针有详细的介绍。
4寄存器变量(register)
为了提高程序的执行效率,C语言允许将一些频率最高的那些变量,定义为能够直接使用硬件寄存器的所谓的寄存器变量。定义一个变量时,在变量类型名前冠以“register” 即将该变量定义成为了寄存器变量。寄存器变量可以认为是一自动变量的一种。有效作用范围也自动变量相同。由于计算机寄存器中寄存器是有限的。不能将所有变量都定义成为寄存器变量,通常在程序中定义寄存器变量时,只是给编译器一个建议,该变量是否真正成为寄存器变量,要由编译器根据实际情况来确定。另一方面,C51编译器能够识别程序中使用频率最高的变量,在可能的情况下,即使程序中并未将该变量定义为寄存器变量,编译器也会自动将其作为寄存器变量处理。被定义的变量是否真正能成为寄存器变量,最终是由编译器决定的。
5内存访问杂谈
1指钟
指钟本身是一个变量,其中存放的内容是变量的地址,也即特定的数据。8051的地址是16位的,所以指针变量本身占用两个存储单元。指针的说明与变量的说明类似,仅在指针名前加上“*”即可。
如 int *int_point; 声明一个整型指针
char *char_point; 声明一个字符型指针
利用指针可以间接存取变量。实现这一点要用到两个特殊运算符
& 取变量地址
* 取指针指向单元的数据
示例一:
int a,b;
int *int_point; //定义一个指向整型变量的指针
a=15;
int_point=&a; //int_point指向 a
*int_point=5; //给int_point指向的变量a 赋值5 等同于a=5;
示例二:
char i,table[6],*char_point;
char_point=table;
for(i=0;i<6;i++)
{
char_point=i;
char_point++;
}
注:
指针可以进行运算,它可以与整数进行加减运算(移动指针)。但要注意,移动指针后,其地址的增减量是随指针类型而异的,如,浮点指针进行自增后,其内部将在原有的基础上加4,而字符指针当进生自增的时候,其内容将加1。原因是浮点数,占4个内存单元,而字符占一个字节。
宏晶科技最新一代STC12C5A360S2系列,每一个单片机出厂时都有全球唯一身份证号码(ID号),用户可以在单片机上电后读取内部RAM单元F1H~F7H的数值,来获取此单片机的唯一身份证号码。使用MOV @Ri 指令来读取。下面介绍C51 获取方法:
char id[7]={0};
char i;
char idata *point;
for(i=0;i<7;i++)
{
id[i]=*point;
point++;
}
(此处只是对指针做一个小的介绍,达到访问内部任何空间的方式,后述有对指针使用的详细介绍)
2对SFR,RAM ,ROM的直接存取
C51提供了一组可以直接对其操作的扩展函数
若源程序中,用#include包含头文件,io51.h 后,就可以在扩展函数中使用特殊功能寄存器的地址名,以增强程序的可读性:
注 此方法对SFR,RAM,ROM的直接存取不建议使用.因为,淡io51.h这个头文件在KEIL中无法打开,可用指针,或是采用absacc.h头文件,
‘叁’ keil显示文件被外部编译器改变是怎么回事
那时因为你的文件在keil项目保存后,通过其他方式(如记事本、UE、sourcesight等其他编辑器打开)编辑后保存了后,然后在keil再次打开这个工程中的文件时,就会有这样的提示,你可以选择载入先前的文件(即就是你keil工程最好保存是的文件),也可以选择载入现有文件(指你在通过其他编辑器修改保存后的文件)
我对keil 比较熟悉,呵呵
‘肆’ keil如何快速找到代码
高级查找
步骤一:首先工程编译选项中要选择如图一:【Browse Infomation】选项,即浏览信息。
全编译工程至没有错误,这一点很重要,如果有严重的错误,则可能没有编译完,即一般的查找可能不会查到整个工程文件的内容,选成搜索的信息不全或是没有。
图一:设置编译选项
步骤二:如图二,双击需要查找的内容选中后,点击右键,选择查找项:
这里为简单的查找方式,方便与快速。可以查找到相关的定义及调用情况,在哪个文件里。这里必须是全编译通过的工程源码。
图二:选中并右键查找。
步骤三:如图三,部分汇编函数的变量或是函数名无法找到。有时查不到,怎么办呢?继续以下的方法。
图三:简单的查找没有找到相关项。
步骤四:如图四,选中后,通过Edit->Find in files..高级查找功能。这里要点就是设置搜索筛选的条件及文件范围,如是否精确查找或是只要部分包含等选项。
图四:打开高级查找功能:工程文件内容搜索。
步骤五:设置文件搜索的选项,尤其是工程文件夹,默认有可能不是整个工程文件夹。这里点击浏览选择整个工程文件。
图五:设置搜索选项。
步骤六:保证搜索文件范围为整个工程文件主目录。选择后,即可进行搜索了查找了。
图六:选择文件主目录。
步骤七:点击查找后,查看搜索到的信息。查看搜索到的结果,有可能很多,可以重新查找并修改查找选项等。
图七:文件搜索到的信息。
步骤八:双击并定位查看指定的搜索信息。双击即可定位并查看查找的结果。
图八:定位并查看指定的搜索信息。
有时需要对工程源码进行从头到尾的学习与消化,因此,查找功能还是比较有用的。从而让变量定义或是函数定义等无处藏身。虽然步骤很多,其实很简单。
最重要的,学习在于积累,有些技术的东西,就要多动手,然后再举一返三,熟能生巧。
张世争
微信公众号
嵌入式开发技术经验分享
打开CSDN,阅读体验更佳
keil c51 关键字_行知zzz的博客_c51扩展关键字
keil c51 关键字 一:KeilCx51扩展的关键字: •at•alien •bdata •bit •code •compac •data •far •idata •interrupt •large •pdata •priority•reentrant...
继续访问
KeilC51基本关键字_dylan_zhouhailiang的博客_c51关键字
KeilC51基本关键字 一、由ANSI标准定义的共32个: auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof ...
继续访问
keil编辑环境下_“搜索”功能窗口中_Bookmark All命令的便捷之处
在keil编辑环境下,有时候调用一个函数,这个函数有执行的前提条件,比如要执行函数体内容得满足:if (cmdArrived) 条件; 可是变量:cmdArrived在哪里定义的? 在哪个函数里变量:cmdArrived满足条件,要怎么找比较快呢。 ctrl + F 打开搜索框,输入“cmdArrived”,再点击“Bookmark All”命令,所有的“cmdArrived”调用行全部使用了书签,这样就比较好着了; keil编辑环境工具栏搜索框输入cmdArrived,点击右边搜索命令,再点击“Book
继续访问
Keil 查找功能的使用
keil中如何查找和替换以及一个工程里所有文件所包含查找和替换的内容: 1、点击 edit-find或者快捷键 ctrl+f; 2、在look in中 选择current document就是查找或替换本文件的内容, 选择current project就是查找或替换整个工程的包含的内容 ...
继续访问
MDK keiluvision Volatile关键字的用法_点点墨的博客
MDK keiluvision Volatile关键字的用法 在定义变量时,变量前面加volatile修饰,作用是防止相关变量被优化。 例如对外部寄存器的读写。对有些外部设备的寄存器来说,读写操作可能都会引发一定硬件操作,但是如果不加volatile,编译器会把这些...
继续访问
Keil中的code关键字_weixin_30823001的博客
Keil中的code关键字 一般说来,我们在C语言中定义的每一个变量初始化后都会占用一定的内存(RAM)空间。但是在keil中提供了一个特殊的关键字“code”,这个关键字在标准C中是没有的。其语法举例如下:...
继续访问
keil C51 中的库函数
非常有用的keil c51 库函数文档,受益匪浅,
Keil C51 V9.00/uVision 4基础
<br /> <br />Keil C51 V9.00 即09年发布的最新版本uVision 4,版本外观改变比较大<br />可以使用以前的注册文件<br />如果全新安装,在VISTA或者WIN 7系统下,请使用管理员方式运行,然后注册即可无限制运行<br />注册方法:<br /> 1. 安装Keil C51 V9.00版本,即uV4<br /> 2. 打开uVision4,点击File---License Management...,打开License Management窗口,复制右上
继续访问
解决Keil 搜索关键字时不能跳转到所在位置的问题
问题:KEIL搜索结果不能跳转的问题分析过程:最近遇到一个问题:在keil5.1中ctrl+shift+s全局搜索,双击搜索结果后无法跳转。重装软件,换版本,修复电脑我都试了,都没用。最后发现,原先的程序可以跳转,而后来修改的不行。相同的工程在相同的目录下为什么一个可以一个不行呢?发现唯一的区别就是两个工程文件夹名称不同,由于修改过的版本我在工程文件名附加了 “(0922)”,我把括号去掉后就可以...
继续访问
keil5寻找自定义函数的位置
keil中想快速的找到自定义函数的位置,如下所示: 想找到CAN定义的函数位置: 第一步:先对程序进行build(第一步非常重要,如果不build,就不能用后面的快捷键与go to!!!) 第二步:可以光标放到函数的位置右击,然后点击go to definition…或者按F12 ...
继续访问
KEIL5 全局搜索关键字功能用不了的解决办法(CTRL+F)
CTRL+F跳出搜索界面 点击Find in Files 项目卡,选择Current Project即可。
继续访问
STM32F4工程--KEIL--搜索关键字
STM32F4工程--KEIL--搜索关键字 在.C文件或.H文件中搜索一个关键字 方法: ctrl+F 输入关键字即可查询 (问题解决,如果对大佬您有帮助的话,给小丁个赞呗,谢谢大佬)
继续访问
最新发布 如何通过KEIL查看所定义函数入口在内存的地址
如何通过KEIL查看所定义函数入口在内存的地址
继续访问
Keil软件开启“查找变量定义”功能方法
在使用Keil软件编写程序时,有可能将程序的变量定义和使用放在了不同的位置, 有时候想要查看变量的定义,可以使用Keil软件的查找功能。 1、使用Find功能一个个查找变量,在Keil界面输入 Ctrl+F,弹出查找界面。 将要查找的内容输入[Find what]查找框,[Look in]框选择"Current Document",然后点击"Find Next"就可以在当前文件一...
继续访问
Keil使用技巧及常见问题
文章目录Keil的使用快捷键Keil中使用Ctrl+Shift+F:在多个文件中搜索变量/函数(Find in files) Keil的使用快捷键 Keil中使用Ctrl+Shift+F:在多个文件中搜索变量/函数(Find in files) 搜索条件 说明 Find what 输入要搜索的关键字 指定要搜索的文件类型 指定要搜索的文件夹/工程 搜索属性...
继续访问
keil的主要功能和作用_keil进阶教程
前言keil只懂得创建软件工程是远远不够的,如果要想顺心使用,应该要懂得部分配置,这样使用心情顺畅,码代码也会越发高效。设置字号字体点击编辑菜单,会出现很多子目录,找到配置,点击进入设置页面。看到上方的子栏目,去选择colors,进入新界面,单片机用C语言编写·,那就点击编辑c文件,右边会出现字号,字体,字色设置,按照个人需求自行设置。改正错误有时候各种因素会出现编程错误,但自行又找不到错误在何处...
继续访问
KEIL5全局搜索,在find in files框内双击搜索内容,不能跳到相应位置
文件名包含了()括号,去掉就可以了。
继续访问
热门推荐 keil编程关键字没有彩色,找不到Keyword和 C++files解决办法
打开颜色设置,如果没有C/C++ Editor files 你就无法修改你的代码界面关键字颜色。 这种情况,很有可能是你的Keil安装目录下含有中文路径(一般国外专业软件我都放在D盘第一目录下的新建英文文件夹(Softwares)中,养成文件夹存放的好习惯,日后无论是安装还是找路径都会方便许多。),将你的Keil安装文件整个拖到英文目录下,或者修改目录名为英文。 接下来重启软件,就可以设置关键字了。 注意:修改前关闭keil,如果文件名无法修改,说明当前有文件里的东西正在运行。需关闭”修改目录“所在文件里的
继续访问
Keil代码整体偏移和查找功能
选中要偏移的代码,然后按TAB键,所有被选中的代码就会向后偏移TAB,TAB等于多少个空格,可以在“Edit”-“Editor”-“C/C++ Files”下面设置。 如果要返回,则选中目标代码,按Shift+TAB就行了。 Keil的查找功能
继续访问
Keil如何查看函数或变量调用---非Ctrl F
今天公司新人问我,Keil这个编译器怎么查看一个函数都在哪里被调用?我脱口而出 辣鸡软件只能用Ctrl F慢慢找。。要么你就先用SourceInsight编辑代码,改好了再去编译吧。 好好的编译器怎么会没有这个最基本的功能呀?? 想着这个问题,于是就有了今天的意外之喜。 操作方法如下: 在View中调出SourceBrowser这个窗口,将需要查找定义及调用位置的 函数、变量、宏等复制到Symbol处,回车 你就可以看到Definitions&References了,双击可以跳转到对应的代码位置。这
继续访问
keil查找函数引用的方法
1.快捷键ctrl+f 2在Find in Files中填要找的,Find all. 3.ojbk
继续访问
如何在KEIL里面搜索一个函数名或者字符串
使用Ctrl + F 会出现如下弹窗,这个就是一个搜索窗口。 这个弹窗的搜索内容会和你之前选中的字符串一样,同时可以选择在一个文件下找,也可以选择查找那个文件含有这个字符串 查找含有某一个字符串的文件 ...
继续访问
实验一 单片机 绘制原理图
实验一 2.2绘制原理图 1.首先在开始菜单栏里面输入“ISIS”打开软件; 2.1)单击元器件列表窗口上边的按钮P,弹出图2.1所示元器件选择窗口; 图2.1 2)在该窗口左上方的关键字文本框内输入8051,在窗口右上方的栏中将显示出80C51图形符号,同时显示该器件的虚拟仿真模型VSM DLL model(MCS8051.DLL)如图2.2; 图2.2 3) 用鼠标从器件选择窗口中选中需要的器件,单机确定按钮后,选择的器件将出现在预览窗口中如图2.3; 图2.3 4)将鼠标指向编辑窗口并单
继续访问
keil查找关键字
Keil
‘伍’ 如何让KEIL和PROTEUS联调连接
一、工具/原料
windowsXP
PROTEUS
生成的HEX文件
二、方法/步骤
1、PROTEUS安装好后,默认不会在桌面上产生快捷方式。先打开开始菜单,依次点击“程序、Proteus 7 Professional、ISIS 7 Professional”打开PROTEUS
三、注意事项
HEX文件生成需要用编译器,比如常用的KEIL
‘陆’ keil c 编译器的问题
进入编辑界面后,点EDIT--CONFIGUATION,出现配置对话框,再选COLORS&FONTS,看来你是用C语言的,在WINDOWS选框中就点第二项(EIDTOR C FILES),在元素ELENENTS选框中点KEYWORD,最右边有一个COLORS选项,点击下面FOREGROUND下面的颜色,自己选择喜欢的颜色,OK。再用左键点一下编辑界面,以前关键字是黑色的,现在就会变成你设置的颜色了。
‘柒’ keil c51编写程序的问题,
看到你的提问没有人回答,我看不过去这个问题以前都有人提问过了,这个问题不是编译器设置问题,可能是你系统软件冲突引起的,你仔细分析一下你电脑, keil编译器是不是一开始装上去,就是这个问题,编译代码后底部带有下划线,如果是可能是编译器问题,如果不是自从电脑装了某个软件引起的,建议把某软件卸载掉看看,是不是还是这个问题,如果编译器问题,我发我做51开发用地keil4编译器,希望我的回答对你有帮助!
‘捌’ proteus仿真过程画原理图,载入程序,然后仿真那程序是HEX文件还是keil文件怎样设置供电电压谢谢
先画原理图,再载入HEX文件,再点界面左下方的仿真按钮就可以仿真了。
设置供电电源,可以选左边的工具栏的Terminals Mode选项,选POWER,仿真电源,再双击电源,就可以设置电压值了。