一、什么是单片机?
- 将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
片内结构图 图片来源网络
封装图
图片来源网络
实物图 图片来源网络
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: 采集外部信号时用
三、单片机工作过程
-
如果使用实物 设计电路:设计好硬件电路 编程:用软件编写C语言程序(keil4、keil5等) 编译:把C语言程序编译成 .hex文件 烧录:用下载线连接单片机和电脑 ,把hex文件“输入”到单片机内部,把程序写入单片机。(这个烧录过程相当于光盘的刻录) 上电运行:单片机根据烧录的程序,开始执行对于的操作。 -
如果使用仿真 设计电路:打开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个一组 转化为对应的十六进制字母 即可得到十六进制数
即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
(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
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)
{
b=2
}
else
{
b=1
}
除了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语言编程的基本框架
单片机中用第一种
程序示例
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文件
附录
|