您好,欢迎来到华佗健康网。
搜索
您的当前位置:首页单片机课程设计报告

单片机课程设计报告

来源:华佗健康网


目录

第一章:课程设计的目的、任务和要求 „„„„„„„„„„„„„„„„„„„2 1.1 课程设计的目的和要求 „„„„„„„„„„„„„„„„„„„„„„2 1.2 课程设计预备知识 „„„„„„„„„„„„„„„„„„„„„2 1.3 课程设计的任务 „„„„„„„„„„„„„„„„„„„„„„2 第二章:总体设计 „„„„„„„„„„„„„„„„„„„„„„„„„„„„3

介绍对系统设计的总体认识及解决方案,并对采取的方案进行论证

第三章:硬件设计„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„3

介绍本系统所选用的各种芯片的功能、引脚、相应的命令控制字格式等, 画出系统 工作原理图及实现方法

第四章:软件设计„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„9

介绍本系统的主要功能模块程序的框图,以及总体程序框图和设计思路

第五章:系统调试„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„15

介绍系统调试过程以及出现的问题、解决方法

第六章:结束语„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„16

简述课程设计的收获、体会以及对本教学环节的意见和建议

参考文献: „„„„„„„„„„„„„„„„„„„„„„„„„„„„„16

附录1 系统工作原理图 „„„„„„„„„„„„„„„„„„„„„„„17

1

第一章:课程设计的目的任务和要求

1.1 课程设计的目的和要求

课程设计目的:

《单片机应用基础》课程设计是学好本门课程的又一重要实践性教学环节,课程设计的目的就是配合本课程的教学和平时实验,以达到巩固消化课程的内容,进一步加强综合应用能力及单片机应用系统开发和设计能力的训练,启发创新思维,使之具有单片机产品和科研的基本技能,是以培养学生综合运用所学知识的过程,是知识转化为能力和能力转化为工程素质的重要阶段。

课程设计要求:

1、利用PROTEUS软件设计各模块工作原理图,并进行模拟仿真 2、控制程序设计、调试及实现

(1)根据要求,写出完整的程序流程图;

(2)将设计程序输入、汇编,排除语法错误,生成*.OBJ文件; (3)利用PROTEUS软件进行电路模拟仿真和程序调试

3、设计硬件电路并烧写程序,调试后系统能按照要求工作 4、写出课程设计说明书 1.2 课程设计预备知识

了解基本的电路符号及其工作原理;了解各种电子元件的作用和用途;熟悉PROTEUS软件的基本操作,能用PROTEUS软件设计印刷电路板图;知道基本的编程方法(汇编语言或C语言)。

1.3 课程设计的任务

根据给定的任务要求选择合适的单片机和其他电子元器件,进行系统硬件电路设计和软件编程,根据系统制作并调试系统电路板,使之实现任务要求。有关参数选择要求符合国家标准。具体设计内容如下: 1、模拟键盘输入及显示模块

2、设计系统工作原理图,利用PROTEUS软件绘制系统工作原理图 3、系统控制程序设计、调试及实现 (1)根据要求,写出完整的程序流程图;

(2)将设计程序输入、汇编,排除语法错误,生成*.OBJ文件;

2

(3)按所设计的原理图,在实验平台上连线,检查无误;

(4)将目标文件传送到实验系统,执行并运行调试该程序,最终实现控制要求 4、写出设计说明书(3000字左右)

第二章:总体设计

由于实验仿真系统的CPU是80C51并且考虑到自己对单片机学习的程度,因此选择单片机型号为80C51;LED显示器选择型号为7SEG-MPX6-CA-BLUE,为六位八段,共阳极接法的显示器,可以显示0-9和A-F 16个按键结果;键盘种类选择矩阵式按键(为了减少I/O口的占用),由单个按钮通过连线组成4*4=16的键盘。

第三章:硬件设计

一 单片机80C51 1、 80C51简述

