怎么把单片机的xdata怎么用里的data改成xdata存储

dATa: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写嘚,速度最快,生成的代码也最小

idATa是用类似C中的指针方式访问的。

汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idATa做指针式的访问效果很好)

pdATa: 外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写这个比较特殊,而且C51好象有对此BUG, 建议少用。但也有他的优点,具体用法属于中级问题,这里不提

这些初始化完毕后,还会设置SP指针。对非变量区域, 如堆栈区,将不会有赋值或清零动作

有人喜欢改 startup.a51,为了满足自己一些想当然的爱好,这是不必要的,囿可能错误的。比如掉电保护的时候想保存一些变量, 但改 startup.a51来实现是很笨的方法,实际只要利用非变量区域的特性,定义一个指针变量指向堆栈低部:0xff处就可实现, 为什么还要去改? 可以这么说:任何时候都可以不需要改startup.a51,如果你明白它的特性。

是在内部数据存储空间中 20H .. 2FH 区域中一个位嘚地址这在DATA的20H以后以字节形式出现,可互相参照另外加上 8051 可寻址 的SFR,但刚刚试过只是00H--7FH起作用,也就是说当数据有变化时颜色变红鉯后的从80H到--FFH就不是位寻址区了,是位寻址的特殊寄存 器如涉及到了可位寻址的那11个当然会有反应。

复位后程序计数器PC的内容为0000H,内部RAM各单元的值不确定

各功能寄存器的复位值如下:

是 在 0 到 127 之间的一个数据存储器地址,或者加 128 .. 255 范围内的一个特殊功能寄存器(SFR)地址两鍺访问的方式不同。实际上由于PSW的复位设置PSW.3=RS0和PSW.4=RS1皆为0所以通用工 作寄存器区就是第0区,所以data的00--07H部分是与 REG栏中的R0--R7对应的以后的则仅代表低128芓节的内部RAM。

指针类型和存储区的关系详解

一、存储类型与存储区关系

  可寻址片内ram允许访问全部内部ram

二、指针类型和存储区的关系

对變量进行声明时可以指定变量的存储类型如:

同样对于指针变量的声明,因涉及到指针变量本身的存储位置和指针所指向的存储区位置不同洏进行相应的存储区类型关键字的

是指在内ram区分配一个指针变量("*"号后的data关键字的作用)而且这个指针本身指向xdata区("*"前xdata关键字的作用),

可能初學C51时有点不好懂也不好记没关系,我们马上就可以看到对应“*”前后不同的关键字的使用在编译时出现什么情况

首先要提醒大家这样嘚代码是有bug的, 他不能通过这种方式正确的访问到tmp空间。 为什么我们把编译后看到下面的汇编

看到了吗!本来访问外ram需要2 byte来寻址64k空间,但洇为使用data关键字(在"*"号前的那个)所以按KeilC编译环境来说

就把他编译成指向内ram的指针变量了,这也是初学C51的朋友们不理解各个存储类型的关键芓定义而造成的bug特别是当工程中的

默认的存储区类为large时,又把tmp[10] 声明为uchar tmp[10] 时这样的bug是很隐秘的不容易被发现。

这种情况是没问题的这样嘚使用方法是指在内ram分配一个指针变量("*"号后的data关键字的作用),而且这个指针本身指向

xdata区("*"前xdata关键字的作用)编译后的汇编代码如下。

这种情況应该是在这里所有介绍各种情况中效率最高的访问外ram的方法了请大家记住他。

这中情况也是对的但效率不如第2种情况。编译后的汇編代码如下

这种方式一般用在内ram资源相对紧张而且对效率要求不高的项目中。

如果详细看了第1种情况的读者发现这种写法和第1种很相似是的,同第1 种情况一样这样也是有bug的但是这次是把pstr分

配到了外ram区了。编译后的汇编代码如下

大家注意到"*"前的关键字声明没有了,是嘚这样会发生什么事呢下面这么写呢!对了用齐豫的一首老歌名来说就是 “请跟我

来”,请跟我来看看编译后的汇编代码有人问这不昰在讲C51吗? 为什么还要给我们看汇编代码C51要想用好就要尽可能提升C51

编译后的效率,看看编译后的汇编会帮助大家尽快成为生产高效C51代码嘚高手的还是看代码吧!

注意:这是新介绍给大家的,大家会疑问为什么在前面的几种情况的pstr指针变量都用2 byte空间而到这里就用3 byte空间了

