学号1251401243《单片机》课程设计(2012级本科)题目:基于单片机的抢答器设计系(部)院:物理与机电工程学院专业:电气工程及其自动122班作者姓名:杨存恩指导教师:向根祥职称:副教授完成日期: 2 0 1 5 年 6 月28 日目录1 引言 (2)1.1 设计目的 (2)1.2 设计要求 (2)2 设计方案 (2)3 硬件设计 (3)3.1 电路原理图 (3)3.2总体设计电路图 (3)3.2.1 振荡电路 (4)3.2.2 复位电路 (4)3.2.3 加减分电路及蜂鸣器报警电路 (5)3.2.4 抢答电路及裁判控制开始停止电路 (5)3.2.5 数码管显示电路 (6)4 仿真过程示意 (7)4.1 开始抢答 (7)4.2 抢答倒计时 (8)4.3 答题及答题倒计时 (8)4.4 违规抢答 (9)4.5 答题正确加分 (9)4.6 答题错误减分 (9)4.7 抢答结束 (10)5 程序流程图 (11)6 课程设计总结 (11)参考文献 (12)附录:源程序清单 (13)1 引言1.1 设计目的现如今电视节目日益丰富其中的竞赛环节也越来越多,其中智力抢答器是不可或缺的器材。
在本学期学习了单片机这门课之后,我觉得可以试着自己来实现抢答器的功能,令它能准确、公正、直观地判断出第一抢答者,并通过抢答器的数码管显示和蜂鸣器报警指出抢答组别。
最终做出一种数字式抢答器的设计方案,通过Proteus设计完成,利用keil2软件编辑程序,仿真验证,适用于多种竞赛场合。
1.2 设计要求设计一个用于智力竞赛的抢答器,其功能的实现是由单片机控制的,满足:(1)能容许2-6组进行抢答。
(2)能显示抢答组号。
(3)各组记分,并能记分显示。
(4)比赛结束时,能发出报警声。
2 设计方案在设计中采用的单片机是AT89C51,它主要负责控制各个部分协调工作。
P1.0和P1.7由裁判控制,分别是抢答开始和停止键。
P1.1—P1.6是6组抢答的输入口,按下对应按钮即为抢答。
P0口为数码管的段选口,位选口用的是P2口的低4位,外部中断0。
外部中断1,P3.3用于控制有组答题完成后结束计时。
P3.4—P3.5分别实现了分数的加一和减一。
P3.6为蜂鸣器的控制口。
外部中断和内部中断并存,单片机有硬件复位端,只要输入持续4个机器周期的高电平即可实现复位。
外部还接有蜂鸣器用来发出报警音。
采用7SEG-MPX4-CC-BLUE显示,它是共阴极的由高电平点亮。
系统仿真用到了Proteus软件,通过仿真可以显示所设计系统的功能,对于程序的调试等有很大的帮助。
3 硬件设计3.1 电路原理图电路原理图如图3.1所示。
图3.1 电路原理图3.2总体设计电路图整个系统分为:外部振荡电路、复位电路、加减分电路及蜂鸣器报警电路、抢答电路及裁判控制开始停止电路、数码管显示电路几个部分。
本设计的核心是单片机AT89C51。
AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,128字节内部RAM,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
3.2.1 振荡电路振荡电路使用外部振荡电路,由两个1nF的电容和一个晶体振荡、外部振荡电路。
图3.2.1 晶振振荡电路3.2.2 复位电路外部中断和内部中断并存,单片机有硬件复位端,只要输入持续4个机器周期的高电平即可实现复位。
硬件复位后的各状态可知寄存器及存储器的值都恢复到了初始值。
因为本设计功能中有倒计时时间的记忆功能,所以不能对单片机进行硬件复位,只能用软复位。
软复位实际上就是当程序执行完毕之后,将程序指针通过一条跳转指令让它跳转到程序开始。
图3.2.2 复位电路3.2.3 加减分电路及蜂鸣器报警电路P3.3接口的开关按下意味着答题结束,P3.4接口开关表示给抢答相应组加上一分,P3.5接口开关按下表示相应组减去一分。
裁判示意开始抢答、有组抢答成功、违规抢答、最后5s倒计时都会触发蜂鸣器发出警报。
P3.6为蜂鸣器控制口。
图3.2.3 加减分电路及蜂鸣器报警电路3.2.4 抢答电路及裁判控制开始停止电路P1.0和P1.7由裁判控制,分别是抢答开始和停止键。
P1.1-P1.6是6组抢答的输入口,按下按钮抢答。
图3.2.4 抢答电路及裁判控制开始停止电路3.2.5 数码管显示电路采用排阻RESPACK-8来做为上拉电阻,排阻一般应用在数字电路上,通常作为某个并行口的上拉或者下拉电阻用。
排阻具有方向性,与色环电阻相比具有整齐、少占空间的优点,比用若干只固定电阻更方便。
图3.2.5 排阻RESPACK-8数码管7SEG-MPX4-CC-BLUE,它是共阴极的数码管图3.2.6 数码管7SEG-MPX4-CC-BLUE4 仿真过程示意4.1 开始抢答开始抢答时,数码管显示000。
图4.1 开始抢答4.2 抢答倒计时允许抢答后,开始倒计时从15s直到0s。
在最后5s蜂鸣器会发出警报。
图4.2 抢答倒计时4.3 答题及答题倒计时第四组抢答,答题时间有30s,在最后5s蜂鸣器会发出警报。
图4.3 第四组答题及答题倒计时4.4 违规抢答若还没有允许抢答就有人按下抢答器,那么蜂鸣器会发出警报,并显示是哪一组违规抢答。
如图为第二组违规抢答。
图4.4 第二组违规抢答4.5 答题正确加分如图为第四组回答正确加一分图4.5 第四组答题正确加一分4.6 答题错误减分如图为第四组回答错误减一分图4.6 第四组答题错误减一分4.7 抢答结束抢答结束后电路复位,并记录各组抢答得分,待下次抢答得分累计。
5 程序流程图图5.1 程序流程图6 课程设计总结在这次课程设计中,我们运用到了以前所学的专业课知识,如:汇编语言、模拟和数字电路知识等。
虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。
要做好一个课程设计,就必须做到:在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常德,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的课程设计结束了,但是从中学到的知识会让我受益终身。
发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。
设计过程,好比是我们人类成长的历程,常有一些不如意,但毕竟这是第一次做,难免会遇到各种各样的问题。
在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
参考文献[1] 周立功.夏宇闻.单片机与CPLD综合应用技术[M].北京:北京航空航天大学出版[2] 丁元杰.单片微机原理及应用[M].北京:机械工业出版社.[3] 靳达编.单片机应用系统开发实例导航[M].北京:人民邮电出版社.[4] 李光飞.单片机课程设计实例指导[M].北京:北京航空航天大学出版社.[5] 胡宴如.高频电子线路[M].北京:高等教育出版社.[6] 白驹珩.雷晓平.单片计算机及其应用[M].成都:电子科技大学出版社.[7] 李广弟.单片机基础[M].北京:北京航空航天大学出版社.[8] 沈美明.温冬婵.IBM汇编语言程序设计[M].北京:清华大学出版社.[9] 彭传正.林春景.凌阳单片机原理与实践[M].北京:北京航空航天大学出版社.[10] 李荣正.陈学军.PIC单片机实践教程[M].北京:北京航空航天大学出版社。
附录:源程序清单OK EQU 20HRING EQU 22HORG 0000HAJMP MAINORG 000BHAJMP T0INTORG 0013HAJMP INT1SUBORG 001BHAJMP T1INTORG 0040HMAIN:MOV R1,#15;设置抢答倒计时时间15sMOV R2,#30;设置答题倒计时时间30sMOV TMOD,#11H;设置未定时器/工作方式1(16位计数器)MOV TH0,#0F0H;MOV TL0,#0FFH;越高发声频率越高,越尖(3.842ms)MOV TH1,#3CH;MOV TL1,#0B0H;50ms为一次溢出中断SETB EASETB ET0SETB ET1SETB EX1;允许3个中断,T0/T1/INT0/INT1CLR OKCLR RINGSETB TR1SETB TR0;开始就运行定时器,初始显示888如果想重新计数,重置TH1/TL1;=====查询程序=====START: MOV R5,#00HMOV R4,#00HMOV R3,#00HACALL DISPLAY;未开始抢答时候显示888JB P1.0,NEXTACALL DELAYJB P1.0,NEXT;去抖动,如果"开始键"按下就向下执行,否者跳到非法抢答查询ACALL BARK;按键发声MOV A,R1MOV R6,A;送R1->R6,因为R1中保存了抢答时间SETB OK;抢答标志位,用于COUNT只程序中判断是否查询抢答MOV R3,#0AH;抢答只显示计时,灭号数AJMP COUNT;进入倒计时程序,"查询有效抢答的程序"在COUNT里面NEXT:JNB P1.1,FALSE1JNB P1.2,FALSE2JNB P1.3,FALSE3JNB P1.4,FALSE4JNB P1.5,FALSE5JNB P1.6,FALSE6AJMP START;=====非法抢答处理程序=====FALSE1: ACALL BARK;按键发声MOV R3,#01HAJMP ERRORFALSE2: ACALL BARKMOV R3,#02HAJMP ERRORFALSE3: ACALL BARKMOV R3,#03HAJMP ERRORFALSE4: ACALL BARKMOV R3,#04HAJMP ERRORFALSE5: ACALL BARKMOV R3,#05HAJMP ERRORFALSE6: ACALL BARKMOV R3,#06HAJMP ERROR;=====INT1(答题对错加减分数程序)===== INT1SUB:MOV R4,#0AHMOV R5,#0AHJNB P3.4,INC1JNB P3.5,DEC1JNB P1.7,BACK1ACALL DISPLAYAJMP INT1SUBMOV A,R3SUBB A,#01HJZ XXY1SUBB A,#02HJZ XXY2SUBB A,#03HJZ XXY3SUBB A,#04HJZ XXY4SUBB A,#05HJZ XXY5SUBB A,#06HJZ XXY6XXY1:MOV R7,41HXXY2:MOV R7,42HXXY3:MOV R7,43HXXY4:MOV R7,44HXXY5:MOV R7,45HXXY6:MOV R7,46HINC1:INC R7CJNE R3,#01H,L1MOV 51H,R7L1:CJNE R3,#02H,L2MOV 52H,R7L2:CJNE R3,#03H,L3MOV 53H,R7L3:CJNE R3,#04H,L4MOV 54H,R7L4:CJNE R3,#05H,L5MOV 55H,R7L5:CJNE R3,#06H,LLMOV 56H,R7LL:ACALL DELAY1AJMP INT1SUBDEC1:DEC R7ACALL DELAY1AJMP INT1SUBBACK1:RETI;=====倒计时程序(抢答倒计时和回答倒计时都跳到该程序)=====COUNT: MOV R0,#00H;重置定时器中断次数MOV TH1,#3CH;MOV TL1,#0B0H;重置定时器(53ms)RECOUNT:MOV A,R6;R6保存了倒计时的时间,之前先将抢答时间或回答时间给R6MOV B,#0AHDIV AB;除十分出个位/十位MOV 30H,A;十位存于(30H)MOV 31H,B;个位存于(31H)MOV R5,30H;取十位MOV R4,31H;取个位MOV A,R6SUBB A,#07HJNC LARGER;大于5s跳到LARGER,小于等于5s会提醒MOV A,R0CJNE A,#0AH,FULL;1s中0.5s向下运行CLR RINGAJMP CHECKFULL:CJNE A,#14H,CHECK;下面时1s的情况,报警,显示号数并清R0,重新计数SETB RINGMOV A,R6JZ QUIT;计时完毕MOV R0,#00HDEC R6;一秒标志减1AJMP CHECKLARGER: MOV A,R0CJNE A,#14H,CHECK;如果1s向下运行,否则跳到查"停/显示"DEC R6;计时一秒R6自动减1MOV R0,#00HCHECK: JNB P1.7,QUIT;如按下停止键退出ACALL DISPLAYJB OK,ACCOUT;如果是抢答倒计时,如是则查询抢答,否者跳过查询继续倒数(这里起到锁抢答作用)AJMP RECOUNTACCOUT:JNB P1.1,TRUE1JNB P1.2,TRUE2JNB P1.3,TRUE3JNB P1.4,TRUE4JNB P1.5,TRUE5JNB P1.6,TRUE6AJMP RECOUNTQUIT:CLR OK;如果按下了"停止键"执行的程序CLR RINGAJMP START;=====正常抢答处理程序=====TRUE1: ACALL BARK;按键发声MOV A,R2MOV R6,A;抢答时间R2送R6MOV R7,41HCLR OK;因为答题的计时不再查询抢答,所以就锁了抢答AJMP COUNTTRUE2:ACALL BARK;MOV A,R2MOV R6,AMOV R3,#02HMOV R7,42HCLR OKAJMP COUNTTRUE3:ACALL BARK;MOV A,R2MOV R6,AMOV R3,#03HMOV R7,43HCLR OKAJMP COUNTTRUE4:ACALL BARK;MOV A,R2MOV R6,AMOV R3,#04HMOV R7,44HCLR OKAJMP COUNTTRUE5:ACALL BARK;MOV A,R2MOV R6,AMOV R3,#05HMOV R7,45HCLR OKAJMP COUNTTRUE6:ACALL BARK;MOV A,R2MOV R6,AMOV R3,#06HCLR OKAJMP COUNT;=====犯规抢答程序=====ERROR:MOV R0,#00HMOV TH1,#3CHMOV TL1,#0B0HMOV 34H,R3;犯规号数暂存与(34H)HERE: MOV A,R0CJNE A,#0AH,FLASH;0.5s向下运行->灭并停响CLR RINGMOV R3,#0AHMOV R4,#0AHMOV R5,#0AH;三灯全灭AJMP CHECK1FLASH:CJNE A,#14H,CHECK1;下面系1s的情况,响并显示号数并清R0,重新计SETB RINGMOV R0,#00HMOV R3,34H;取回号数MOV R5,#0BHMOV R4,#0BH;显示FF和号数AJMP CHECK1CHECK1:JNB P1.7,QUIT1ACALL DISPLAYAJMP HEREQUIT1: CLR RINGCLR OKAJMP START;=====显示程序=====DISPLAY:MOV 41H,51HMOV 42H,52HMOV 43H,53HMOV 44H,54HMOV 45H,55HMOV 46H,56HMOV DPTR,#DAT1;查表显示程序,利用P0口做段选码口输出/P2低三位做位选码输出,MOV A,r5MOVC A,@A+DPTRMOV P2,#01HMOV P0,AACALL DELAYMOV DPTR,#DAT2MOV A,r4MOVC A,@A+DPTRMOV P2,#02HMOV P0,AACALL DELAYMOV A,r3MOVC A,@A+DPTRMOV P2,#04HMOV P0,AACALL DELAYMOV A,R7MOVC A,@A+DPTRMOV P2,#08HMOV P0,AACALL DELAYRETDAT1:DB 00H,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H ;"灭","1","2","3","4","5","6","7","8","9","灭","F"DAT2:DB 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H ;第一个为零,其他与上相同,因为十位如果为零显示熄灭;====加减时间延时(起到不会按下就加N个数)======DELAY1: MOV 35H,#08HLOOP0: ACALL DISPLAYDJNZ 35H,LOOP0RET;=====延时(显示和去抖动用到)=====DELAY: MOV 32H,#12HLOOP: MOV 33H,#0AFHLOOP1: DJNZ 33H,LOOP1DJNZ 32H,LOOPRET;=====发声程序=====BARK: SETB RINGACALL DELAY1ACALL DELAY1CLR RING;按键发声RET;=====TO溢出中断(响铃程序)=====T0INT: MOV TH0,#0ECHMOV TL0,#0FFHJNB RING,OUT;CPL P3.6;RING标志位为1时候P3.6口不短取反使喇叭发出一定频率的声音OUT: RETI;=====T1溢出中断(计时程序)=====T1INT: MOV TH1,#3CHMOV TL1,#0B0HINC R0RETIENDPLC程设计成绩评定表指导教师签字:年月日。