无线抢答器.docx
《无线抢答器.docx》由会员分享,可在线阅读,更多相关《无线抢答器.docx(28页珍藏版)》请在冰豆网上搜索。
![无线抢答器.docx](https://file1.bdocx.com/fileroot1/2023-1/30/7da9a803-a5c6-4a90-807e-6e61201fed95/7da9a803-a5c6-4a90-807e-6e61201fed951.gif)
无线抢答器
无线抢答器
1.
系统功能要求
(1)可任意设定回答时间、抢答时间(0-999秒),时间可正计、倒计切换;
(2)可显示组号,显示时间;
(3)抢中或违规可自动语音播报出组号;
(4)内置喇叭,声音可调节;
(5)抢答时限规定:
01~999秒可调,答题时限规定:
01~999秒可调;
(6)建议使用PT2262/PT2272制作。
2.系统整体结构
2.1主控台框图
图2.1主控台框图
2.1.1数码管显示
数码管显示采用的是74HC573锁存、ULN2803驱动显示模块,通过锁存器控制位选、段选均使用P0口,使系统简单化。
2.1.2语音模块
语音模块采用较为容易控制的SYN6288模块,采用串行通信方式。
2.1.3无线收发模块
无线接收模块采用315MHzDF无线收发模块配套PT2272解码部分,形成控制命令,对显示、语音模块加以控制。
无线发送模块采用的是315MHzDF无线收发配套PT2262编码,此部分不与单片机相连。
2.1.4键盘控制
键盘、拨码开关部分通过对I/O口控制,实现主控命令。
2.2抢答端框图
图2.2抢答端框图
2.2.1数码管显示
数码管显示部分采用的是74HC595实现I/O口模拟串口,ULN2803驱动显示模块,74595实现了I/O口的大节约化,仅用三个口驱动段选。
2.2.2无线收发模块
无线发送模块采用的是315MHZ无线收发配套PT2262编码部分,此部分不与单片机相连。
无线接收模块采用315MHZ无线收发模块配套PT2272解码部分,形成控制命令。
3.系统硬件电路设计
3.1系统总电路
图3.1.1主控端原理图
图3.1.2抢答端原理图
3.2无线收发模块
图3.2.1无线发射模块原理图
图3.2.2无线发射模块原理图
DF无线模块的工作频率是315MHZ,采用省标谐振器SAW进行稳频,受环境温度的影响非常小,声表谐振器的频率稳定度仅次于晶体。
DF无线接收模块实际上是一个超再生接收电路,这是一个非常成熟的电路。
3.3PT2262/PT2272解码/编码芯片
图3.3.1PT2262原理图
PT2262发出的编码信号是由:
地址码、数据码、同步码组成一个完整的码字,解码芯片接收到解码信号时,其地址码经过两次比较核对后,VT标志位才会输出高电平,相应的数据码也会变成高电平,当发射机没有按键按下的时候,PT2262不接通电源,PT2262不工作,当有按键摁下的时候,其17管脚输出经调制的串行数据信号。
PT2272采用的是PT2272-M4,表示数据输出为四位的暂存性红外遥控接收芯片,采用此型号的芯片主要是为了配套语音模块的只刷新一遍,否则采用L4型号语音模块将不断刷新播报,采用四位数据输出因为四位数据输出的编码足够各种功能的组合。
3.474HC573、74HC595
图3.474HC573原理图
74HC573是器件的输入是和标准CMOS兼容的,具有高噪声抵抗特性的8路锁存器,恰好够数码管的8路输出。
74HC595是硅结构的CMOS器件,兼容低电压TTL电路,由串行输入8位并行输出的移位寄存器和一个存储器构成,因为移位寄存器和存储器是不同的时钟。
因此当输出8位数据时,通过控制两个时钟,当连接数码管时中间的移位状态不会显示,只会显示移位后的状态。
这也是74595相较于74164的优点。
3.5驱动芯片ULN2803
图3.5ULN2803原理图
ULN2803属于高电压、大电流的达林顿晶体管阵列。
他的驱动负载电流是500mA,驱动电压为50V。
适合驱动大数码管。
4.系统软件设计
4.1系统软件开发环境
采用KEIL开发环境,对STC89C51进行控制,通过单片机开发板将程序下载到单片机中。
具体步骤如下:
1、启动KEILC51。
2、新建一个工程。
Project菜单——NewProject,选择好要保存好的文件后,键入qiangda保存,接着弹出CPU的类型,选择STC89C51。
3、在工程中加入文件,新建一个文件,文件菜单File——New,我们再选择文件菜单File——Saveas,弹出对话框后,我们文件名框中键入qiangda.c,这样C文件就建立好了。
再把文件加入到工程中去。
点击Target1前面的+号键,右键单击SourceGroup1——选择AddFiletoGroupSourceGroup1,选择添加Add。
4、Project设置:
在Project——optionsforTarget(target1)——output将createHEX选中,这样编译后如果程序没有问题就可以生成单片机可以识别的HEX文件。
5、将程序下载到单片机中,打开STC-ISP,选择单片机的型号,打开程序文件,选择正确的com口,下载程序,给开发板上电,当显示下载成功后,就可以实现实现相应的功能。
图4.152系统开发板
4.2系统主要功能的实现流程
图4.2系统流程
4.3系统主要功能实现源代码
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitzhengdao=P3^2;//正倒计
sbitqidong=P3^3;//启动
sbitpan=P3^4;//抢答时间还是回答时间
sbitbaiadd=P3^5;//百位的按键
sbitshiadd=P3^6;//十位的按键
sbitgeadd=P3^7;//个位的按键
sbitzanting=P1^5;//暂停
sbitpan2=P1^7;//清屏
#defineKEYP1//定义用来检测按键的端口
sbitK0=P1^1;
sbitK1=P1^2;
sbitK2=P1^3;
sbitK3=P1^4;//程序代码为四个抢答端
sbitDUAN=P2^6;//定义锁存使能端口段锁存
sbitWEI=P2^7;//位锁存
sbitTTS_BUSY=P1^0;//检测SYN6288模块工作状态
#defineHEAD_LEN5//数据包头的长度
#defineLEN_OFFSET2//长度字节的偏移量(本例中长度不超过255字节,因此只使用1字节长度)
#defineBKM_OFFSET4//背景音乐命令偏移
#defineBKM_MAX15//背景音乐数量
//数据包头(0xFD+2字节长度+1字节命令字+1字节命令参数)
ucharcodehead[HEAD_LEN]={0xfd,0x00,0x00,0x01,0x00};
ucharnBkm=0x00;//背景音乐编号
staticucharbai2=0;shi2=0;ge2=0;//初始化
staticucharbai1=0;shi1=0;ge1=0;//初始化
uchacodeTAB[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
staticunsignedintsecond;
intm;
unsignedchartext[]={"[soundu]选手抢答犯规,组号"};
unsignedchartext1[]={"[soundu]选手抢答成功,组号"};
unsignedchartext2[]={"[soundu]选手抢答犯规,组号"};
#defineTEXT_LEN28//正文长度
#defineNUM_POS25
#defineNUM_MIN1
#defineNUM_MAX8
uintnNum=NUM_MIN;
staticucharcounter=0;second_1=0;second_0=0;second_2=0;
voiddelay(unsignedcharm);
voiddelayms(unsignedinti);
voiddisplay();
voidUART_InitBaud(void);
voidDelay1(uintn);
voidBkMusic(ucharnum);
voidSpeech(uchar*buf);
voidscankey2(void);
voidTimer0(void)interrupt1
{
ET0=0;
TH0=0X3C;
TL0=0XB0;
counter++;
if(counter==20)
{
counter=0;
if(zhengdao==1)
second++;
elsesecond--;
if(second==0||second==999)
{TR0=0;}
second_1=(second%100)/10;//shi
second_0=(second%100)%10;//ge
second_2=second/100;
}
ET0=1;
}
voiddelay(unsignedcharm)
{while(m--)
{
unsignedchari;
for(i=120;i>0;i--)
{}
}
}
voiddelayms(unsignedinti)
{
unsignedchara,b;
for(a=0;a
for(b=0;b<120;b++);
}
voiddisplay1(void)
{
P0=0Xfe;
WEI=1;//位锁存
WEI=0;
P0=TAB[bai1];
DUAN=1;//段锁存
DUAN=0;
delayms
(2);
P0=0Xfd;
WEI=1;//位锁存
WEI=0;
P0=TAB[shi1];
DUAN=1;//段锁存
DUAN=0;
delayms
(2);
P0=0Xfb;
WEI=1;//位锁存
WEI=0;
P0=TAB[ge1];
DUAN=1;//段锁存
DUAN=0;
delayms
(2);
P0=0Xf7;
WEI=1;//位锁存
WEI=0;
P0=TAB[bai2];
DUAN=1;//段锁存
DUAN=0;
delayms
(2);
P0=0Xef;
WEI=1;//位锁存
WEI=0;
P0=TAB[shi2];
DUAN=1;//段锁存
DUAN=0;
delayms
(2);
P0=0Xdf;
WEI=1;//位锁存
WEI=0;
P0=TAB[ge2];
DUAN=1;//段锁存
DUAN=0;
delayms
(2);
}
voidscankey1(void)
{
if(pan==1)
{
if(baiadd==0)
{
delayms(10);
if(baiadd==0)
{while(baiadd==0);
(bai1)++;
if((bai1)==9)
{(bai1)=0;}
}
}
if(shiadd==0)
{
delayms(10);
if(shiadd==0)
{while(shiadd==0);
(shi1)++;
if((shi1)==9)
{(shi1)=0;}
}
}
if(geadd==0)
{
delayms(10);
if(geadd==0)
{while(geadd==0);
(ge1)++;
if((ge1)==9)
{(ge1)=0;}
}
}
}
else
{
if(baiadd==0)
{
delayms(10);
if(baiadd==0)
{while(baiadd==0);
(bai2)++;
if((bai2)==9)
{(bai2)=0;}
}
}
if(shiadd==0)
{
delayms(10);
if(shiadd==0)
{while(shiadd==0);
(shi2)++;
if((shi2)==9)
{(shi2)=0;}
}
}
if(geadd==0)
{
delayms(10);
if(geadd==0)
{while(geadd==0);
(ge2)++;
if((ge2)==9)
{(ge2)=0;}
}
}
}
}
voiddisplay()
{
P0=0Xfe;
WEI=1;//位锁存
WEI=0;
P0=TAB[second_2];
DUAN=1;//段锁存
DUAN=0;
delay(3);
P0=0Xfd;
WEI=1;//位锁存
WEI=0;
P0=TAB[second_1];
DUAN=1;//段锁存
DUAN=0;
delay(3);
P0=0Xfb;
WEI=1;//位锁存
WEI=0;
P0=TAB[second_0];
DUAN=1;//段锁存
DUAN=0;
delay(3);
}
voidDelay1(uintn)
{
uchari=112;
while(n--)
while(i--);
}
//串口初始化
voidUART_InitBaud(void)
{
SCON=0xD8;//晶振为11.059MHZ时,设定串口波特率为9600bit/s,方式3
PCON=0x00;
TH1=0xFD;
TR1=1;
}
//串口发送数据
voidSendChar(ucharn)
{
SBUF=n;
while(TI==0);//发送数据
TI=0;
}
//背景音乐(参数为0表示关闭背景音乐)
voidBkMusic(ucharnum)
{
num%=BKM_MAX+1;
nBkm=num;
}
//发声程序
voidSpeech(uchar*buf)
{
uchari=0;//循环计数变量
ucharxor=0x00;//校验码初始化
ucharch=0x00;
ucharlen=0x00;
while(buf[len++]);//当数组buf的第len个值的内容不为0时执行下列程序
//发送数据包头(0xFD+2字节长度+1字节命令字+1字节命令参数)
for(i=0;i{
if(i==BKM_OFFSET)
ch=nBkm<<3;//写入背景音乐
elseif(i==LEN_OFFSET)
ch=len+3;
else
ch=head[i];
xor^=ch;
SendChar(ch);
Delay1
(1);
}
//发送文字内容
for(i=0;i{
xor^=buf[i];
SendChar(buf[i]);
Delay1
(1);
}
SendChar(xor);//发送校验位
Delay1(10);
while(TTS_BUSY);//等待语音结束
Delay1(10);
}
//键扫描
voidscankey2(void)
{
uchark;
KEY=0xff;//置位键端口以读取键值
if(KEY!
=0xff)//如果有键按下
{
k=KEY;//取键值
Delay1
(1);//消抖
if(K0==1)
nNum=1;
elseif(K1==1)
nNum=2;
elseif(K2==1)
nNum=3;
elseif(K3==1)
nNum=4;
elsereturn;
sprintf(text+NUM_POS,"%1d",nNum);//修改选手号码
Speech(text);//合成语音
Delay1(1000);//抢答间隔
return;
}
}
voidmain()
{
TMOD=0X21;
TH0=0X3C;
TL0=0XB0;
ET0=1;EA=1;
UART_InitBaud();//初始化串口为9600bps
Delay1(200);
BkMusic(4);//背景音乐4
Delay1(200);
Speech("[t5]欢迎大家参加竞赛,请[3]选手们做好准备");//欢迎词
BkMusic(0);//关闭背景音乐
Delay1(1000)
while
(1)
{
if(qidong==1)
{
if(zanting==0)
{
TR0=1;
for(m=0;m<28;m++)
{text[m]=text1[m];}
scankey2();
display();
if(K0==1&&K1==0&&K2==0)
{
P0=0Xf7;
WEI=1;
WEI=0;
P0=0X06;
DUAN=1;
DUAN=0;
delayms(4);
}
elseif(K0==0&&K1==1&&K2==0)
{
P0=0Xf7;
WEI=1;
WEI=0;
P0=0X5B;
DUAN=1;
DUAN=0;
delayms(4);
}
elseif(K0==0&&K1==0&&K2==1)
{
P0=0Xf7;
WEI=1;
WEI=0;
P0=0X4F;
DUAN=1;
DUAN=0;
delayms(4);
}
}
elseif(zanting==1)
{
TR0=0;
second=100*(bai2)+10*(shi2)+(ge2);
}
}
elseif(qidong==0)
{
for(m=0;m<28;m++)
{text[m]=text2[m];}
scankey2();
second=100*(bai1)+10*(shi1)+(ge1);
TR0=0;
if(pan2==1)
{
scankey1();
display1();
}
else
{
P0=0Xff;
WEI=1;
WEI=0;
P0=0X00;
DUAN=1;
DUAN=0;
if(K0==1&&K1==0&&K2==0)
{
P0=0Xf7;
WEI=1;
WEI=0;
P0=0X06;
DUAN=1;
DUAN=0;
delayms(4);
}
elseif(K0==0&&K1==1&&K2==0)
{
P0=0Xf7;
WEI=1;
WEI=0;
P0=0X5B;
DUAN=1;
DUAN=0;
delayms(4);
}
elseif(K0==0&&K1==0&&K2==1)
{
P0=0Xf7;
WEI=1;
WEI=0;
P0=0X4F;
DUAN=1;
DUAN=0;
delayms(4);
}
}
}
}
}
5.系统测试
5.1无线模块的测试
图5.1地址码和数据码的脉冲表示
其中,Ta=8个时钟宽度,Tb=1个时钟宽度,Tc=2个字码长度。
地址码和数据码都用宽度不同的脉冲来表示,两个窄脉冲表示“0”;两个宽脉冲表示“1”;一个窄脉冲和一个宽脉冲表示“F”也就是地址码的“悬空”。
图5.2pt2272的不同后缀功能
后缀的6和4表示有几路并行的控制通道,当采用4路并行数据时(PT2272-M4),对应的地址编码应该是8位,如果采用6路的并行数据时(PT2272-M6),对应的地址编码应该是6位。
图PT22622272编码信号波形
5.2显示数码管调试
经过一系列的调试,八英寸数码管已经可以完全实现可任意设定回答时间、抢答时间(0-999秒),时间可正计、倒计切换、清屏、显示抢答组号及分数的功能。
图5.2.1设定抢答时间、回答时间
图5.2.2抢答时间的正计/倒计
图5.2.3回答时间的正计/倒计
图5.2.4抢答组号显示
图5.2.5分数的加、减、清零及保持
6.课程建议
此门课程开的非常有意义,在以前觉得学接口什么的没有什么用处,觉得自己学的只是书本上的比较死的知识,但是通过这次实验,能够意识到一门课程只要学过了就一定能够用的上,这也是一个学习新的知识的过程,比如加深了我对高频知识的理解。
也让我理解了一个产品,他的系统的形成是一个不断优化的过程,要敢于突破,敢于创新。
通过电子实验,我们掌握应用基本理论和设计软件,设计电子电路的能力。
掌握电子电路的测试方法,熟练应用电子工程领域相关仪器、仪表和设备对电路的技术指标进行测试。
我们通过自主设计电路和软件来完成,解决一些实际问题。
而且开放性创新实验,给了我们一个完全自由发挥的平台。
在这里,我们利用所有资源实现自己的创意,提高了主动学习的积极性。
但是我觉得最好不要和学长学姐合作,容易产生依赖的心理。
并且产品的系统最好不是一方面的东西,不能直视软件方面的开发,或者只是模电知识。
7.参考文献
【1】康华光,邹寿彬.电子技术基础(数字部分)(第五版).高等教育出版社.2005
【2】康华光,邹寿彬.电子技术基础(模拟部分)(第五版).高等教育出版社.2005
【3】李朝青.单片机原理及接口技术[M].北京:
北京航空航天大学出版社.2005
【4】朱勇.单片机原理与应用技术.清华大学出版社.2006
【5】张毅刚,彭喜元等.新编MCS-51单片机应用设计(第二版).哈尔滨工业大学出版社.2006
【6】潭博学,苗江静.集成电路原理及应用.北京:
电子工业出版社.2003
【7】高峰.单片微机应用系统设计及实用技术[M].北京:
机械工业出版社.2004
【8】楼然苗,李光飞.51系列单片机设计实例.北京航空航天大学出版社.2006
【9】何书森,何华斌.实用电子线路设计速成[M].福州:
福建科学技术出版社,2006
【10】陈欢庆.电子制作理论与实践[M].浙江大学出版社.2005
【11】马淑华、王凤文、张美金.单片机原理及接口技术.北京邮电大学出版社.2005.10
【12】杨金岩,郑应强,张振仁.8051单片机数据传输接口扩展技术与应用实例.人民邮电出版社.2005
【13】王文杰 基于逻辑数字电路的抢答器设计-毕业论文(20