东北石油大学单片机课程设计8位竞赛抢答器.docx
- 文档编号:8799604
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:29
- 大小:376.45KB
东北石油大学单片机课程设计8位竞赛抢答器.docx
《东北石油大学单片机课程设计8位竞赛抢答器.docx》由会员分享,可在线阅读,更多相关《东北石油大学单片机课程设计8位竞赛抢答器.docx(29页珍藏版)》请在冰点文库上搜索。
东北石油大学单片机课程设计8位竞赛抢答器
目录
第1章绪论1
1.1设计目的1
1.2设计原理1
1.3设计方案1
第2章系统结构及主要元器件2
2.1系统结构2
2.2主要元器件2
第3章硬件设计4
3.1时钟及复位电路4
3.2选手抢答电路4
3.3显示电路5
3.4开始、复位及蜂鸣器电路5
3.5硬件总图6
第4章软件设计7
4.1程序设计总流程7
4.2中断服务子程序流程8
4.3蜂鸣器报警程序流程8
第5章系统仿真及调试9
5.1利用Keil软件进行程序调试9
5.2利用Proteus进行系统仿真9
结论11
参考文献12
附录13
第1章绪论
1.1设计目的
抢答器作为一种工具,已广泛应用于各种竞赛场合。
但抢答器的使用频率较低,且有的要么制作复杂,要么可靠性低。
作为一个普通企业,每年使用的次数极少,往往因长期存放使抢答器的电子器件损坏,再购置的麻烦和及时性就会影响活动的开展,故一个好的抢答器应具有价格低廉,体积较小,易于操作等特点。
为满足上述要求设计了本抢答器。
1.2设计原理
通过键盘改变抢答的时间,原理与闹钟时间的设定相同,将定时时间的变量置为全局变量后,通过键盘扫描程序使每按下一次按键,时间加1(超过30时置0)。
同时单片机不断进行按键扫描,当参赛选手的按键按下时,用于产生时钟信号的定时计数器停止计数,同时将选手编号(按键号)和抢答时间分别显示在LED上。
1.3设计方案
抢答器可同时供8名选手比赛。
设置一个抢答控制开关S,开关由主持人控制。
抢答器具有锁存与显示功能并能定时抢答,一次抢答的时间由主持人设定。
当主持人启动“开始”键后,定时器进行减计时,同时扬声器响一下,时间为0.5s左右。
参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。
如果定时时间已到,无人抢答,系统报警并禁止抢答,定时显示器上显示00。
单片机
显示电路
晶振及复位电路
报警电路
抢答电路
图1-1设计方案方框图
第2章系统结构及主要元器件
2.1系统结构
根据本设计要求,系统结构应具有抢答功能、倒计时功能、时间及选手编号显示功能以及能让单片机正常运行的基本电路。
设计系统结构如图2-1所示。
图2-1总体设计思路图
2.2主要元器件
2.2.180C51单片机
80C51单片机的片内RAM容量、I/O端口系统扩展能力以及指令系统和CPU的处理功能都非常强.80C51单片机的主要功能如下:
8位CPU、片内128BRAM、片内4KBROM/EPROM、特殊功能寄存器区、2个优先级的5个中断源结构、4个8位并行I/O口(P0~P3)、2个16位定时器/计数器、64KB外部数据存储器地址空间、64KB外部程序存储器地址空间等。
80C51引脚图如图2-2所示。
图2-280C51单片机引脚图
2.2.27SEG-MPX4-CC数码管
数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点(DP)这个小数点可以更精确的表示数码管想要显示的内容.
按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。
7SEG-MPX4-CC数码管采用共阴极的形式显示四位阿拉伯数字。
其中A~G引脚分别显示一位数字的某一部分,DP引脚显示小数点,1~4引脚分别控制显示四个数字。
7SEG-MPX4-CC引脚图如图2-3所示。
图2-37SEG-MPX4-CC数码管引脚图
2.2.374LS373锁存器
74LS373是常用的锁存器芯片,它实质是一个是带三态缓冲输出的8位触发器。
D0~D7为数据输入端,Q0~Q7为数据输出端其引脚图如图2-4所示。
当三态允许控制端OE为低电平时,Q0~Q7为正常逻辑状态,可用来驱动负载或总线。
当OE为高电平时,Q0~Q7呈高阻态。
当锁存允许端LE为高电平时,Q随数据D而变。
当LE为低电平时,D被锁存。
图2-474LS373锁存器引脚图
第3章硬件设计
根据抢答器的设计要求,硬件设计包括:
抢答电路、晶振电路、复位电路、显示电路、开关控制电路及报警电路。
3.1时钟及复位电路
时钟电路使用的是单片机内部的时钟电路,晶振的频率为12MHZ,提供80C51的时钟脉冲使80C51工作。
复位电路使用的是按键与上电复位,复位电路使单片机初始化,使单片机重新开始执行程序。
当复位开关按下RST由低电平变为高电平,则程序从头开始执行。
时钟及复位电路电路图如图3-1所示。
图3-1时钟及复位电路电路图
3.2选手抢答电路
设计中选择80C51的P1口作为选手抢答的输入按键引脚,P1.0至P1.7轮流输出低电平,给P1.0至P1.7分别为编号1至8的选手。
当选手按下按钮时,P1端口的电平变化并从P1口输入,经单片机处理后从P0输出由LED灯显示出来此组。
选手抢答电路图如图3-2所示。
图3-2选手抢答电路电路图
3.3显示电路
显示电路包括显示和驱动功能。
显示采用数码管和LED灯,驱动用P2和P3口抢答者编号将通过与P3口相连的LED灯显示出来,抢答30秒倒计时由P3口上的数码管采用动态显示第一个数字显示抢答选手的编号,最后两位显示时间。
显示电路电路图如图3-3所示。
图3-3显示电路电路图
3.4开始、复位及蜂鸣器电路
P3口要外接上拉电阻才能正常运行。
P3.1用于总抢答器启停的控制。
P3.4用于控制蜂鸣器电路。
P3.6用主持人控制抢答的开始。
P3.7用于主持人控制抢答器的复位。
电路图如图3-4所示。
图3-4开始、复位及蜂鸣器电路电路图
3.5硬件总图
8位竞赛抢答器硬件总图如图3-5所示。
包括80C51单片机、抢答电路、晶振电路、复位电路、显示电路、开关控制电路及报警电路。
图3-58位竞赛抢答器总电路图
第4章软件设计
4.1程序设计总流程
在编开始抢答前的程序要先编写设定时间的程序,当时间设好之后,主持人发布抢答命令按下“开始”按键,程序开始打开定时中断进行倒计时,然后调用键盘扫描子程序,编写键盘扫描程序。
当扫描到有人按下了答题键,马上关闭T0、调用显示程序、封锁键盘。
若在规定时间内没有抢答成功,那么进入蜂鸣器报警程序。
之后判断“复位”是否开启,没开启则保持,若开启则重新回到主持人按“开始”键之前的状态。
如此循环往复。
流程图如图4-1所示。
蜂鸣器提示
将选手编号送至显示器
判断哪是哪一位选手抢答成功
判断P1口数据是否为0
抢答是否超时
启动
主持人按下开始键
定时器及P1口初始化,并蜂鸣0.5s
将定时器开启
进行抢答,系统倒计时并等待
是否
是否继续比赛
复位键开启
结束
是否
图4-1程序设计思想流程图
4.2中断服务子程序流程
中断子程序负责倒计时的计时和蜂鸣器的报警,应具有能中断定时及重新初始化的功能。
中断服务子程序流程图如图4-2所示。
判断“复位”键是否开启
TR0允许中断,TF0标志位清零
判断TF0是否置1
中断开启
否
是
否
是
图4-2中断服务子程序流程图
4.3蜂鸣器报警程序流程
在抢答的开始,主持人会按下“开始”键,蜂鸣器响0.5s,若倒计时超时,无人抢答成功,则蜂鸣器会一直报警提示,知道主持人按下“复位”按键时停止。
蜂鸣器报警程序流程图如图4-3所示。
倒计时开启
蜂鸣器响0.5s
判断倒计时是否结束
是否
蜂鸣器长鸣报警
“复位”键是否开启
是否
图4-3蜂鸣器报警程序流程图
第5章系统仿真及调试
5.1利用Keil软件进行程序调试
将所编写的抢答器程序输入到Keil软件中进行编译调试,利用Keil软件检验所设计程序是否有误。
调试过程出现如下错误:
(1)没有定义个别变量。
(2)延时函数中的for循环语句出现语法错误。
改正后再次进行了调试,调试之后程序无误的结果如图5-1所示。
图5-1程序调试结果
5.2利用Proteus进行系统仿真
将Keil生成的HEX文件导入Proteus的单片机中,利用Proteus进行抢答器的仿真,在调试的过程中出现了如下的错误:
(1)数码管无法显示。
原因是数码管由于共阴极驱动,而设计的程序却是共阳极驱动的。
修改程序后数码管能够正常显示数字。
(2)抢答按键无法工作。
检查后发现是抢答按键的左侧没有接地。
改正后抢答按键能正常工作。
(3)蜂鸣器无法发声。
查阅资料后发现无法发声的原因是Proteus中的蜂鸣器默认驱动电压过大,为“12V”。
把驱动电压改成“2V”后蜂鸣器能够正常发声。
改正错误后利用Proteus软件仿真系统结果如图5-2、图5-3所示。
图5-2模拟抢答器倒计时仿真图
图5-3模拟3号选手用时7秒抢答成功仿真图
结论
这次课程设计老师给我们安排了一个星期的时间,可以说是比较紧张的。
我利用了前两天的时间在宿舍思考本次的课程设计,拿到题目时,第一感觉就是太复杂了,不知如何下手,虽然这些知识以前都有接触过,但也只是分部分接触,而这次的设计是对前面几次实验的一个综合。
通过翻阅一些资料,自己事先编写好了程序,到了第三天去到实验室时,就把自己写的程序进行了编译,发现不行,程序错误非常多,自己检查了好久好久,但还是发现不了问题,之后问了老师和同学,才得知了错误的所在。
通过本次单片机控制系统课程设计,发现了自己的很多不足,知识有很多漏洞,而且自己的实践经验还是比较缺乏,理论联系实际的能力还急需提高。
在这个过程中,我也曾经因为实践经验的缺乏失落过,也曾经仿真成功而热情高涨。
特别是Proteus设计电路图和仿真时,因为是英文版的软件,很多东西都看不太明白,都是通过自己一个个来慢慢琢磨,才把电路图画了出来,然后把写好的程序导入,进行仿真,汗水预示着结果也见证着收获。
这次课程设计对我而言,知识上的收获重要,精神上的丰收更加可喜。
让我知道了学无止境的道理。
我们每一个人永远不能满足于现有的成就。
相信这次课程设计必将成为我将来从事自动化相关工作上很好的经验。
参考文献
[1]王长涛.单片机原理及应用[M].北京:
人民邮电出版社,2014.
[2]王东峰.单片机C语言应用100例[M].北京:
电子工业出版社,2009.
[3]刘守义.单片机技术基础[M].西安:
西安电子科技大学出版社,2007.
[4]于海生.微型计算机控制技术[M].北京:
清华大学出版社,2009.
[5]李平.单片机入门与开发[M].北京:
机械工业出版社,2008.
附录
程序清单:
#include
/*-----------------------------------------------------------
宏定义
------------------------------------------------------------*/
#defineuintunsignedint
#defineucharunsignedchar
/*-----------------------------------------------------------
共阴极数码管编码表0-f显示
------------------------------------------------------------*/
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
/*-----------------------------------------------------------
变量定义
------------------------------------------------------------*/
sbitstart_stop=P3^6;
sbitreset=P3^7;
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
sbitkey4=P1^3;
sbitkey5=P1^4;
sbitkey6=P1^5;
sbitkey7=P1^6;
sbitkey8=P1^7;
sbitstate=P3^4;
sbitkaishi=P3^1;
bitstart_stop_flag=0;
bitkey1_flag=0;
bitkey2_flag=0;
bitkey3_flag=0;
bitkey4_flag=0;
bitkey5_flag=0;
bitkey6_flag=0;
bitkey7_flag=0;
bitkey8_flag=0;
bitreset_flag=0;
bitaction=0;
bitkaishi_flag=0;
ucharsecond=30;
uchartimer0_count=0;
ucharnumber=0;
ucharnumber_display=0;
/*-----------------------------------------------------------
延时函数
------------------------------------------------------------*/
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*-----------------------------------------------------------
数码管显示驱动函数
------------------------------------------------------------*/
voiddisplay(ucharnumber,ucharsecond)
{
ucharsecond_first,second_second;
second_first=second/10;
second_second=second%10;
P2=0xfe;
P0=table[number];
delay
(2);
P2=0xfd;
P0=0x40;
delay
(2);
P2=0xfb;
P0=table[second_first];
delay
(2);
P2=0xf7;
P0=table[second_second];
delay
(2);
}
/*-----------------------------------------------------------
开始键扫描函数
------------------------------------------------------------*/
voidstart_stop_keyscan()
{
if(start_stop==0)
{
state=0;
delay(60);
if((start_stop==0)&&(!
start_stop_flag))
{
start_stop_flag=1;
action=1;
TR0=1;
state=1;
}
}
else
{
start_stop_flag=0;
}
}
/*-----------------------------------------------------------
八位抢答键扫描函数
------------------------------------------------------------*/
ucharkey_scan8()
{
if(key1==0)
{
delay(8);
if((key1==0)&&(!
key1_flag))
{
key1_flag=1;
number=1;
number_display=number;
}
}
else
{
key1_flag=0;
number=0;
}
if(key2==0)
{
delay(8);
if((key2==0)&&(!
key2_flag))
{
key2_flag=1;
number=2;
number_display=number;
}
}
else
{
key2_flag=0;
number=0;
}
if(key3==0)
{
delay(8);
if((key3==0)&&(!
key3_flag))
{
key3_flag=1;
number=3;
number_display=number;
}
}
else
{
key3_flag=0;
number=0;
}
if(key4==0)
{
delay(8);
if((key4==0)&&(!
key4_flag))
{
key4_flag=1;
number=4;
number_display=number;
}
}
else
{
key4_flag=0;
number=0;
}
if(key5==0)
{
delay(8);
if((key5==0)&&(!
key5_flag))
{
key5_flag=1;
number=5;
number_display=number;
}
}
else
{
key5_flag=0;
number=0;
}
if(key6==0)
{
delay(8);
if((key6==0)&&(!
key6_flag))
{
key6_flag=1;
number=6;
number_display=number;
}
}
else
{
key6_flag=0;
number=0;
}
if(key7==0)
{
delay(8);
if((key7==0)&&(!
key7_flag))
{
key7_flag=1;
number=7;
number_display=number;
}
}
else
{
key7_flag=0;
number=0;
}
if(key8==0)
{
delay(8);
if((key8==0)&&(!
key8_flag))
{
key8_flag=1;
number=8;
number_display=number;
}
}
else
{
key8_flag=0;
number=0;
}
if(number_display!
=0)
{
return1;
}
else
{
return0;
}
}
/*-----------------------------------------------------------
复位键扫描函数
------------------------------------------------------------*/
voidreset_keyscan()
{
if(reset==0)
{
delay(8);
if((reset==0)&&(!
reset_flag))
{second=30;
reset_flag=1;
number_display=0;
state=1;
}
}
else
{
reset_flag=0;
}
}
/*开机函数*/
voidkaishi_keyscan()
{
if(kaishi==0)
{
delay(8);
if((kaishi==0)&&(!
kaishi_flag))
{
kaishi_flag=1;
number_display=0;
state=1;
}
}
else
{
kaishi_flag=0;
}
}
/*-----------------------------------------------------------
主函数
------------------------------------------------------------*/
voidmain()
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
TR0=0;
while
(1)
{while((kaishi==0)&&(!
kaishi_flag))
{start_stop_keyscan();
reset_keyscan();
while(action)
{
while(!
key_scan8())
{
display(number_display,second);
if(second==0)
{
break;
}
}
TR0=0;
second=30-second;
display(number_display,second);
action=0;
break;
}
display(number_display,second);
}
}
}
/*-----------------------------------------------------------
中断服务函数
----------------------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 东北 石油大学 单片机 课程设计 竞赛 抢答
![提示](https://static.bingdoc.com/images/bang_tan.gif)