打印
[经验分享]

C语言入门

[复制链接]
935|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
robincotton|  楼主 | 2024-8-23 21:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、什么是单片机?
  • 将CPU芯片、存储器芯片、I/O接口芯片和简单的I/O设备(小键盘、LED显示器)等装配在一块印刷电路板上,再配上监控程序(固化在ROM中),就构成了一台单片微型计算机(简称单片机)。 由于单片机在使用时,通常处于测控系统的核心地位并嵌入其中,因而,国际上通常把单片机称为嵌入式控制器( Embedded MicroController Unit, EMCU )或微控制器( MicroContoller Unit,MCU)。而在我国,大部分工程技术人员则习惯使用“单片机”这一名称。
  • 单片机是一块可编程的控制芯片,通过给单片机设计不同的程序,让单片机执行不同的功能。
  • 种类:4位、8位、16位和32位单片机,位数越高,数据处理能力更强。
    8051单片机、AVR单片机、PIC单片机、MSP430/432单片机、基于ARM技术的单片机。
  • 用途:
    工业自动化: 数据采集、测控技术。
    智能仪器仪表: 数字示波器、数字信号源、数字万用表、感应电流表等。
    消费类电子产品: 洗衣机、电冰箱、空调机、电视机、微波炉、手机、IC 卡、汽车电子设备等 。
    通讯方面: 调制解调器、程控交换技术、手机、小灵通等。
    武器装备: 飞机、军舰、坦克、导弹、航天飞机、鱼雷制导、智能武器等。
  • 单片机最小系统板

需要添加复位电路,电源电路、晶振电路,单片机才能正常工作。

二、单片机结构
  • 单片机的结构
    单片机内部各种部件:CPU,RAM,ROM,计时器/计数器、串行口,IO口、中断系统、特殊功能寄存器、看门狗定时器。

举例:AT89S51

片内结构图

图片来源网络

封装图

图片来源网络

实物图

图片来源网络

下面是该51单片机的引脚的介绍:
VCC为电源引脚,用于给单片机供电,VSS为接地。
1~40的数字为不同引脚的编号,数字旁边的英文+数字是引脚的名称,如P1.0、P1.1、P1.2,VCC等。
2. IO口(input,output)
以P开头的引脚是IO口引脚(P0.0–P0.7、P1.0–P1.7、P2.0–P2.7,P3.0–P3.7),IO有两种状态,高电平和低电平,也叫1和0。
高电平简单来说就是相对高的电压,一般为单片机的VCC的电压,5V或3.3V,AT89S51为5V。
低电平为0V。
单片机上电后IO口的默认状态为悬空。
可以用程序来控制单片机,让单片机的IO口输出不同的电平,若再给IO口引脚连接到电子元件,可以完成不同的目的如led亮灭等。
也可以给单片机的IO引脚连接外部电源或者接地,此时可以编写程序,让单片机检测自己引脚电平状态,实现计算、逻辑运算等不同的功能。
3. 其他功能
复位:能让单片机内部程序从头开始运行,单片机RST引脚接高电平
RX/TX : 在单片机和其他设备通信时候用。
ADC: 采集外部信号时用

三、单片机工作过程
  • 如果使用实物
    设计电路:设计搭建好硬件电路。【最简单电路直接用导线连接,较简单电路可以用面包板连接,当然有焊接条件的可以用洞洞板,PCB板(需要学习画PCB的软件)】。
    编程:用软件编写C语言程序(keil4、keil5等)。注:51单片机和一些其他单片机都用C语言进行编程,当然也有可以用Python等语言编写程序的单片机,如ESP32。
    编译:把C语言程序编译成 .hex文件
    烧录:用下载线连接单片机和电脑 ,把hex文件“输入”到单片机内部,即把程序写入单片机。(这个烧录过程可以理解为光盘的刻录的写入数据,但是它们的原理是不同的)
    上电运行:单片机根据烧录的程序,开始执行对于的操作。

注:如果使用实物,只有孤零零的一块MCU芯片是不行的,还需要外围电路(晶振、复位电路、烧录电路等),并且需要焊接。初学者可以用仿真或购买一块该芯片的最小系统板(包含了外围电路和MCU芯片,且较便宜),如果预算充足,可以购买相应芯片的开发板(开发板还焊接了各类外设:LED、数码管、按键等)

  • 如果使用仿真
    设计电路:打开proteus软件,选择对应单片机型号,放置单片机,设计需要的电路
    编程:用软件编写C语言程序(keil4、keil5等)
    编译:把C语言程序编译成 .hex文件
    烧录:双击单片机芯片,选择编译好的hex文件,确定。
    运行:点击运行按钮,运行proteus仿真

如果需要修改程序,可以重新烧录运行。

四、单片机编程–C语言入门

编程可以让电脑代替人完成一些工作,如果应用到单片机领域,就可以让单片机完成一些功能
1. 位和进制
(1) 介绍进制转化
在此之前,介绍字节和位数的概念:由于内部结构,计算机只能识别0和1两种状态,位是最基本单位,它只能取值0和1
1个字节 = 8位

1位二进制只能是0和1,2位二进制的组合方式有00、01、10、11 ,换算成十进制后,分别可以表示 0、1、2、3 。4位二进制的组合方式有16种,可以表示十进制0~15,总共16个数字,如下图所示。
依次类推 n位可以表示2^n个数字。
所以一个字节的大小为0~255。
所以任意一个数字可以被0和1来表示,0和1组成的数叫二进制数
同样的,也有16进制数,十进制的0-15分别用十六进制的0-9、A~F(不区分大小写)表示,一般会在十六进制前加0x用以区分不同进制
举个例子: 十进制的15用0xF表示,16用0x10表示(F+1会向第二位进位),255用0xff表示
在单片机中会经常用到十六进制数和二进制的转换

图片来源网络

根据数学规律,二进制每4个一组 转化为对应的十六进制字母 即可得到十六进制数

即1001000111111100=0x91fc,反之也成立
只有二进制和十六进制转化时可以每一位分开转化,二进制和十进制之间不可以,也就是说 0001 1001 不能等于 十进制19,十进制15也不能等于001101
(2) 介绍位运算
位运算为二进制数的运算,所以其他进制数进行位运算时需要转化为二进制数

运算名称  运算符号  :  运算举例,解释与   &:0&0=0,0&1=0,1&0=0,1&1=1,0和任意数相与(&)得0。或    | :0|0=0,0|1=1,1|0=1,1|1=1,     1和任意数相或(|)得1。异或^:  0^0=0,0^1=1,1^0=1,1^1=0    相同为0,相异为1 取反~:~0=1,~1=0左移:0<<1=10表示0左移1位,结果为10B(二进制),右移:0>>1=0表示0右移一位,还是0

多位二进制数也可以进行位运算 0001&1111=0001 运算方法为逐位相与 0&0 0&0 0&0 1&1
多位二进制数也可以进行移位运算 0101<<1=01010,右侧补0
0101>>1=0010 ,左侧补0,低位1直接舍弃
2. 语法
下面是一些所要用到的C语言知识。单看一篇文章是无法掌握一门语言的,建议看完本文并有点感觉的同学去阅读相关书籍和视频。 下文仅作入门知识讲解。

(1) 就像学习英语等其他语言一样,掌握语法是基础,C语言也有自己的语法。
电脑执行C语言程序时,会一行执行完,再执行下一行,即顺序执行

如图中执行完第24行后,才会到25行,然后26行,27,28…
(2) C语言每一条语句末尾都需要添加分号,如果不添加分号,就会和下一条语句视为同一行。
(3) 一条语句分为几部分内容,内容之间需要用空格隔开,如定义变量中int和a之间要用空格隔开。
(4) C语言大括号用于区分不同的代码块,相当于给代码分组,几个语句可以分为一组
(5) 注释:
单行注释用 两个斜杠+注释内容 表示。如上图的绿色字体。
多行注释用 /* 注释内容 */表示,注释内容两边加斜杠和星号。
注释不算语句,对语句的运行没有影响,主要用于解释自己的语句内容。
勤加注释可以帮助自己理清程序思路,让别人读懂自己的程序,在程序出现bug时更好排查
(6) C语言所有语句都用英文输入法来写,包括逗号,分号,引号,如果语句内容出现中文汉字或中文标点,程序会出错
3. 变量
变量可以存储一些数据,能执行逻辑运算等操作。
操作变量分为三步:定义,赋值、运算
(1) 定义 : 定义变量的取值范围,后面的赋值操作不能超出这个范围 ,定义只需定义一次。语法结构为 : 数据类型+空格+变量名字+分号

int a; float a1;//a和a1是不同变量的名字unsigned int car;char car_value1;//变量名字可以为字母数字下划线,但名字开头不能用数字,如1a,1b是错误的命名方式。

数据类型包括char , int,unsigned int,float,short int,unsigned short int,long int,unsigned long int,char,float 等。(数据类型的作用:让数字、浮点数、字符这些内容分开,因为它们各自的所占存储空间是不同的)
这些类型的区别为定义的范围不同: int定义的变量范围为4个字节,范围为

char定义的为8个字节,范围为-128~127,
unsigned char定义的范围和char一样,unsigned意思是没有符号,不能为负数,即unsigned char的变量只能取0~255

(2) 逻辑运算和算术运算
运算的语法结构为: 变量名字 + 运算符 + 运算的内容(可以为数字、字母、另外一个变量名等)+ 分号
举例

a = 1;   //把1赋值给a,    注意:赋值前一定要先定义

还可以把其他变量的值赋值给这个变量