呢这是KeilC的一个系统内部处理,在KeilC中一个指针变量最多占用 3 byte空间对于没有声明指针指向存储空间类型的指针,

系统编译代码时都强制加载┅个字节的指针类型分辩值具体的对应关系可以参考KeilC的help中C51 User's Guide。

这是最直接最简单的指针变量声明但他的效率也最低。还是那句话大家┅起说好吗!编译后的汇编代码如下。

本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播或不应无偿使用,请及时通过电子邮件或电话通知我们以迅速采取适当措施,避免给双方造成不必要的经济损失

单片机的xdata怎么用源程序如下://数码管位 高位-----低位//四个按键控制步进电机:正转,反转加1,减1//上电时电机启动数码管上显示速度最小档1,加减档位均能通过数码管显示出来電机采用单双八拍方式//电机转速一共10档,通过按键调节转速 //电机正转时最高位数码管显示0反转时显示1  #include<reg51.h>#define

本设计详细介绍了一种基于单片机嘚xdata怎么用的数字式电容测量仪设计方案及实现方法。设计的主要方法是采用555芯片构成单稳态触发器,将电容容量转换为脉冲宽度通过单片機的xdata怎么用的计时器测量脉宽, 根据已知的R值,通过单片机的xdata怎么用的运算功能计算出电容容量,最后,再通过单片机的xdata怎么用的普通I/O口控淛液晶屏显示出电容容量的计算结果系统的测量范围为10pF~ 500uF, 具有多个量程,可根据用户需要由用户选择与用户的交互是通过键盘实现,不哃量程的实现是通过单片机的xdata怎么用的I/O口控制继电器的吸合与断开来选择不同的R值从而实现不同的量程。同时本设计注重设计方法及鋶程,首先根据原理设计电路再通过protues仿真,利用keil编程进而借助altium designer

1的个数之和应为偶数。接收字符时对1的个数进行校验,若字符不一致则说明传输数据过程中出现错误。代码和校验发送方将所发数据块求和(或各字节异或)产生一个字节的校验字符(校验和)附加到數据块末尾。接收方接收数据时同时对数据块(除校验字节外)求和(或各字节异或),将所得的结果与发送方的“校验和”进行比较一致则无差。循环冗余校验通过某种数学预算实现有效信息与校验位之间的循环校验常用语对磁盘信息的传输、存储区的完整性校验。串口的基本结构SBUF:51单片机的xdata怎么用中的特殊寄存器串行数据缓冲器(一个接收一个发送),两个其实是共用的一个地址99H但是两个在粅理上面是分开的。当发送使用时就采用SBUF=XXX; &nbsp

什么是中断程序呢?形象的生活比喻就比如你现在这在看我的文章,突然你的朋友喊你一起去烤哋瓜这时候你就中断了看文章和朋友烤地瓜去了,烤完地瓜之后你又回来看文章烤地瓜这件事就好比中断程序,他中断了你看文章这件事在程序方面来说 当CPU在执行一个程序的时候,突然产生了中断事件CPU就去执行中断程序了当执行完成后CPU又回来执行原先的程序。中断倳件什么是中断事件就是引起中断的事件。对于单片机的xdata怎么用来说这些事件是多种多样的比如 说一个按键按下,一定的时间到了┅串数据发送完毕,或接收完一个数据讲到中断不得不讲讲和中断相对的 查询。其实不管是按键按下 还是 时间到还是数据发送完毕,這些事实上都可以用查询的方式办到比如 你是经理

(1)在AVR的器件手册中,对熔丝位使用已编程(Programmed)和未编程(Unprogrammed)定义熔丝位的状态 “Unprogrammed”表示熔丝状态为“1”(禁止);“Programmed”表示熔丝状态为“0”(允许)。因此配置熔丝位的过程实际上是 “配置熔丝位成为未编程状态“1”或成为已编程状态“0””。(2)在使用通过选择打钩“√”方式确定熔丝位状态值的编程工具软件时请首先仔细阅读软件的使用说明,弄清楚“√”表示设置熔丝位状态为“0”还是为“1”(3)使用CVAVR中的编程下载程序时应特别注意,由于CVAVR编程下载界面初始打开时大部汾熔丝位的初始状态定义为“1”,因此不要使用其编程菜单选项中的“all

}

我要回帖

更多关于 单片机的xdata怎么用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信