虽然学习这一门新的语言充满种种困难,但是只有困难的东西才值得去学习,去突破,由学习知识到热爱知识再到使用知识,掌握一门有区分度的知识这才是以后工作的坚实后盾,加油!
第一部分基础知识
1单片机定义
2单片机结构
3基本的关系与计算
4基本数据类型
5基本语句
必会知识点:
1掌握单片机最小系统运作的必要条件(电源 晶振 复位电路)
2掌握对单片机I/O接口的操作(输出控制电平高低 输入检测电平高低)
3定时器 (重点掌握最常用方式2)
4中断 (掌握外部中断,定时中断,串口中断)
5串口通信(掌握单片机之间的通信,单片机与计算机之间的通信)
第一部分——基础
1单片机定义:单片机就是在一片硅片上集成微处理器,存储器及各种输入输出端口芯片,这块芯片具有计算机的属性所以被称为单片微型计算机,简称单片机。
解释:通俗地讲就是一块集成芯片,但这个集成芯片有特殊功能,这些功能的实现是靠使用者自己来编程控制各个引脚在不同时候输出不同电平,进而控制外围电路电气状态。
2各类有代表性的51芯片
公司
| 产品
| AT(Atmel)
| AT89C51 AT89C52
| Intel(英特尔)
| i87C54 i87C58
| STC
| STC89C51RC STC89C52RC
| 芯片标号解释:STC89C51RC 40C-PDIP 0707CU813.00D
STC——表示STC公司的产品
8——表示该芯片为8051内核芯片
9——内部含有flash 存储器 0表示内部含有Mask ROM存储器 7表示内含有紫外线可擦除存储器
C——表示该器件为CMOS 产品 LV和LE表示该芯片为低压产品 S表示含有可串行下载flash存储器
5——固定不变
1——表示该芯片内部程序存储空间大小1位4KB,2为8KB,程序存储空间(ROM)=n乘4KB
RC——内部随机读写存储器(RAM)为512B RD+表示内部RAM为1280B
40——芯片外最高接入40MHZ晶振 AT单片机一般是24
C——产片级别 C表示商业级,温度范围0-70 I表示工业级,温度范围-40-85
A表示汽车用产品 温度范围-40-125 M 军用产品 温度范围-55-150
PDIP——双列直插式封装 PLCC 塑料封装 QFP,PFP塑料扁平式封装 PGA 插针网络阵列封装 BGA 球栅阵列封装
单片机应用:
智能仪表:数字示波器 数字万用表 通信:手机 小灵通
武器装备:飞机 军舰 坦克 鱼雷制导
单片机学习方法:
1首先51单片机作为入门芯片,适合初学者学。
2只用软件仿真是学不会单片机的,要把硬件摆在面前(开发板)亲自操作,体会。
3不能只看书,也不能不看书,需要大致了解单片机各个引脚功能,了解寄存器。
4实践最重要,自己买一块单片机开发板只需要有流水灯,数码管,键盘(独立,矩阵),A\D,D\A转换,液晶,I2R总线,USB扩展就够了
单片机有40个引脚,按照功能可以分为三类:
电源及时钟引脚:VCC GND XTAL1 XTAL2(必会)
I/O口引脚: P1 P2 P3 四组8位I/O接口(必会)
编程控制引脚:RST PSEN ALE\PROG EA/VPP(了解)
XTAL1 片内振荡电路输入端,XTAL2 片内振荡电路输出端
8051芯片时钟振荡有两种方式:
1片内振荡 两个引脚接石英晶体振荡器和电容(10PF-30PF)
2外部时钟 外部时钟信号从XTAL2进 XTAL1 接地
I/O口引脚——P0口 P1口 P2口 P3口
P0口(39脚-32脚)
| 每个口可独立控制,无内置上拉电阻,使用时需要外接
| P1口(1脚-8脚)
| 每个口可独立控制, 内置上拉电阻 ,使用时需要进行写1操作
| P2口(21脚-28脚)
| 同P0口
| P3口(10脚-17脚
| 同P1口
| P3引脚第二功能定义
标号 | 引脚 | 第二功能
| 说明
| P3.0 | 10 | RXD
| 串行输入
| P3.1 | 11 | TXD
| 串行输出
| P3.2 | 12 | TNT0\
| 外部中断0
| P3.3 | 13 | TNT1\
| 外部中断1
| P3.4 | 14 | T0
| 定时器/计数器0外部输入端
| P3.5 | 15 | T1
| 定时器/计数器1外部输入端
|
电平特性
数字电路只有两种电平高电平1和低电平0
TTL型集成:+5V为1 0V为0
CMOS型集成:VCC可达12V,高电平为0.9VCC 低电平为0.1VCC
二进制和十六进制
十进制 | 二进制 | 十六进制 | 十进制 | 二进制 | 十六进制 | 0 | 0 | 0 | 8 | 1000 | 8 | 1 | 1 | 1 | 9 | 1001 | 9 | 2 | 10 | 2 | 10 | 1010 | A | 3 | 11 | 3 | 11 | 1011 | B | 4 | 100 | 4 | 12 | 1100 | C | 5 | 101 | 5 | 13 | 1101 | D | 6 | 110 | 6 | 14 | 1110 | E | 7 | 111 | 7 | 15 | 1111 | F | 二进制逻辑运算
与
必须都有,否则就没有 C语言中的符号 & 运算规则:0&0=0&1=1&0=0 1&1=1
或
只要其中之一有就有 C语言中的符号 | 运算规则: 0|1=1|0=1|1=1 0|0=0
非
求反运算 C语言中的符号 ! 运算规则: !1=0 !0=1
C51中的基本数据类型
作用:设定变量前要声明这个变量类型,好让单片机分配合适的存储空间
数据类型 | 关键字 | 所占位数 | 表示数范围 | 无符号字符型 | unsigned char | 8 | 0-255 | 有符号字符型 | char | 8 | -128-127 | 无符号整型 | unsigned int | 16 | 0-65535 | 有符号整型 | int | 16 | -32768-32767 | 无符号长整型 | Unsigned long | 32 |
| 无符号长整型 | long | 32 |
| 单精度实型 | float | 32 |
| 双精度实型 | double | 64 |
| 位类型 | bit | 1 | 0-1 |
二进制两个数每个数所占空间就是1位(b)位也是单片机存储器最小的单位 字节B(1B=8b)
float和double区别:float只能提供7位有效数字,double可以提供6位有效数字。
数据类型扩充定义:
背景:当我们需要在程序中操作这些特殊功能寄存器时,必须在程序最前面将这些名称加以声明,就是把寄存器器地址编码赋给这个名称,这样编译器才认识。
sbit ——特殊功能位声明,声明某个特殊寄存器的某一位
C51中的运算符
分为算术运算符 逻辑运算符 位运算符
算术运算符 | 逻辑运算符 | 位运算符 | 算术运算符 | 含义 | 逻辑运算符 | 含义 | 位运算符 | 含义 | + | 加 | > | 大于 | & | 逻辑与 | - | 减 | < | 小于 | ! | 逻辑或 | * | 乘 | >= | 大于等于 | ^ | 异或 | / | 除 | <= | 小于等于 | ~ | 取反 | ++ | 自加 | == | 测试相等 | >> | 左移 | -- | 自减 | != | 测试不等 | << | 右移 | % | 求余 | & & | 按位与 |
|
|
|
| || | 按位或 |
|
|
|
| ! | 非 |
|
| C51中的基础语句
语句 | 类型 | If | 选择语句 | while | 循环语句 | for | 循环语句 | switch/case | 多分支选择语句 | do-while | 循环语句 | for 语句
格式:for(表达式1;表达式2;表达式3)
{语句(可以为空)}
执行过程:
1求解第一次表达式1
2求解表达式2,若为真则执行for中的语句,然后执行第3步,否则结束for语句,直接跳出,不执行第3步
3第三步:求解表达式3
第4步:跳到第2步重复执行
delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--); //延时xms秒
}
while()语句
格式:while(表达式)
{内部语句(内容可为空)}
特点:先判断表达式,后执行语句
原则:若表达式不为0即为真,执行语句,否则跳出while循环,执行后面语句
应用:1让程序停止 while(1);
2不停地执行某段程序
while(1)
{
P0=0xfe;
}
If语句
格式:if(表达式)
{内部语句}
特点:如果条件表达式为真(非0值),就执行后面的语句;如果条件表达式为假(0值),就不执行后面的语句
解释:使用条件语句if可以构成分支结构,它通过用户给定的条件进行判断,根据判断的结果决定执行不同的分支程序
if(key1=0) //如果key=1(按下S2键)
{
delayms(10); //延时去抖
if(key1=0); //再次检测按键是否按下,如果按下
{
num++; //数字自加1
if(num=60) //如果数字与60测试相等
num=0; //则回到0
while(!key1); //等待按键释放
}
}
switch-case语句
背景;if语句一般用来处理两个分支,处理多个分支需要用if—else—if结构,但若分支较多,就要用switch语句,又称开关语句,switch语句可以直接处理多个分支
格式:
switch(表达式)
{
case常量表达式1:(注意这里是“:”) 执行过程:
语句1; 首先计算switch后面表达式的值
break; 用此值一次与各个case后常量表达式比较
case常量表达式2: 如果此值与某个case后面常量表达式值相等就执行此case后语句
语句2; 当执行遇到break语句就退出switch语句
break; 若表达式值与所有case后面表达式都不相等则执行default后语句并退出
......
case常量表达式n:
语句n;
break;
default:
语句n+1;
break;
}
应用:根据输入考试成绩的等级,输出百分制分数段
switch(grade)
{
case‘A’:
printf(“85-100\n”)
break;
case‘B’:
printf(“70-84\n”);
break;
case‘C’:
printf(“60-69\n”);
break;
case‘D’:
printf(“<60\n”);
break;
default:
printf(“error!\n”);
}
|