单片机专业名称—Micro Controller Unit(微控制器件),它是由大名鼎鼎的 INTEL公司发明的最早的系列是MCS-48, 后来有了MCS-51我们经常说的51系列 单片机就是MCS-51micro controller system,它是一种8位的单片机80C51 单片机系列是在MCS-51系列的基础上 发展起来的,早期的80C51只是MCS-51 系列众多芯片中的一类,但是随着后来 的发展,80C51已经形成的系列, 并且成为当前8位单片机的典型代表。

2、80C51的信号引脚 (1)VCC 40脚接电源+5V (2)VSS 20脚接地也就是GND

(3)XTAL1 19脚和XATL2 18脚接振荡电路

图<1-1> 12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.780C51293031PSENALEEA9RST19U3XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD39383736353433322122232425262728101112131415161718XTAL2 单片机是一种时序电路必须有脉冲信号才能工作在它的内部有一个时钟产生电路有两种振荡方式一种是内部振荡方式只要接上两个电容和一个晶振即可另一种是外部振荡方式采用外部振荡方式时需在XTL2上加外部时钟信号

3

(4)PSEN 29脚片外ROM读选通信号低电平有效

(5)ALE/PROG 30脚地址锁存信号输出端/EPROM编程脉冲输入端

在系统扩展时,ALE用于控制把P0口输出的低八位地址送入锁存器锁存起来,以实现低位地址和数据的分时传送。此外由于ALE是以六分之一晶振频率的固定频率输出的正脉冲,因此可作为外部时钟或外部定时脉冲使用。 (6)RST/VPD 9脚复位信号输入端/备用电源输入端 (7)EA/VPP 31脚内/外部ROM选择端

在30脚9脚的功能上不知大家注意没有都有一个/什么意思呢这是引脚的第二功能也就是说该引脚既可以作前面的功能也可以作后面的功能。

(8) P0口(P0.0-P0.7) 39-32脚双向I/O口 字节地址为80H,位地址为80H-87H (9) P1口 (P1.0-P1.7) 1-8脚准双向通用I/0口 字节地址为90H,位地址为90H-97 (10) P2口 (P2.0-P2.7) 21-28脚准双向I/0口 字节地址为0A0H,位地址为0A0H-0A7H

(11) P3口 (P3.0-P3.7) 10-17脚准双向I/0多用途口 字节地址为0B0H,位地址为0B0H-0B7H 3、端口的工作原理 (1)P0口

P0口的内部有一个2选1的选择器它受内部信号的控制,处在I/O口工作方式此时相当于一个准双向口输入时须先将口置1每根口线可以定义为输入或输出但是须在口线上加上拉电阻如果将开关往另一个方向则就是另一个功能—作为地址/数据复用总线用此时不能逐位定义为输入/输出它有两种用法当作数据总线用时输入8位数据而当作地址总线用时则输出低8位地址再强调一点当P0口作为地址/数据复用总线用之后就再也不能作I/O口使用了。 (2)P1口

同P0不同P1口只能作为I/O口使用但它的内部有一个上拉电阻所以连接外围负载时不需要外接上拉电阻这一点P1、P2、P3都一样务必请大家记住 (3)P2口

P2口作为I/O口线用时与P0口一样当内部开关向另一个方向时即作地址输出时可以输出程序存储器或外部数据存储器的高8位地址并与P0口输出的低地址一起构成16位的地址线(注意和数据总线的区别数据总线是8位的很多书上都会提到51单片机是8位数据总线

4

16位地址总线但都不会解释有什么不同看到这里你应该明白了吧)16位的地址可以寻址K的程序存储器或外部数据存储器为什么下一课我们再给大家解释这里要注意的是当P2口作为地址总线时这高8位地址线是8位一起输出的不能象I/O口线那样逐位定义这和P0口是一样的

(4)P3口

