多功能抢答器与投票器报告.docx

上传人:b****2 文档编号:24121322 上传时间:2023-05-24 格式:DOCX 页数:43 大小:290.82KB
下载 相关 举报
多功能抢答器与投票器报告.docx_第1页
第1页 / 共43页
多功能抢答器与投票器报告.docx_第2页
第2页 / 共43页
多功能抢答器与投票器报告.docx_第3页
第3页 / 共43页
多功能抢答器与投票器报告.docx_第4页
第4页 / 共43页
多功能抢答器与投票器报告.docx_第5页
第5页 / 共43页
点击查看更多>>
下载资源
资源描述

多功能抢答器与投票器报告.docx

《多功能抢答器与投票器报告.docx》由会员分享,可在线阅读,更多相关《多功能抢答器与投票器报告.docx(43页珍藏版)》请在冰豆网上搜索。

多功能抢答器与投票器报告.docx

多功能抢答器与投票器报告

多功能投票抢答器设计与总结报告

 

参赛队名:

三人行

组员:

杨福金香黄思友

 

2010年11月05日

目录

摘要:

3

1.系统方案选择和论证3

1.1系统基本方案3

1.2各模块方案选择和论证4

1.2.1电源模块4

1.2.2通信模块4

1.2.3按键模块5

1.2.4显示模块6

1.2.5声音模块6

1.2.6单片机复位电路模块7

2.理论分析与参数计算7

3.系统的电路设计与实现8

3.1系统硬件的基本组成部分8

3.2主要单元电路的设计9

3.3系统的软件设计10

3.3.1单片机c程序:

10

3.3.2上位机部分:

18

4.系统测试21

4.1测试仪器21

4.2指标测试方法及测试数据21

5.结果分析23

6.总结23

参考文献24

摘要:

全国人大副委员长曾经说过:

使用电子投票器后投反票的人数增多了,可见投票器是多么的重要,同样抢答器也是十分的重要,如果没有电子抢答器许多来为我们提供帮助,那么一些赛事就无从谈起什么公平不公平,正因为如此我们设计了这款多功能投票与抢答器,集两者功能于一身,并利用单片机与电脑串口通信随时把单片机上的投票信息与抢答信息发送到电脑中,并把数据保存在电脑,还可以通过电脑控制单片机的启动与设置倒计时时间。

单片机系统的硬件结构给予了抢答系统“身躯”,而单片机的应用程序赋予了其新的“生命”,使其在传统的抢答器与投票系统面前具有电路简单、成本低、运行可靠等特色。

科学技术改变人们的生活,工作,学习的方式,更推进社会的民主化进程。

关键字:

单片机,投票器,抢答器,串口通信,vb。

 

1.系统方案选择和论证

1.1系统基本方案

方案一:

采用可编程I/O口扩展芯片8155

8155作为单片机的扩展接口能实现很多功能,但是这个系统并不复杂,用8155会浪费很多的资源,而且8155要用P0和P2端口作为地址线对它进行读写,这样不仅浪费端口还使得编程变的复杂。

从节省资源和简化编程的角度考虑,放弃了此方案。

方案二:

直接采用stc89C52单片机

直接用单片机不仅编程被简单,还有效的利用了各个端口。

8052单片机的资源完全够这个系统的要求。

所以最终选择了此方案。

本系统采用stc89c52单片机为核心,外加max232芯片,利用rs232与pc进行电脑串口通信,用四个独立按键来代替四个选手的抢答与投票,通过一个自锁开关来选择功能,一个主持人开始键用来控制抢答和投票的开始,通过数码管来显示倒计时时间,因为采用动态扫描的方式容易占用cpu的内存,为了节约资源所以我们采用解码芯片4511来锁存信号并译码,这样为我们节约了不少资源与时间,为抢答与投票的精确性更提供了有力的手断。

上位机我们采用vb编程软件,因为vb简单易学,而且有现成的mscomm控件,专门用来串口通信的。

该表决器可完成4人会议投票、抢答等功能,通过LED、数码管和串行口可完成投票、抢答等结果输出。

图1系统设计模块图

1.2各模块方案选择和论证

1.2.1电源模块

方案一:

采用usb直接供电,好处:

简单,成本低,可以利用电脑现存的usb口供电。

方案二:

采用外部电源供电,并用7805稳压,在这里考虑我们的抢答器与投票器还必须脱离电脑的情况下也能正常运行,所以我们采用直接外部供电

图27805稳压电路

1.2.2通信模块

这里我们采用rs232协议,利用max232芯片来完成通信。

利用单片机与pc机串口通信,波特率设置在9600,传输方式采用方式1,八位数据位。

连接方式见图3,图4

图3max232外部引脚图与内部原理图

图4max232与电脑,单片机的连接

1.2.3按键模块

功能选择键我们采用自锁开光,当开关按下时为投票模式,没按时为抢答模式。

选手按键我们采用独立按键。

图5功能选择键图6选手抢答键

 

1.2.4显示模块

方案一:

采用共阳极数码管,利用人眼的视觉暂留效果,用单片机动态扫描,实现显示效果。

方案二:

由于采用动态扫描要占用系统的资源,因此我们采用4511解码芯片来驱动,数码管采用共阴极数码管。

故方案一舍弃,采用方案二。

图7显示模块

1.2.5声音模块

方案1:

用专门的声音模块,但是考虑经济方面,还有单片机本身资源还是比较丰富的,且声音模块还要占用pcb的一定空间,还考虑抢答投票并不需要很高级的声音,所以舍弃此方案。

方案2:

用单片机来产生不同频率的脉冲波来驱动蜂鸣器发生,由于此方法投资小,编程也简单,更符合题目要求,所以选择此方案。

图8声音模块

1.2.6单片机复位电路模块

在这里我们采用自动复位与手动复位共存的方法,自动复位就是当把电源开关打开时利用电容的充放电特性,给RST一个高点平完成复位,手动复位,就是把按键按下时,强制给RST一个高电平以实现复位。

图9单片机复位电路模块

2.理论分析与参数计算

单片机时钟晶振的选择:

由于我们此系统要与电脑经行串口通信,在通信中,数据的安全性与精确性事很重要的,所以我们在此采用11.0592MHZ的晶振,这样算出来的值才没有误差存在。

波特率计算:

波特率=(2^smod/32)*(定时器T1溢出率)

溢出率=溢出周期的倒数

溢出周期=(256-X)*12/Fosc

波特率=(2^smod*Fsoc)/(32*12*(256-X))

而我们的波特率设置在9600带入计算得出

TH1=0xFA;TL1=0xFA;(这里我们smod等于1)。

发光二极管限流电阻的选择:

R=(5-2)/10=300欧姆,这里我们选用220欧姆的电阻,能进一步加大发光二极管的显示亮度。

数码管限流电阻的选择:

这里我们同样选择220欧姆电阻做为我们的限流电阻,事实证明,显示效果良好。

单片机复位电路电阻电容选择:

电阻电容的值的选择是由我们单片机的复位时间决定的,而单片机的复位,只需在RST引脚上加两个机器周期的高电平即可完成复位。

假设高电平复位有效,一充一放周期是1.386*RC,舍去充放过程中较低的电平,一般的单片机复位脉冲宽度取值:

(0.7~1)RC反正都是大概的,电平保持时间越长越好,电容大点好。

单位是:

(R)*(C)=(欧姆)*(法拉)=秒

R=10K,C=0.1UF则延时

时间是(10*1000)*(0.1/1000000)

=0.001秒一毫秒时间完全够复位电路的高电平时间

3.系统的电路设计与实现

3.1系统硬件的基本组成部分

图10硬件实物图

图11Proteus原理仿真图

 

3.2主要单元电路的设计

电源电路

所用元器件:

LM7805*10,220uF电解电容(16V)*1,自锁开光*1,电源插孔*1,发光二极管(绿色)*1,220欧姆色环电阻*1

原理图见图2

通信电路

所用元器件:

max232cpe通信芯片*1,1uF电容(50v)*1,16脚插座*1

原理图见图

Max

显示电路

所用元器件:

RJ5101AH*2(共阴数码管),HCF4511BE译码器*2,220欧姆色环电阻*10,发光二极管*8

原理图见图3,图4

单片机最小系统

所用元器件:

STC89C52单片机*1,11.0592MHZ晶振*1,10pf陶瓷电容*2,排阵20针*2,

独立按钮*1,10uF点解电容*1,带锁单片机插座*1

原理图见图11

键盘与蜂鸣器

所用元器件:

独立按键*5,带锁开关*1,蜂鸣器*1,9012三极管*1,100欧姆色环电阻*1

3.3系统的软件设计

3.3.1单片机c程序:

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

//********************函数声明

voiddelay(uchart);//延时函数

voidSPEAKER_get(void);//抢答函数

voidSPEAKER_foul(void);//违规函数

voidSPEAKER_start(void);//开始函数

voidtoupiao();//投票程序

voidtoupiaokaishi();//投票开始程序

voidtoupiaoxianshi();//投票显示结果程序

voidqiangda();//抢答程序

voidqiangdakaishi();//抢答开始程序

voidledsan();//发光二极管显示程序

voidinstall();//初始化程序

voiddisplay(ucharx,uchary);//数码管闪烁程序

ucharkey_xuanshou();//选手键盘扫描程序

ucharkey_gnxz();//功能键扫描程序

ucharkey_start();//主持人开始键扫描程序

voidstart();//开始程序

voidckchaxun();//串口查询

//********************

 

//********************位定义

sbitgnxz=P2^7;//功能选择位

sbitb1=P2^5;//选手一键

sbitb2=P2^4;//选手二键

sbitb3=P2^3;//选手三键

sbitb4=P2^2;//选手四键

sbitBEEP=P2^0;//蜂鸣器

sbitl1=P0^0;//选手一对应的发光二极管

sbitl2=P0^1;//选手二对应的发光二极管

sbitl3=P0^2;//选手三对应的发光二极管

sbitl4=P0^3;//选手四对应的发光二极管

sbithost_start=P2^6;//主持人按键

//********************

//**************************************************************************

bitst=0;//启动标志

bitled=0;//时间标志位

ucharmiao;//定时器0:

当定时器中断miao加1

ucharnumber=0;//串口是否连通标志位

uintkeyid=0;//选手键值标志位

uchartime=30;//倒计时时间

uchartime2_number=0;//定时器2计数次数

uinttoupia[4];//用于存放投票结果的数组

ucharre_data[4]={0};//串口接收到的数据

ucharrre_data[4]={0};

ucharcodetable1[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};//数码管高位编码

ucharcodetable2[10]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90};//数码管低位编码

//***************************************************************************

//***************************************************************************

//函数名:

主函数

//功能描述:

初始化设置,当打开系统后,八个发光二极管亮一下,以示系统运行正常

//调用函数:

install(),delay();start()

//***************************************************************************

main()

{

miao=0;

install();

P0=0x00;

delay(50);

P0=0xff;

miao=0;

start();

}

//*****************************************************************************

//函数名:

开始函数

//功能描述:

功能选择,并向pc发送功能选择信息

//调用函数:

printf(),toupiao();qiangda();

//*****************************************************************************

voidstart()

