单片机随机数字课程设计报告_第1页
单片机随机数字课程设计报告_第2页
单片机随机数字课程设计报告_第3页
单片机随机数字课程设计报告_第4页
单片机随机数字课程设计报告_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、上海电机学院课程设计任务书课程名称微机原理及接口技术课程设计课程代码013084P1设计题目数字显示游戏机设计时间2013年12月16日2013年12月27日院(系)电气学院专业测控技术与仪器班级BG1107/1108一、课程设计任务 功能描述:设定开关1启动游戏,开关2停止游戏。编程使LED数码管显示不同的从099的随机数(不能有规律显示)。利用开关3作为自锁控制按钮,当按钮被按下,LED数码管上的数字固定在当前显示的数值上,再次按下开关3,重新开始。二、课程设计成果要求(包括课程设计说明书、图纸、图表、软硬件等要求) 1,课程设计报告;2,系统方案,画出系统框图;3,分析工作原理、画出硬件

2、电路原理图;4,画出程序框图,给出程序清单;5,写出系统调试分析结果三、课程设计工作进度计划星期一:设计硬件电路,焊接电路板;星期二:编写程序,调试并编译生成.hex文件;星期三:烧录程序,结合硬件调试程序;星期四:演示结果,撰写课程设计报告;星期五:修改报告,打印并答辩。四、主要参考资料1单片机原理及应用张毅刚主编,高教出版社,2012.11 2C51单片机有关教材和文献资料指导教师(签名): 李皎洁 系主任(签名):高桂革 2013 年 12月20日 2013年 12月20日摘要:本课程设计所设计的数字显示游戏机的控制是以单片机AT89C51为核心,在满足单片机最小系统时钟电路和复位电路的

3、基础上设计以键盘扫描和中断服务系统的外围电路来实现其功能。该数字显示游戏机在proteus仿真中可以实现产生0-99的随机数、自锁显示LED数码管显示固定数值和启动停止功能。关键词:游戏机 单片机AT89C51 Proteus仿真目录第一章 引言3第二章 系统设计方案32.1 设计思路3第三章 设计原理分析43.1 硬件电路设计43.3.1 时钟电路设计53.3.2 复位电路设计63.3.3 数码管显示电路设计63.3.4 键盘扫描电路设计83.3.5 外部中断设计83.2程序流程图设计9第四章 系统调试与仿真114.1 系统调试出现的问题114.1.1 按键3的自锁功能不起作用114.1.2

4、 不能连续产生随机数134.2 源程序154.3 系统仿真174.3.1 按下开关按钮1连续产生随机数示意图174.3.2 按下开关按钮3静态显示数码管示意图184.3.3 按开关按钮2关闭数码管示意图18第五章 课设体会与小结19第六章 参考文献19第一章 引言随机数已广泛地应用于仿真、抽样、数值分析、计算机程序设计、决策、美学和娱乐之中。常见的随机数发生器有两种:使用数学算法的伪随机数发生器和以物理随机量作为发生源的真随机数发生器。要获取真正随机的真随机数,常使用硬件随机数发生器的方法来获取。每次获取的真随机数都是不可测的,具有很好的随机性。真随机数因其随机性强,在数据加密、信息辅助、智能

5、决策和初始化向量方面有着广泛应用,构建一种基于硬件真随机数发生源,具有广泛的应用价值。但目前硬件真随机数发生源均较复杂,而且很少有基于单片机的真随机数发生器。本文利用单片机AT89S51的特点设计了一种性价比极高的真随机数发生器。该随机数发生器使用元件很少,稳定性高,对一些价格敏感的特殊场合,如金融、通信、娱乐设备等有较大的应用意义,此外,此游戏机作为生活上的抽奖游戏也有性价比高的优势,可以广泛应用与推广。第二章 系统设计方案2.1 设计思路按钮1启动游戏:开关和按钮的使用可以使用键盘扫描程序和中断服务程序两种,考虑到游戏的启动和运行是在主程序上运行,因此只要简单的使用独立式键盘扫描程序对按钮