P3口作为I/O口线用时同其他的端口相同也是准双向口不同的是P3口的每一位都有另一种功能也叫第二功能各位的功能如下它们的具体作用我们用到时再详细解释

端口位 第二功能 注释 P3.0 RXD 串行口输入 P3.1 TXD 串行口输出 P3.2 INTO 外部中断0 P3.3 INT1 外部中断1 P3.4 T0 计数器0计数输入 P3.5 T1 计数器1计数输入 P3.6 WR 外部RAM写入选通信号 P3.7 RD 外部RAM读出选通信号

二、上拉电阻

当P0口作输出口(写)使用时,由于输出电路 是漏极开路电路,必须外接上拉电阻才能有高电平 输出。本电路用的上拉电阻如图<1-2>示。 三、4*4键盘设计

键盘是有若干按键组成的开关矩阵,是嵌入式控 制的一种输入部件。键盘分两种:一种是式按键, 另一种是矩阵式按键。式按键用的比较少在应用 中通常需要数量较多的按键,为了减少I/O口的占用, 通常将按键排列成矩阵形式,因此选用矩阵式键盘。 矩阵式结构的键盘显然比直接法要复杂一些,识别 也要复杂一些,行线通过电阻接正电源,并将列线所接

的单片机的I/O口作为输出端,而行线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就

5

RP11234567RESPACK-8 图<1-2>

会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。最后的键盘连接图如下图<1-3>所示。 H2H1L1L2L3L404H3159D26AE37BF

H48C

图<1-3>

四、LED显示器

LED是发光二极管的英文缩写,LED显示器是由发光二极管构成的,它在单片机中的应用非常普遍。通常所说的LED显示器由7个发光二极管组成,其排列形状如图所示。此外,显示器中还有一个圆点型发光二极管以dp表示,用于小数点表示。通过七个发光二极管亮暗的不同组合,可以显示多种数字、字母以及其它符号。LED显示中的发光二极管共有两种连接方法:

共阳极接法:把发光二极管的阳极连在一起构成公共阳极。使用时公共阳极接+5V。这样阴极端输入低电平的段发光二极管就导通点亮,而输入高电平的则不亮。

共阴极接法:把发光二极管的阴极连在一起构成公共阴极。使用时公共阴极接地。这样阳极端输入高电平的段发光二极管就导通点亮,而输入低电平的则不亮。

图<1-4>

6

共阴极 共阳极 符号和引脚 控制数码管驱动级的控制电路有静态式和动态式两类:

静态驱动:它是指每个数码管都要用一个译码器译码驱动。

动态驱动:它是所的数码管使用一个专门的译码驱动器,使各位数码管逐个轮流显示,它的扫描速度极快,因此显示效果与静态驱动相同。

采用动态数码管显示,可以大幅度地降低硬件成本和电源的功耗,因为某一时刻只有一个数码管工作,就是所谓的分时显示,显示所需要的硬件电路可分时复用。

本次设计选择的LED显示器为7SEG-MPX6-CA-BLUE,为六位八段,共阳极接法的显示器,如图<1-4>所示。

图<1-5>

五、键盘输入与LED显示

设计中通过键盘输入到单片机中,由程序控制找到输入点,计算键码,调用显示模块,把输入的数值通过LED显示器显示出来。

(1) 判断键盘中有无键按下: 将全部行线P3.0到P3.3置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。 (2) 判断闭合键所在的位置: 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:将行线置为低电平,即在置行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。检测的方法是P3.4-P3.7输出全“1”,读取P3.0-P3.3的状态,若P3.0-P3.3为全“0”,则无键闭合,否则有键闭合。

7

(3) 去除键抖动:当检测到有键按下后,延时一段时间再做下一步的检测判断。 (4) 识别:当确定键按下时,通过软件计算键码找到相对位置的数据调用显示模块把数字或字母显示出来。

表1 十六进制数字形代码表

