C51编程技巧与内存优化心得分享
创始人
2024-12-26 11:26:40
0 次浏览
0 评论
c语言实验报告心得
C语言实验经验:1、只有经常使用或者计算速度要求高的变量才应该放在数据区,比如for循环中的计数值。2、其他调用不频繁、计算速度要求不高的变量放在xdata区域。
3.在代码区域设置常量,例如字体和校正因子。
4.bdata中可以定义布尔标志变量。
51系列芯片上有一个16位的寻址区域bdata,其中可以定义8*16=128个逻辑变量。
这可以显着减少内存占用。
定义方法为:bdatabitLedState,但位类型不能用在字符串和结构体中;5、局部变量最好设置在数据区。
由于局部变量空间可以被覆盖(函数的局部变量空间在函数退出时被释放,并被其他函数的局部变量覆盖),因此可以提高内存使用率。
当然,除了局部静态变量外,它们的内存占用与全局变量相同6.确保程序中没有未调用的函数。
当KeilC中遇到未调用的函数时,编译器将其视为中断函数。
函数中使用的局部变量空间不会被释放,即被视为与全局变量相同。
凯尔做了这件蠢事,但他却无能为力。
7.如果要节省数据空间,应使用large模式。
将所有未定义内存位置的变量放置在xdata区域中。
当然,最好为所有变量指定内存类型。
8、使用指针时,必须指定指针所指向的内存类型。
在C51中,一般指向内存类型的指针是未定义的,占用3个字节,数据区中指定的指针只占用1个字节;如果指针p指向数据区,则必须定义为:chardata*p;。
还可以指定指针本身的内存类型,如:chardata*xdatap;。
含义是指针p指向数据区变量,本身存储在xdata区。
我以前从来没有接触过C51,这些关键字我不太理解。
我没办法,只能去问他们。
程序存储器、片内和片外数据存储器以及片内程序存储器。
存储器还分为直接寻址类型和间接寻址类型,根据51系列的特点分别对应代码、数据、xdata、数据集和pdata类型,不同的存储器的使用会使效率提高。
编写C51程序的程序执行时,最好指定变量存储的类型,这将有助于提高程序执行的效率(这个问题将在稍后具体讨论)。
它与ANSI-C略有不同,仅分为SAMLL、COMPACT和LARGE模式。
51系列中,data、data、xdata、pdata的区别:固定是指面向0x00-0x7f的128个RAM,可以直接用acc读写。
idata:固定指从0x00-0xff的前256个RAM,其中前128个与data128完全相同,只是因为访问方式不同。
使用与C中类似的指针访问数据。
汇编中的声明为:moxACC、@Rx(琐碎补充:c中的idata对于指针访问非常有效)xdata:外部扩展RAM,一般指外部空间0x0000-0xffff,用DPTR访问。
pdata:扩展外部RAM的低256字节,当地址出现在A0-A7时读写,使用movxACC、@Rx读写。
这个比较奇特,C51好像也有这个bug,所以建议少用。
但它也有其优点。
具体使用是中间的事情,这里就不说了。
3、关于单片机ALE引脚的问题:“当单片机没有进入外壳时,ALE端有正脉冲信号输出,这个频率约为时钟振荡频率的1/6。
每当单片机的外部存储器数据访问时,两台ALE机器每个周期仅出现一次,即丢失一个ALE脉冲。
”这句话有问题吗?我想这样不行,3个ALE闪烁我一直没能弄清楚这是怎么回事,非常感谢MOVX指令需要12个机器周期才发出一个ALE4.如何将INT数据类型转换为数据类型CHAR?经过keil优化后,char1=int1/256、char2=int1%256或char1=int1>>8、char2=int1&0x00ff具有相同的效率。
5、KEILC51仿真完成后,如何生成HEX文件进行编程??右键单击项目中的Target1,选择第二个,在OUTPUT中选择CREATHEX6.typedef和#define有什么区别?typedef和#define有什么区别》》》例如typedefunsignedcharUCHA?R;#defineunsignedcharUCHAR;typedef命名了一个新的数据类型,但实际上这个新的数据类型是存在的,它只是定义了一个新的名称,它只是一个标签的定义。
但#define也可以用作#defineMAX100#defineFUN(x)100-(x)#defineLABEL等。
这些情况下,typedef就不能用了。
7、如何设置KELC51的模拟工作频率(时钟)左边右键,然后在xtal一栏输入。
不同的sbit模块如何不起作用。
9.C51我应该自己定义对Px.x的访问吗?是的。
例如,sbitP17=0x97可以定义对P1.7的访问。
SWITCH()语句中的表达式不能是可变的,对吧?您可以使用位变量:#include#includevoidmain(){bitflag;flag=0;switch(flag){case'0':{printf("0\n");break;}case'1':{printf("1\n");break;}default:break;}}位变量只有两种状态,if语句就足够了11.常量语句占用内存吗const仅用于定义“常量”,所占用的空间与您的定义相关。
它确实占用空间。
另外,#define的定义似乎并不占用空间。
12.如何在C51中使用PhilipsP89C51RD+单片机扩展RAM?尝试将auxr.1清为0,然后直接在C语言中声明一个xdata类型的变量13、在程序BUGofKeilC51中使用如下语句:constunsignedcharstrArr[]={"Mathematics"}原来strArr[的内容]是{0xCA,0xD1,0xA7},太奇怪了!任何0xfd都会丢失,所以只能手动输入内码,比如ucharstrArr[]={0xCA,0xfd,0xd1,0xa7}(Ultraedit非常合适)。
14、KeilC51中如何实现代码优化?项目菜单下Optionfortarget“Simulator”的C51你见过Codeoptimization吗?15.向c寻求建议!~符号有什么区别??!是逻辑否定,~是按位否定。
16.c51编程时,读端口时,必须先输出1吗?为什么我看到有些人喜欢而有些人不喜欢,请专家告诉我吗?感谢输出1,除非你能保证之前已经是1并且中间没有输出其他值。
17.当定时器1(T1)用于产生波特率时,P3^5还可以用作普通I/O端口吗?p3.5可以用作常规IO18.在C51中将INT转换为2CHAR?尊敬的专家:C51中如何将INT转换为CHAR,如:X=LOW(Z=HIGH(Z)答案:x=(char)z;y=(char)(z>>8);如果我想将2EH的第7位设置为1,我可以使用位运算吗?现在我不明白一些扩展操作指令,请给我一些建议:例如SETB07H的意思是20H.7设置为1,对吗?(我在一本书上看到过)那么如果我想将2EH的第7位设置为1?谢谢SETB77Hsetb(2eh-20h)*8+720h-2fh有8位运算每字节(00h-7fh其他RAM不能直接操作20.之间有什么区别char*addr=0xc000和charxdata*addr=0xc00?char*addr=0xc000space;charxdata*addr=0xc000指定指针变量只能指向最后一个定义中的值,指针变量(addr)将占用一个字节lessucharxdata*addr=0xc000指针指向外部RAM,如果:dataucharxdata*addr=0xc000指针存在于内部ram(数据)等;arxdata*addr=0xc000;pdataucharxdata*addr=0xc000;dataucharidata*addr=0xa0;......21while(p1_0)的执行时间?假设P1_0是单片机P1端口的第一个引脚,请告诉我,while(P1_0){P1_0=0;}while(!P1_0){P1_0=1;}上述代码在KEILC中执行需要多长时间?你能指定while(P1_0)的执行时间吗?通过运行模拟你就会知道,我也尝试过。
22、亲爱的虾米,我用KEILC51写了一个外部开启器程序,但是程序无法执行。
当主程序设置开门狗时,开门时间已到,我的程序在这结束时重置,使其设置开门狗运行?您可以将看门狗刷新命令添加到startup.a51,当然使用汇编,然后重新编译startup.a51并将其链接到您的程序。
新的Startup.a51将自动替换默认的系统启动模块。
23、keilC51如何将修改后的startup.a51添加到工程文件中直接添加即可,注意不要更改?STACK、?C_START、?C_STARTUP等符号?startup.a51可以直接添加到项目中,无需修改。
你可以自己修改一些汇编约束或者里面的堆栈指针。
24、关于波特率设置,在设置串口波特率时发现一个问题:晶振为11.0592MHz时,如果设置为9600BPS,TH1=0XFD,TL1=0XFD,如果设置为19200BPS,TH1和TL1有变化吗?如果没有,为什么?如果改变了,为什么?(因为我读到两者是一样的)希望大家不吝赐教。
答:当电源控制寄存器(PCON)的BIT7(SMOD)为1时,噪声率加倍。
TH1和TL1的值保持不变25、如何在C中声明这部分RAM区域被保留,不被C使用?我不知道如何在C源程序中检查这一点,但我只是将以下段落添加到汇编程序中:DSEGAT20HAA:DS10,这样C51就不会占用20H--29H或者在c51中这样定义:uchardataasm_。
buff[10]_at_0x20。
问关于浮点运算的问题,发现它对传递变量的浮点参数数量有限制以变量的形式传递的参数有限制吗?2)传递浮点参数有哪些限制?3)float*float的结果是float类型还是double类型可以直接赋值给float类型的变量吗?答:由于KEILC51的参数是通过R0-R7传递的,所以会有限制。
不过KEIL提供了编译参数,可以支持传递更多的参数。
具体内容参见KEILPDF文档。
我建议您定义多个要传递给指针或结构体的参数,并且最好通过指针或结构体传递参数。
第三个问题的答案是YES,你自己尝试一下就知道了。
27、如何使用at命令确定ram在特定地址,以便找到更灵活的地址ucharxdatadis_buff[16]_at_0x6020;//定位RAM并在从0x6020开始的16个字节中找到dis_buff[16]在keilc中,什么函数可以用来获取奇偶校验位吗?例如,对于32位数据,只需将四个字节相互异或,然后检查P。
如果担心P被改变,可以使用内联汇编。
#includeunsignedcharparity(unsignedcharx){x^=x;if(P)return(1);elsereturn(0);}unsignedcharparity2(unsignedintx){#pragmaasmmova,r7xrlar6,a#pragmaendasmif(P)return(1(0);elsereturn(1);}
c语言实验报告心得
C语言实验报告心得:1.在实验中,我学会了如何根据需要选择合适的变量存储区域。比如对于需要经常使用或者对运算速度有要求的变量,我会选择将其存储在数据区。
对于不经常使用或者速度要求不高的变量,我会选择存放在xdata区域。
2.了解到常量应该存放在代码区,这样可以减少代码大小。
同时,我还学习了如何使用逻辑标志变量以及如何在bdata中定义它们。
3.在实验过程中,我注意到局部变量应尽可能存储在数据区,这样可以提高内存使用率。
同时我还了解到,除了静态局部变量外,它们的内存使用量和全局变量是一样的。
4.我学会了如何确保程序中没有未调用的函数,以避免编译器将它们视为中断函数。
5.在实验中,我学习了如何通过使用大模式以及为变量指定内存类型来节省数据空间。
6.我注意到,使用指针时,必须指定指针指向的内存类型。
这可以防止指针占用不必要的内存空间。
7、在实验中,我学会了如何正确使用按位运算符,以及如何通过按位运算实现一些常见的逻辑运算。
8.学习了在C51中,如何通过定义SBIT变量来访问单片机的特殊寄存器。
9、在实验中,我还学会了如何使用KeilC51进行代码优化,以提高程序执行的效率。
10.通过实验,我深刻理解了typedef和#define的区别,以及在不同情况下如何使用它们。
11.学习了如何在C51中进行浮点运算,以及浮点运算的一些限制。
12.在实验中,我学会了如何在C51中声明保留的RAM区域不被C使用以及如何定位RAM区域的地址。
13.学习了如何在KeilC51中获取奇偶校验位以及如何使用内联汇编来实现此功能。
通过这次实验,我对C编程有了更深入的了解,提高了自己的编程能力。
在今后的学习和工作中,我将继续努力、探索、提高。

