最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

单片机C语言学习总结

来源:动视网 责编:小OO 时间:2025-09-28 00:21:32
文档

单片机C语言学习总结

1、C程序结构#include“reg51.h”声明语句main()只有一个,执行从main开始{程序内容(语句是以;结束)}2、数据定义inta,b=0;floatx=2.6;charA;定义是要考虑变量的大小及类型,一般单片机定义基本型就可以,也没必要注意是否溢出,一般都不会超过其范围了。单片机有自己的数据类型,所以它有特有的定义类型bitflag=0;……………………内部RAM位寻址区sfr16DPTR=0x82;…………特殊功能寄存器(只有一个)codeintx=10;………………存储
推荐度:
导读1、C程序结构#include“reg51.h”声明语句main()只有一个,执行从main开始{程序内容(语句是以;结束)}2、数据定义inta,b=0;floatx=2.6;charA;定义是要考虑变量的大小及类型,一般单片机定义基本型就可以,也没必要注意是否溢出,一般都不会超过其范围了。单片机有自己的数据类型,所以它有特有的定义类型bitflag=0;……………………内部RAM位寻址区sfr16DPTR=0x82;…………特殊功能寄存器(只有一个)codeintx=10;………………存储
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值。

文档

单片机C语言学习总结

1、C程序结构#include“reg51.h”声明语句main()只有一个,执行从main开始{程序内容(语句是以;结束)}2、数据定义inta,b=0;floatx=2.6;charA;定义是要考虑变量的大小及类型,一般单片机定义基本型就可以,也没必要注意是否溢出,一般都不会超过其范围了。单片机有自己的数据类型,所以它有特有的定义类型bitflag=0;……………………内部RAM位寻址区sfr16DPTR=0x82;…………特殊功能寄存器(只有一个)codeintx=10;………………存储
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top