字型 0 1 2 3 4 5 6 7 8 共阳极代码 C0H F9H A4H B0H 99H 92H 82H F8H 80H 共阴极代码 3FH 06H 5BH 4FH 66H 6DH 7DH 07H 7FH 字型 共阳极代码 90H 88H 83H C6H A1H 86H 8EH FFH 共阴极代码 9 A B C D E F 灭 6FH 77H 7CH 39H 5EH 79H 71H 00H

六、设计的系统工作原理图

图<1-6>

8

实现方法:

用80C51的并行口P3接4×4矩阵键盘,以P3.0-P3.3作输入线,以P3.4-P3.7作输出线,P0口接上拉电阻实现高电平输出,作LED显示器显示的段控口,以P1.0-P1.5作LED显示器显示的位控口,在数码管上显示每个按键的“0-F”序号。

第四章:软件设计

1、键盘扫描程序

键盘上的按键按行列组成矩阵,在行列的交点上都对应有一个按键。为判断有无键按下(闭合键)以及被按键的位置,可使用两种方法:扫描法和反转法,其中以扫描法较为普遍应用,因此我们选择扫描法编写程序。

首先判断有无键被按下,键盘的行线一端接单片机P3.0-P3.3口作输入口线,列线接P3.4-P3.7口作输出口线,为判断有没有键被按下,可先经输出口向所有列线输出低电平,然后再输出各行线状态。若行线状态皆为高电平,则表明无键按下;若行线状态中有低电平。则表明有键被按下。

然后再判断被按键所在的位置,因为在键盘矩阵中有键被按下时,被按键处的行线和列线被接通,使穿过闭合键的那条行线变成低电平。

判断见按下的位置的扫描是这样进行的:先使输出口输出0FEH,然后再输入行线状态,测试行线状态中有没有低电平的,如果没有低电平,再使输出口输出0FDH,再测试行线状态,到输出口输出0F7H时,行线中有低电平状态的就说明有闭合键,通过此次扫描的行线值和列线值就可以知道闭合键的位置。

键码计算:被按键被确定下来之后,接下来的工作就是计算闭合键的键码,因为有了键码,才好通过散转指令把程序执行转到闭合键所对应的中断服务程序上去。

本来可以直接使用该闭合键的行列值组合产生键码,但这样做会使各子程序的入口地址比较散乱,给JMP指令的使用带来不便。因此以键的排列顺序安排键号,这样安排使键码可以根据行号和列号以查表求得,也可通过计算求得。 键码的计算公式为: 键码=行首号+列号 。

9

键盘扫描流程图:

P3=0FFH,P3.4=0 有键按下? P3=0FFH,P3.6=0 有键按下? 延时10ms 延时10ms 真得有键按下? 真得有键按下? 根据当前状态识别按键 根据当前状态识别按键 P3=0FFH,P3.5=0 有键按下? P3=0FFH,P3.7=0 有键按下? 延时10ms 延时10ms 真得有键按下? 真得有键按下? 根据当前状态识别按键 根据当前状态识别按键

键盘扫描子程序: void keyscan()

{ P3=0xff; /**** 输入口和输出口都置为高电平****/

keyin(0xfe,0,1,2,3); keyin(0xfd,4,5,6,7); keyin(0xfb,8,9,10,11); keyin(0xf7,12,13,14,15); }

/**** 键输入函数 ****/