6、的状态进行检测即可,按键接到单片机的P1引脚上,用一个上拉电阻保证按键未按下时,保证对应的I/O口线为稳定的高电平,当某一按键按下时,对应的I/O口线就变成了低电平,与其他按键相连的I/O口线仍为低电平,就很容易识别出哪个键被按下。因此把开关1接到P1口,用键盘扫描程序即可实现其功能。开关2停止游戏:要求按下该开关数码显示管关闭,由于采用共阳极数码管显示电路,两管所对应的I/O端口为高电平即可控制数码管的亮灭。通过键盘的扫描程序,扫描P1引脚,如果扫描到按钮2被按下后,引脚2控制P0口的引脚状态为0XFF,即可实现数码管关闭的功能。产生随机数:功能为使LED数码管显示不同的从099的随机数(不

7、能有规律显示)。用定时器加rand()随机函数来实现。单片机上电之后通过按键去启动取随机数,若是单片机上电就立即取随机数的话,那每次上电随机的结果都是一样的。采用rand()%100即可得到的是0到99不重复的随机数,程序中用了循环来判断是否和前面取的随机数相同,相同则进入下次取随机数,不同则存入数组。自锁功能:利用开关3作为自锁控制按钮,当按钮被按下,LED数码管上的数字固定在当前显示的数值上,再次按下开关3,重新开始。利用键盘扫描功能和外部中断功能,通过switch功能语句直接处理多个分支(开关一、开关二、)。其中外部中断控制开关三的按键次数,当按下第一次时跳入外部中断程序,采用中断扫描方

8、式,单片机响应中断,执行键盘扫描中断服务子程序,识别出按下的按键,并跳向该按键的处理程序。即可达到开关三的自锁和启动功能。第三章 设计原理分析3.1 硬件电路设计本课程设计所使用的硬件电路为键盘扫描系统、中断系统、时钟电路、复位系统、数码管显示电路。程序框图如下图所示:3.3.1 时钟电路设计时钟电路 时钟电路用于产生51单片机工作时所必须的时钟控制信号,MCS-51单片机的内部电路在时钟信号的控制下,严格的执行指令进行工作,在执行指令时,CPU首先要到程序存储器中取出所需要的指令操作码,然后译码,并由时序电路产生一系列控制信号去完成指令所规定的操作。CPU发出的时序信号有两类,一类

9、用于片内对各个功能部件的控制,另一类用于对片外存储器或I/O端口的控制。 51单片机各功能部件的运行都是以时钟信号为基准,有条不紊地一拍一拍地工作,因此时钟频率直接影响单片的速度,时钟电路的质量也直接影响单片机系统的稳定性。常用的时钟设计电路有两种方式,一种是内部时钟方式,一种是外部时钟方式。 外部时钟方式是使用外部振荡器产生的脉冲信号,常用于多片单片机同时工作,以便于多片单片机之间的同步,一般为低于12 MHz的方波,常见的89C51单片机的外部时钟方式接法如下:外部的时钟源直接连接到XTAL1端,XTAL2端 悬空 。  

10、;            内部时钟方式 51单片机内部由一个用于构成振荡器的高增益反相放大器,该高增益反相放大器的输入端为51单片机的引脚XTAL1,输出为XTAL2。这两个引脚跨接石英晶体振荡器和微调电容,就构成了一个稳定的自激振荡器。      51单片机常选择振荡器的频率为6 MHz或是12 MHz的石英晶体。随着集成电路制造工艺的发展,单片机的时钟频率也在逐步提高,现在某些高速单

11、片机芯片的时钟频率以达40 MHz。51内部时钟电路的内部时钟方式的振荡器 3.3.2 复位电路设计  复位电路  51单片机的复位是由外部的复位电路来实现的。复位引脚RST通过一个施密特触发器与复位电路相连,施密特触发器用来抑制噪声,在每个机器周期的S5P2,施密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。 复位电路通常采用上电自动复位和按钮复位两种方式:最简单的上电复位电路如下图所示。上电复位是通过外部复位电路的电容来充电来实现的。当电源接通时只要VCC的上升时间不超过1ms,就可以实现自

12、动上电复位。除了上电复位之外,有时还需要按键手动复位,按键手动复位有电平方式和脉冲方式两种。其中电平复位时通过RST端经电阻与电源VCC接通而实现的。3.3.3 数码管显示电路设计数码管:数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电

13、平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。数码管的驱动:数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。静态显示驱动:静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是

14、占用I/O端口多,如驱动5个数码管静态显示则需要5×840根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。 本实验采用静态显示驱动: 动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字

15、形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为12ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。3.3.4 键盘扫描电路设计如果有键按下,则相应行的电平值应为低,如果无键按下,由于上拉的作用,电平为高.这