int b;  //定义b为int类型int a; //定义a为int类型b=1;  //给b赋值给1b=2; //多次赋值会覆盖之前的值,值以最近的一次为准,所以此时b的值为2a=b;  //把b的值赋值给a ,  此时a的值为2b=b-1;//把b-1的值赋值给b,因为b-1等于1,所以b的值此时变成了1b=b<<1; //也可以结合位运算,b左移一位,b变成10,即十进制的2

对于C语言初学者,可以先在C语言编译器中练习编程,为了能够看到每个变量存储的值,可以用printf函数。

数组的作用:如果要处理大量的数字,如1-100内的所有数字,为每个数字都取一个变量名并赋值的话非常繁琐也不变操作,因此便可以把这写数字放在一个数组(列表)中,要操作数组中的数字,可以通过循环访问的方式(下文要讲的循环语句)

4.三大基本结构:顺序,选择,循环

顺序就是前面所讲的按行的顺序,向下执行
选择:使用if语句或用switch语句

if(判断语句){        判断语句的结果为true执行}else{        判断语句的结果为false执行}

判断语句:如
a>1: 如果a的值大于1,a>1的结果为true(真或1)。如果a为2,那么结果为真。
a<1 如果a的值小于1,a<1的结果为true
还有>= , <=表示大于或等于、小于或等于
判断值是否相等用双等号==,例如 a==1判断a是否等于1,等于则结果为true,否则为false
判断值是否不相等用英文感叹号和等号!=,例如 a!=1判断a是否不等于1,不等于则结果为true,否则为false
两个判断语句合并为一个: 语句1 && 语句2 语句1成立且语句2成立
两个判断语句合并为一个: 语句1 || 语句2 语句1成立或语句2成立
if语句的嵌套用法

if(判断语句){        判断语句的结果为true执行}if else(判断句2){        判断语句2的结果为true执行}if else(判断句3){        判断语句3的结果为true执行}...else{        所有判断语句的结果为false执行}

举例

int a;int b;a=0;b=1;if(a==0  && b>0)  //判断是否 a等于0且b大于0{b=2}else{b=1}//if内条件成立,执行语句b=2,给b赋值

除了if,还有switch case语句。

循环的作用: 执行多条重复或有规律的语句
有两种 while语句 for语句
while:

while(判断语句){        //判断语句成立时执行大括号内的代码        /*如果执行完一次,会进入判断语句,再次判断条件是否成立(true),如果成立,就会再执行代码,如果不成立,不会执行代码,直接执行while后面的其他代码*/        /*执行次数取决于判断语句*/}/*其他代码(在大括号外边,不在while的作用域内)*/*

举例

int a=1;//定义和赋值写一起也可以int b;while(a<3){        a=a+1;//或写成 a++}b=1/*解释: a<3成立,执行语句a=a+1,a变成2,再执行语句a<3,也成立,再次执行a=a+1,再次判断,3<3不成立,跳出循环,执行b=1,然后顺序执行...*/

其他用法

int a;while(1){        a=a+1;}/*这里的1也可以看成一条语句,这条语句的结果始终为1,即为true,因此while里面的内容会无限执行下去*/

for语句C for 循环 | 菜鸟教程 (runoob.com)
C 语言中 for 循环的语法:

for ( init; condition; increment ){         statement(s); }

解释

  • init 会首先被执行,且只会执行一次。这一步允许您声明并初始化任何循环控制变量。您也可以不在这里写任何语句,只要有一个分号出现即可。
  • 接下来,会判断 condition。如果为真,则执行循环主体。如果为假,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。
  • 在执行完 for 循环主体后,控制流会跳回上面的 increment 语句。该语句允许您更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可。
  • 条件再次被判断。如果为真,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。在条件变为假时,for 循环终止。
    举例
int a;int b;for(a=0;a<10;a++){        //写需要执行的语句        if(a==5)        {                b=1;        }}

函数相关知识

函数的定义C 函数 | 菜鸟教程 (runoob.com)
return_type function_name( parameter list )
{
body of the function
}

在 C 语言中,函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分:

  • **返回类型:**一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void。
  • **函数名称:**这是函数的实际名称。函数名和参数列表一起构成了函数签名。
  • **参数:**参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
  • **函数主体:**函数主体包含一组定义函数执行任务的语句。
    举例

宏定义

C语言编程的基本框架

单片机中用第一种,并且main中一般要有且只有一个while(1){}语句,让单片机能够持续运行、

程序示例

C程序

#include <stdio.h>void main(){    int a;     //定义变量    a = 0;     //变量赋值    a = a + 1; //变量运算    a = a << 1;        while(a<3)        {                a = a+1;        }        b =1 ;                for(a=0;a<10;a++)        {                if(a==5)                {                        b=1;                }        }        printf("a=%d",a);//打印出a的值}

单片机程序

#include "reg51.h"  //这是51单片机标准头文件void main(){}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

1215

帖子

0

粉丝