目 录
第1章 绪论... 1
1.1 单片机抢答器的背景... 1
1.2 抢答器的意义... 1
第2章 设计概述... 2
2.1 抢答器的工作原理... 2
2.2 设计任务... 2
第3章 系统硬件电路设计... 2
3.1 AT89C51单片机硬件电路... 2
3.2原理及电路总框图... 3
第4章 系统软件设计... 5
4.1 主程序设计... 5
4.2 子程序设计... 5
4.2.1数码管显示电路... 5
4.2.2键盘扫描段码表... 6
4.3 系统流程图... 6
4.3.1系统主程序流程图... 6
4.3.2系统中断程序流程图... 6
4.4 源程序代码... 8
第5章 结束语... 16
5.1 小结... 16
5.2 心得体会... 16
参考文献... 17
第1章 绪论
1.1 单片机抢答器的背景
对于抢答器我们大家来说并不陌生,他是用于很多竞赛场合。真正实现先抢先答,让最先抢到题的选手来回答问题。抢答器不仅考验选手的反应速度同时也要求选手具备足够的知识面和一定的勇气,选手们都站在同一个起跑线上,体现了公平公正的原则。
1.2 抢答器的意义
本系统采用单片机作为整个控制核心。控制系统的四个模块为:显示模块、存储模块、抢答开关,总开关模块。该系统通过一个自锁按键输入抢答信号;利用一个数码管来完成显示功能;用按键来让选手进行抢答,在数码管上显示哪一组先答题的,从而实现整个抢答过程。在知识比赛中,特别是做抢答题目的时候,在抢答过程中,为了知道哪一组或哪一位选手先答题,必须要设计一个系统来完成这个任务。如果在抢答中,靠视觉是很难判断出哪组先答题。利用单片机系统来设计抢答器,使以上问题得以解决,即使两组的抢答时间相差几微秒,也可分辨出哪组优先答题。相对于类似电视台这类花几万元采购的抢答器系统,如果个人组织小型的抢答比赛,这毕竟不合适,但是依靠单片机的低成本,低功耗,可以很好的解决个人用户需要举办小型抢答比赛的需求,而且精度高,操作性好。
第2章 设计概述
2.1 抢答器的工作原理
抢答器的工作原理是采用单片机最小系统,用中断式键盘进行抢答。采用动态显示组号。主持人按下开始抢答键才可以抢答。主持人没有按下开始抢答按纽(P3.0),各组人员无法抢答,主持人按下开始抢答按纽(P3.0),数码管10秒倒计时(10秒内抢答有效),如果有人按下按键,程序就会判断是谁先按下的,然后数码显示管就会显示抢答成功选手的号码,并封锁键盘,数码管显示当前选手的编号,禁止其他人按键的输入,从而实现了抢答的功能。如果在设定的时间中没有一个人按下按键,一到时间,则倒计时停止,不可以抢答。抢答成功后。当要进行下一次的抢答时,由主持人抬起自锁按键,主程序再次进入初始化,进入下一次抢答的就绪状态。
2.2 设计任务
(1)多路数字抢答器的硬件和软件设计;
(2)分析电路图;
(3)画出程序流程图;
(4)编写代码;
(5)程序分析与调试;
第3章 系统硬件电路设计
3.1 AT89C51单片机硬件电路
单片机(SCM)是单片微型计算机(Single Chip Microcomputer)的简称。它是把中央处理器CPU、随机存储器RAM、只读存储器ROM、I/O接口电路、定时/计数器以及输入输出适配器都集成在一块芯片上,构成一个完整的微型计算机。它的最大优点是体积小,可放在仪表内部,但存储量小,输入输出适配器简单,功能较低[2]。目前,单片机在民用和工业测控领域得到最广泛的应用,早已深深地融入人们的生活中。近年来,AT89C51在我国非常流行,它最大的特点是内部有可以多次重复编程的ROM,并且ROM可以直接用编程器来擦写,使用起来比较方便。本设计使用到的元器件包括:AT89C51芯片、LED二极管、七段LED数码管的译码。其中AT89C51是系统的核心,它主要负责控制各个部分的协调工作。在其外围接上复位电路,数码管,LED二极管,按钮以及振荡器,P1口为8个LED二极管,P2.1-P2.7为抢答输入键接口,数码管段选P0口,位选P3.5和P3.4口。
3.2原理及电路总框图
图3.1 抢答器原理框图
第4章 系统软件设计
4.1 主程序设计
单片机通电以后,2位数码管显示数字“10”此时自锁开关为打开状态,任何选手的按键都无效,8个LED等长灭,当自锁开关闭合后,数码管开始”10-0”的10秒倒计时,在10秒内任意选手抢答,数码管会立即显示对应选手的号码,对应号码的LED灯也会亮起,此时任何选手的按键都无效。若10秒内无选手抢答,则倒计时完毕以后数码管显示“00”,LED全灭,任意选手按键无效。在任意时候打开自锁开关,则程序初始化,再次按下时可再次抢答
4.2 子程序设计
4.2.1数码管显示电路
LED数码管,实现七段数码管的显示二位十进制数。来进行倒计时,即来限制抢答的时间。由于本次课设选用的共阳接法所以对应的段码表如下
表4-1 共阳接法数码管段码表
4.2.2键盘扫描段码表
本次键盘扫描程序采用的是行列翻转法扫描键盘,即先置行为0,读列值,存在变量1中,然后把列置为0,读行值,存在变量2中,把变量1和变量2相加即为按键对应的键值,下表为相应按键对应的键值
表4-2 行列翻转法键盘键值表
4.3 系统流程图
4.3.1系统主程序流程图
4.3.2系统中断程序流程图
N
Y
Y
N
Y
Y
Y
N
N
N
Y
Y
N
Y
N
Y
4.4 源程序代码
#include<reg51.h>
sbit p3_0=P3^0;
sbit p3_4=P3^4;
sbit p3_5=P3^5;
unsigned char key,num;
unsigned char x,y;
unsigned char count;
unsigned char keycode;
unsigned char LED_T[10]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff}; //P1口LED表
flag=0;
start=0;
flagl=0;
void delay() //延时
{
unsigned int i;
i=500;
while(i--);
}
int keyscan() //键盘扫描
{
unsigned char read,recode,keyvalue;
P2=0xf0;
read=P2;
if(read!=0xf0)
{
delay();
if(read!=0xf0)
{
P2=0x0f;
recode=P2;
keyvalue=read+recode;
return keyvalue;
}
}
return 0;
}
void display() //显示
{
unsigned char code Table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管段码表
switch(num)
{
case 0:{x=0;y=0;break;}
case 1:{x=1;y=0;break;}
case 2:{x=2;y=0;break;}
case 3:{x=3;y=0;break;}
case 4:{x=4;y=0;break;}
case 5:{x=5;y=0;break;}
case 6:{x=6;y=0;break;}
case 7:{x=7;y=0;break;}
case 8:{x=8;y=0;break;}
case 9:{x=9;y=0;break;}
case 10:{x=0;y=1;break;}
}
p3_4=0;
p3_5=0;
P0=Table[x];
p3_4=0;
p3_5=1;
delay();
p3_4=0;
p3_5=0;
P0=Table[y];
p3_4=1;
p3_5=0;
delay();
}
unsigned char decode() //解码按键
{
switch(key)
{
case 0xb7:return 1;
case 0xbb:return 2;
case 0xbd:return 3;
case 0xbe:return 4;
case 0xd7:return 5;
case 0xdb:return 6;
case 0xdd:return 7;
case 0xde:return 8;
}
return 0;
}
void main()
{
while(1)
{
while(start==0) //P3.0自锁开关按下,程序跳出循环,开始初始化中断
{
num=10;
P1=LED_T[9];
display();
if(p3_0==0)
start=1;
}
EA=1;
TMOD=0x01;
TH0=0xd8;
TL0=0xf0;
ET0=1;
TR0=1;
count=100;
num=9;
while(flag==0&&p3_0==0) //flag=0且P3.0按下时执行此循环
{
if(flagl==1) //若中断里检测到按键,P1口对应LED亮起
P1=LED_T[num-1];
display();
}
start=0;
flag=0;
flagl=0;
}
}
void timer_1(void) interrupt 1
{
TH0=0xD8;
TL0=0xf0;
if(p3_0==1) //中断途中抬起P3.0自锁开关,关中断
{
TR0=0;
flag=0;
}
key=keyscan(); //检测到按键,解码按键至对应case,并且显示对应数字,关中断,防止再次进入中断,保证锁住状态
if(key!=0)
{
num=decode();
display();
TR0=0;
flag=0;
flagl=1;
}
count--; //10秒倒计时
if(count==0)
{
num--;
if(num==0)
{
TR0=0;
flag=0;
}
count=100;
}
}
第5章 结束语
5.1 小结
为期一周的课程设计即将结束,在拿到课题后经过仔细的考虑和组员间的分组,我主要负责用绘图工具制作连线图的任务。在程序以及硬件的完成后经过了解和深刻的认识后,我开始了绘制过程。说道绘图工具,现在有很多,AUTOCAD,PROTEL,PROTEUS和altium design9等等,我选用了PROTEL来绘制。
作为一款历史悠久的工具相比起PROTEUS的容易仿真,PROTEL也有着其容易控制和强大的PCB版设计。在绘制过程中,遇到了许多问题,比如元器件的引脚,以及连线不能自动伸缩,在修改时要多费功夫,还有字体大小比例问题等。在经过长时间的修改后,终于完成了绘制。
5.2 心得体会
然后便是开始对实验报告的整理与对自己这一星期来的心得体会。通过这次试验我发现自己对于软件方面尤其是编写程序那块有着长远的不足,这给了自己警示,提醒自己在未来的学习生活中要更加重视这块方面的练习与实践,光看懂是不够的,学生要能够自己流畅的编写这才是关键。
在这里我要感谢知道我的高桂革老师,是她在设计过程中给了我们许多的帮助,正因为有着她孜孜不倦的教导和指正才会是我们少走许多弯路,令我们顺利的完成了课题。自己的努力,组员的合作加上老师的教导才有了这次的完成。
参考文献
[1] 宋彩礼等. 《单片机原理与C51编程》. 西安交通大学出版社 20##年
[2] 李泉溪. 《单片机原理与应用实例仿真》.北京航天航空大学出版社 20##年
[3] 江世明. 《基于Proteus的单片机应用技术》. 电子工业出版社 20##年
[4] 喻宗泉. 《单片机原理与应用技术》.西安电子科技大学出版社 20##年
[5] 万光毅. 《单片机实验与实践教程》. 北京航天航空大学出版社 20##年
第二篇:单片机实训课程设计报告
单片机实训课程设计报告
基于C51单片机的
院 系:
专 业:班 级:姓 名:
学 号:
指导老师:
完成时间:成 绩:
陕西电子科技职业学院
1. 2. 3. 4. 5. 6. 7. 8. 前言 设计目的和要求 总体设计 硬件设计 软件设计 调试及总结 结束语 参考文献