抢答器单片机课程设计报告.docx
《抢答器单片机课程设计报告.docx》由会员分享,可在线阅读,更多相关《抢答器单片机课程设计报告.docx(18页珍藏版)》请在冰豆网上搜索。
抢答器单片机课程设计报告
一 课程设计题目及要求.........................2
二 设计整体思路.................................2
三 原理图.....................................2
四 程序模块.....................................3
五 软件程序.....................................4
六 心得体会........................................13
一 、课程设计题目及要求
1 抢答开关电路分别设定选手抢答键8个、主持人开始抢答键和复位键,开始指示灯,犯规指示灯,抢答成功指示灯。
2系统工作后,首先由主持人按下开始键,开始指示灯亮,单片机进入20秒倒计时并显示,台位号显示0。
3 选手们开始抢答,如果在20秒内无人抢答,则蜂鸣器发声报警,等待主持人按复位键,进入下一题;
4 若有人抢答,数码管同步显示抢答选手的编号,同时蜂鸣器器发声提示,表示抢答成功,抢答成功指示灯亮,开始指示灯灭。
同时封锁输入电路,禁止其他选手抢答
5在主持人按下开始抢答键前,有选手提前按下抢答键时,视为抢答犯规,犯规指示灯点亮,数码管显示犯规选手台位号,同时蜂鸣器发声提示抢答犯规。
6 主持人按下复位键,系统返回到抢答状态,进行下一轮抢答。
7当主机发送09H,从机回发09H,主机显示9,当主机发送非09H时,从机回发台位号,并在主机显示。
8
二 、设计整体思路
根据任务要求抢答器由抢答输入、单片机识别和处理、输出信息和状态的显示、串行通信四部分组成。
抢答器的工作原理是采用单片机最小系统,用程序查询方式采用动态显示组号。
由波码开关K1~K8组成8路抢答器的输入,有复位按钮和C1,电阻组成复位电路。
单片机运行时对P1口扫描检测,判断是否有按键按下,进一步确定是哪路键位按下。
P2口做倒计时20秒两位数码管驱动,每位数码管输入为8位二进制代码。
第一位数码管为抢答台位数码显示。
D1、D2、D3发光二极管只是抢答器的工作状态,蜂鸣器BUZI发出声音提示。
其工作原理为:
接通电源后,主持人将开关拨到“清除”状态,抢答器处于禁止状态,编号显示器灭灯,定时器显示设定时间;主持人将开关置,“开始”状态,宣布“开始”抢答器工作。
定时器倒计时,选手在定时时间内抢答时,抢答器完成:
优先判断、编号锁存、编号显示、扬声器提示。
当一轮抢答之后,定时器停止、禁止二次抢答、定时器显示剩余时间。
如果再次抢答必须由主持人再次操作“开始、停止”状态开关。
三 、原理图
四、 程序模块
否
是
否
是
否
是
否
是否
否
否是
五、软件程序
主机程序:
#include
#defineLEDLen6
xdataunsignedcharOUTBIT_at_0x8002;//位控制口
xdataunsignedcharOUTSEG_at_0x8004;//段控制口
xdataunsignedcharIN_at_0x8001;//键盘读入口
unsignedcharLEDBuf[LEDLen];//显示缓冲
unsignedchara;
unsignedcharb;//接收缓冲
unsignedcharreceive;
bitHasRcv=0;//接收标志
bitflag;
unsignedchari=0;
unsignedcharTestKey();
unsignedcharGetKey();
codeunsignedcharLEDMAP[]={//八段管显示码
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
voidSerialIO0()interrupt4
{
if(TestKey());
SBUF=GetKey();
if(TI);
TI=0;
if(RI)
{
RI=0;
HasRcv=1;
receive=SBUF;
if(receive==0x09)
{
flag=1;
//RI=0;
b=SBUF;
//HasRcv=1;
}
else
{
flag=0;
a=SBUF;
//LEDBuf[1]=LEDMAP[a];
//RI=0;
//HasRcv=1;
}
}
/*if(TI);
TI=0;*/
}
voidDelay(unsignedcharCNT)
{
unsignedchari;
while(CNT--!
=0)
for(i=100;i!
=0;i--);
//for(j=500;j!
=0;j--);
}
voidDisplayLED()
{
unsignedchari;
unsignedcharPos;
unsignedcharLED;
Pos=0x20;//从左边开始显示
for(i=0;iOUTBIT=0;//关所有八段管
LED=LEDBuf[i];
OUTSEG=LED;
OUTBIT=Pos;//显示一位八段管
Delay
(1);
Pos>>=1;//显示下一位
}
}
codeunsignedcharKeyTable[]={//键码定义
0x16,0x15,0x14,0xff,
0x13,0x12,0x11,0x10,
0x0d,0x0c,0x0b,0x0a,
0x0e,0x03,0x06,0x09,
0x0f,0x02,0x05,0x08,
0x00,0x01,0x04,0x07
};
unsignedcharTestKey()
{
OUTBIT=0;//输出线置为0
return(~IN&0x0f);//读入键状态(高四位不用)
}
unsignedcharGetKey()
{
unsignedcharPos;
unsignedchari;
unsignedchark;
i=6;
Pos=0x20;//找出键所在列
do{
OUTBIT=~Pos;
Pos>>=1;
k=~IN&0x0f;
}while((--i!
=0)&&(k==0));
//键值=列X4+行
if(k!
=0){
i*=4;
if(k&2)
i+=1;
elseif(k&4)
i+=2;
elseif(k&8)
i+=3;
OUTBIT=0;
doDelay(10);while(TestKey());//等键释放
return(KeyTable[i]);//取出键码
}elsereturn(0xff);
}
voidmain()
{
IE=0x00;//DISABLEALLINTERRUPT
TMOD=0x20;//定时器1工作于方式2(8位重装)
TH1=0xFa;//2400BPS@
TL1=0xFa;
PCON&=0x7F;//SMOD位清零
SCON=0x50;//串行口工作方式设置01010000
LEDBuf[0]=0x00;
LEDBuf[1]=0xff;
LEDBuf[2]=0x00;
LEDBuf[3]=0x00;
LEDBuf[4]=0x00;
LEDBuf[5]=0x00;
TR1=1;
ES=1;
EA=1;
HasRcv=0;
while
(1)
{
if(HasRcv)
{
if(flag==1)
{
LEDBuf[1]=LEDMAP[b];
}
else
{
LEDBuf[1]=LEDMAP[a];
}
}
DisplayLED();
/*if(TestKey())
SBUF=GetKey();*/
}
}
从机程序:
#include
/*常量定义*/
#defineBAUD2400
/*指示位定义*/
sbitsy=P3^0;//蜂鸣提示
sbitkszsd=P3^3;//开始指示
sbitfgzsd=P3^4;//犯规指示
sbitqdzsd=P3^5;//抢答器指示
/*键位定义*/
sbitksyx=P3^2;//开始运行
sbitk1=P1^0;//抢答键位
sbitk2=P1^1;
sbitk3=P1^2;
sbitk4=P1^3;
sbitk5=P1^4;
sbitk6=P1^5;
sbitk7=P1^6;
sbitk8=P1^7;
/*数码显示*/
unsignedinta[]={0x06,0x3f};
unsignedintb[]=
{0x6f,0x7f,0x07,0x7d,0x6d,0x66,0x4f,0x5b,0x06,0x3f};
codeunsignedcharLEDMAP[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*变量定义*/
xdataunsignedcharOUTBIT_at_0x8002;//位控制口
xdataunsignedcharOUTSEG_at_0x8004;//段控制口
xdataunsignedcharIN_at_0x8001;//键盘读入口
unsignedchardjs=0;//倒计时变量
unsignedcharqdh=0;//判断抢答器
unsignedcharxsqdh=0;//显示抢答号
unsignedchards100ms=0;//100ms定时
unsignedcharshiwei=0;
unsignedcharrecv1,recv2,flag;
unsignedchargewei=0;
bitkszt=0;//开始按键状态
bitc=1;//是否执行抢答判断
/*函数定义*/
voiddsqcsh();//定时器初始化
voidqdpd();//抢答判断
voidjwpd();//键位判断
voidxs();//显示
voidqdzs();//抢答指示
voidspeaker();//蜂鸣
voiddelay();
voidctpd();//串通判断
/*主函数*/
voidmain()
{dsqcsh();
while(c)
{
qdpd();
xs();
}
ctpd();
}
/*定时器初始化函数*/
voiddsqcsh()
{
TMOD=0x01;//采用方式1,16位计数器
TH0=0x3c;//定时初值
TL0=0xb0;
EA=1;
IT0=0;//低电平触发方式
ET0=1;//允许定时器T0中断
}
/*抢答判断函数*/
voidqdpd()
{
jwpd();
if(ksyx==0)//开始键是否按下
{
kszt=1;kszsd=0;
if(xsqdh==0)TR0=1;
}
if(kszt==0)//开始键未按下有抢答
{
if(qdh!
=0)
{fgzsd=0;kszsd=1;EX0=0;TR0=0;speaker();qdh=0;c=0;}
}
else//开始键已按下
{
if(djs>=20)//开始键已按下,20s内无抢答
{EX0=0;TR0=0;kszsd=1;speaker();djs=0;c=0;}
if(qdh!
=0)//开始键按下,20s内有抢答
{qdzsd=0;EX0=0;TR0=0;kszsd=1;speaker();qdh=0;c=0;}
}
}
/*键位判断函数*/
voidjwpd()
{
if(k1==0)qdh=1;/*1号选手抢答成功*/
if(k2==0)qdh=2;
if(k3==0)qdh=3;
if(k4==0)qdh=4;
if(k5==0)qdh=5;
if(k6==0)qdh=6;
if(k7==0)qdh=7;
if(k8==0)qdh=8;
xsqdh=qdh;
}
/*数码管显示函数*/
voidxs()
{shiwei=djs/10;
gewei=djs%10;
//后两位显示秒数
OUTBIT=0x02;
OUTSEG=a[shiwei];
delay();
OUTBIT=0x01;
OUTSEG=b[gewei];
delay();//第一位显示抢答号
OUTBIT=0x20;
OUTSEG=LEDMAP[xsqdh];
delay();
}
/*定时器T0中断函数*/
voidtime0()interrupt1//6M晶振,中断间隔100ms
{
TH0=0x3c;
TL0=0xb0;
if(ds100ms==10)
{
djs++;TH0=0x3c;TL0=0xb0;ds100ms=0;
}
else
{
ds100ms++;
}
}
/*延时函数*/
voiddelay()
{
inti,j;
for(i=5;i>0;i--)
for(j=100;j>0;j--);
}
/*蜂鸣函数*/
voidspeaker()
{
sy=0;
delay();
sy=1;
}
/*串通判断函数*/
voidctpd()
{
TMOD=0x21;
TH1=0xfd;//串行口波特率9600b/s
TL1=0xfd;
SCON=0x50;//串行口工作方式1,允许接受
PCON=0x00;
TR1=1;
ES=1;
EA=1;
}
/*串通执行函数*/
voidctzx()interrupt4
{
if(RI)
{
RI=0;
if(SBUF==0x09)
{
recv1=SBUF;
flag=1;
}
elserecv2=SBUF;
flag=0;
if(flag==1)
SBUF=recv1;
elseSBUF=xsqdh;
}
}
六 、心得体会
单片机课程设计是一门很实用,很难的设计。
这个设计用到了单片机,电路等方面的知识,通过这次课程设计,使我对单片机及其附属电路有了一定的了解,对课本上的知识有了近一步的掌握,也深刻明白了自己的不足。
刚做做课程设计时,仔细阅读设计的题目和要求,以为没什么困难的。
可是当我动手开始做的时候,才发现其中的设计是那么繁琐。
于是,再到网上查找资料,在经过借鉴很多类似的资料,文献后,总算是有点眉目了。
埋头苦干的过程是痛苦的,尤其是在思考算法和程序框架时,迷茫,烦躁。
在痛苦中挣扎,建立,推翻,参考别人的思路,建立,再次在推翻,在这不断循环中,终于最后完善了程序。
其中的煎熬是很痛苦的,深刻明白攻克自己“未知领域”的困难。
但当课程设计完成时,那感觉是甜蜜的。
同时我也感觉到自己从课本上学到的理论知识和实践仍有很大的差距。
这让我重新反思我们的学习,深刻领悟到我们这个专业动手,实践的重要性。
理论不经过实践考验,是没法实施的,就像我们编的程序,很多方面考虑的都不够,几乎没有涉及到实际应用时的防范方法措施。
总之, 这次的课程设计,对我来说收获真的很多。