{

if(key_gnxz()==1)

{

printf("现在功能:

投票");

toupiao();

}

if(key_gnxz()==0)

{

printf("现在功能:

抢答");

qiangda();

}

}

//*****************************************************************************

//函数名:

投票入口函数

//功能描述:

在此不断检测是否有开始键按下和查询串口信息,如果有开始信号则转入正式投票,否者如果没开始信号而有人按下则是违规,则报警

//投票后装入投票显示函数。

//调用函数:

key_start(),ckchaxun();key_xuanshou();SPEAKER_foul();SPEAKER_start();toupiaokaishi();toupiaoxianshi();

//全局变量:

st

//*****************************************************************************

voidtoupiao()

{

st=0;

while(!

key_start()&st==0)

{

ckchaxun();

if(key_xuanshou()!

=0)

SPEAKER_foul();

}

st=0;

SPEAKER_start();

toupiaokaishi();

toupiaoxianshi();

}

//*****************************************************************************

//函数名:

投票函数

//功能描述:

进入函数把倒计时时间赋值给shezhi变量,然后票数清零,开led闪烁,开定时器0,串口查询,当倒计时到零或者票数大于4则跳出

//关led闪烁关定时器0,发送投票信息给电脑。

//调用函数:

display();ckchaxun();key_xuanshou();delay();printf();delay();SPEAKER_foul();

//全局变量:

time,toupia[0],toupia[1],toupia[2],toupia[3]

//*****************************************************************************

voidtoupiaokaishi()

{

charshezhi=time;

toupia[0]=0;

toupia[1]=0;

toupia[2]=0;

toupia[3]=0;

led=1;

TR0=1;

miao=0;

display(shezhi);

while(shezhi!

=0)

{

ckchaxun();

if(miao==20|miao>20)

{

shezhi--;

display(shezhi);

miao=0;

}

switch(key_xuanshou())

{

case1:

if(toupia[0]<5)

{

toupia[0]=toupia[0]+1;

SPEAKER_start();

}

else

SPEAKER_foul();

break;

case2:

if(toupia[1]<5)

{

toupia[1]=toupia[1]+1;

SPEAKER_start();

}

else

SPEAKER_foul();

break;

case3:

if(toupia[2]<5)

{

toupia[2]=toupia[2]+1;

SPEAKER_start();

}

else

SPEAKER_foul();

break;

case4:

if(toupia[3]<5)

{

toupia[3]=toupia[3]+1;

SPEAKER_start();

}

else

SPEAKER_foul();

break;

}

if((toupia[0]+toupia[1]+toupia[2]+toupia[3])>=4)

shezhi=0;

}

led=0;

TR0=0;

P0=0xff;

printf("1号选手得票为%d",toupia[0]);

delay(100);

printf("2号选手得票为%d",toupia[1]);

delay(100);

printf("3号选手得票为%d",toupia[2]);

delay(100);

printf("4号选手得票为%d",toupia[3]);

delay(100);

}

//*****************************************************************************

//函数名:

投票显示程序

//功能描述:

每隔一秒显示一个结果,第一个数码管显示选手号码,第二个显示选手票数

//,当有开始键按下的时候停止显示,转到投票入口函数。

//调用函数:

key_start();toupia();

//全局变量:

miao

//*****************************************************************************

voidtoupiaoxianshi()

{

uchari=0;

miao=0;

TR0=1;

while(!

key_start()&st==0)

{

ckchaxun();

if(miao==20)

{

display((i+1)*10+toupia[i]);

i++;

if(i==4)

i=0;

miao=0;

}

}

TR0=0;

P1=0xff;

toupiao();

}

//*****************************************************************************

//函数名:

抢答入口函数

//功能描述:

在此不断检测是否有开始键按下和查询串口信息,如果有开始信号则转入正式抢答,否者如果没开始信号而有人按下则是违规,则报警

//调用函数:

key_start(),ckchaxun();key_xuanshou();SPEAKER_foul();SPEAKER_start();qiangdakaishi();

//全局变量:

st

//*****************************************************************************

voidqiangda()

{

st=0;

while

(1)

{

ckchaxun();

if(key_start()|st)

{

st=0;

SPEAKER_start();

P0=0xff;

qiangdakaishi();

}

if(key_xuanshou()!

=0)

SPEAKER_foul();

}

}

//*****************************************************************************

//函数名:

抢答函数

//功能描述:

进入函数把倒计时时间赋值给shezhi变量,开定时器0,串口查询,当有人投票时,倒计时停止,蜂鸣器响起,发送抢答信息给电脑

//关led闪烁关定时器0,发送投票信息给电脑,转到抢答入口函数。

//调用函数:

display();ckchaxun();key_xuanshou();delay();printf();delay();SPEAKER_get();qiangda();

//全局变量:

time,miao,keyid

//*****************************************************************************

voidqiangdakaishi()

{

ucharshezhi=time;

TR0=1;

miao=0;

display(shezhi);

while

(1)

{

ckchaxun();

if(miao==20)

{shezhi--;

display(shezhi);

miao=0;

}

switch(key_xuanshou())

{

case1:

l1=0;

keyid=1;

SPEAKER_get();

break;

case2:

l2=0;

keyid=2;

SPEAKER_get();

break;

case3:

l3=0;

keyid=3;

SPEAKER_get(

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1