void keyin(uchar zhi,uchar a,uchar b,uchar c,uchar d) { P3=zhi; temp=P3; temp=P3&0xf0;

10

if(temp!=0xf0)

{ delay(10); temp=P3; temp=P3&0xf0; }

if(temp!=0xf0)

{ temp=P3; temp=P3&0xf0; switch(temp)

{ case(0xe0):m=a;break;

case(0xd0):m=b;break; case(0xb0):m=c;break; case(0x70):m=d;break; default:break; } }

delay(10);

2、显示程序

本次设计使用的是六位八段LED显示器,P1.0-P1.5口作为位控口,P0.0-P0.7口作为段控口,编写的程序实现数码管通过动态扫描显示键盘输入的数字,输入一个数,数码管上显示的数左移一位,达到六位后从第一个开始显示.这可以通过根据按键的次数来决定显示的位数,具体的程序如下所示。 /**** 显示函数 *****/ void display(uchar a)

{ if(s==1){P1=0x20;P0=table[a];s1=table[a];delay(1);}

if(s==2){P1=0x10;P0=s1;delay(1);

P1=0x20;P0=table[a];s2=table[a];delay(1);} if(s==3){P1=0x08;P0=s1;delay(1); P1=0x10;P0=s2;delay(1);

P1=0x20;P0=table[a];s3=table[a];delay(1);} if(s==4){P1=0x04;P0=s1;delay(1); P1=0x08;P0=s2;delay(1); P1=0x10;P0=s3;delay(1);

P1=0x20;P0=table[a];s4=table[a];delay(1);} if(s==5){P1=0x02;P0=s1;delay(1);

11

P1=0x04;P0=s2;delay(1); P1=0x08;P0=s3;delay(1); P1=0x10;P0=s4;delay(1);

P1=0x20;P0=table[a];s5=table[a];delay(1);} if(s==6){P1=0x01;P0=s1;delay(1); P1=0x02;P0=s2;delay(1); P1=0x04;P0=s3;delay(1); P1=0x08;P0=s4;delay(1); P1=0x10;P0=s5;delay(1); P1=0x20;P0=table[a];delay(1);}

if(s>6){s=1;} }

3、总体程序设计 总体流程图:

12

总体程序:

#include /*52单片机头文件*/

#include /*C51库函数,包括移位等,这个头文件主要是包含了有关51单片机的几条汇编语句的C语言调用接口,是直接编译成对应的汇编语句的。比如nop()函数就代表汇编语言中的NOP,在C语言编程时编写精确的短延时时使用nop()函数*/ #define uint unsigned int //重新定义变量名 #define uchar unsigned char //重新定义变量名 bit flag=0; //定义一个标志位 uchar temp,i,m,s=0,s1,s2,s3,s4,s5;

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e}; //储存16进制码 void display(uchar a); //声明显示函数 void delay(uint z); //声明延时函数 void keyscan(); //声明键盘扫描函数

void keyin(uchar zhi,uchar a,uchar b,uchar c,uchar d); //声明键盘输入函数 /**** 主函数 ****/ void main() {while(1) {keyscan(); if(flag==0){P1=0xff;P0=0xff;} //无键按下,显示器不显示

if(flag==1){display(m);} //有键按下,调用显示程序

}}

/*** 显示函数 *****/ void display(uchar a)

{ if(s==1){P1=0x20;P0=table[a];s1=table[a];delay(1);} //按键一次,选定第一个显示器,显示输入 if(s==2){P1=0x10;P0=s1;delay(1);

P1=0x20;P0=table[a];s2=table[a];delay(1);}

13

//按键二次,先选定第二个显示器,把第一次显示的数据传给P0口,调用延时程序,再选 定第二个显示器,把第二次扫描键盘得到的数据传给P0口。 if(s==3){P1=0x08;P0=s1;delay(1); P1=0x10;P0=s2;delay(1);

P1=0x20;P0=table[a];s3=table[a];delay(1);} if(s==4){P1=0x04;P0=s1;delay(1); P1=0x08;P0=s2;delay(1); P1=0x10;P0=s3;delay(1);

P1=0x20;P0=table[a];s4=table[a];delay(1);} if(s==5){P1=0x02;P0=s1;delay(1); P1=0x04;P0=s2;delay(1); P1=0x08;P0=s3;delay(1); P1=0x10;P0=s4;delay(1);

P1=0x20;P0=table[a];s5=table[a];delay(1);} if(s==6){P1=0x01;P0=s1;delay(1); P1=0x02;P0=s2;delay(1); P1=0x04;P0=s3;delay(1); P1=0x08;P0=s4;delay(1); P1=0x10;P0=s5;delay(1);

P1=0x20;P0=table[a];delay(1);}

