单片机技术开发.docx
《单片机技术开发.docx》由会员分享,可在线阅读,更多相关《单片机技术开发.docx(107页珍藏版)》请在冰点文库上搜索。
单片机技术开发
《单片机技术开发》教案
白话单片机
一、基础篇
以8051单片机为载体,学习C语言“三基”,即基本概念、基础知识、基本方法应用。
通过8051端口上接LED灯来查看程序运行结果。
C语言基础知识总结如下:
1.8051及8051最小系统
2.C51程序的基本结构形式
“三段”结构形式
第一段:
头文件#include单片机内部的特殊功寄存器
#include数学函数
#include小型操作系统
第二段:
变量、常量及可调用函数定义区
变量unsignedcharI;
常量unsignedcharcodetable[]={0x01,0x02,0x03};
可调用函数:
Voiddelay()
{
Unsignedintt=60000;
While(t--){;}
}
第三段:
主函数
Main()
{
//初始化区域
局部变量的定义
单片机设备的初始化。
While
(1)
{
----;
}
}
3.程序设计三种结构(顺序、循环、选择)
程序设计有哪三种结构?
4.数组知识
Code
Unsignedcharcodetable[]={0x01,0x02};
Unsignedchartable[]={0x01,0x02};
说明这两种定义方法的区别,并说明那种在单片机设计中更具有优势?
第一种定义方式数据在程序存储区;第二种定义方式数据在数据存储区;
数组数据为常数,其存放于数据区,会浪费数据存储区的宝贵资源;在单片机设计中,第一种定义方式更具有优势:
节省数据空间。
5.单片机内部数据的显示(二进制)以及二进制到十进制之间的转换显示
6.指针的用法
7.数学运算
8.小型操作系统
二、硬件篇
三、应用篇
第一周计算机系统概述
第一周星期一34节
一、单片机是计算机
1.单片机是计算机,是微型计算机。
2.计算机具有五大部件:
运算器、控制器、存储器、输入设备、输出设备
3.单片机也同样具有这五大部件,所以单片机是计算机。
二、单片机的应用场合
复习题:
1.为什么说单片机是计算机?
根据冯诺依曼计算机体系结构,任何计算机都具有五大部件,即运算器、控制器、存储器、输入设备和输出设备;单片机同样也具有这五大部件,所以说单片机是计算机。
2.计算机具有哪五大部件?
运算器、控制器、存储器、输入设备和输出设备
第一周星期三34
一、单片机五大部件体现
1.运算器、控制器合称为中央处理器,集成在单片机“黑壳”内部,看不见摸不着
2.存储器用于存储单片机执行时的程序,以及执行程序过程中产生的中间变量。
存储器有大小之分,存储器越大单片机的价格越高
3.输入设备和输出设备,这是单片机能看得见摸着的。
复习题:
1.中央处理器包含那两个重要部件?
运算器和控制器
2.构成运算器的最重要部件是什么?
其主要的功能是什么?
构成运算器的最重要的部件是ALU,简称算数逻辑部件。
其主要的功能就是完成算数运算,包括加减乘除;以及逻辑运算,包括与、或、非。
3.8051单片机存储器的构成?
并说明其功能。
4.描述存储器容量的单位。
BitbyteKBMBGBTB
5.8051单片机的那几个端口?
其功能是什么?
P0P1P2P3,这四个端口是单片机的输入设备和输出设备的体现。
也就是说,这四个端口既可以作为输入设备来使用,也可以作为输出设备来使用。
6.8051单片机有多少个引脚?
可以分为几类?
40
电源类VCCGND
时钟类1819
复位信号9RST
/EA内外程序存储器访问控制端
32个输入、输出引脚,也成为通用IO口
第一周星期五34
二、“黑壳”单片机
1.对于我们而言,我们能看到的仅仅是单片机的对外的引脚。
其他的运算器、控制器和存储器都封装在单片机的内部。
2.对于单片机入门而言,最重要的就是关注单片机的外部引脚。
3.单片机的外部引脚既可以作为输入来使用,也可以作为输出来使用。
第二周嵌入式系统
第二周星期一34
单片机外部引脚
1.单片机由电源引脚、复位引脚、时钟引脚、EA\引脚组成。
2.电源引脚是提供+5V的直流电源
3.复位引脚的功能是提供复位功能,类似于我们台式计算机的复位引脚。
当程序跑乱了,或者人为需要中途重新启动单片机系统,需要用到该复位电路。
4.时钟引脚的功能是为整个单片机系统提供时钟脉冲,类似于数字电路中的时钟脉冲一样。
单片机作为一种具有中央处理器的数字器件,它的工作也遵循着一般数字器件的工作原理,也就是在时钟脉冲的驱动下一步一步的工作。
5.EA\是选择使用内部的程序存储器还是选择使用外部的程序存储器。
第二周星期三34
单片机最小工作系统
1.单片机最小工作系统是仅仅为单片机加上电源、晶振、复位电路、EA\接高电平构成的电路
2.单片机最小工作系统的存储器使用的内部存储器
3.单片机最小工作系统的重要性是现在绝大多数的单片机设计仅仅用到单片机最小工作系统就可以满足了;也就是说,用最小工作系统就能满足90%的设计项目。
4.单片机最小系统属于嵌入式系统的一个重要的组成部分。
嵌入式系统
1.嵌入式系统是处理器焊接在板子上的计算机系统
2.单片机系统是最低档次或者说最低层次的嵌入式系统
3.嵌入式系统可以分为8位、16位、32位系统;单片机系统属于8位系统,所以说它是最低层次的嵌入式系统。
复习题:
1.画出单片机最小工作系统电路原理图?
并标明电子元器件数据参数?
2.按处理器字长来划分,嵌入式系统可以分为哪几类?
并说明其代表性的处理器型号?
字长—计算机处理器一次所能处理的二进制位数的长度,字长越长说明处理器处理能力越强。
按字长长度来划分处理器,可以分为三类:
8位机、16位机、32位机。
8位机代表型号为8051单片机;16位机代表型号为dsp;32位机代表型号为ARM处理器。
3.8051单片机最小工作系统包含那几个部分?
复位电路、时钟电路、EA/、电源。
第二周星期五34
一、单片机系统的工作原理
1.单片机是计算机,所以单片机遵循着一般计算机的工作原理,既存储程序的原理。
2.单片机系统的工作用到硬件系统和软件系统,硬件系统一般是单片机最小工作系统;软件系统一般是由汇编语言和C语言编写的程序
3.单片机系统一般不带操作系统,这也是单片机系统时最底层细嵌入式系统的要害
4.软件系统是将C程序写入到单片机的程序存储器中
二、单片机的开发工具
1.单片机最小工作系统板
2.单片机编程器
3.通过编程器把程序写入到单片机中,然后上电执行。
第三周2013-3-11星期一
单片机存储系统
一、计算机系统
--具有五大部件:
运算器、控制器、存储器、输入设备、输出设备
--单片机的输入设备和输出设备反映在单片机的对外的引脚上。
单片机的外部引脚可以作为输入来使用,也可以作为输出来使用。
--单片机作为计算机是通过存储程序的原理工作的
二、单片机存储系统共
单片机存储系统分为程序存储区和数据存储区两块。
--程序存储区
A.功能用于存储我们写的程序。
容量是4k8K16K32K64K。
相当于我们台式计算机的硬盘。
B.由flash构成,可以反复擦写。
至少擦写次数为一万次
C.通过在线下载线或者是专用编程器,可以将我们写的程序烧写到单片机内部的程序存储器中
--数据存储器
A.功能用于存放单片机系统运行过程中产生的中间变量,相当于我们台式计算机的内存
B.容量是256B512B1024B
第三周2013-3-13星期三
一.复习
1.存储器分类
RAM:
随机访问存储器。
特点:
成本高、价格贵;掉电后,所存储信息全部丢失。
--分类:
静态RAM和动态RAM
---静态RAM:
成本特别高、速度特别快,是构成Cache的主要部件。
---动态RAM:
成本相对低,速度相对慢(相对于Cache),是构成计算机系统内存的主要部件。
--RAM是构成8051单片机数据存储器的主要部件。
ROM:
只读存储器
Flash:
闪存,特点是可以读写,掉电之后,所保存的信息不丢失。
是构成8051单片机程序存储器的主要部件。
2.单片机存储系统
单片机存储系统分为程序存储区和数据存储区两块。
--程序存储区
D.功能用于存储我们写的程序。
容量是4k8K16K32K64K。
相当于我们台式计算机的硬盘。
E.由flash构成,可以反复擦写。
至少擦写次数为一万次
F.通过在线下载线或者是专用编程器,可以将我们写的程序烧写到单片机内部的程序存储器中
--数据存储器
A.功能用于存放单片机系统运行过程中产生的中间变量,相当于我们台式计算机的内存
B.容量是256B512B1024B
二、延时函数的编写
#include
Voiddelay()
{
Unsignedintt=5000;
While(t--){;}
}
Main()
{
P1=0x01;delay();
P1=0x02;delay();
P1=0x04;delay();
P1=0x08;delay();
P1=0x10;delay();
P1=0x20;delay();
P1=0x40;delay();
P1=0x80;delay();
}
注:
1.整个主函数仅仅执行一次。
最后的状态停留在0x80上,此时只有一盏灯亮。
2.delay()函数式全局函数,可以在主函数中灵活调用
3.delay()函数的存在,延时了P1=0x02的执行;使得P1=0x01执行的时间更长,灯亮的效果更具有可看性
4.如果没有delay()函数的存在,我们会看到灯一闪而过,最后停在0x80只有一盏灯的效果上。
原因是,每条语句的执行都是在毫秒级别上。
5.为了使灯的效果反复流动,可以加上一个死循环。
2013-3-15星期五34节
习题课
1.通过字节控制字方式,在P1端口上做流水灯的效果
2.通过字节控制字方式,在P1端口上做单灯闪烁三次后,再做流动。
3.训练延时函数的编写
总结:
单片机就是计算机
1.认识单片机。
单片机就是计算机,包括五大部件;运算器、控制器以及存储器封装在黑壳里面;外面我们能看得到是单片机的输入、输出引脚。
2.既然单片机是计算机,那么单片机的工作原理、运行方式遵循一般计算机的工作机制。
也就是说,单片机是靠存储程序的原理工作的。
3.硬件是基础,软件是灵魂。
同样的硬件,运行不同的软件,最终的功能也就不同。
第四周2013-3-18星期一
一、复习延时函数
1.延时函数的意义
A.对于流水灯,添加延时函数是为了区分状态
B.单片机作为快速器件,而还有一些慢速器件,为了正确读取慢速起建立的数据,必须添加延时函数,等待慢速器件。
例如AD转换器件
二、复习字节控制字方式
--一次同时书写八个数据
三、单片机程序结构
--#include
--全局变量定义区域(可以包括延时函数、全局变量、位变量等)
--main()
--{
初始化区域;
While
(1)
{
反复语句;
}
}
三、位控制方式
1.P0~P3不但可以采用字节控制字方式,也可以采用位控制方式
2.字节控制字方式是一次书写八个数据,例如P0=0x01
3.P0-P3端口的每一位也可以单独控制,某一位状态的改变会被反映到对应的单片机外部端口的某一引脚上。
4.在reg52.h中仅仅定义了P0-P3端口,而没有定义每个端口上的某一引脚,所以我们在进行位控制的时候,必须在程序中自己定义某一引脚。
例如:
sbitmotor=P1^6;//用来控制电机
Sbitjdq=P3^7;//用于控制继电器
5.定义位语句的位置,位于全局变量定义区域。
五、例子
设计要求:
点亮一盏灯。
状态1
○
○为不亮;●亮。
通过程序使得一盏灯由状态1变为状态2.
状态2
●
第四周2013-3-20星期三34节
数组在流水灯中的应用
一、数组概念
Unsiglenedchartable[]={0x01,0x02,0x04,0x08}
数据类型
数组名
数组元素
数组下标
数组的引用table[0]
二、数组在单片机程序设计中的定义
1.数组的定义位于变量定义区域中。
一般作为全局变量来使用。
2.例如数码管表数据、流水等数据
三、数组举例
1.直接使用数组引用来进行流水灯程序的编写
#include
Unsignedchartable[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
Voiddelay()
{
Unsignedinti=5000;
While(i--){;}
}
Main()
{
While
(1)
{
P1=table[0];delay();
P1=table[1];delay();
P1=table[2];delay();
P1=table[3];delay();
P1=table[4];delay();
P1=table[5];delay();
P1=table[6];delay();
P1=table[7];delay();
}
}
2.使用for循环控制数组,实现流水灯效果
#include
Unsignedchartable[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
Voiddelay()
{
Unsignedinti=5000;
While(i--){;}
}
Main()
{
Unsignedchari;
While
(1)
{
For(i=0;i<8;i++)
{P1=table[i];delay();}
}
}
总结:
流水灯
4.流水灯为项目,分别通过直接对端口写字节控制字、数组控制字、位控制来分别实现,训练学生对C51基础知识的掌握。
5.流水灯项目,分三个任务。
任务一:
字节控制字方式;任务二:
数组字控制方式;任务三:
位控制方式。
项目
任务
学时
流水灯
任务一:
字节控制字方式
6
任务二:
数组字控制方式
6
任务三:
位控制方式
6
第四周2013-3-22星期五34节
一、复习流水灯的三种实现方式。
1.引脚操作(位操作)
2.端口操作(字节操作)
3.数组操作,本质是端口操作方式
二、编程训练
1.使用引脚操作实现以下灯的控制
7
6
5
4
3
2
1
0
○
不亮
●
亮
状态1到状态9循环
状态1
○
○
○
○
○
○
○
○
状态2
○
○
○
○
○
○
○
●
状态3
○
○
○
○
○
○
●
○
状态4
○
○
○
○
○
●
○
○
状态5
○
○
○
○
●
○
○
○
状态6
○
○
○
●
○
○
○
○
状态7
○
○
●
○
○
○
○
○
状态8
○
●
○
○
○
○
○
○
状态9
●
○
○
○
○
○
○
○
2.使用引脚操作实现以下灯控制
7
6
5
4
3
2
1
0
○
不亮
●
亮
状态1到状态9循环
状态1
○
○
○
○
○
○
○
○
状态2
○
○
○
○
○
○
○
●
状态3
○
○
○
○
○
○
●
●
状态4
○
○
○
○
○
●
●
●
状态5
○
○
○
○
●
●
●
●
状态6
○
○
○
●
●
●
●
●
状态7
○
○
●
●
●
●
●
●
状态8
○
●
●
●
●
●
●
●
状态9
●
●
●
●
●
●
●
●
第五周2013-3-25星期134节
一、复习流水灯的三种实现方式。
1.引脚操作(位操作)
2.端口操作(字节操作)
3.数组操作,本质是端口操作方式
三、编程训练
3.使用端口操作实现以下灯的控制
7
6
5
4
3
2
1
0
○
不亮
●
亮
状态1到状态9循环
十六进制
二进制
7
6
5
4
3
2
1
0
状态1
○
○
○
○
○
○
○
○
0xff
1
1
1
1
1
1
1
1
状态2
○
○
○
○
○
○
○
●
0xfe
1
1
1
1
1
1
1
0
状态3
○
○
○
○
○
○
●
○
0xfd
1
1
1
1
1
1
0
1
状态4
○
○
○
○
○
●
○
○
0xfb
1
1
1
1
1
0
1
1
状态5
○
○
○
○
●
○
○
○
0xf7
1
1
1
1
0
1
1
1
状态6
○
○
○
●
○
○
○
○
0xef
1
1
1
0
1
1
1
1
状态7
○
○
●
○
○
○
○
○
0xdf
1
1
0
1
1
1
1
1
状态8
○
●
○
○
○
○
○
○
0xbf
1
0
1
1
1
1
1
1
状态9
●
○
○
○
○
○
○
○
0x7f
0
1
1
1
1
1
1
1
(1)直接端口控制
#include
voiddelay()
{
unsignedintt=50000;
while(t--){;}
}
main()
{
while
(1)
{
P0=0xff;delay();
P0=0xfe;delay();
P0=0xfd;delay();
P0=0xfb;delay();
P0=0xf7;delay();
P0=0xef;delay();
P0=0xdf;delay();
P0=0xbf;delay();
P0=0x7f;delay();
}
}
(2)直接数组引用控制
#include
//数据表
unsignedchartable[9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
voiddelay()
{
unsignedintt=50000;
while(t--){;}
}
main()
{
while
(1)
{
P0=table[0];delay();
P0=table[1];delay();
P0=table[2];delay();
P0=table[3];delay();
P0=table[4];delay();
P0=table[5];delay();
P0=table[6];delay();
P0=table[7];delay();
P0=table[8];delay();
}
}
(3)数组循环控制
#include
//数据表
unsignedchartable[9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
voiddelay()
{
unsignedintt=50000;
while(t--){;}
}
unsignedchari;//全局变量
main()
{
while
(1)
{
for(i=0;i<9;i++)
{
P0=table[i];
delay();
}
}
}
4.使用端口操作实现
7
6
5
4
3
2
1
0
○
不亮
●
亮
状态1到状态9循环
状态1
○
○
○
○
○
○
○
○
状态2
○
○
○
○
○
○
○
●
状态3
○
○
○
○
○
○
●
●
状态4
○
○
○
○
○
●
●
●
状态5
○
○
○
○
●
●
●
●
状态6
○
○
○
●
●
●
●
●
状态7
○
○
●
●
●
●
●
●
状态8
○
●
●
●
●
●
●
●
状态9
●
●
●
●
●
●
●
●
#include
//数据表
unsignedchartable[9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
voiddelay()
{
unsignedintt=50000;
while(t--){;}
}
main()
{
while
(1)
{
P0=table[0];delay();
P0=table[1];delay();
P0=table[2];delay();
P0=table[3];delay();
P0=table[4];delay();
P0=table[5];delay();
P0=table[6];delay();
P0=table[7];delay();
P0=table[8];delay();
}
}
#include
voiddelay()
{
unsignedintt=6000;
while(t--){;}
}
main()
{
while
(1)
{
P0=0xff;delay();
P0=0xfe;delay();
P0=0xfc;delay();
P0=0xf8;delay();
P0=0xf0;d