16、样就可以通过输出的列码和读取的行码来判断按下的是什么键。在判断有键按下后,要有一定的延时,防止键盘抖动。列扫描码还可以分时用作LED的位选通信号。3.3.5 外部中断设计51单片机的外部中断有两种触发方式可选:电平触发和边沿触发。选择电平触发时,单片机在每个机器周期检查中断源口线,检测到低电平,即置位中断请求标志,向CPU请求中断。选择边沿触发方式时,单片机在上一个机器周期检测到中断源口线为高电平,下一个机器周期检测到低电平,即置位中断标志,请求中断。3.2程序流程图设计第四章 系统调试与仿真4.1 系统调试出现的问题4.1.1 按键3的自锁功能不起作用本课程设计的如果所有程序全部用基于键盘程

17、序的控制,发现自锁功能用不了,键盘虽然可以进行正常的扫描,开关1可以实现启动游戏的功能,但是对于开关2的停止游戏和开关3的静态显示数码管的随机数的功能不能实现,经过调试、分析可以发现由于主程序进入了死循环中,switch语句中的case2和case3不能使得对于按钮的检测跳出死循环,一直使得程序的执行处于case1的状态。该程序为:#include<reg51.h>#include<stdlib.h>unsigned char key;sbit S1=P10;sbit S2=P11;sbit S3=P12;unsigned char code discode=0xC0,

18、0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90;void Delay(unsigned int)unsigned int j;for(;i>0;i-)for(j=0;j<333;j+);display(int z)int m,n;m=z/10;n=z%10;P0=discode(m);P2=discode(n);void key_scan(void)P1=0xff;if(P1&0x0f)!=0x0f)delay(400);if(S1=0)key=1;if(S2=0)key=2;if(S3=0)key=3;main()int a,s;

19、s=0;key=0;key_scan();switch(key)case1:while(1)a=100*rand();display(a);delay(400);break;case2:P0=Ox00;p2=0x00;break;case3:s+;if(s=2)key=1;s=0;display(a);break;default:break;4.1.2 不能连续产生随机数基于上述跳不出死循环的情况,我们对程序进行了改进,将case1中的while循环去掉,改在使整个主程序进入while循环中,理论上应该可以实现预定的功能,但是在实际的功能调试中发现,电路只能产生一次的随机数,即按下一次按钮,产

20、生一次随机数,只能在按下按钮的情况才能产生随机数。而此时开关2和开关3的停止游戏可以实现,也即是说键盘的扫描功能可以实现,主程序可以进入无限的循环状态。该程序如下:#include<reg51.h>#include<stdlib.h>unsigned char key;sbit S1=P10;sbit S2=P11;sbit S3=P12;unsigned char code discode=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90;void Delay(unsigned int)unsigned int j;f

21、or(;i>0;i-)for(j=0;j<333;j+);display(int z)int m,n;m=z/10;n=z%10;P0=discode(m);P2=discode(n);void key_scan(void)P1=0xff;if(P1&0x0f)!=0x0f)delay(400);if(S1=0)key=1;if(S2=0)key=2;if(S3=0)key=3;main()while(1)int a,s;s=0;key=0;key_scan();switch(key)case1:a=100*rand();display(a);delay(400);brea

22、k;case2:P0=Ox00;p2=0x00;break;case3:s+;if(s=2)key=1;s=0;display(a);break;default:break;4.2 源程序从以上两个调试过程出现的问题可以看出,如果全部程序均采用键盘扫描程序来实现功能,显然程序不能同时满足连续产生随机数和自锁的功能,因此可以寻求一种使两者功能分开的方法,即自锁的功能采用中断系统,开关按钮1和2采用独立式键盘扫描进行扫描和检测。把数码管显示随机数和继续产生随机数的功能放在中断服务程序中,只要能够记录中断的次数即可实现这两个功能。即中断第一次静态显示随机数,中断第二次回复连续产生随机数,同时恢复记录

23、状态,重新从第一次开始记录,即可实现其功能。源程序如下:#include <reg51.h>#include <stdlib.h>unsigned char key;sbit S1=P10;sbit S2=P11;sbit S3=P12;unsigned char code discode=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90; /共阳数码管段码表unsigned int z;unsigned char s=0;void delay(unsigned int i) /延时函数unsigned int j;for (;i>0;i-)for (j=0;j<333;j+);void delay10ms(void) /10ms消抖延时unsigned char i,j;for(i=0;i<100;i+)for(j=0;j<100;j+);void key_scan(void) /键盘扫描P1=0xff;if(P1&0x0f)!=0x0f)delay10ms();if(S1=0)key=1;if(S2=0)key=2;main()EA=1;EX0=1;IT0=1;while(1)key_sc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论