单片机课程设计.docx
- 文档编号:30633760
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:44
- 大小:389.91KB
单片机课程设计.docx
《单片机课程设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计.docx(44页珍藏版)》请在冰豆网上搜索。
单片机课程设计
郑州大学信息工程学院
课程设计实验讲义
题目:
单片机系统设计及应用
2009年8月10日
单片机系统设计及应用
§1概述:
一、课程目的:
1、学习单片机最小系统的基本电路、键盘电路、显示电路以及简单I/O电路设计。
2、学习单片机编程语言及设计方法,初步掌握使用C语言的单片机程序设计。
3、掌握单片机与BC7281键盘显示芯片、1602液晶模块的接口电路及程序设计。
4、通过课程设计,使学生对单片机应用具有一定的产品开发及设备维护能力。
二、课程内容:
1、MCS51单片机的最小系统设计。
2、学习单片机编程语言,重点学习C语言在单片机中的应用。
3、设计利用I/O驱动8位发光二极管练习。
4、设计使用BC7281芯片的键盘显示系统。
5、设计使用1602液晶模块的LCD显示系统。
§2MCS51单片机最小系统
一、MCS51单片机概述
1、单片机简介
在一片集成电路芯片上集成微处理器、存储器、I/O接口电路,从而构成了单芯片微型计算机,即单片机。
1980年,Intel公司推出了MCS-51系列单片机:
8位CPU、4K字节ROM、128字节RAM、4个8位并口、1个全双工串行口、2个16位定时/计数器。
寻址范围64K,并有控制功能较强的布尔处理器。
由于结构体系完善,性能非常高,面向控制的特点突出,MCS51已成为公认的单片机经典机种。
2、MCS-51系列
1)、MCS-51是Intel公司生产的一个单片机系列名称。
属于这一系列的单片机有多种,如:
﹡8051/8751/8031;
﹡8052/8752/8032;
﹡80C51/87C51/80C31
﹡80C52/87C52/80C32等。
2)、在功能上,该系列单片机有基本型和增强型两大类:
属于基本型有:
8051/8751/8031、80C51/87C51/80C31等;属于增强型的有8052/8752/8032、80C52/87C52/80C32等。
增强型与基本型的区别在于其内部RAM多一些,并具有3个定时/计数器。
实际上随着MCS51技术的转让,越来越多的单片机厂商在自己的产品中嵌入MCS51内核,并配有非常丰富的接口如IIC、A/D、D/A、SPI……,这类完全兼容MCS51的单片机也属于增强型,它们已经成为MCS51家族的主流产品。
3)、80C51典型产品资源配置
4)、MCS51家族近况
﹡ATMEL公司融入Flash存储器技术的AT89系列;
﹡Philips公司的80C51、80C552系列;
﹡华邦公司的W78C51、W77C51高速低价系列;
﹡ADI公司的ADμC8xx高精度ADC系列;
﹡LG公司的GMS90/97低压高速系列;
﹡Maxim公司的DS89C420高速(50MIPS)系列;
﹡Cygnal公司的C8051F系列高速SOC单片机。
同学们在选用单片机时可根据系统要求选择高、低档单片机。
课程设计选用ATMEL公司的89S52芯片。
二、单片机最小系统设计
1)、单片机结构
图1-1
CPU:
由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;
RAM:
用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;
ROM:
用以存放程序、一些原始数据和表格;
I/O口:
四个8位并行I/O口,既可用作输入,也可用作输出;
T/C:
两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式;
五个中断源的中断控制系统;
一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;
片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。
最高振荡频率为24M。
2)、封装
图1-2
3)、单片机最小系统
图1-3
A)、引脚介绍:
P0~P3:
通用I/O口;
VCC:
电源端,一般接5V;
GND:
电源地;
XTAL1,XTAL2:
外接晶体振荡器,不能超过24M;需加微调电容,一般为30pF;
RST/VPD:
复位端,平时为低电平;
ALE/PROG:
地址锁存允许信号端;
EA/Vpp:
外部程序存储器地址允许输入端/固化编程电压输入端;
B)、机器周期和指令周期
(1)振荡周期:
也称时钟周期,是指为单片机提供时钟脉冲信号的振荡源的周期。
(2)状态周期:
每个状态周期为时钟周期的2倍,是振荡周期经二分频后得到的。
(3)机器周期:
一个机器周期包含6个状态周期S1~S6,也就是12个时钟周期。
在一个机器周期内,CPU可以完成一个独立的操作。
(4)指令周期:
它是指CPU完成一条操作所需的全部时间。
每条指令执行时间都是有一个或几个机器周期组成。
MCS-51系统中,有单周期指令、双周期指令和四周期指令。
C)、复位引脚
RST是复位信号输入端,高电平有效。
当此输入端保持2个机器周期的高电平时,就可以完成复位操作。
RST引脚的第二功能是备用电源的输入端。
D)、EA/Vpp引脚
当EA接高电平时,CPU访问片内ROM,并执行内部程序存储器中的指令,但当PC(程序计数器)的值超过4K时,将自动转去执行片外存储器内的程序。
当EA脚接低电平时,CPU只访问片外ROM并执行外部程序存储器中的指令,而不管是否有片内程序存储器。
VPP是对8751片内ROM固化程序时,作为施加较高编程电压(12V~21V)的输入端。
E)、I/O引脚
P0~P3:
4个8位双向输入输出端口,每个端口都有锁存器、输出驱动器和输入缓冲器。
4个端口都可以做输入输出口使用,其中,P0和P2通常用于对外部存储器的访问。
在这种方式下,把P0口作为地址/数据总线使用,分时输出外部存储器的地址和传送8位数据。
当扩充外部存储器的地址为16位时,P2口作为地址总线的高8位地址使用。
§3MCS51编程基础
一、单片机指令系统(ASM)
1)、概述
指令系统共有7种寻址方式,111条指令。
A)、字节数分类
单字节指令:
49条
双字节指令:
45条
三字节指令:
17条
B)、运行速度分类
单周期指令:
64条
双周期指令:
45条
四周期指令:
2条
C)、功能分类
数据传送类:
29条
算术运算类:
24条
逻辑运算类:
24条
控制转移类:
17条
位操作类:
17条
2)、常用符号约定
Rn:
工作寄存器中的寄存器R0、R1…R7之一。
Ri:
工作寄存器中的寄存器R0或R1,包含在Rn中。
#data:
8位立即数。
#data16:
16位立即数
direct:
片内RAM或SFR的地址(8位)
@间接寻址寄存器
Bit:
片内RAM或SFR的位地址
addr11:
11位目的地址
addr16:
16位目的地址
rel:
补码形式的8位地址偏移量。
偏移范围为-128~127。
/:
位操作指令中,该位求反后参与操作,不影响该位
X:
片内RAM的直接地址或寄存器
(X):
相应地址单元中的内容
→:
箭头左边的内容送入箭头右边的单元内
3)、寻址方式
寻址方式
寻址空间(操作数存放空间)
立即寻址
程序存储器
直接寻址
片内RAM低128字节、SFR
寄存器寻址
工作寄存器R0~R7,A,B,DPTR
寄存器间接寻址
片内RAM:
@R0,@R1,SP
片外RAM:
@R0,@R1,@DPTR
变址寻址
程序存储器:
@A+PC,@A+DPTR
相对寻址
程序存储器256字节范围内:
PC+偏移量
位寻址
片内RAM的位寻址区(20H~2FH字节地址)
某些可位寻址的SFR
表2-1
4)、单片机指令
A)、传送指令
MOVA,Rn
MOVA,direct
MOVA,@Ri
MOVA,#data
MOVRn,A
MOVRn,direct
MOVRn,#data
MOVdirect,A
MOVdirect,Rn
MOVdirect1,direct2
MOVdirect,@Ri
MOV@Ri,A
MOV@Ri,#data
说明:
内部RAM、寄存器间可以直接进行数据的传递。
MOVDPTR,#data16
说明:
这是唯一的一条16位立即数传递指令。
功能:
将一个16位的立即数送入DPTR中去。
其中高8位送入DPH,低8位送入DPL。
MOVXA,@Ri
MOVX@Ri,A
MOVXA,@DPTR
MOVX@DPTR,A
说明:
与外部存储器RAM打交道的只可以是A累加器。
MOVCA,@A+DPTR
MOVCA,@A+PC
说明:
本组指令也被称为查表指令,常用此指令来查一个已做好在ROM中的表格。
PUSHdirect;SPSP+1,(SP)(direct)
POPdirect;(direct)(SP),SPSP-1
B)、算术运算指令
ADDA,#data;A+data→A
ADDA,direct;A+(direct)→A
ADDA,Rn;A+Rn→A
ADDA,@Ri;A+(Ri)→A
ADDCA,Rn;A+Rn+CY→A
ADDCA,direct;A+(direct)+CY→A
ADDCA,@Ri;A+(Ri)+CY→A
ADDCA,#data;A+data+CY→A
INCA;A+1→A
INCRn
INCdirect
INC@Ri
INCDPTR
DAA;十进制调整指令
SUBBA,Rn;A-Rn-CY→A
SUBBA,direct;A-(direct)-CY→A
SUBBA,@Ri;A-(Ri)-CY→A
SUBBA,#data;A-data-CY→A
DECA;A-1→A
DECRn
DECdirect
DEC@Ri
MULAB;A*B
DIVAB;A/B
C)、逻辑运算指令
ORLA,Rn;A∨Rn→A
ORLA,direct;A∨(direct)→A
ORLA,@Ri;A∨(Ri)→A
ORLA,#data;A∨data→A
ORLdirect,A;(direct)∨A→(direct)
ORLdirect,#data;(direct)∨data→(direct)
ANLA,Rn;A∧Rn→A
ANLA,direct;A∧(direct)→A
ANLA,@Ri;A∧(Ri)→A
ANLA,#data;A∧data→A
ANLdirect,A;(direct)∧A→(direct)
ANLdirect,#data;(direct)∧data→(direct)
XRLA,Rn;A⊕Rn→A
XRLA,direct;A⊕(direct)→A
XRLA,@Ri;A⊕(Ri)→A
XRLA,#data;A⊕data→A
XRLdirect,A;(direct)⊕A→(direct)
XRLdirect,#data;(direct)⊕data→(direct)
CPLA;/A→A
CLRA;0→A
D)、循环移位指令
RLA
RRA
RLCA
RRCA
E)、控制转移指令
短转移类指令:
AJMPaddr11
长转移类指令:
LJMPaddr16
相对转移指令:
SJMPrel
间接转移指令:
JMP@A+DPTR
JZrel;如果A=0,则转移,否则顺序执行。
JNZrel;如果A≠0,就转移。
CJNEA,#data,rel
CJNEA,direct,rel
CJNERn,#data,rel
CJNE@Ri,#data,rel
DJNZRn,rel
DJNZdirect,rel
F)、调用指令
LCALLaddr16;长调用指令(3字节)
ACALLaddr11;短调用指令(2字节)
G)、返回指令
RET;子程序返回指令
RETI;中断子程序返回指令
H)、空操作指令
NOP
I)、位操作指令
MOVC,bit;bit→C
MOVbit,C;C→bit
CLRC;使CY=0
CLRbit;使指令的位地址等于0。
SETBC;使CY=1
SETBbit;使指定的位地址等于1
ANLC,bit;Cy与指定位的值相与,结果送Cy
ANLC,/bit;先将指定的位地址中的值取出后取反,再和Cy相与,结果送回Cy。
ORLC,bit
ORLC,/bit
CPLC;使Cy值取反。
CPLbit;使指定的位的值取反。
JCrel
JNCrel
JBbit,rel
JNBbit,rel
JBCbit,rel
二、C51语言设计
当设计一个小的单片机系统时,一般我们都用汇编语言。
在很多工程中这是一个很好的方法,因为代码一般都不超过8K,而且都比较简单。
使用汇编的麻烦在于它的可读性和可维护性,特别当程序没有很好的标注的时候,代码的可重用性也比较低,因为C语言很好的结构性和模块化,更容易阅读和维护,而且由于代码模块化,用C语言编写的程序有很好的可移植性,其功能化的代码能够很方便的从一个工程移植到另一个工程,从而减少了开发时间。
在本讲义中不再重复以往所学关于C的知识,因为C51支持ANSIC(标准C),我们只介绍KeilC(一种常用的C51)与ANSIC的不同之处。
1)、数据类型
KeilC支持ANSIC的所有标准数据类型,除此之外为了更加有利的利用8051的结构,还加入了一些特殊的数据类型,下表显示了标准数据类型在8051中占据的字节数,注意整型和长整型的符号位字节在最低的地址中。
除了这些标准数据类型外,编译器还支持一种位数据类型,一个位变量存在于内部RAM的可位寻址区中,可像操作其它变量那样对位
变量进行操作,但是位数组和位指针是违法的。
数据类型
大小
char/unsignedchar
8bit
int/unsignedchar
16bit
long/unsignedlong
32bit
float/double
32bit
genericpointer
24bit
表2-2
2)、特殊功能寄存器
单片机中特殊功能寄存器一般为8位,用sfr来定义,而16位的特殊功能寄存器用sfr16来定义,如DPTR。
在程序中可以通过名字或地址来引用特殊功能寄存器。
可位寻址的特殊功能寄存器的位变量定义用关键字sbit,SFR的定义如下所示,对于大多数8051成员Keil提供了一个包含了所有特殊功能寄存器和他们的位的定义的头文件,通过包含头文件可以很容易的进行新的扩展。
sfrSCON=0X98;//定义SCON
sbitSM0=0X9F;//定义SCON的各位
sbitSM1=0X9E;
sbitSM2=0X9D;
sbitREN=0x9C;
sbitTB8=0X9B;
sbitRB8=0X9A;
sbitTI=0X99;
sbitRI=0X98;
3)、存储类型
Keil允许使用者指定程序变量的存储区,这使使用者可以控制存储区的使用,编译器可识别以下存储区。
存储区
描述
DATA
RAM的低128个字节可在一个周期内直接寻址
BDATA
DATA区的16个字节的可位寻址区:
20H~2FH
IDATA
RAM区的高128个字节必须采用间接寻址
PDATA
外部存储区的256个字节通过P0口的地址对其寻址,使用指令MOVX@Rn,需要两个指令周期。
XDATA
外部存储区使用DPTR寻址
CODE
程序存储区使用DPTR寻址
表2-3
A)、DATA区
对DATA区的寻址是最快的,所以应该把使用频率高的变量放在DATA区,由于空间有限必须注意使用,DATA区除了包含程序变量外,还包含了堆栈和寄存器组。
DATA区的声明如下例2-1。
例2-1:
unsignedchardatasystem_status=0;
unsignedintdataunit_id[2];
chardatainp_string[16];
floatdataoutp_value;
mytypedatanew_var;
B)、BDATA区
你可以在BDATA区的位寻址区定义变量,这个变量就可进行位寻址,并且声明位变量。
这对状态寄存器来说是十分有用的,因为它需要单独的使用变量的每一位,不一定要用位变量名来引用位变量,下面是一些在BDATA段中声明变量和使用位变量的例子。
例2-2:
unsignedcharbdatastatus_byte;
unsignedintbdatastatus_word;
unsignedlongbdatastatus_dword;
C)、IDATA区
IDATA段也可存放使用比较频繁的变量,使用寄存器作为指针进行寻址。
在寄存器中设置8位地址进行间接寻址,和外部存储器寻址比较,它的指令执行周期和代码长度都比较短。
例2-3:
unsignedcharidatasystem_status=0;
unsignedintidataunit_id[2];
charidatainp_string[16];
floatidataoutp_value;
D)、PDATA与XDATA区
在这两个段声明变量和在其它段的语法是一样的,PDATA段只有256个字节,而XDATA段可达65536个字节。
下面是一些例子。
例2-4:
unsignedcharxdatasystem_status=0;
unsignedintpdataunit_id[2];
charxdatainp_string[16];
floatpdataoutp_value;
对PDATA和XDATA的操作是相似的,对PDATA段寻址比对XDATA段寻址要快,因为对PDATA段寻址只需要装入8位地址,而对XDATA段寻址需装入16位地址,所以尽量把外部数据存储在PDATA段中。
对PDATA和XDATA寻址要使用MOVX指令,需要两个处理周期。
E)、CODE区
CODE区是代码段的数据,是不可改变的。
8051的代码段不可重写,一般代码段中可存放数据表。
跳转向量和状态表对CODE段的访问和对XDATA段的访问的时间是一样的,代码段中的对象在编译的时候初始化,下面是代码段的声明例子。
例2-5:
unsignedintcodeunit_id[2]=1234;
unsignedcharcodechar_num[]={
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15
};
4)、指针
C51提供一个3字节的通用存储器指针,通用指针的头一个字节表明指针所指的存储区空间,另外两个字节存储16位偏移量,对于DATA、IDATA和PDATA段只需要8位偏移量。
Keil允许使用者规定指针指向的存储段,这种指针叫具体指针,使用具体指针的好处是节省了存储空间,编译器不用为存储器选择和决定正确的存储器操作指令产生代码,这样就使代码更加简短,但你必须保证指针不指向你所声明的存储区以外的地方,否则会产生错误,而且很难调试。
指针类型
大小
通用指针
3字节
XDATA指针
2字节
CODE指针
2字节
IDATA指针
1字节
DATA指针
1字节
PDATA指针
1字节
表2-4
5)、中断服务
8051的中断系统十分重要,C51使你能够用C来声明中断和编写中断服务程序(当然你也可以用汇编来写)。
中断过程通过使用interrupt关键字和中断号(0到31)来实现.,中断号告述编译器中断程序的入口地址,中断号对应着IE寄存器中的使能位,换句话说IE寄存器中的0位对应着外部中断0,相应的外部中断0的中断号是0,表2-5反映了这种关系。
IE寄存器中的使能位和C中的中断号
中断源
0
外部中断0
1
定时器出0溢
2
外部中断1
3
定时器1溢出
4
串行口中断
5
定时器2溢出(8051没有此中断源)
表2-5
例2-6
voidtimer0(void)interrupt1{
TR0=0;//停止定时器0
TH0=RELOADVALH;//50ms后溢出
TL0=RELOADVALL;
TR0=1;//启动T0
tick_count++;//时间计数器加1
printf("tick_count=%05u\n",tick_count);
}
上例中的定时器0中断,在主程序中必须打开定时器0中断。
例2-7
Voidmain()
{
……
ET0=1;
EA=1;
TR0=1;
……
}
§4MCS51单片机程序设计练习
本章我们将一步一步、由浅入深地学习单片机编程方法及相关电路设计。
一、跑马灯设计
1)、实验目的
A)、学习P0口的使用方法。
B)、掌握循环移位的工作原理。
C)、学习延时子程序的编写和使用。
D)、掌握LED控制电路设计方法。
2)、实验内容
单片机P0口相连的8个发光二极管按一定时间间隔循环移位点亮。
3)、电路设计
如图4-1所示,单片机P0口(图中为D0~D7)经74LS245三态双向总线收发器,8路输出依次连接到LED3至LED10的阴极,VCC通过限流电阻接在LED阳极,通过控制74LS245的片选E及方向控制DIR,利用P0口使所对应管脚按顺序依次由高电平变为低电平再变为高电平。
注意P0口必须接上拉电阻。
图4-1发光二极管电路
4)、实验原理
A)、P0口为三态双向口,当做I/O口使用时,必须加上拉电阻。
输出0点亮,输出1熄灭LED
B)、使用左移位寄存器指令实现跑马灯,函数为_crol_()。
C)、延时程序的实现。
现常用的有两种方法,一是用定时器来实现,一是用指令循环来实现。
D)、使用定时器时间常数可按下述方法确定:
机器周期=12÷晶振频率=12/(11.0592×10⁶)=1.085us
设计数初值为X,则(216-X)×1.085×10-6=0.048(s),可求得X=21299
化为十六进制则X=5333H,故初始值为TH0=53H,TL0=33H(使用定时器0)
E)程序初始化:
定时器使用中断方式需要对系统进行初始化,主要是对IP、IE、TCON、TMOD的相应位进行正确的设置,并将时间常数送入定时器中。
由
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计