补充:单片机C语言程序设计基础单片机C语言程序设计基础一单片机C程序设计的一般格式二单片机C程序的数据类型三单片机C程序的运算符和表达式四单片机C程序的一般语法结构五51系列单片C语言特点补充:单片机C语言程序设计基础一单片机C程序设计的一般格式•1、几个基本概念(1)函数:C语言程序由一个主函数和若干个其它函数构成,程序中由主函数调用其它函数,其它函数之间也可以相互调用。(2)指针与指针变量:若定义变量x,&x即为x的指针,指针变量是指针的指针,若xp=&x,利用*xp即可访问变量x。(3)#include(包含处理命令):把一个源文件将另外一个源文件的全部内容包含进来,或者说把一个外部文件包含到本文件之中。(4)#define(宏定义):在C程序中,可以指定一标志符去定义一个常量或字符串。补充:单片机C语言程序设计基础2、单片机C程序的基本结构(1)主函数名必须为main()。C程序通过函数调用去执行指定的工作。(2)一个函数由说明部分和函数体两部分组成。函数说明部分是对函数名、函数类型、形参名和形参类型等所做的说明。(3)C程序的执行总是从main()函数开始,而对该函数的位置无特殊规定。(4)在源程序文件需要包含其它源程序文件时,应在本程序文件头部用包含命令#include处理。(5)C程序中的一个函数需要调用另一个子函数时,另一个函数应写在前面,否则应声明。(6)C程序书写格式自由,一行可写一个语句或几个语句。每个语句结尾用;结束。补充:单片机C语言程序设计基础二单片机C程序的数据类型•1、常量和符号常量例:#definePARL3.14159(PARL即为符号常量)(1)整型常量,如11,o11,0xff等。(2)实型常量,如0.12,1.55e5等。(3)字符常量,如‘a’、‘A’等。(4)字符串常量,如“a”、“CHINA”等。2、变量(1)位变量:bit和sbit(2)字符变量:singedchar和unsignedchar(3)整型变量:singedint和unsignedint(4)长整型变量:unsignedlong和signedlong补充:单片机C语言程序设计基础(3)实型变量:float和double(4)寄存器变量:sfr和sfr16三单片机C程序的运算符和表达式(1)算术运算符13个:+、-、*、/、%、=、+=、-=、*=、/=、%=、++、--(2)关系运算符6个:、、==、=、=、!=(3)逻辑运算符3个:&&、||、!(4)位操作运算符7个:、、|、&(相与)、^、~、&(变量取地址)(5)指针运算符:*补充:单片机C语言程序设计基础四单片机C程序的一般语法结构•1、顺序结构例:main(){P0=0xff;P2=0x30;P1=0xff;P3=0xff;scan();test();}补充:单片机C语言程序设计基础•2、分支结构(1)单分支结构形式:if(条件表达式){执行语句;}例:补充:单片机C语言程序设计基础(2)双分支结构:形式:if(条件表达式){语句1;}else{语句2;}例:补充:单片机C语言程序设计基础(3)由双分支结构变化而成的多分支结构形式:if(表达式1)语句1;elseif(表达式2)语句2;..elseif(表达式n)语句n;else语句n+1;补充:单片机C语言程序设计基础例:补充:单片机C语言程序设计基础(4)switch…case多分支转移结构语句形式:switch(条件表达式){case常量表达式1:{语句1;break;}case常量表达式2:{语句2;break;}...case常量表达式n:{语句n;break;}default:{语句n+1;break;}}补充:单片机C语言程序设计基础例:补充:单片机C语言程序设计基础•3、循环结构(1)while(表达式){循环体语句;}例:voiddelay(unsignedchartimes){unsignedcharI;i=250;while(--times){while(--i);}}补充:单片机C语言程序设计基础(2)do{循环体语句;}while(表达式);(3)for(表达式1;表达式2;表达式3){循环体语句;}例:补充:单片机C语言程序设计基础五51系列单片C语言特点•(1)使用文件包含命令#include应注意对应头文件的名称,要与规定名称相符。•(2)单片机中,一个变量可放在片内存储单元,也可放在片外存储单元,放在片内存储单元还要区分是否可位寻址,或放在间接寻址区。例:intdatax,y;//表示整型变量指定在片内数据存储区charxdatam,n;//表示字符变量指定在片外数据存储区补充:单片机C语言程序设计基础C51存储类型存储类型寻址空间数据长度值域范围data片内直接寻址RAM800H~7FHidata片内间接寻址RAM880H~FFHpdata分页寻址片外RAM800H~FFH补充:单片机C语言程序设计基础存储类型寻址空间数据长度值域范围xdata片外数据存储(64K)160000H~FFFFHcode片内统一编址ROM(64K)160000H~FFFFHbdata片内可位寻址的RAM(16byet)120H~2FH补充:单片机C语言程序设计基础•(3)21个SFR只能直接寻址,一般在头文件中用字节定义方式定义。如:sfrTMOD=0x89;(4)C51编译器编译源程序时,数据类型和存储类型都可预先定义,但数据具体放在哪一个单元不由用户指定。(5)单片机C程序的中断程序与汇编语言程序不同,中断过程通过使用interrupt关键字和中断号(0~31)来实现。中断号告诉编译器中断程序的入口地址。补充:单片机C语言程序设计基础单片机中断源与C中断程序中中断号对照表C中的中断号对应单片机中的中断源C中的中断号对应单片机中的中断源0外部中断03定时器1中断1定时器0中断4串行口中断2外部中断15定时器2中断补充:单片机C语言程序设计基础一个定时器0中断程序编写格式如下:Voidtimer0(void)interrupt1{TR0=0;TH0=0xff;TL0=0x30;TR0=0;tick_count++;}用户不必关心现场保护及恢复现场的问题,编译器会自动完成。中断程序的入口地址被编译器放在中断向量中,无需用户指定。补充:单片机C语言程序设计基础•(6)片外扩展的I/O接口,可用#define进行定义。如:#includeabsacc.h#defineADC0804XBYTE[0x7ffe]补充:单片机C语言程序设计基础照此电路连接,ADC0804作为单片机扩展的IO设备,采用了端口控制方式(即端口作通用I/O口用)。补充:单片机C语言程序设计基础若用总线控制方式,如何修改电路和程序?unsignedcharadc0804(void)//读AD0804子程序{unsignedcharaddata,i;rd=1;wr=1;int1=1;//读ADC0804前准备P1=0xff;//P1全部置一准备cs=0;wr=0;wr=1;//启动ADC0804开始测电压while(int1==1);//查询AD转换结束标志rd=0;//开始读转换后数据i=i;i=i;//无意义语句,用于延时等待addata=P1;//读出的数据赋与addatard=1;cs=1;//读数完毕return(addata);//返回最后读出的数据}补充:单片机C语言程序设计基础例1:清零程序(将2000H—20FFH的内容清零)★汇编语言程序ORG0000HSE01:MOVR0,#00HMOVDPTR,#2000H;(0000H)送DPTRLOO1:CLRAMOVX@DPTR,A;0送(DPTR)INCDPTR;DPTR+1INCR0;字节数加1CJNER0,#00H,LOO1;不到FF个字节再清LOOP:SJMPLOOP程序示例补充:单片机C语言程序设计基础清零程序(将2000H—20FFH的内容清零)★C-51程序#includereg51.hmain(){inti;unsignedcharxdata*p=0x2000;/*指针指向2000H单元*/for(i=0;i256;i++){*p=0;p++;}/*清零2000H-20FFH单元*/}补充:单片机C语言程序设计基础★汇编语言程序ORG0000HL00:MOVR0,#10H;查找16个字节MOVR1,#00HMOVDPTR,#2000HL11:MOVXA,@DPTRCJNEA,#00H,L16;取出内容与00H相等吗?INCR1;取出个数加1L16:INCDPTRDJNZR0,L11;未完继续MOVDPTR,#2100HMOVA,R1MOVX@DPTR,A;相同数个数送2100HL1E:SJMPL1E例2:查找零的个数(在2000H--200FH中查出有几个字节是零,把个数放在2100H单元中)补充:单片机C语言程序设计基础★查找零的个数★C-51程序#includereg51.hmain(){unsignedcharxdata*p=0x2000;/*指针p指向2000H单元*/intn=0,i;for(i=0;i16;i++){if(*p==0)n++;/*若该单元内容为零,则n+1*/p++;/*指针指向下一单元*/}p=0x2100;/*指针p指向2100H单元*/*p=n;/*把个数放在2100H单元中*/}补充:单片机C语言程序设计基础结合单片机硬件的C程序示例1、任务:点亮LED灯在Keil软件编辑窗口输入以下程序:#includeAT89x51.HsbitP3_0=P3^0;voidmain(void){while(1){P3_0=0;}}补充:单片机C语言程序设计基础2、任务:闪烁灯#includeAT89X51.Hvoiddelay02s(void){unsignedchari,j,k;for(i=20;i0;i--)for(j=20;j0;j--)for(k=248;k0;k--);}voidmain(void){while(1){P3_0=0;delay02s();P3_0=1;delay02s();}}要求:前面例子是让LED灯亮,现在实现LED灯的闪烁。补充:单片机C语言程序设计基础3、任务:花样灯要求:做广告灯的左移右移,要求8个灯依次点亮下移、再上移、从两边向中间移、从中间向两边移、1357和2468交替亮灭3次、1234和5678交替亮灭2次,1256和3478交替亮灭3次,最后构成循环。补充:单片机C语言程序设计基础参考程序:#includereg51.h#defineucharunsignedcharconstuchartab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,//下移0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,//上移0xef,0xbd,0xdb,0xfe,//两边向中间移0xdb,0xbd,0xef,//中间向两边移0xaa,0x55,0xaa,0x55,0xaa,0x55,//1357,2468交替3次0xf0,0x0f,0xf0,0x0f,//1234,5678交替2次0x33,0xcc,0x33,0xcc,0x33,0xcc,//1256,3478交替3次0x00};//结束码uchart=0;////以下初始化子函数////voidsys_init(void){TMOD=0x01;TH0=0xd8;补充:单片机C语言程序设计基础续前页:TL0=0xef;ET0=1;EA=1;TR0=1;}////以下主函数////voidmain(void){uchari=0;P3=tab[i];i++;sys_init();while(1){while(t100);t=0;if(tab[i]==0x00){i=0;}P3=tab[i];i++;}}续左页:////以下定时器0中断函