单片机设计与实训设计报告.docx
- 文档编号:11763214
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:27
- 大小:155.32KB
单片机设计与实训设计报告.docx
《单片机设计与实训设计报告.docx》由会员分享,可在线阅读,更多相关《单片机设计与实训设计报告.docx(27页珍藏版)》请在冰点文库上搜索。
单片机设计与实训设计报告
《单片机设计与实训》
设计报告
题目:
姓名:
班级:
学号:
指导老师:
提交日期:
目录
摘要1
1.设计背景2
1.1任务阐述2
1.2任务分析2
2.设计方案2
2.1系统方案设计2
2.2最小系统设计2
2.3单元电路设计3
2.4数码管显示电路5
2.5矩阵键盘电路5
3.方案实施6
3.1原理阐述6
3.2仿真结果6
4.程序设计8
4.1程序编写8
5.系统调试11
5.1软件测试11
5.2硬件调试12
6.总结与体会12
参考文献13
附录一14
附件二15
附件三21
简易按键操作小游戏设计
摘要:
近年来随着计算机在社会领域的渗透, 单片机的应用正在不断地走向深入,同时带动传统控制检测日新月益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。
关键词:
单片机最小系统ProteusKeil矩阵键盘
1.设计背景
1.1任务阐述
自制一个单片机最小系统,包括串口下载、复位电路。
由系统随机生成0—99的数字在数码管上显示,操作人员必须在2S内按下对应的按键,按键正确获得一分,在2分钟内,对得分进行累加,到时后,由数码管显示得分值。
游戏的启动、暂停(继续)可以由按钮控制。
1.2任务分析
设计一个简易按键操作小游戏主要是设计一个单片机最小系统,单片机的最小系统分为四个部分,分别是晶振电路、复位电路、电源和AT89C51单片机。
2.设计方案
2.1系统方案设计
其原理图如图2.1。
图2-1系统原理图
2.2最小系统设计
单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统。
对51系列单片机来说,最小系统一般应该包括:
单片机、晶振电路、复位电路、按键输入、显示输出等。
单片机接口电路主要用来连接计算机和其它外部设备,以下列举几个模块的原理及功能:
复位电路:
由电容串联电阻构成,由图并结合"电容电压不能突变"的性质,可以知道当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定。
晶振电路:
典型的晶振取11.0592MHz(因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合)/12MHz(产生精确的US级时歇,方便定时操作)。
单片机:
一片AT89S51或其他51系列兼容单片机。
接口电路:
具有人机交互接口。
具有一定的可扩展性,单片机I/O口可方便地与其他电路板连接。
2.3单元电路设计
2.3.1MCU控制器简介
AT89C51(如图2-2所示)是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)128*8字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,2个16位定时器/计数器,一个6向量2级中断结构,可编程串行通道低功耗的闲置和掉电模式,有片内振荡器和时钟电路,全静态工作0Hz-24MHz。
的低电压、高性能CMOS8位微处理器,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪速存储器组合在单个芯片中,ATMEL的AT89S51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
图2-3AT89C51引脚图
2.3.2复位电路
单片机的置位和复位,都是为了把电路初始化到一个确定的状态,一般来说,单片机复位电路作用是把一个例如状态机初始化到空状态,而在单片机内部,复位的时候单片机是把一些寄存器以及存储设备装入厂商预设的一个值。
单片机复位电路原理是在单片机的复位引脚RST上外接电阻和电容,实现上电复位。
当复位电平持续两个机器周期以上时复位有效。
复位电平的持续时间必须大于单片机的两个机器周期。
具体数值可以由RC电路计算出时间常数。
复位电路由按键复位和上电复位两部分组成。
图2-4复位电路图
2.3.3晶振电路
单片机系统里都有晶振,在单片机系统里晶振作用非常大,全称叫晶体振荡器,它结合单片机内部电路产生单片机所需的时钟频率,单片机晶振提供的时钟频率越高,那么单片机运行速度就越快,单片接的一切指令的执行都是建立在单片机晶振提供的时钟频率。
在通常工作条件下,普通的晶振频率绝对精度可达百万分之五十。
高级的精度更高。
有些晶振还可以由外加电压在一定范围内调整频率,称为压控振荡器(VCO)。
晶振用一种能把电能和机械能相互转化的晶体在共振的状态下工作,以提供稳定,精确的单频振荡。
单片机晶振的作用是为系统提供基本的时钟信号。
通常一个系统共用一个晶振,便于各部分保持同步。
有些通讯系统的基频和射频使用不同的晶振,通过电子调整频率的方法保持同步。
2.4数码管显示电路
LED数码管显示是利用半导体发光制成条形的发光二极管,封装在一起组成数字或其他符号形状。
数码管根据公共端不同,分为共阴极和共阳极两种形式。
根据设计需要,本次选用共阴极数码管。
由于一个数码管不能实现多位数显示,同时从节省I/O端口考虑,结合数电知识,利用两片74HC573扩展单片机的I/O口,两片74HC573的输出分别接6位7段共阴数码管的段选端和公共端。
图2-7数码管显示仿真电路
2.5矩阵键盘电路
矩阵键盘检测的原理和方法:
矩阵键盘每个按键两端都与单片机I/O口相连,因此在检测时需人为通过单片机I/O口送出低电平。
检测时,先送一列为低电平,其余几列全为高电平(此时确定了列数),然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电平(这是有确定了行数),则便可以确认当前被按下的键是哪一列哪一行,用同样方法轮流送各列一次低电平,再轮流检测一次各行是否变为低电平,这样既可检测完所有的按键,当有键按下时便可判断出按下的是哪一个键。
其工作原理是从0列开始顺序行扫描即该行输出为0。
每扫描一行读入列线数据从0开始列检查找该行输出为0的列若无则顺序扫描下一行并检查其各列若找到某列线为0则该列与检查行交叉的按键为被按下的键。
从0行0列开始顺序将按键编号就可以按扫描的值得到按键的值。
本设计使用的是2个独立按键其功能设置为输入数字、开始/暂停。
此外还需要消除按键在闭合或断开时的抖动。
消抖的方法可采用消抖电路(RS触发器时锁电路硬件消除抖动),也可采用延时方式软件消除抖动(延时后再重读,以跳过抖动期),本设计采用软件消抖方式。
3.方案实施
3.1原理阐述
简易按键操作小游戏是基于单片机最小系统的一个系统设计,主要是通过编写程序,然后将写好的程序导入单片机使其能运行,将键盘串入单片机的输入口,数码管串入单片机的输出口,再连入LED指示灯。
单片机最小系统的原理为:
单片机最小系统包括振荡器电路,复位电路,单片机EA端接高电平(Vcc),P0口需要接上拉电阻(100K)。
振荡器电路选用12MHz晶振,两个20pf电容,振荡器电路接单片机XTAL1和XTAL2引脚。
复位电路原理:
由电容串联电阻构成,由图并结合"电容电压不能突变"的性质,可以知道当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定。
晶振电路原理:
它结合单片机内部电路产生单片机所需的时钟频率,单片机晶振提供的时钟频率越高,那么单片机运行速度就越快,单片接的一切指令的执行都是建立在单片机晶振提供的时钟频率。
3.2仿真结果
通过在电脑上进行器件的选择以及线路的连接,其仿真图以及结果图如下
图3-2系统仿真设计图
图3-2仿真结果图
4.程序设计
4.1程序编写
#include
#include
voidmain()
{
unsignedcharOverFlag=0;//用户输入溢出标志位,当用户输入两个数字该位会为1
P0=0xff;//数码管初始化为零
P2=0x00;
TMOD=0x01;//T0工作方式1
TH0=(65536-20000)/256;//高八位
TL0=(65536-20000)%256;//低八位
//TR0=1;//定时器0开始计时
TR0=0;//关闭定时器0的计时,等待按键才能开始计时
ET0=1;//打开定时器0中断
EA=1;//打开总中断
P1=0xf0;
YES=1;//初始化回答指示灯不亮
NO=1;
while
(1)
{
//键盘扫描程序
P1=0xf0;
if((P1&0x70)!
=0x70)//如果有按键按下
{
delay();//机械消抖
if((P1&0x70)!
=0x70)
{
UserSet[UserFlag]=Check();//返回键值
if(UserSet[UserFlag]==11)//如果按下‘0’则将当前用户输入改为0,并将本次输入保存为上次输入,同时更新移位标志位
{
if(NormalFlag==1)
{UserSet[UserFlag]=0;LastNum[UserFlag]=UserSet[UserFlag];UserFlag++;}
else{UserSet[UserFlag]=10;}
}
elseif(UserSet[UserFlag]==10)
{//如果按下‘提交答案’,忽略本次的用户输入,用上次的用户输入来替换本次的输入,同时溢出标志位置1,完成标志位为1
UserSet[UserFlag]=LastNum[UserFlag];
if(NormalFlag==1)//只有在系统运行时按键才有效
{
OKFlag++;
OverFlag=1;
}
}
elseif(UserSet[UserFlag]==12)
{
NormalFlag++;
if(NormalFlag==1){TR0=1;UserSet[0]=LastNum[0];UserSet[1]=LastNum[1];}//如果系统正常运行标志位为1打开定时器0,开始计时,恢复显示内容
if(NormalFlag==2){NormalFlag=0;TR0=0;UserSet[0]=10;UserSet[1]=10;}//关闭定时器0,清除显示内容
}else{
if(NormalFlag==1)//只有在系统运行时按键才能有效
{
LastNum[UserFlag]=UserSet[UserFlag];
UserFlag++;
}
else
{
UserSet[UserFlag]=10;
}
}//正常状态下,将本次的输入保存到上次的输入,同时更新移位标志位
if(UserFlag==2){UserFlag=0;}//OverFlag=1;防止溢出的措施,使用户输入一直为2位
}
}
if(NormalFlag==1)
{
N=0;
RefSet[0]=sys[Num_2s]/10;//系统正常运行时,更新系统的随机数,指示灯亮
RefSet[1]=sys[Num_2s]%10;
//RefSet[0]=(Ref-(unsignedchar)(Ref%10))/10;
//RefSet[1]=Ref%10;
}
else
{
N=1;//系统的指示灯灭,随机数数码管显示‘--’故障
RefSet[0]=11;
RefSet[1]=11;
}
if(OverFlag==1)//如果用户输入了两个数据则进行判断
{
if((RefSet[0]*10+RefSet[1]==UserSet[0]*10+UserSet[1]))//如果用户输入和系统的随机数相同
{
if((NormalFlag==1)&&(OKFlag==1))//如果系统正常运行,并且用户已经提交答案
{
Score++;
ScoreShow[0]=Score/10;
ScoreShow[1]=Score%10;
YES=0;//改变回答正误指示灯,并且更新积分
NO=1;
}
}
else//改变回答正误指示灯,
{
NO=0;
YES=1;
OKFlag=0;//允许错误重新输入
}
OverFlag=0;//溢出标志位清零
}
//S_2=OFF;
T_2=OFF;//如果需要显示时间
R_1=ON;
P0=display[RefSet[0]];
delay();
R_1=OFF;
R_2=ON;
P0=display[RefSet[1]];
delay();
R_2=OFF;
U_1=ON;
P0=display[UserSet[0]];
delay();
U_1=OFF;
U_2=ON;
P0=display[UserSet[1]];
delay();
U_2=OFF;
S_1=ON;
P0=display[ScoreShow[0]];
delay();
S_1=OFF;
S_2=ON;
P0=display[ScoreShow[1]];
delay();
S_2=OFF;
T_1=ON;
P0=display[(unsignedchar)(Num_2s/10)];
delay();
T_1=OFF;
T_2=ON;
P0=display[(unsignedchar)(Num_2s%10)];
delay();
}
}
5.系统调试
5.1软件测试
选择好器件,设置参数,正确连接,单片机导入程序,开始运行,首先点击复位按键,复位后点击开始游戏,黄灯亮,根据数码管上显示的产生的随机数输入数字点击提交,如果正确则绿灯亮,数码管上相应积一分,如果错误或者超过设定的两秒提交答案则红灯亮,超过两秒后输入数字显示的数码管自动清零。
其运行仿真图如图5-1所示。
图5-1仿真运行图
图中数码管从左至右依次显示为随机数、用户输入数、正确个数、时间计数。
5.2硬件调试
1.领取器件
2.排好位置,进行焊接,其间要注意引脚的位置
3.装上单片机等器件,调试电路
4.打开电源,按下复位按钮将电路复位,按下开始按钮(#键)开始游戏,根据数码管显示的数字相应按下数字,再按下提交按钮(*键)
5.观察可得按下开始游戏时黄灯亮,提交答案后数字正确并且提交时间小于2s则绿灯闪亮,并且数码管上分数显示加一分。
输入数字错误或者超过两秒提交后红灯闪亮,数码管显示输入的部分超过两秒后自动清零。
6.游戏一次循环为2min,到达2min之后系统自动停止,这时需要重新开始游戏。
6.总结与体会
本次的课程设计实验使我收获良多。
锻炼了动手能力,本次设计,使我意识到自己的焊接技术还需要加强,要好好布局,焊接的时候不要虚焊。
使用飞线的时候一定不要相互交叉,要做到飞线也要有一定的排列顺序。
在调试的过程中,也学到了很多东西。
调试的过程中一定要保持头脑清醒,当电路出现故障时要静下心来检查电路,考虑多方面的可能性,排查故障。
上电过程也要注意,一开始就要搞清楚到底是多少伏的电压,到底是直流还是交流电,引脚图也要确定,错误之后很难改,数码管也要考虑是共阴极还是共阳极。
实验中一定要细心。
参考文献
[1]李群芳,张士军,黄建等.《单片微型计算机与接口技术》.电子工业出版社,2009
[2]陈光东,赵性初.《单片微型计算机原理与接口技术》.华中科技大学出版社,2005
[3]高峰.《单片微机应用系统设计及实用技术》.机械工业出版社,2004
[4]孙余凯.《数字集成电路实用技术》.电子工业出版社,2010
[5]江晓.《数字电子技术》.西安电子科技大学出版社,2009
附录一:
元件清单
序号
元件
数量
1
四位数码管
2
2
1nf电容
2
3
0.1uf电容
1
4
晶振
1
5
排阻
1
6
发光二极管
3
7
AT89C51
1
8
100Ω电阻
3
9
按钮
1
附件二:
程序清单
#include
#include
//定义键盘的按键
sbitH_1=P1^0;
sbitH_2=P1^1;
sbitH_3=P1^2;
sbitH_4=P1^3;
sbitV_1=P1^4;
sbitV_2=P1^5;
sbitV_3=P1^6;
sbitN=P3^0;//定义系统状态输出口
//定义数码管的位选
sbitR_1=P2^0;
sbitR_2=P2^1;
sbitU_1=P2^2;
sbitU_2=P2^3;
sbitS_1=P2^4;
sbitS_2=P2^5;
sbitYES=P2^6;//用户回答正确指示灯
sbitNO=P2^7;//用户回答错误指示灯
sbitT_1=P3^1;//时间显示的十位
sbitT_2=P3^2;//时间显示的个位
//数码管如果是低电平位选
#defineON0
#defineOFF1
//数码管如果是高电平位选
//#defineON1
//#defineOFF0
//一个自己定义的随机数组
unsignedcharsys[]={26,42,54,55,44,50,3,0,12,84,
64,68,40,65,68,52,62,25,76,22,27,25,6,35,23,64,99,19,
21,99,88,74,81,61,6,97,93,72,64,48,51,19,85,69,22,53,
19,56,5,50,81,96,60,95,80,66,34,62,68};
unsignedcharUserSet[2]={10,10};//用户的输入存放位置
unsignedcharRefSet[2]={7,7};//系统的随机数存放位置
unsignedcharScoreShow[2]={0};//用户得分的存放位置
unsignedcharScore=0;//用户得分
unsignedcharNum_2s=0;//2s的时钟计时
unsignedcharNormalFlag=0;//系统正常运行的标志位,正常运行为1暂停为0 暂态为2
unsignedcharOKFlag=0;//用户输入完成标志位
unsignedcharLastNum[2]={10,10};//用户上一次按下的键值,
unsignedcharUserFlag=0;//用户输入移位标志位
unsignedintRef;
//共阳数码管的段选
//unsignedchardisplay[12]={0xc0,0xf9,0xa4,0xb0,//0,1,2,3
//0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//4,5,6,7,8,9,off-
//共阴数码管的段选
unsignedchardisplay[12]={~0xc0,~0xf9,~0xa4,~0xb0,//0,1,2,3
~0x99,~0x92,~0x82,~0xf8,~0x80,~0x90,~0xff,~0xbf};//4,5,6,7,8,9,off-
//延时函数,每个数码管显示的时间
voiddelay(void)
{
unsignedchari;
for(i=0;i<100;i++);
}
//用来进行键盘按键的判断
unsignedcharCheck()
{
unsignedchari=0,j=0;
if(V_1==0)j=0;
elseif(V_2==0)j=1;
elseif(V_3==0)j=2;
P1=0x0f;//交换扫描方向
if(H_1==0){i=0;while(!
H_1);}//确定按下的位置,并等待按键释放
elseif(H_2==0){i=1;while(!
H_2);}
elseif(H_3==0){i=2;while(!
H_3);}
elseif(H_4==0){i=3;while(!
H_4);};
returni*3+j+1;//返回相应的键值
}
voidmain()
{
unsignedcharOverFlag=0;//用户输入溢出标志位,当用户输入两个数字该位会为1
P0=0xff;//数码管初始化为零
P2=0x00;
TMOD=0x01;//T0工作方式1
TH0=(65536-20000)/256;//高八位
TL0=(65536-20000)%256;//低八位
//TR0=1;//定时器0开始计时
TR0=0;//关闭定时器0的计时,等待按键才能开始计时
ET0=1;//打开定时器0中断
EA=1;//打开总中断
P1=0xf0;
YES=1;//初始化回答指示灯不亮
NO=1;
while
(1)
{
//键盘扫描程序
P1=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 设计 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)