单片机实验8路抢答器C语言知识版

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机综合实验报告

题目: 8路抢答器实验

班级:

姓名:

学号:

指导老师:

时间:

一、实验内容:

以单片机为核心,设计一个8位竞赛抢答器:同时供8名选手或8个代表队比赛,分别用8个按钮S0~S7表示。本实验有Protues软件仿真。

分别设置一个抢答控制开关S1和复位开关S2,由主持人控制。

抢答器具有锁存与显示功能。即选手按按钮抢答时,锁存相应的编号,并且优先抢答选手的编号一直保持显示在显示器上,直到主持人将系统复位为止。

抢答器具有定时抢答功能,且一次抢答的时间由主持人设定为30秒。

当主持人启动“开始”键后,定时器进行减计时,同时绿色LED灯亮。

二、实验电路及功能说明

分别设置一个抢答控制开关S1和复位开关S2,由主持人控制。

抢答器具有锁存与显示功能。即选手按按钮抢答时,锁存相应的编号,并且优先抢答选手的编号一直保持显示在显示器上,直到主持人将系统复位为止。参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统复位为止。复位后参赛队员可继续抢答。

如果定时时间已到,无人抢答,本次抢答无效,系统报警红色LED灯亮,并禁止抢答,定时显示器上显示00。

三、实验程序流程图:

主程序;

非法抢答序;抢答时间调整程序;回答时间调整程序;倒计时程序;正常抢答处理程序;犯规处理程序;显示及发声程序。主流程图如下图所示

子程序

四、实验结果分析

五、心得体会

六、程序清单

#include

#define uchar unsigned char

#define uint unsigned int

sbit wela_a=P3^0;

sbit wela1=P3^1;

sbit wela2=P3^7;

sbit rest=P3^5;

sbit host=P3^6;

sbit led1=P3^4;//绿灯

sbit led2=P3^3;//红灯

sbit led3=P3^2;//黄灯

sbit key1=P1^0;

sbit key2=P1^1;

sbit key3=P1^2;

sbit key4=P1^3;

sbit key5=P1^4;

sbit key6=P1^5;

sbit key7=P1^6;

sbit key8=P1^7;

uchar x,q,d,s,ge,t0,t1,start,flag; uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

void init();/*初始函数申明*/

void display(uchar s,uchar ge,uchar a); void delay(uint z); void keyscan();

void main()

{

init();

display(s,ge,a);

while(1)

{

if(host==0) //主持人控制开关

{

delay(5);

if(host==0)

{

flag=1;

start=1;

delay(5); 延时

while(!host); 检测开关

}

}

if(rest==0) //复位

{

delay(5);

if(rest==0)

{

q=30;

led2=1;

led3=1;

x=0;

delay(5);

.-

start=1;

delay(5);

while(!rest);

}

}

if(flag==1)

{

if(start==0)//选手按下,倒计10秒开始 {

led3=0;

wela1=0;

wela2=0;

delay(1);

TR0=0;

TR1=1;

display(s,ge,a);

delay(1);

}

if(start==1)//主持人按下,倒计时30秒{

led1=0;

wela1=0;

wela2=0;

delay(1);

TR0=1;

TR1=0;

display(s,ge,a);

delay(1);

keyscan();

}

}

}

}

void init()/*初始化*/

{

t0=0;

t1=0;

flag=0;

q=30;

d=10;

wela_a=0;

a=0;

TMOD=0x11;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

TH1=(65536-50000)/256;

TL1=(65536-50000)%256;

EA=1;

ET0=1;

ET1=1;

TR0=0;

TR1=0;

}

void display(uchar s,uchar ge,uchar a)/*数码管动态扫描*/

{

wela1=1;

P0=table[ge];

delay(5);

wela2=1;

相关文档
最新文档