
c语言实验报告心得
c语言实验心得:1、只有频繁用到或对运算速度要求很高的变量才放到data区内,如for循环中的计数值。
2、其他不频繁调用到和对运算速度要求不高的变量都放到xdata区。
3、常量放到code区,如字库、修正系数。
4、逻辑标志变量可以定义到bdata中。
在51系列芯片中有16个字节位寻址区bdata,其中可以定义8*16=128个逻辑变量。
这样可以大大降低内存占用空间。
定义方法是: bdata bit LedState;但位类型不能用在数组和结构体中。
5、data区内最好放局部变量。
因为局部变量的空间是可以覆盖的(某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖),可以提高内存利用率。
当然静态局部变量除外,其内存使用方式与全局变量相同;6、确保程序中没有未调用的函数。
在Keil C里遇到未调用函数,编译器就将其认为可能是中断函数。
函数里用的局部变量的空间是不释放,也就是同全局变量一样处理。
这一点Keil做得很愚蠢,但也没办法。
7、如果想节省data空间就必须用large模式。
将未定义内存位置的变量全放到xdata区。
当然最好对所有变量都要指定内存类型。
8、使用指针时,要指定指针指向的内存类型。
在C51中未定义指向内存类型的通用指针占用3个字节;而指定指向data区的指针只占1个字节;指定指向xdata区的指针占2个字节。
如指针p是指向data区,则应定义为: char data *p;。
还可指定指针本身的存放内存类型,如:char data * xdata p;。
其含义是指针p指向data区变量,而其本身存放在xdata区。
以前没搞过C51,大学时代跟单片机老师的时候也是捣鼓下汇编,现在重新搞单片机,因为手头资料不多,找到一些C51的程序,发现里面有这些关键字,不甚明了,没办法只好找了下,发现如下描述:从数据存储类型来说,8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据51系列特点而设定的pdata类型,使用不同的存储器,将使程序执行效率不同,在编写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率(此问题将在后面专门讲述)。
与ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各种不同的模式对应不同的实际硬件系统,也将有不同的编译结果。
在51系列中data,idata,xdata,pdata的区别data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。
idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。
idata是用类似C中的指针方式访问的。
汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idata做指针式的访问效果很好) xdata:外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。
pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写。
这个比较特殊,而且C51好象有对此BUG,建议少用。
但也有他的优点,具体用法属于中级问题,这里不提。
三、有关单片机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#includevoid main(){bit flag;flag=0;switch(flag){case '0':{printf(0\\\ );break;}case '1':{printf(1\\\ );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 77Hsetb (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 20HAA: 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 asmmov a,r7xrl ar6,a#pragma endasmif(P)return(1);else return(0);}
C语言 文件初学
我来回答吧:首先是两个输入文件:一个文本文件:scoret.txt一个二进制文件:scoreb.txt文本文件scoret.txt我们可以直接编辑(按要求编辑五个学生的姓名和成绩),而二进制文件不易编辑。
我们先写一个代码,实再将scoret.txt文件转成二进制文件scoreb.txt#include
这时scoreb.txt的学生信息与scoret.txt是一样的。
接着就要修改一下scoret.txt文件的内容,重新编辑5个学生的信息给scoreb.txt这样使得scoret.txt与scoreb.txt分别各有五个学生的信息。
当然你如果有原始文件的话,上面都是浮云。
下面是你这个问题的重点:#include 当然二进制文件你如果用记事本打开的话,一般是乱码。 你可以弄一个UltraEdit之类的文本编辑器,查看其二进制代码。 你不妨用链表操作 #include 软件简介:1 C语言概述 21.1 C语言的发展过程 21.2 当代最优秀的程序设计语言 21.3 C语言版本 21.4 C语言的特点 31.5 面向对象的程序设计语言 31.6 C和C++ 31.7 简单的C程序介绍 41.8 输入和输出函数 51.9 C源程序的结构特点 61.10 书写程序时应遵循的规则 61.11 C语言的字符集 61.12 C语言词汇 71.13 Turbo C 2.0集成开发环境的使用 81.13.1 Turbo C 2.0简介和启动 81.13.2 Turbo C 2.0集成开发环境 81.13.3 File菜单 91.13.4 Edit菜单 101.13.5 Run菜单 111.13.6 Compile菜单 121.13.7 Project菜单 131.13.8 Options菜单 141.13.9 Debug菜单 181.13.10 Break\\\/watch菜单 191.13.11 Turbo C 2.0的配置文件 202 程序的灵魂—算法 12.1 算法的概念 12.2 简单算法举例 12.3 算法的特性 42.4 怎样表示一个算法 42.4.1 用自然语言表示算法 42.4.2 用流程图表示算法 42.4.3 三种基本结构和改进的流程图 82.4.4 用N-S流程图表示算法 92.4.5 用伪代码表示算法 102.4.6 用计算机语言表示算法 112.5 结构化程序设计方法 112 3 数据类型、运算符与表达式 13.1 C语言的数据类型 13.2 常量与变量 33.2.1 常量和符号常量 33.2.2 变量 33.3 整型数据 43.3.1 整型常量的表示方法 43.3.2 整型变量 53.4 实型数据 73.4.1 实型常量的表示方法 73.4.2 实型变量 83.4.3 实型常数的类型 93.5 字符型数据 93.5.1 字符常量 93.5.2 转义字符 93.5.3 字符变量 103.5.4 字符数据在内存中的存储形式及使用方法 103.5.5 字符串常量 113.5.6 符号常量 123.6 变量赋初值 123.7 各类数值型数据之间的混合运算 133.8 算术运算符和算术表达式 143.8.1 C运算符简介 143.8.2 算术运算符和算术表达式 153.9 赋值运算符和赋值表达式 173.10 逗号运算符和逗号表达式 183.11 小结 193.11.1 C的数据类型 193.11.2 基本类型的分类及特点 193.11.3 常量后缀 193.11.4 常量类型 193.11.5 数据类型转换 193.11.6 运算符优先级和结合性 203.11.7 表达式 204 最简单的C程序设计—顺序程序设计 14.1 C语句概述 14.2 赋值语句 34.3 数据输入输出的概念及在C语言中的实现 44.4 字符数据的输入输出 44.4.1 putchar 函数(字符输出函数) 44.4.2 getchar函数(键盘输入函数) 54.5 格式输入与输出 54.5.1 printf函数(格式输出函数) 54.5.2 scanf函数(格式输入函数) 84.6 顺序结构程序设计举例 124 5 分支结构程序 15.1 关系运算符和表达式 15.1.1 关系运算符及其优先次序 15.1.2 关系表达式 15.2 逻辑运算符和表达式 25.2.1 逻辑运算符极其优先次序 25.2.2 逻辑运算的值 35.2.3 逻辑表达式 35.3 if语句 45.3.1 if语句的三种形式 45.3.2 if语句的嵌套 75.3.3 条件运算符和条件表达式 95.4 tch语句 105.5 程序举例 115 6 循环控制 16.1 概述 16.2 goto语句以及用goto语句构成循环 16.3 while语句 26.4 do-while语句 46.5 for语句 66.6 循环的嵌套 96.7 几种循环的比较 96.8 break和continue语句 96.8.1 break语句 96.8.2 continue 语句 106.9 程序举例 116 7 数组 17.1 一维数组的定义和引用 17.1.1 一维数组的定义方式 17.1.2 一维数组元素的引用 27.1.3 一维数组的初始化 47.1.4 一维数组程序举例 47.2 二维数组的定义和引用 67.2.1 二维数组的定义 67.2.2 二维数组元素的引用 67.2.3 二维数组的初始化 77.2.4 二维数组程序举例 97.3 字符数组 97.3.1 字符数组的定义 97.3.2 字符数组的初始化 97.3.3 字符数组的引用 107.3.4 字符串和字符串结束标志 107.3.5 字符数组的输入输出 107.3.6 字符串处理函数 127.4 程序举例 147.5 本章小结 178 函 数 18.1 概述 18.2 函数定义的一般形式 38.3 函数的参数和函数的值 48.3.1 形式参数和实际参数 48.3.2 函数的返回值 58.4 函数的调用 68.4.1 函数调用的一般形式 68.4.2 函数调用的方式 68.4.3 被调用函数的声明和函数原型 78.5 函数的嵌套调用 88.6 函数的递归调用 108.7 数组作为函数参数 128.8 局部变量和全局变量 178.8.1 局部变量 178.8.2 全局变量 198.9 变量的存储类别 208.9.1 动态存储方式与静态动态存储方式 208.9.2 auto变量 218.9.3 用static声明局部变量 218.9.4 register变量 228.9.5 用extern声明外部变量 239 预处理命令 19.1 概述 19.2 宏定义 19.2.1 无参宏定义 19.2.2 带参宏定义 49.3 文件包含 89.4 条件编译 99.5 本章小结 1110 指针 110.1 地址指针的基本概念 110.2 变量的指针和指向变量的指针变量 210.2.1 定义一个指针变量 310.2.2 指针变量的引用 310.2.3 指针变量作为函数参数 710.2.4 指针变量几个问题的进一步说明 1010.3 数组指针和指向数组的指针变量 1310.3.1 指向数组元素的指针 1310.3.2 通过指针引用数组元素 1410.3.3 数组名作函数参数 1610.3.4 指向多维数组的指针和指针变量 2210.4 字符串的指针指向字符串的针指变量 2510.4.1 字符串的表示形式 2510.4.2 使用字符串指针变量与字符数组的区别 2810.5 函数指针变量 2910.6 指针型函数 3010.7 指针数组和指向指针的指针 3110.7.1 指针数组的概念 3110.7.2 指向指针的指针 3410.7.3 main函数的参数 3610.8 有关指针的数据类型和指针运算的小结 3710.8.1 有关指针的数据类型的小结 3710.8.2 指针运算的小结 3710.8.3 void指针类型 3811 结构体与共用体 111.1 定义一个结构的一般形式 111.2 结构类型变量的说明 211.3 结构变量成员的表示方法 411.4 结构变量的赋值 411.5 结构变量的初始化 511.6 结构数组的定义 511.7 结构指针变量的说明和使用 711.7.1 指向结构变量的指针 711.7.2 指向结构数组的指针 911.7.3 结构指针变量作函数参数 1011.8 动态存储分配 1111.9 链表的概念 1211.10 枚举类型 1411.10.1 枚举类型的定义和枚举变量的说明 1411.10.2 枚举类型变量的赋值和使用 1511.11 类型定义符typedef 1612 位运算 112.1 位运算符C语言提供了六种位运算符: 112.1.1 按位与运算 112.1.2 按位或运算 212.1.3 按位异或运算 212.1.4 求反运算 312.1.5 左移运算 312.1.6 右移运算 312.2 位域(位段) 412.3 本章小结 613 文件 113.1 C文件概述 113.2 文件指针 213.3 文件的打开与关闭 213.3.1 文件的打开(fopen函数) 213.3.2 文件关闭函数(fclose函数) 413.4 文件的读写 413.4.1 字符读写函数fgetc和fputc 413.4.2 字符串读写函数fgets和fputs 813.4.3 数据块读写函数fread和fwtrite 913.4.4 格式化读写函数fscanf和fprintf 1113.5 文件的随机读写 1213.5.1 文件定位 1213.5.2 文件的随机读写 1313.6 文件检测函数 1413.6.1 文件结束检测函数feof函数 1413.6.2 读写文件出错检测函数 1413.6.3 文件出错标志和文件结束标志置0函数 1413.7 C库文件 1413.8 本章小结 15真心恳求各位帮帮忙,C语言文件输入输出
c语言怎么用文件保存和读取 结构体数组\\\/
在C语言中,文件的存取是以 什么为单位



