视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
单片机C语言学习总结
2025-09-28 00:21:32 责编:小OO
文档
1、C程序结构

#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      max=c;

    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(maxprintf(“%d,%s,%c,%f”,boy[n].num,boy[n].name,boy[n].sex,boy[n].score);

函数定义:

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(文件名,使用文件方式);

文件使用方式
 “rt”

 “wt”

 “at”

 “rb”

 “wb”

 “ab”

 “rt+”

 “wt+”

 “at+”

 “rb+”

 “wb+”

 “ab+”

文件关闭:fclose(文件指针);

文件读写:

字符读写函数  :fgetc和fputc

 ·字符串读写函数:fgets和fputs

 ·数据块读写函数:freed和fwrite

·格式化读写函数:fscanf和fprinf

使用以上函数都要求包含头文件stdio.h

文件定位:rewind(文件指针);

它的功能是把文件内部的位置指针移到文件首

用来移动文件内部位置指针,其调用形式为:fseek(文件指针,位移量,起始点);

起始点表示符号数字表示
文件首SEEK_SET0
当前位置SEEK_CUR1
文件末尾SEEK_END2
说明文件的随机读写:

【例】在学生文件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值。下载本文

显示全文
专题