01课程设计目的
单片机原理及应用课程设计是学生综合运用所学知识,全面掌握单片微型计算机及其接口的工作原理、编程和使用方法的重要实践环节。通过独立或协作提出并论证设计方案,进行软、硬件调试,最后获得正确的运行结果,可以加深和巩固对理论教学和实验教学内容的掌握,进一步建立计算机应用系统整体概念,初步掌握单片机软、硬件开发方法。
根据单片机原理及应用课程的要求,主要进行两个方面的设计,即单片机最小系统和存储器扩展设计、接口技术应用设计。其中,单片机最小系统主要要求学生熟悉单片机的内部结构和引脚功能、引脚的使用、复位电路、时钟电路、4个并行接口和一个串行接口的实际应用,从而可构成最小应用系统,并编程进行简单使用。
存储器扩展设计要求学生掌握常用半导体芯片与单片机的接口,如EPROM存储器用作外部程序存储器时与单片机的连接关系,SRAM存储器用作外部数据存储器时与单片机的连接关系,E2PROM存储器用作外部程序/数据存储器时与单片机的连接关系。能合理分配和使用单片机的内部和外部存储器,编程实现正常的读写功能。
02课程设计的任务与要求
2.1课程设计的任务
根据所学的单片机知识,设计一个八路的电子抢答器系统,实现功能为:可供8个选手使用,可显示30s倒计时,并可显示出抢到的选手号。
2.2课程设计要求
(1)设计出硬件电路;
(2)设计出软件编程方法,并写出源代码;
(3)用PROTEUS进行仿真;
03设计方案与论证
3.1设计方案
系统采用51系列单片机AT89C51作为控制核心,该系统可以完成运算控制、信号识别以及显示功能的实现。由于用了单片机,使其技术比较成熟,应用起来方便、简单并且单片机周围的辅助电路也比较少,便于控制和实现。整个系统具有极其灵活的可编程性,能方便地对系统进行功能的扩张和更改。
3.2方案论证
(1)可靠性好:单片机按照工业控制要求设计,抵抗工业噪声干扰优于一般的CPU,程序指令和数据都可以写在ROM里,许多信号通道都在同一芯片,因此可靠性高,易扩充。
(2)单片机有一般电脑所必须的器件,如三态双向总线,串并行的输入及输出引脚,可扩充为各种规模的微电脑系统。
(3) 控制功能强:单片机指令除了输入输出指令,逻辑判断指令外还有更丰富的条件分支跳跃指令。
04设计原理及功能介绍
4.1设计原理
八路抢答器的工作原理是利用单片机的定时器T0、T1中断完成,其余状态循环调用显示子程序,用4个共阴极LED数码管来显示,用P0口作为数码管的八个段选,用P2口中的P2.0、P2.1、P2.2、作为4个数码管其中3个位选,P1口接8个按键,提供选手抢答,P3.0-P3.5四个接四个按键,提供开始、结束、答题时间调整、抢答时间调整,加1、减1调整之用
接通电源后,主持人将开关拨到“清除”状态,抢答器处于禁止状态,编号显示器灭灯,定时器显示设定时间;主持人将开关置,“开始”状态,宣布“开始”抢答器工作。定时器倒计时,扬声器给出声响提示。选手在定时时间内抢答时,抢答器完成:优先判断、编号锁存、编号显示、扬声器等提示。当一轮抢答之后,定时器停止、禁止二次抢答、定时器显示剩余时间。如果再次抢答必的条件分支跳跃指令。其原理框图如4-1所示
4-1八路抢答器原理框图
4.2 功能介绍
(1)如果想调节抢答时间或答题时间,按"抢答时间调节"键或"答题时间调节"键进入调节状态,此时会显示现在设定的抢答时间或回答时间值,如想加一秒按一下"加1s"键,如果想减一秒按一下"-1s"键,时间LED上会显示改变后的时间,调整范围为0s~99s, 0s时再减1s会跳到99,99s时再加1s会变到0s。
(2)主持人按"抢答开始"键,会有提示音,并立刻进入抢答倒计时(预设30s抢答时间),如有选手抢答,会有提示音,并会显示其号数并立刻进入回答倒计时(预设60s抢答时间),不进行抢答查询,所以只有第一个按抢答的选手有效。倒数时间到小于5s会每秒响一下提示音。
(3)如倒计时期间,主持人想停止倒计时可以随时按"停止"按键,系统会自动进入准备状态,等待主持人按"抢答开始"进入下次抢答计时。
(4)如果主持人未按"抢答开始"键,而有人按了抢答按键,犯规抢答,LED上不断闪烁FF和犯规号数并响个不停,直到按下"停止" 键为止。
(5)P3.0为开始抢答,P3.1为停止,p1.0-p1.7为八路抢答输入 数码管段选P0口,位选P2口低3位,蜂鸣器输出为P3.6口。P3.2抢答时间调整结,P3.3回答时间调整,P3.4为时间加1调整,P3.5为时间减1调整。
05单元电路设计
5.1时钟电路
5-1时钟电路图
一般选用石英晶体振荡器。此电路在加电大约延迟10ms后振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率确定。电路中有两个电容C1,C2它们的主要作用为:一是帮助振荡器起振;二是对振荡器的频率进行微调。C1,C2的典型值为30PF。
单片机在工作时,由内部振荡器产生或由外直接输入的送至内部控制逻辑单元的时钟信号的周期称为时钟周期。其大小是时钟信号频率的倒数,常用fosc表示。如时钟频率为12MHz,即fosc=12MHz,则时钟周期为1/12µs。
5.2复位电路
AT89C51的复位由外部的复位电路实现。复位电路通常采用上电自动复位和按钮复位两种方式。本次设计采用按钮复位方式。
单片机的第9脚RST为硬件复位端,只要持续4个机器周期的高电平即可实现复位,硬件复位后的各状态可知寄存器以及存储器的值都恢复到了初始值。
5-2复位电路图
5.3数码管显示电路
本次课程设计采用了7SEG-MPX2-CC 的两位7段共阴极数码管,用来显示30s倒计时,和7SEG-MPX1-CC的一位7段共阴极数码管,用来显示抢答中的选手号码。位选端分别与P2口的第七位,第六位以及第零位相接。同时7段数码管线段通过上拉电阻接power,实现数码管的点亮。
5-3数码管显示电路图
5.4报警电路
这里能利用程序来控制单片机P3.7口线反复输出高电平或低电平,即在该口线上产生一定频率的矩形波,接上扬声器就能发出一定频率的声音,再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调,使扬声器发出不同的声音,由于材料有限,本次实验采用发光二极管代替报警器。
5-4报警电路图
5.5按钮输入电路
5-5按钮电路图
8个按钮接P1口,表示8个选手的抢答按钮,一个总开关接P3.0口负责启动定时程序。
06软件调试过程及结果
6.1调试过程
(1)软件调试
问题1:选手抢答后计时未停止。
解决办法:在if语句判断按钮是否按下后,增加TR0=0语句,使计时器停止计时。
问题2:倒计时开始之前,以及选手抢答后都可按下按钮。
解决办法:增加检测变量n,当TR0为1是n为1,当n为1时才开始检测是否有键按下,一旦有键按下n置为0,此后按键均无效。
(2)硬件仿真调试
问题1:七段数码管不亮
解决办法:开始采用Input作为数码管电源,改为power后显示正常。
问题2:一位七段数码管管脚较密集无法正常画线
解决办法:在走线困难的地方按住ctrl键即可。
6.2调试结果
(1) keil uVision3
6.2.2 proteus
(2)开始计时
(3)7号选手抢答
07
总结
经过一周的单片机课程设计,终于完成了八路抢答器的设计,不仅基本上达到设计要求,而且还是收获良多。通过这次课程设计,使我更进一步地熟悉了单片机芯片的工作原理和其具体的使用方法。单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,这锻炼了自己独立思考问题的能力和通过查看相关资料来解决问题的习惯。还有了解了课程设计的一般步骤,和设计中应注意的问题。
设计不仅是对前面所学知识的一种检验,而且也是对自己能力的一种提高。下面我对整个设计的过程做一下简单的总结。第一,接到任务以后进行选题。选题是设计的开端,选择恰当的、感兴趣的题目,这对于整个设计是否能够顺利进行关系极大。好比走路,这开始的第一步是具有决定意义的,第一步迈向何方,需要慎重考虑。否则,就可能走许多弯路、费许多周折,甚至南辕北辙,难以到达目的地。因此,选;题时一定要考虑好了。第二,题目确定后就是找资料了。查资料是做设计的前期准备工作,好的开端就相当于成功了一半,到图书馆、书店、资料室去虽说是比较原始的方式,但也有可取之处的。总之,不管通过哪种方式查的资料都是有利用价值的,要一一记录下来以备后用。第三,通过上面的过程,已经积累了不少资料,对所选的题目也大概有了一些了解,这一步就是在这样一个基础上,综合已有的资料来更透彻的分析题目。第四,有了研究方向,就应该动手实现了。其实以前的三步都是为这一步作的铺垫。通过这次设计,我对数字电路设计中的逻辑关系等有了一定的认识,对以前学的数字电路又有了一定的新认识,温习了以前学的知识,就像人们常说的温故而知新嘛,但在设计的过程中,遇到了很多的问题,有一些知识都已经不太清楚了,但是通过一些资料又重新的温习了一下数字电路部分的内容。在这次设计中也使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法我们更好的理解知识,所以在这里非常感谢帮助我的同学。
在此要感谢我的指导老师,感谢老师给我这样的机会锻炼。在整个设计过程中我懂得了许多东西,也培养了我独立工作的能力,树立了对自己工作能力的信心,相信会对今后的学习工作生活有非常重要的影响。而且大大提高了动手的能力,使我充分体会到了在创造过程中的探索的艰难和成功的喜悦。虽然这个项目还不是很完善,但是在设计过程中所学到的东西是这次设计的最大收获和财富,使我终身受益。
[1] 张毅刚.单片机原理及应用[M].高等教育出版社 2003.
[2] 王章瑞.单片机课程实验及课程设计指导书[J]. 西南石油大学 2013.
[3] 李光飞.单片机课程设计实例指导[J].北京航天航空大学出版社 2004.
[4] 冯育长.单片机系统设计与实例指导[J].西安电子科技大学出版社2007.
[5] 王冬梅等.基于单片机的八路抢答器设计与实现[M].佳木斯大学学报 2009.
[6] 吴亦峰、陈德为.单片机原理与接口技术[M]. 北京:电子工业出版社.2005.
[7] 周润景、张丽娜.基于PROTEUS的电路及单片机仿真[M]. 北京: 航空航天大学出版社,2007.
[8] 胡耀辉、朱朝华等.单片机系统开发实例经典[M].北京:冶金工业出版社.2006.
[9] 张迎新.单片机初级教程[M]. 北京: 航空航天大学出版社,2007.
附录3:元器件清单
序号 |
名称 |
型号规格 |
数量 |
1 |
单片机 |
STC89C51 |
1 |
2 |
三极管 |
8050 |
4 |
3 |
电阻 |
10K |
13 |
4 |
电容 |
30PF |
2 |
5 |
晶振 |
12MHz |
1 |
6 |
电源开关 |
小型 |
1 |
7 |
抢答按钮 |
小型 |
10 |
8 |
LED |
黄色 |
1 |
#include
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^0; //定义"启动"按钮
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit k6=P1^5;
sbit k7=P1^6;
sbit k8=P1^7; //选手按键
sbit beep=P3^7; //蜂鸣器
uchar temp;
ucharaa,shi,ge,i;
uint n;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77}; //共阴极数码管编码
void display(ucharshi,ucharge); //声明显示子函数
void dis(uchari);
void delay(uint z); //声明延时子函数
void init(); //声明初始化函数
void main()
{
init( ); //调用初始化子程序
while(1)
{
if(key1==0) //检测"启动"按钮是否按下
{
delay(10); //延时去抖动
if(key1==0) //再次检测"启动"按钮是否按下
{
while(!key1); //松手检测,若按键没有释放,key1始终为0,那么!key1始终为1,程序就一直停在此while语句处
TR0=1; //启动定时器开始工作
n=1;
}
}
display(shi,ge); //调用显示子函数
dis(i); //显示选手号数
if(n==1) {
if(k1==0){ delay(10);if(k1==0){while(!k1) i=1;TR0=0;n=0;beep=1;delay(500);beep=0;}}
if(k2==0){ delay(10);if(k2==0){while(!k2) i=2;TR0=0;n=0;beep=1;delay(500);beep=0;}}
if(k3==0){ delay(10);if(k3==0){while(!k3) i=3;TR0=0;n=0;beep=1;delay(500);beep=0;}}
if(k4==0){ delay(10);if(k4==0){while(!k4) i=4;TR0=0;n=0;beep=1;delay(500);beep=0;}}
if(k5==0){ delay(10);if(k5==0){while(!k5) i=5;TR0=0;n=0;beep=1;delay(500);beep=0;}}
if(k6==0){ delay(10);if(k6==0){while(!k6) i=6;TR0=0;n=0;beep=1;delay(500);beep=0;}}
if(k7==0){ delay(10);if(k7==0){while(!k7) i=7;TR0=0;n=0;beep=1;delay(500);beep=0;}}
if(k8==0){ delay(10);if(k8==0){while(!k8) i=8;TR0=0;n=0;beep=1;delay(500);beep=0;}}
}
}
}
void delay(uint z) //延时子函数
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(ucharshi,ucharge) //显示子程序
{
P2=0xbf;
P0=table[shi];
delay(10);
P2=0x7f;
P0=table[ge];
delay(10); //使用动态扫描的方法实现数码管显示
}
void dis(uchari)
{ P2=0xfe;
P0=table[i];
delay(10);
}
void init( ) //初始化子程序
{
n=0;
temp=30;
TMOD=0x01; //使用定时器T0的方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //定时50ms中断一次
EA=1; //中断总允许
ET0=1; //允许定时器T0中断
}
void timer0( ) interrupt 1
{
TH0=(65536-50000)/256;//重新赋初值
TL0=(65536-50000)%256;
aa++; //中断一次变量aa的值加1
if(aa==20) //中断20次后,定时时间为20*50ms=1000ms=1s,将变量temp的值加1
{
aa=0;
temp--;
if (temp==0)
{ temp=30;
}
shi=temp%100/10;
ge=temp%10; //分离个位和十位
}
}
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !