单片机c语言学习 17页

  • 44.00 KB
  • 2022-08-23 发布

单片机c语言学习

  • 17页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档由用户上传,淘文库整理发布,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,请立即联系网站客服。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细阅读内容确认后进行付费下载。
  4. 网站客服QQ:403074932
word完美格式单片机C语言之一               预处理一》宏定义:1、不带参数:#define标识符常量表达式   /*#define是宏定义命令,宏名(标识符)好习惯用大写*/#defineNIL0x802、带参数:/*相当于小函数*/#define宏名(参数表)字符串   /*不仅要时行字任串替换还要进行参数的替换,在宏定义时,宏名与带参数的括弧之间不应该加空格,否则将空格以后的字符串都作为替代字符串的一部分,这可是很容易出错的*/   如:#defineSQ(a,b)a*b   使用:x=12;y=10;area=SQ(x,y);/*则area=12*10=120*/二》文件包含:#include<文件名>或#include"文件名"   /*在C中用双引用形式更保险,在C51中常用物是尖括弧形式*/精心整理学习帮手\nword完美格式三》条件编译:   /*一般源程序中的所有程序行都参加编译,但有时希望对其中一部分内容只在满足一定条件下才进行编译,也就是对一部分内容指定编译的条件。*/#if、#elif、#else、#endif、#ifdef、#ifndef   /*选择不同的编译范围,产生不同的代码,提供通用性。*/   /*如对8051在6MHZ与12MHZ下有*/#ifdefcpu==8051#defineFREQ6/*程序段*/#else#defineFREQ12/*程序段*/#endif   /*这样下面的原程序不用做任何修改便可以使用于两种时钟频率的单片机系统*/四》其他:1、#error:捕捉不可预料的编译条件#if(myv!=0&&myv!=1)/*假定其值必为0或1*/#errormyvmustbe1or0/*出错时显示*/#endif2、#pragma:用于在程序中向编译器传送各种编译控制命令#pragma编译命令序列   /*例:想按如下命令编译ex.cc51ex.cdebugcodlarge可用:*/#pragmaDBCD精心整理学习帮手\nword完美格式LA#pragmadisable   /*禁止中断*/单片机C语言之二一》数据类型:       char        int        long1:unsinged    0~255        0~65535    0~42949672952:signed    -128~127    -32768~32767    -2147483648~2147483647指针:*       3字节位标量:   sbit特殊功能寄存器:sfr16位特殊功能寄存器:sfr16    占2个内存单元,0~65535可寻址位:sbit利用他可访问51单片机的内部RAM中的可寻址位或特殊功能寄存器中的可寻址位sfrP0=0x80;sbitP0_1=P0^1;   /*将P0口的口地址定义为80H,将P0.1位定义为P1_1*/二》数据存贮类型                 表1.C51数据存贮类型━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━精心整理学习帮手\nword完美格式数据存贮类型┃       与存贮空间的对应关系                ━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━    data    ┃ 直接寻址片内数据存贮区,访速度快                     bdata   ┃ 可位寻址片内数据存贮区,允许位与字节混合访问    idata   ┃ 间接寻址片内数据存贮区,可访问片内全部RAM地址空间    pdata   ┃ 分页寻址片外数据存贮区(256字节)由MOVX@R0访问               xdata   ┃ 片外数据存贮区(64K),由MOVX@DPTR访问    code    ┃ 代码存贮区(64K),由MOVC@DPTR访问━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━变量的存贮类型定义:chardatavar   /*字符变量var被定义为data存贮类型,C51编译器将把该变量定位在51单片机片内数据区存贮区中*/bitbdataflag   /*位变量flag被定义为bdata存贮类型,C51编译器将把该变量定位在51单片机片内数据区存贮区(RAM)中的位寻址区:20H--2FH*/三》typedef:重新定义数据类型精心整理学习帮手\nword完美格式typedef已有数据类型新的数据类型typedefintword;   /*将word定义为整型*/wordi,j;   /*将i,j定义为整型*/四》位运算符:       ━━━━┳━━━━━┳━━━━━┳━━━━━━┳━━━━━━┳━━━━━━           ~  ┃   &    ┃    |   ┃   ^         ┃    <<    ┃   >>               ━━━━╋━━━━━╋━━━━━╋━━━━━━╋━━━━━━╋━━━━━━        按位取反┃ 按位与 ┃  按位或┃按位异或  ┃ 左移     ┃    右移       ━━━━┻━━━━━┻━━━━━┻━━━━━━┻━━━━━━┻━━━━━━对移位:如<<,a<<2,即为将二进制的a左移两位,若a=0x8f,即10001111,a=a<<2,将导致a=0x3c(00111100),右边补零。五》条件运算符:逻辑表达式?表达式1:表达式2精心整理学习帮手\nword完美格式六》指针与地址运算符:*取内容       &取地址七》强制类型转换:(类型)=表达式(char*)0xb000八》sizeof取数据类型、变量以及表达式的字节数的运算符;九》continue:中断语句:结束本次循环。单片机C语言之三_____________________________________________________________________________________函数:一》中断服务函数与寄存器组定义:函数类型函数名(形式参数表)[interruptn][usingn]n为中断号,0~31:━━━━┳━━━━━┳━━━━━中断编号┃ 中断向量┃入口地址━━━━╋━━━━━╋━━━━━   0  ┃ 外中断0┃  0003H━━━━╋━━━━━╋━━━━━   1  ┃ 定时器0┃  000BH精心整理学习帮手\nword完美格式━━━━╋━━━━━╋━━━━━   2  ┃ 外中断1┃  0013H━━━━╋━━━━━╋━━━━━   3  ┃ 定时器1┃  001BH━━━━╋━━━━━╋━━━━━   4  ┃ 串行口 ┃  0023H━━━━┻━━━━━┻━━━━━后面的n指的是四个工作寄存器组的一个:0~3对函数目标代码影响如下:在函数入口处将当前工作寄存器组保护到堆栈中;指定的工作寄存器内容不会改变,函数返回前将被保护的工作寄存器组从堆栈中恢复!例(定时1ms):   #include   sbitP1_0=P1^0;   voidtimer0(void)interrupt1using1{   P1_0=!P1_0;   TH0=-(1000/256);   TL0=-(1000%256);}main(){      SP=0x60;精心整理学习帮手\nword完美格式   P1_0=0;   TMOD=0X01;   TH0=-(1000/256);   TL0=-(1000%256);   EA=1;   ET0=1;   TR0=1;   do{}while(1);}/*   注意:   1、如果中断函数中用到浮点运算,必须保存浮点寄存器的状态。(在math.h中保存浮点寄存器函数为pfsave,恢复浮点寄存器的状态函数为fprestore)   2、如果在中断函数中调用了其他函数,则被调函数所使用的工作寄存器组与中断函数的一致!*/单片机C语言之四_____________________________________________________________________________________一、局部变量与全局变量(外部变量):精心整理学习帮手\nword完美格式1、全局变量若不在开头定义则加extern2、全局变量会使代码长,占用内存多二、存储方式:自动变量(auto):缺省,函数调用存在,退出消失。内部变量静态变量(static):staticinta=5;始终存在,退出不消失,但不能访问。寄存器变量(register):速度最快。通常只给编译器一个建议,由编译器根据实际情况确定。(见下)变量全局变量(global):外部变量静态变量(static):寄存器变量例:   #include   int_power(m,e)   intm;registerinte;{   registerinttemp;   temp=1;   for(;e;e--)   temp*=m;精心整理学习帮手\nword完美格式   return(temp);}main(){   ……}三、函数的参数和局部变量的存储器模式:三种存储器模式:small,compact,large.一个函数的存储器模式确定了函数的参数和局部变量在内存中的地址空间small:内部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);}精心整理学习帮手\nword完美格式利用存储器混合模式编程,充分利用有限的存储空间,还可加快程序的执行速度!单片机C语言之五_____________________________________________________________________________________       数组1>初始化数组:   unsignedchara[5]={0x11,0x22,0x33,0x44,0x55}或   unsignedchara[]={0x11,0x22,0x33,0x44,0x55,0x66}3>数组作为函数的参数:不但可以由变量作为函数的参数外,还可以用数组名作为函数的参数。一个数组数组名表示该数组的首地址。用一个数组名作为函数的参数时,在执行函数调用的过程中参数传递方式采用的是地址传递。将实际参数数组首地址传递给被调函数中的形式参数数组,这样一来两个数组就占有同一段内存单元。见下图:a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]起始地址1000b[0]b[1]b[2]b[3]b[4]b[5]b[6]b[7]b[8]b[9]精心整理学习帮手\nword完美格式用数组名作为函数的参数,应该在主调函数和被调函数中分别进行数组定义而不能只在一方定义数组。而且在两个函数中定义的数组类型必须一致,如果类型不一致将导致编译出错。实参数组和型参数组的长度可以一致可以不一致,编译器对形参数组的长度不做检查,直只是将实参数组的首地址传递给行参数组。如果希望行参数组能得到实参数组的全部元素,则应使两个数组的长度一致。定义型参数组时可以不指定长度,只在数组名后面跟一个方括号[]。这时为了在被调函数中处理数组元素的需要,应另外设置一个参数来传递数组元素的个数。例:用数组作为函数的参数,计算两个不同长度的数组中所有元素的平均值   #includefloataverage(array,n)   intn;   floatarray[];{   intI;   floataver,sum=array[0];   for(I=1;I   unsignedintxdata*ADC;/*定义ADC0809端口指针*/精心整理学习帮手\nword完美格式   unsignedintxdata*ADCdata;/*定义ADC0809数据缓冲器指针*/   unsignedcharI;voidmain(){   ADC=0x00f0;/*定义端口地址和数据缓冲器地址*/   ADCdata=0x1000;   I=8;/*ADC0809有8个模拟输入通道*/   EA=1;EX1=1;IT1=1;/*开中断*/   *ADC=I;/*启动ADC0809*/   WHILE(I);/*等待8个通道A/D转换完*/}voidint1()interrupt2{   unsignedchartmp;   temp=*ADC;/*读取A/D转换结果*/   *ADCdata=temp;/*结果值存到数据缓冲区*/   ADCdata++;/*数据缓冲区地址加1*/   i—;   *ADC=I;/*启动下一个模拟输入通道A/D转换*/}除了用指针变量来实现对内存地址的直接操作外,c51编译器还提供一组宏,该宏定义文件为:“absacc.h”,利用它可十分方便地实现对任何内存空间的直接操作,改写上面的程序:精心整理学习帮手\nword完美格式   #include   #include/*包含绝对地址操作预定义头文件*/   #defineADC0x00f0;/*定义ADC0809端口地址*/   #defineADCdata0X1000/*定义数据缓冲器地址*/   unsignedcharI;voidmain(){   I=8;/*ADC0809有8个模拟输入通道*/   EA=1;ex1=1;it1=1;/*开中断*/   XBYTE[ADC]=I;/*启动0809*/   While(i);/*等待8个通道转换完毕*/}voidint1()interrupt2{   unsignedchartmp;   tmp=XBYTE[ADC];/*读取A/D转换结果*/   i--;   XBYTE[ADCdata+I]=tmp;/**结果值存储到数据缓冲器*/   XBYTE[ADC]=I;/*启动下一个模拟输入通道A/D转换*/}两指针相减-----计算字符串的长度   精心整理学习帮手\nword完美格式#includemain(){   char*s=”abcdef”;   intstrlen(char*s);   printf(“\nlengthof‘%%s’=%%d\n”,s,strlen(s));}intstrlen(char*s){   char*p=s;   while(*p!=’\0’)p++;   return(p-s);}结果为:lengthof‘abcdef’=6注:不允许指针之间进行加,乘,除,移位,或屏蔽运算,也不允许用float类型数据与指针做加,减运算!抽象型指针:ANSI新标准增加了一种“void*”的指针类型,这是一种抽象型指针,即可以定义一个指针变量,但不指定该指针是指向哪种类型的数据的。在赋值时需进行强制类型转换:Char*p1;Void*p2;P1=(char*)p2;抽象型指针可以用来在每个存储区内访问任意绝对地址或者用来产生绝对调用。精心整理学习帮手

相关文档