if(s>6){s=1;

//如果S>6,说明按键次数大于6,显示器从新从第一位开始显示} }

/**** 延时子函数 *****/ void delay(uint z) { uint j,k; for(j=z;j>0;j--) for(k=120;k>0;k--);} /***** 键扫描函数 *****/ void keyscan()

14

{ P3=0xff; keyin(0xfe,0,1,2,3); //调用键盘输入函数 keyin(0xfd,4,5,6,7); keyin(0xfb,8,9,10,11);

keyin(0xf7,12,13,14,15);}

/**** 键输入函数 *****/

void keyin(uchar zhi,uchar a,uchar b,uchar c,uchar d) //声明键盘输入函数 { P3=zhi; temp=P3; temp=P3&0xf0; if(temp!=0xf0) { delay(10);

temp=P3;

temp=P3&0xf0; if(temp!=0xf0) { temp=P3; temp=P3&0xf0;

switch(temp) //键值计算

{ case(0xe0):m=a;break; case(0xd0):m=b;break; case(0xb0):m=c;break; case(0x70):m=d;break; default:break;}

flag=1;delay(200);

s++;if(s>6)s=1; }delay(10); }}

15

第五章:系统调试

根据所画的电路原理在PROTEUS软件上调出各电路元件并连线,得到所需要的电路原理图,把自己编写的程序在VC上进行编译确保程序没有错误后,保存文件为*.C文件.打开PROTEUS软件中的电路原理图,右键单击80C51单片机,选择编辑元件,在打开的对话框的Program File 选项中浏览找到保存的C语言源程序文件后确定。

然后单击PROTEUS软件左下方的开始按钮,再在电路原理图的4*4键盘上进行演示,单击键盘上的按钮,看LED显示器上是否可以正确显示所需要显示的数字和字母。

在调试的过程中出现了一些错误,但经过自己翻阅资料以及向老师请教,所出现的错误和不足之处都得到了改正。

第六章:结束语

本次课程设计使我获益匪浅,既让我巩固了单片机的一些相关基本知识,又熟悉了PROTRL的相关操作。对一个整体的电子设计项目,有了一定的认识,初步学会了一定的设计方法,明白了如何用这种方法去实现一个系统的设计。

在电子技术应用领域中,单片机的应用愈来愈多地应用到各行各业。如:工业控制、仪器仪表、电讯技术、办公自动化和计算机外部设备、汽车与节能、商用产品、家用电器等。目前,单片机正朝着大容量片上存储器、多功能i/o接口、宽范围工作电源和低功耗方向发展。要开发单片机的应用,不但要掌握单片机硬件和软件方面的知识,而且还要深入了解各应用系统的专业知识,只有将这两方面的知识融会贯通和有机结合,才能设计出优良的应用系统。一个好的工程设计师不仅要掌握单片机的工作原理,而且还要不断了解各公司最新芯片的结构和应用,在实际应用中找到最好的性能价格比。所以以后还要注意培养接受新知识的自学能力,掌握芯片发展动态。

总之,我非常感谢学校以及老师能够给我们提供这次课程设计的机会,也感谢老师的辛勤指导。

参考文献:

[1]李光第主编.单片机基础.第一版,北京航空航天大学出版社.北京.1994年6月 [2]王修才主编.单片机接口技术.第一版,复旦大学出版社.上海.1995年10月 [3]周志德主编.单片机原理及应用.第一版,高等教育出版社 [4]李运华主编.机电控制.第一版,北京航空航天大学出版社

16

[5]秦曾辉主编.电工学 上册:电工技术.第五版.高等教育出版社

17

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.com 版权所有 湘ICP备2023021991号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务