
#include “reg51.h”
声明语句
main( ) 只有一个,执行从main开始
{
程序内容 (语句是以 ; 结束)
}
2、数据定义
int a,b=0; float x=2.6; char A ;
定义是要考虑变量的大小及类型,一般单片机定义基本型就可以,也没必要注意是否溢出,一般都不会超过其范围了。
单片机有自己的数据类型,所以它有特有的定义类型
bit flag=0;……………………内部RAM位寻址区
sfr16 DPTR=0x82;…………特殊功能寄存器(只有一个)
code int x=10;………………存储于程序存储器(只能读,不能写)
unsigned int data i[10];………………前128字节内部存储器 (idata是全部256字节)
unsigned char pdata cl;………………外部存储器 (xdata是KB RAM)
注意:在定义时一定注意变量存放地址,及软件工程设置,可通过调试看存放情况
3、运算符与表达式
注意:作用和级别高低关系(排列从高到低)
!(非)
算术运算符(+ - * / %)
关系运算符
&& ||
=
4、选择结构语句
if语句:
main( )
{int a,b,c,max,min;
printf("input three numbers: ");
scanf("%d%d%d",&a,&b,&c);
if(a>b)
{max=a;min=b;}
else
{max=b;min=a;}
    if(max     else       if(min>c)     min=c;  printf("max=%d\\nmin=%d",max,min); } Switch语句: main() {float a,b;char c; printf("input expression:a+(-,*,/)b \\n"); scanf("%f%c%f",&a,&c,&b); switch(c) { case '+': printf("%f\\n",a+b);break;     case'-': printf("%f\\n",a-b);break;     case'*': printf("%f\\n",a*b);break;     case'/': printf("%f\\n",a/b);break;     default: printf("input error\\n");     } } 5、循环语句 Goto语句 main() {int i,sum=0;      i=1; loop:if(i<=100)      {sum=sum+i;       i++;       goto loop;} printf("%d\\n",sum); } While语句 main() {int i,sum=0;    i=1;    while(i<=100)     {sum=sum+i;       i++;}  printf("%d\\n",sum); } Do-while语句 main() {int i,sum=0;    i=1;    do    {sum=sum+i;      i++;} while(i<=100)  printf("%d\\n",sum);} Break语句 main() {int i=0;    char c;    while(1)     /*设置循环*/   {c='\\0';   /*变量赋初值*/   while(c!=13&&c!=27) /*键盘接收字符直到按回车或Esc键*/   {c=getch();    printf("%c\\n", c);}   if(c==27)   break;          /*判断若按Esc键则退出循环*/   i++;   printf("The No. is %d\\n", i);     }   printf("The end");  } Continue语句 main() {char c;   while(c!=13)          /*不是回车符则循环*/       { c=getchar(  );          if(c==0X1B)             continue;   /*若按Esc键不输出便进行下次循环*/          printf("%c\\n", c);        } } 结合单片机实例分析程序: C语言源程序 #include  unsigned char i; unsigned char temp; unsigned char a,b; void delay(void) { unsigned char m,n,s; for(m=20;m>0;m--) for(n=20;n>0;n--) for(s=248;s>0;s--) } void main(void) { while(1) { temp=0xfe; P1=temp; delay(); for(i=1;i<8;i++) { a=temp<b=temp>>(8-i); P1=a|b; delay(); } for(i=1;i<8;i++) { a=temp>>i; b=temp<<(8-i); P1=a|b; delay(); } } }  数组: 一维数组定义及引用: int a[10]={0,1,2,3,4,5,6,7,8,9};   main() {   int i,a[10];   for(i=0;i<=9;i++)   for(i=9;i>=0;i--) } main() {   int i,a[10];   for(i=0;i<10;)   for(i=9;i>=0;i--)  } 注意:比较它们的区别 二维数组定义及引用: int a[2][5]={{0,1,2,3,4},{5,6,7,8,9}};       或={0,1,2,3,4,5,6,7,8,9}; 字符数组定义及引用: Char name[ ]={“xiaoli”};          或=”xiaoli”;          或={‘x’,’i’,’a’,’o’,’l’,’i’}; 指针: 变量的指针就是变量的地址。存放变量地址的变量是指针变量 1)&:取地址运算符。 *:指针运算符(或称“间接访问” 运算符) 定义;int *p1; 引用:main() { int a,b;   int *pointer1, *pointer2;   a=100;b=10;   pointer_1=&a; pointer_2=&b;   printf("%d,%d\\n",a,b);   printf("%d,%d\\n",*pointer1, *pointer2); } 结构体:不同的数据类型构成一个整体 struct stu {int num;  char name[20];  char sex;  float score;}boy1,boy2;  stu boy1,boy2; boy1.num=102; boy1.name="Zhang ping";     boy2=boy1;    【例11.3】计算学生的平均成绩和不及格的人数。 struct stu   { }boy[5]={ main( ) {  n=0,i,c=0;  max,ave,s=0;   { s+=boy[i].score;   if(boy[i].score<60) {c+=1;printf(“%s\\n”,boy[i].name)} } } 输出最大分数资料 max=boy[0].score; for(i=1;i<5;i++) {if(max 函数定义: 1、无参函数的定义形式  类型标识符 函数名()        {声明部分       语句    } void Hello( )  ("Hello,world \\n"); } 2、有参函数定义的一般形式  类型标识符 函数名(形式参数表列)        {声明部分       语句    } int a,b; int max(a,b)  (int a,int b) {if (a>b) return a;  else return b;} 注意: A、函数的类型实际上是函数返回值的类型。 B、函数置在main之后(main内要有函数声明语句),也可以把它放在main之前,但一定是在main之外。 C、return语句:返回值;void:无返回值。 D、函数调用语句在main内。 例题: int max(int a,int b) { if(a>b)return a; main() { int max(int a,int b);  numbers:\\n"); 实参与形参——值传递: int x,y; int fin(x) { y=x+2;return y;} main( ) {int a,b; printf(“input a:\\n”);  scanf(“%d\\n”,&a);  b=fin(a); printf(“%d”,b);} 嵌套调用: long f1(int p) {int k; long f2(int q) { long c=1; main() { int i; 递归调用: long ff(int n) {long f; main() { int n; 数组作为函数参数:(地址传递方式) 【例】数组a中存放了一个学生5门课程的成绩,求平均成绩。 float aver(float a[5]) { int i; void main() {float sco[5],av; int i; printf("average score is %5.2f",av);} 编写一个max函数,找出数组中的最大值并返回。 int max(int values[]) {int maxdat,i,n; int score[10]={10,11,23,44,9,8,233,456,34,60}; maxnum=max(score); } 局部变量和全局变量 1、局部变量:局部变量是在函数内作定义说明的。其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的 …… } x,y,z有效 int m,n;  …… m,n有效 2、全局变量:在函数外部定义的变量,它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。 在函数中使用全局变量,一般应作全局变量说明。 只有在函数内经过说明的全局变量才能使用。全局变量的说明符为extern。例: int max(int x,int y) {int z;  z=x>y?x:y;  return(z); } main() {extern A,B;  printf("%d\\n",max(A,B)); } int A=13,B=-8; 【例】输入正方体的长宽高l,w,h。求体积及三个面x*y,x*z,y*z的面积。 int s1,s2,s3; int vs( int a,int b,int c) { } main() {  int v,l,w,h;  printf("\\ninput length,width and height\\n");  scanf("%d%d%d",&l,&w,&h);  v=vs(l,w,h);  printf("\\nv=%d,s1=%d,s2=%d,s3=%d\\n",v,s1,s2,s3); } 如果同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即它不起作用。 例: i为全局变量*/ max(int a,int b) /*a,b为局部变量*/ {int c;  c=a>b?a:b;  return(c); } main() {int a=8;  printf("%d\\n",max(a,b)); } 3.请写出以下程序的输出结果: #include main() { int a[]={1,2,3,4},i; int x=0; for(i=0;i<4;i++) { sub(a,x);printf("%d",x);} printf("\\n");} sub(s,x) int *s,x; { static int t=3; x=s[t];t--; return(x);} 变量的存储类别 从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。 从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式。 静态存储方式:是指在程序运行期间分配固定的存储空间的方式。 动态存储方式:是在程序运行期间根据需要进行动态的分配存储空间的方式。 例如: int f(int a)         /*定义f函数,a为参数*/ {auto int b,c=3;     /*定义b,c自动变量*/  …… } a是形参,b,c是自动变量,对c赋初值3。执行完f函数后,自动释放a,b,c所占的存储单元。 关键字auto可以省略,auto不写则隐含定为“自动存储类别”,属于动态存储方式。 f(int a) {auto b=0;  Static c=3;  b=b+1;  c=c+1;  return(a+b+c); } main() {int a=2,i;  for(i=0;i<3;i++)  printf("%d",f(a)); } 注意:1、静态存储区内分配存储单元。在程序整个运行期间都不释放 2、只赋初值一次 3、编译时自动赋初值0 4、其它函数不能引用 局部变量得值放在CPU中的寄存器用关键字register作声明 int fac(int n) {register int i,f=1;  for(i=1;i<=n;i++) f=f*i  return(f); } main() {int i;  for(i=0;i<=5;i++)  printf("%d!=%d\\n",i,fac(i)); } 说明: 1)只有局部自动变量和形式参数可以作为寄存器变量; 2)一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量; 3) 局部静态变量不能定义为寄存器变量。 文件: 文件指针:FILE *fp;FILE应为大写 文件打开:文件指针名=fopen(文件名,使用文件方式); 文件读写: 字符读写函数  :fgetc和fputc  ·字符串读写函数:fgets和fputs  ·数据块读写函数:freed和fwrite ·格式化读写函数:fscanf和fprinf 使用以上函数都要求包含头文件stdio.h 文件定位:rewind(文件指针); 它的功能是把文件内部的位置指针移到文件首 用来移动文件内部位置指针,其调用形式为:fseek(文件指针,位移量,起始点); 【例】在学生文件stu_list中读出第二个学生的数据。 #include struct stu {   char name[10];   int num;   int age;   char addr[15]; }boy,*qq; main() {   FILE *fp;   char ch;   int i=1;   qq=&boy;   if((fp=fopen("stu_list   {   }   rewind(fp);   fseek(fp,i*sizeof(struct stu),0);   fread(qq,sizeof(struct stu),1,fp);   printf("\\n\\nname\number age addr\\n");   printf("%s\%5d%7d%s\\n",qq->name,qq->num,qq->age,qq->addr);} 文件检测: feof(文件指针); 功能:判断文件是否处于文件结束位置,如文件结束,则返回值为1,否则为0 ferror(文件指针);   功能:检查文件在用各种输入输出函数进行读写时是否出错。如ferror返回值为0表示未出错,否则表示有错。 clearerr(文件指针);   功能:本函数用于清除出错标志和文件结束标志,使它们为0值。
文件关闭:fclose(文件指针);文件使用方式  “rt”  “wt”  “at”  “rb”  “wb”  “ab”  “rt+”  “wt+”  “at+”  “rb+”  “wb+”  “ab+” 
说明文件的随机读写:起始点 表示符号 数字表示 文件首 SEEK_SET 0 当前位置 SEEK_CUR 1 文件末尾 SEEK_END 2 