相关文章

C语言实现:轻松找出任意三个数中的最大值...
2024-12-27 22:37:00
C语言实现有序数组连续插入与排序技巧分享
2024-12-15 02:55:43
C语言字符排序与字符串输出技巧解析
2025-01-08 16:54:46
C语言中如何计算平方根(sqrt)?
2025-02-20 13:16:56
C语言教程:实现10个整数的奇偶和计算
2025-01-01 04:53:03
C语言多行注释详解及两种注释方式介绍
2024-12-25 18:59:10
C语言字符串比较规则与Java/Pyth...
2025-03-26 11:23:56
Excel提取字符串特定字符段:方法与步...
2024-12-25 06:41:01
C语言变量命名规范详解
2025-02-16 16:03:42
C语言基础教程:字符变量定义及ASCII...
2024-12-17 11:49:08最新文章
04
2025-04
04
2025-04
04
2025-04
04
2025-04
04
2025-04
04
2025-04
04
2025-04
04
2025-04
04
2025-04
04
2025-04
热门文章
1
JavaScript数组转字符串:两种方...
如何 用 js把 数组 转换成 字符串这里的系列窗口为您提供了两种方式。1。使用...
2
C语言实现三角形面积计算:海伦公式应用实...
如何用c语言编写已知三角形三边求面积?已知语言C可以找到三角形三角侧的面积,如下...
3
计算机专业核心:C语言在多学科中的应用与...
哪些专业学c语言对于计算机专业来说,入门级编程语言C是用来为学生的编程打下坚实的...
4
JSF架构解析与Java学习资源分享:J...
JavaServerFacesJSF体系结构JavaServerFaces(JS...
5
数据结构C语言版深度解析与C语言入门很简...
《数据结构(C语言版)》.严蔚敏吴伟民著.pdf在《数据结构(C语言版)》一书中...
6
C语言字符串常量解析:区别、用途及存储方...
什么是字符串常量字符串常量是C语言中的一种数据类型,它是由一对双引号括起来的字符...
7
C语言printf函数:格式字符串与输出...
printf函数中的格式与输出项有什么关系?在C语言中,printf函数中的格式...
8
Excel技巧:计算字符串起始位置与合并...
如何计算字符串在特定文本中的起始位置,怎么计算字符串在特定文本中的起始位置您可以...
9
Python发音全解:掌握正确的发音方法...
python怎么读我的很多学习编程的朋友可能都知道Python这个词,但是他们中...
10
字符与字符串:编程中的基础文本类型解析
字符串什么意思字符串是由数字、字母和下划线组成的字符串,表示为s=“a1a2…a...