版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、宏定义:1、不带参数:#define标识符常量表达式/*#define是宏定义命令,宏名(标识符)好习惯用大写*/#defineNIL0 x802、带参数:/*相当于小函数*/#define宏名(参数表)字符串/*不仅要时行字任串替换还要进行参数的替换,在宏定义时,宏名与带参数的括弧之间不应该加空格,否则将空格以后的字符串都作为替代字符串的一部分,这可是很容易出错的*/如:#defineSQ(a,b)a*b使用:x=12;y=10;area=SQ(x,y);/*则area=12*10=120*/二文件包含:#include文件名或#include文件名/*在C中用双引用形式更保险,在C51中常
2、用物是尖括弧形式*/三条件编译:/*一般源程序中的所有程序行都参加编译,但有时希望对其中一部分内容只在满足一定条件下才进行编译,也就是对一部分内容指定编译的条件。*/#if、#elif、#else、#endif、#ifdef、#ifndef/*选择不同的编译范围,产生不同的代码,提供通用性。*/*如对8051在6MHZ与12MHZ下有*/#ifdefcpu=8051#defineFREQ6/*程序段*/#else#defineFREQ12/*程序段*/#endif/*这样下面的原程序不用做任何修改便可以使用于两种时钟频率的单片机系统*/四其他:1、#error:捕捉不可预料的编译条件#if(m
3、yv!=0&myv!=1)/*假定其值必为0或1*/#errormyvmustbe1or0/*出错时显示*/#endif2、#pragma:用于在程序中向编译器传送各种编译控制命令#pragma编译命令序列/*例:想按如下命令编译ex.cc51ex.cdebugcodlarge可用:*/#pragmaDBCDLA#pragmadisable/*禁止中断*/单片机C语言之数据类型:charintlong1:unsinged0255065535042949672952:signed-128127-3276832767-21474836482147483647指针:*3字节位标量:sbit特殊功能寄
4、存器:sfr16位特殊功能寄存器:sfrl6占2个内存单元,065535可寻址位:sbit利用他可访问51单片机的内部RAM中的可寻址位或特殊功能寄存器中的可寻址位sfrP0=0 x80;sbitP0_1=P0A1;/*将P0口的口地址定义为80H,将P0.1位定义为P1_1*/二数据存贮类型表1.C51数据存贮类型I数据存贮类型I与存贮空间的对应关系1dataI直接寻址片内数据存贮区,访速度快bdataI可位寻址片内数据存贮区,允许位与字节混合访问idataI间接寻址片内数据存贮区,可访问片内全部RAM地址空间pdataI分页寻址片外数据存贮区(256字节)由MOVXR0访问xdataI片外
5、数据存贮区(64K),由MOVXDPTR访问code|代码存贮区(64K),由MOVCDPTR访问I变量的存贮类型定义:chardatavar/*字符变量var被定义为data存贮类型,C51编译器将把该变量定位在51单片机片内数据区存贮区中*/bitbdataflag/*位变量flag被定义为bdata存贮类型,C51编译器将把该变量定位在51单片机片内数据区存贮区(RAM)中的位寻址区:20H-2FH*/三typedef:重新定义数据类型typedef已有数据类型新的数据类型typedefintword;/*将word定义为整型*/wordi,j;/*将i,j定义为整型*/四位运算符:II
6、III|&|丨|人|11111按位取反|按位与|按位或|按位异或|左移|右移对移位:女如,a2,即为将二进制的a左移两位,若a=0 x8f,即10001111,a=avv2,将导致a=0 x3c(00111100),右边补零。五条件运算符:逻辑表达式?表达式1:表达式2六指针与地址运算符:*取内容&取地址七强制类型转换:(类型)=表达式(char*)0 xb000八sizeof取数据类型、变量以及表达式的字节数的运算符;九continue:中断语句:结束本次循环。1=1函数:一中断服务函数与寄存器组定义:函数类型函数名(形式参数表)interruptnusingnn为中断号,031:1中断编号
7、11中断向量11入口地址0111外中断0110003H11111定时器011000BH21111外中断1110013H31111定时器111001BH41111串行口110023H后面的n指的是四个工作寄存器组的一个:03对函数目标代码影响如下:在函数入口处将当前工作寄存器组保护到堆栈中;指定的工作寄存器内容不会改变,函数返回前将被保护的工作寄存器组从堆栈中恢复!例(定时1ms):#includesbitP1_0=P1A0;voidtimer0(void)interrupt1using1P1_0=!P1_0;TH0=-(1000/256);TL0=-(1000%256);main()SP=0
8、x60;P1_0=0;TMOD=0X01;TH0=-(1000/256);TL0=-(1000%256);EA=1;ET0=1;TR0=1;dowhile(1);/*注意:1、如果中断函数中用到浮点运算,必须保存浮点寄存器的状态。(在math.h中保存浮点寄存器函数为pfsave,恢复浮点寄存器的状态函数为fprestore)2、如果在中断函数中调用了其他函数,则被调函数所使用的工作寄存器组与中断函数的一致!*/单片机C语言之四一、局部变量与全局变量(外部变量):1、全局变量若不在开头定义则加extern2、全局变量会使代码长,占用内存多二、存储方式:自动变量(auto):缺省,函数调用存在,
9、退出消失。内部变量静态变量(static):staticinta=5;始终存在,退出不消失,但不能访问。寄存器变量(register):速度最快。通常只给编译器一个建议,由编译器根据实际情况确定。(见下)变量全局变量(global):外部变量静态变量(static):寄存器变量例#includeint_power(m,e)intm;registerinte;registerinttemp;temp=1;for(;e;e-)temp*=m;return(temp);main()三、函数的参数和局部变量的存储器模式:三种存储器模式:small,compact,large.一个函数的存储器模式确定了
10、函数的参数和局部变量在内存中的地址空间smal1:内部ramcompact,large:外部RAM函数类型函数名(形式参数表)存储器模式例:#pragmalarge/*默认存储器模式为large*/externintcalc(charI,intb)small;/*指定small模式*/externintfunc(intI,floatf)large;/*指定large模式*/intlarge_te(intI,intk)/*未指定,按默认的large模式处理*/return(mtest(I,k)+2);利用存储器混合模式编程,充分利用有限的存储空间,还可加快程序的执行速度单片机C语言之数组1初始化
11、数组:unsignedchara5=0 x11,0 x22,0 x33,0 x44,0 x55或unsignedchara=0 x11,0 x22,0 x33,0 x44,0 x55,0 x663数组作为函数的参数:不但可以由变量作为函数的参数外,还可以用数组名作为函数的参数。一个数组数组名表示该数组的首地址。用一个数组名作为函数的参数时,在执行函数调用的过程中参数传递方式采用的是地址传递。将实际参数数组首地址传递给被调函数中的形式参数数组,这样一来两个数组就占有同一段内存单元。见下图:a0a1a2a3a4a5a6a7a8a9起始地址1000b0b1b2b3b4b5b6b7b8b9用数组名作为
12、函数的参数,应该在主调函数和被调函数中分别进行数组定义而不能只在一方定义数组。而且在两个函数中定义的数组类型必须一致,如果类型不一致将导致编译出错。实参数组和型参数组的长度可以一致可以不一致,编译器对形参数组的长度不做检查,直只是将实参数组的首地址传递给行参数组。如果希望行参数组能得到实参数组的全部元素,则应使两个数组的长度一致。定义型参数组时可以不指定长度,只在数组名后面跟一个方括号。这时为了在被调函数中处理数组元素的需要,应另外设置一个参数来传递数组元素的个数。例:用数组作为函数的参数,计算两个不同长度的数组中所有元素的平均值#includefloataverage(array,n)int
13、n;floatarray;intI;floataver,sum=array0;for(I=1;IN;I+)sum=sum+arrayI;aver=sum/n;return(aver);main()floatpot_12=99.9,88.8;floatpot_23=11,22,33.3;average(pot_1,2);average(pot_1,3);1=1单片机软件法去干扰:工程上我们在采集数据时一般要求精度达到5%,大于这个值将认为无效。我在实际应用中采用8535对32路数据进行采集(8535带10位AD,带看门狗),发现数据跳动有时达7%,这是由于各种干扰造成的。主要来自于随机干扰,下面
14、就各种干扰的方法给出简单的去除方法:1、白噪声:最重要的统计特性为平均值为0,可采取每路数据采集几次求平均的方法;2、随机干扰:该点明显高于或低于附近正常采样值,故采取中值滤波法,即对被测信号连续采样M次,进行大小排序,取大小居中的1/3个采样值进行算术平均;3、电源干扰:特点是有固定周期,故可采用定时采样求平均的方法。由于各种排序与求平均算法用C易于实现,故C常常用于采集系统中软件去干扰。至于排序算法可参考上一篇文章,有一个经典的程序。在实际中我们采用每路猜9个值,排序,取中间3个,求平均。然后。,每路数据几乎不动!单片机C语言之七指针:可对内存地址直接操作基于存贮器的指以贮器类为参量,它在
15、编译时才被确定。因此为指针选择存贮器的方法可以省掉,以这些指针的长度可为1个字节(idata*,data*,pdata*)或2个这节(code*,xdata*)。charxdata*address;ADC0809具有8个模拟量输入通道,采用中断方式,在中断函数中读取8个通道的A/D转换值,分别存储在外部RAM的1000H1007H单元。ADC0809端口地址为OOFOH。程序定义了两个指针变量*ADC和*ADCdata,分别指向ADC0809端口地址(OOFOH)和外部RAM单元地址(1000H1007H)由*ADC=I送入通道数,启动ADC0809进行A/D转换,转换结束时产生INT1中断。
16、在中断服务函数int1()中通过temp=*ADC和*ADCdata=temp;读取A/D转换结果并存到外部RAM中。#includeunsignedintxdata*ADC;/*定义ADC0809端口指针*/unsignedintxdata*ADCdata;/*定义ADC0809数据缓冲器指针*/unsignedcharI;voidmain()ADC=0 x00f0;/*定义端口地址和数据缓冲器地址*/ADCdata=0 x1000;I=8;/*ADC0809有8个模拟输入通道*/EA=1;EX1=1;IT1=1;/*开中断*/*ADC=I;/*启动ADC0809*/WHILE(I);/*等
17、待8个通道A/D转换完*/voidint1()interrupt2unsignedchartmp;temp=*ADC;/*读取A/D转换结果*/*ADCdata=temp;/*结果值存到数据缓冲区*/ADCdata+;/*数据缓冲区地址加1*/i;*ADC=I;/*启动下一个模拟输入通道A/D转换*/除了用指针变量来实现对内存地址的直接操作外,c51编译器还提供一组宏,该宏定义文件为:“absacc.h”,利用它可十分方便地实现对任何内存空间的直接操作,改写上面的程序:#include#include/*包含绝对地址操作预定义头文件*/#defineADCOxOOfO;/*定义ADC0809端
18、口地址*/#defineADCdata0X1000/*定义数据缓冲器地址*/unsignedcharI;voidmain()I=8;/*ADC0809有8个模拟输入通道*/EA=1;ex1=1;it1=1;/*开中断*/XBYTEADC=I;/*启动0809*/While(i);/*等待8个通道转换完毕*/voidint1()interrupt2unsignedchartmp;tmp=XBYTEADC;/*读取A/D转换结果*/i-;XBYTEADCdata+I=tmp;/*结果值存储到数据缓冲器*/XBYTEADC=I;/*启动下一个模拟输入通道A/D转换*/两指针相减计算字符串的长度#includemain()char*s=”abcdef”;intstrlen(char*s);printf(“nlengthof%s=%d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 陶瓷厂给水管道施工合同
- 印刷厂纸张物料员聘用合同
- 2024年版高级酒店宴会厅租赁合同范本版B版
- 2024年版城市基础设施建设项目承包合同
- 建筑节能工程成本管理
- 2024年标准机器人服务合同模板版B版
- 侵权责任律师聘用合同
- 珠宝行业税务登记流程
- 2024年新型蔬菜种植项目承包经营协议3篇
- 交通运输行业职工聘用合同
- 初聘专业技术职务呈报表(中华人民共和国人事部制)
- 计算机图形学智慧树知到课后章节答案2023年下北京理工大学
- GMP认证药厂固体车间及中药材提取车间平面图
- 低血糖的识别和处置
- 博后年度考核个人总结8篇
- 2023年中国生殖健康行业研究报告
- XX市XX医院无痛医院建设方案
- 新能源材料与器件PPT完整全套教学课件
- 张艺谋电影《活着》影评分析与课件展示
- 考后心态调整主题班会
- 东北育才中学2024年高二上数学期末经典试题含解析
评论
0/150
提交评论