单片机课程设计51实验报告Word格式文档下载.docx
《单片机课程设计51实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机课程设计51实验报告Word格式文档下载.docx(27页珍藏版)》请在冰豆网上搜索。
5.4比赛得分复位13
5.5比赛时间复位13
6心得体会14
7源程序代码:
15
/2
1摘要
是为了方便足球比赛时计时与计分及时与准确公开而引申出的实用产品。
在此设计中接入了一个1602液晶显示屏,第一行用来记录赛程的时间,第二行用于显示比赛的得分情况。
赛程计时用倒计时来计时。
在比赛结束时按下相应按键蜂鸣器会响起,提醒比赛时间结束。
这次试验运用C语言进行编程,编程后利用KeiluVision来进行编译,再生成.hex文件装入芯片中,采用Proteus软件来仿真,检验功能是否能够正常实现,最后利用单片机MCS-51实机来实现功能。
本设计以AT89S51单片机作为核心,综合应用单片机定时器、中断、LCD1602
液晶显示等知识,设计一款单片机和简单外设控制的足球计分器应用,同时显示当前的比赛进行时间,比赛队伍,比分状况。
2.设计需求
2.1功能需求
2.1.1基本功能
(1)屏上显示比赛已运行时间
(2)屏上显示A队和B队的得分
(3)屏上显示上下半场(H-L)
(4)通过按键控制比分的增减
2.1.2扩展功能
(1)按键实现比赛场次的更换
(2)按键实现比赛计时的复位
(3)按键实现比赛比分的复位
(4)在比赛结束时,蜂鸣器在主裁判的控制下响起
/0
2.2设计要求
2.2.1单片机芯片部件功能单片机为主控设定了控制模块由AT89C51在实验开发板上,根据功能需求,字节闪烁可编程可擦除只读存储器的低电压,高性能制核心芯片,是一种带4K12MHZ选用能在低功耗,5V超低压工作,CMOS8位微处理器,具有在线编程功能,选定比赛的节次,输入模块由按键控制,的晶振,使得单片机有合理的运行速度;
显示当前洗涤剩余时间。
加分,比赛的暂停;
输出模块由两位LED显示管部件功能2.2.2LED
取余和取10口控制其相应显示的值,用除共阴七段数码管通过80C51的P0秒赋值。
分-整分别给时-按键部件功能2.2.3
口的占为了减少I/O该实验设计只用矩阵键盘,在键盘中按键数量较多时,所示。
在矩阵式键盘中,每条水平用,通常将按键排列成矩阵形式,如图2-2-1一个端口而是通过一个按键加以连接。
这样,线和垂直线在交叉处不直接连通,比之直接将端口线用于键盘多出了一倍,就可以构成4*4=16个按键,口)(如P1
按键图2-2-1
蜂鸣器部件功能2.2.4
蜂鸣器是一种可以把电信号转换成声音信号的一种装置,可以在嵌入式的小型单片机系统中作用,自制音乐之类的,其主要的原理是在待测物体超过常规数值的时候会有电流作用于部件上,通过放大电路将电流放大从而将其转换作用在震动器上,震动器发生震动从而产生了声响,实现蜂鸣功能。
3硬件设计及描述
3.1总体描述
1)设置LCD第一行用来记录赛程的时间
2)设置LCD第二行用于显示比赛的得分情况
3)设置按键功能控制LCD相应位显示时间与得分
4)利用一个蜂鸣器用来作为比赛结束的警报。
3.2系统总体框图
开始执行
时间比分赋初载入文/
计计/
000:
000
赋比分初000:
00赋时间初值
按键开始队得B
Y
比赛开始计时
对应队伍加分
比赛结束?
Y
结束3.3Proteus电路图
图3-3-1系统整体Protues仿真图
3.4各部分硬件介绍
3.4.1晶振Protues仿真
图3-4-1晶振Protues仿真图
晶体振荡电路用于产生单片机工作时所需的时钟信号,从而保证各部分工作的同步。
单片机内部有一个高增益反相反大器,只要在输入端XTAL1与输出XTAL2之间挂一个晶体振荡器和微调电容就可以构成一个稳定的自激震荡器并在单片机内部产生的时钟脉冲信号。
电容C1与C2用于稳定频率和快速起振。
/3
3.4.2LCDProtues仿真
图3-4-2数码管Protues仿真图
显示方式为动态显示是指依次轮流点亮显示器的各个位,每隔一段时间则点亮一次,设置足够短的时间,利用人的视觉暂停效应和发光二极管的熄灭时的余辉,达到多个字符同时显示的效果。
运行这种显示方式可以降低成本与功耗,但需要较大的驱动电流。
3.4.3按键Protues仿真
图3-4-3按键Protues仿真图
键盘中按键数量设置依系统操作要求而定。
单片机应用系统中的键盘有独立式和行列式两种。
独立式键盘中,每个按键占用一个I/O口线,每个按键相对独立。
行列式键盘用I/O口线组成行列结构,按键设置在交叉点上,在按键数目较23
/4
多时运用这种连接方式,可节省I/O口连线。
行列式键盘的标识最常用的两种方法:
行扫描法和线反转法。
本次实训采用矩阵键盘进行操作实现。
3.4.4上拉电阻Protues仿真
图3-4-4上拉电阻Protues仿真图
排阻驱动,用以增加电流,一个脚接高电位VCC,其他脚接单片机I/o口。
3.4.5C51芯片Protues仿真
图3-4-5C51芯片Protues仿真图
VCC:
电源。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当23
/5
P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输
出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚备选功能
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
/6
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;
当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)
3.4.6上电复位电路Protues仿真
图3-4-6上电复位电路Protues仿真图
本设计采用上电按钮复位电路:
首先经过上电复位,当按下按键时,开关直接与VCC相连,为高电平形成复位,同时电解电容被电路放电;
按键松开时,VCC对电容充电,充电电流在电阻上,开关依然为高电平,仍然是复位,充电完成后,23
/7
决定了电R2电容相当于开路,开关为低电平,单片机芯片正常工作。
其中电阻的时间也长。
回落到0V容充电的时间,R2越大则充电时间长,复位信号从VCC仿真蜂鸣器Protues3.4.7
Protues仿真图图3-4-7蜂鸣器使电磁线圈产生磁场来驱动振动膜发蜂鸣器发声原理是电流通过电磁线圈,口输出的电流较小,增加电流放大的电路。
程序中通过改声的。
但是单片机IO口输出波形的频率,产生各种不同音色、音调的声音。
可以有变单片机对应IONPN三极管电流放大电路驱动。
本电路通过一个PNP或NPN两种驱动方式,即用连接C,集电极,发射极E连接一个VCCR4三极管来放大驱动蜂鸣器,基极连接编口是高电平,此时三极管是截止的,蜂鸣器后接地。
单片机在复位后的个I/O写程序使选定的I/O为低电平,此时三极管导通,导通后蜂鸣器与电源正极连通,构成一个工作回路,从而发出滴滴的响声。
4软件设计流程及描述
4.1程序流程图
主程序主要完成系统的初始化和按键的捕获,在按键没有按下时,调用显示子程序
开始执行
/8
载入文时间比分赋初
计计
00
赋时间初
比赛开
N
按键开始队得分Y
启动蜂鸣Y
对应队伍加比赛开始计比赛结束
程序初始复位
函数模块及功能4.2)函数开头用于定义数组,按键端口位置,定义时钟的初始显示时间值和定1(义程序中最核心的数组部分,为后续的程序实现奠定基础。
程序代码如下:
(数组定义不再累述)#include<
reg52.h>
#include<
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
/命令选择引脚数据sbitrs=P2^5;
//1602sbitrw=P2^6;
//1602读写引脚sbiten=P2^7;
//1602使能引脚del*1ms延时)voiddelay(uintdel)//延时程序,用于(2写命令)voidwcmd(ucharcmd)//(3写数据voidwdat(uchardat)//(4)//初始化(5)voidinit()
写字符6()voidwrite_char(ucharhang,ucharlie,charsign)//ET0和中断定时器定义了EA0voidit0(void)interrupt1//7()定时器跳变一次实现时间递增100ms开中断,时钟每隔23
/9
(8)voidTrup()//定时中断
(9)voiddisplay()//显示,包括了比赛运行时间与比分的显示
(10)ucharKeyscan(void)//判断哪个键按下
(11)voidKEY()//键值的返回
(12)voidOutside_Init(void)//开中断
(13)voidplay(uintd)//蜂鸣器
(14)voidmain()//主程序
5功能实现(以下调试过程均在联调中进行)
5.1程序烧入上电调试
图5-1-1上电调试
/10
5.2时间递增跳变
图5-1-2用时015:
10
图5-1-3用时113:
06
/11
5.3比分更变
图5-1-4比分05:
00
图5-1-5比分05:
07
/12
5.4比赛得分复位
图5-1-6得分复位
5.5比赛时间复位
图5-1-7时间复位
/13
6心得体会
经过两周的课程设计,不断的测试与分析,最终完成了电子时钟的设计与制作。
在实验的设计及仿真测试时,当没有得出正确的实验现象时,分析可能出现的错误,是不是自己粗心大意还是在连接上出来错误还是说是程序上面的代码错误。
在程序的调试中,如果出现错误要认真阅读给出的错误报告,并按照要求加以改正,来获取正确的实验结果。
此课程设计主要考察了对单片机技术原理及程序设计基础等知识。
理论和实验的结合使得在课上的学习知识可以动手实验,对于课堂的只是更加一步的认识和了解,
此次设计的电子时钟在单片机应用中是最简单的也是最普遍的应用。
通过本次设计,使我对单片机产生了不少的兴趣,让我对于单片机的实训课程有了更大的期待,对于开发和设计许多不同的实验也有着很高的期待,期待着自己的某一天可以自己不再依靠什么东西就可以自己创造出自己想要的程序和产品。
在这次设计过程中,体现出自己进行单片机设计调试的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。
在此感谢我们的郑旭丹老师,您严谨细致、一丝不苟的作风一直是我工作、学习中的榜样;
老师循循善诱的教导和不拘一格的思路给予我无尽的启迪;
这次实训设计的每个实验细节和每个数据,都离不开老师您的细心指导。
而您开朗的个性和宽容的态度,帮助我能够很顺利的完成了这次课程设计。
同时感谢对我帮助过的同学们,谢谢你们对我的帮助和支持,让我感受到同学的友谊。
也感谢我的队友游锦壕,总能在我陷入无章代码中给我启迪。
由于我俩的设计能力有限,在设计过程中难免出现错误,恳请老师们多多指教,我十分乐意接受你们的批评与指正,我们将万分感谢。
/14
sbitrs=P2^5;
//1602数据/命令选择引脚
sbitrw=P2^6;
//1602读写引脚
sbiten=P2^7;
//1602使能引脚
sbitBEEP=P2^7;
charsection1=1,min=0,sec=0,scoreA=0,scoreB=0;
ucharcount,key1,Key_value;
ucharcodeline1[]={Time:
};
ucharcodeline2[]={A:
--:
B};
uchartab[]={'
0'
'
1'
2'
3'
4'
5'
6'
7'
8'
9'
};
ucharsection[]={'
ucharsections[]={'
H'
L'
ucharcodebuffer[16]={0xee,0xde,0xbe,
0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};
ucharcodetable[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
//延时程序
voiddelay(uintdel)//延时del*1ms
{uinti,j;
for(i=del;
i>
0;
i--)
for(j=110;
j>
j--);
}
//写命令
voidwcmd(ucharcmd)
{
P0=cmd;
rs=0;
rw=0;
en=1;
delay
(1);
en=0;
//写数据
voidwdat(uchardat)
/15
P0=dat;
rs=1;
//初始化
voidinit()
wcmd(0x38);
wcmd(0x0c);
wcmd(0x06);
wcmd(0x01);
//写字符
voidwrite_char(ucharhang,ucharlie,charsign)
uchara;
if(hang==1)a=0x80;
if(hang==2)a=0xc0;
a=a+lie-1;
wcmd(a);
wdat(sign);
//定时器0中断实现时间递增
voidit0(void)interrupt1
ucharcount;
count++;
TH0=(65535-10000)/256;
TL0=(65535-10000)%6;
if(count>
=80)
{
count=0;
sec++;
}
/16
//定时中断
voidTrup()
TMOD=0x01;
EA=1;
ET0=1;
TR0=0;
//显示
voiddisplay()
{//时间显示
uchari;
for(i=1;
i<
11;
i++)
wcmd(0x80+i);
wdat(line1[i]);
if(sec>
59)
sec=0;
min++;
if(section1>
2)
section1=1;
write_char(1,11,tab[min/100]);
if(min>
=100)
write_char(1,12,tab[(min-100)/10]);
else
write_char(1,12,tab[min/10]);
write_char(1,13,tab[min_x0010_]);
write_char(1,14,58);
write_char(1,15,tab[sec/10]);
write_char(1,16,tab[sec_x0010_]);
write_char(1,1,sections[section1-1]);
//分数显示
for(i=2;
=3;
wcmd(0xc0+i);
/17
wdat(line2[i]);
for(i=7;
=8;
for(i=12;
=14;
write_char(2,5,tab[scoreA/100]);
if(scoreA>
write_char(2,6,tab[(scoreA-100)/10]);
write_char(2,6,tab[scoreA/10]);
write_char(2,7,tab[scoreA_x0010_]);
write_char(2,10,tab[scoreB/100]);
if(scoreB>
write_char(2,11,tab[(scoreB-100)/10]);
write_char(2,11,tab[scoreB/10]);
write_char(2,12,tab[scoreB_x0010_]);
//判断哪个键按下ucharKeyscan(void)
uchari,n,h_code,l_code,key_code;
P1=0xf0;
h_code=P1;
h_code=h_code&
0xf0;
P1=0x0f;
l_code=P1;
l_code=l_code&
0x0f;
key_code=h_code|l_code;
for(i=0;
16;
if(key_code==buffer[i])
n=i;
returnn;
/18
//返回键值
voidKEY()
P1=0xf0;
if(P1!
=0xf0)
delay(100);
//按键消抖
{key1=Keyscan();
//将键值赋值给key
switch(key1)
case0:
min=0;
break;
case1:
TR0=1;
brea