单片机及C语言入门

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

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

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

举例:AT89S51

片内结构图
在这里插入图片描述
图片来源网络

封装图
在这里插入图片描述

图片来源网络

实物图
在这里插入图片描述
图片来源网络

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

三、单片机工作过程
  1. 如果使用实物
    设计电路:设计好硬件电路
    编程:用软件编写C语言程序(keil4、keil5等)
    编译:把C语言程序编译成 .hex文件
    烧录:用下载线连接单片机和电脑 ,把hex文件“输入”到单片机内部,把程序写入单片机。(这个烧录过程相当于光盘的刻录)
    上电运行:单片机根据烧录的程序,开始执行对于的操作。

  2. 如果使用仿真
    设计电路:打开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进制数,十进制的015,用十六进制的09、A~F(不区分大小写)表示,一般会在十六进制前加0x用以区分不同进制
举个例子: 十进制的15用0xF表示,16用0xF1表示,255用0xff表示
在单片机中会经常用到十六进制数和二进制的转换
请添加图片描述
图片来源网络

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

| 二进制数: 1001 0001 1111 1100    转化为十六进制数 |        |      |      |      |      |
|---------------------------------------|--------|------|------|------|------|--|--|--|
| 每4位转化为十六进制数                           |        | 1001 | 0001 | 1111 | 1100 |  |
|                                       |        | 9    | 1    | f    | c    |  |  |  |
| 结果                                    | 0x91fc |

即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。
异或^: 00=0,01=1,10=1,11=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. 语法
(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,等
这些类型的区别为定义的范围不同: int定义的变量范围为4个字节,范围为
在这里插入图片描述

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

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

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

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

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

![[Pasted image 20220918211946.png|500]]
![[Pasted image 20220918212110.png|600]]

4.三大基本结构:顺序,选择,循环
![[Pasted image 20220917171630.png]]

顺序就是前面所讲的按行的顺序,向下执行
选择:使用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); 
}

解释

  1. init 会首先被执行,且只会执行一次。这一步允许您声明并初始化任何循环控制变量。您也可以不在这里写任何语句,只要有一个分号出现即可。
  2. 接下来,会判断 condition。如果为真,则执行循环主体。如果为假,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。
  3. 在执行完 for 循环主体后,控制流会跳回上面的 increment 语句。该语句允许您更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可。
  4. 条件再次被判断。如果为真,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。在条件变为假时,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
  • **函数名称:**这是函数的实际名称。函数名和参数列表一起构成了函数签名。
  • **参数:**参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
  • **函数主体:**函数主体包含一组定义函数执行任务的语句。
    举例
    ![[Pasted image 20220918212421.png]]

宏定义
![[Pasted image 20220918212515.png|350]]

C语言编程的基本框架
在这里插入图片描述

单片机中用第一种

程序示例

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()
{


}

编程软件

测试一些的C语言程序可以安装 Dev C++Dev-C++ download | SourceForge.net,能编译成exe文件
如果需要给单片机写程序,需要用keil软件。C51用keil uvision4,编译成单片机能用的hex文件

附录

猜你喜欢

转载自blog.csdn.net/weixin_52013159/article/details/126923550