keil 5与proteus8.9仿真实现四路抢答计分器 您所在的位置:网站首页 四人智力抢答器仿真图 keil 5与proteus8.9仿真实现四路抢答计分器

keil 5与proteus8.9仿真实现四路抢答计分器

2024-05-31 22:22| 来源: 网络整理| 查看: 265

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录 设计目的代码实现仿真图

设计目的

设计一个四位抢答器与计分系统。

模拟四位抢答器与计分系统,实现倒计时抢答,选择自己所选选项,统计所得分数等功能。

(1)抢答器同时供四名选手或四个代表队使用,分别用一号,二号,三号,四号四个按钮表示。

(2)设置一个抢答开始控制开关,该开关由主持人控制。开关按下开始倒计时30s,有人抢答后就停止倒计时。

(3)抢答器具有锁存与显示的功能。即按下开始按键后,选手按下抢答按钮,锁存相应的编号,且优先抢答的选手的编号会一直保存至下一次抢答开始。

(4)抢答后选手应该给出自己的答案,并通过A,B,C,D四个按钮选择选项,同时显示器会显示所选答案。

(5)回答问题给出选项后,主持根据正确答案对相应选手进行加分或减分(开始时全部选手以十分为底,答对一题加一分,答错扣一分,最少总分为零分。)若回答正确绿灯亮,回答错误红灯亮。

(6)四个显示器分别显示对应选手的总得分。

二、代码实现

代码如下(示例):

#include "regx52.h"

#include

sbit DIN=P3^0;// 串行数据输入端

sbit LD=P3^1;// 装载数据信号输入端

sbit CLK=P3^2;// 移位脉冲输入端

sbit begin=P3^6;//开始按钮

sbit led1=P2^4;

sbit led2=P2^5;

unsigned char a=10,b=10,c=10,d=10,e=0;

unsigned char choice=15;//选项,没选时显示为灭

unsigned char second=30;//倒计时时间

unsigned char counter=0;//记录中断次数

unsigned char number=0;

unsigned char people=0;//选手编号

unsigned char num_add[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};//max7219读写地址,内容。

unsigned char num_dat[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b};//非译码方式时的共阴数码管显示编码,0-9

unsigned char NixieTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x40,0x00};//共阴数码管显示编码,0-9,a-d,- 灭

void delay(unsigned int xms)//延时函数

{

       unsigned char i, j;

       while(xms--)

       {

              i = 2;

              j = 239;

              do

              {

                     while (--j);

              } while (--i);

       }

}

unsigned char shuzi()//键盘扫描函数(按列扫描),并返回对应的键值。

{

  unsigned char i;

  unsigned int temp;

  P1=0xfe;

  for(i=4;i>0;i--)

  {

       temp=P1;

       temp=temp&0xf0;

       while(temp!=0xf0)

       {

         switch(temp)

         {

           case 0x70:number=i;

               break;

              case 0xb0:number=i+4;

               break;

              case 0xd0:number=i+8;

               break;

              case 0xe0:number=i+12;

               break;

         }

 while(temp!=0xf0)

         {

           temp=P1;

              temp=temp&0xf0;

         }

        

       }

       temp=P1;

       temp=temp|0xf0;

       temp=_crol_(temp,1);

       P1=temp;

  }

       return number;

}

void Nixie(unsigned char Location,Number)//四位数码管动态显示,Nixie(unsigned char Location,Number),第一个参数显示的位码,第二个为显示的段码

{

       switch(Location)      

       {

              case 4:P2_3=1;P2_2=1;P2_1=1;P2_0=0;break;

              case 3:P2_3=1;P2_2=1;P2_1=0;P2_0=1;break;

              case 2:P2_3=1;P2_2=0;P2_1=1;P2_0=1;break;

              case 1:P2_3=0;P2_2=1;P2_1=1;P2_0=1;break;

       }

       P0=NixieTable[Number];

       delay(1);

  P0=0x00;

                                  

}

void people_display()//选手编号显示,在四位数码管的第一位(最高位)显示选手编号

{Nixie(4,people);

}

void xuanxiang_display()//选手选项显示,在四位数码管的第二位显示选手选项

{Nixie(3,choice);

}

void time_display(unsigned char x)//倒计时时间显示函数

{     unsigned char i,j;

       i=x/10;

       j=x%10;

       Nixie(2,i);

       Nixie(1,j);

}

void max7219_send(unsigned char addr,unsigned char wdata)//向max7219写命令

{

unsigned char temp,i=1,j,k;

LD=0;

while(i

       CLK=0;

       if((temp&0x80)==0x80) DIN=1; //先发送数据的最高位

       else DIN=0;

       for(k=5;k>0;k--); //时钟频率高的单片机需曾加延时时间,此处为12MHz

       CLK=1;

       for(k=5;k>0;k--);

       temp

       if(counter

              counter=0;

              second=second-1;

              if(second==0){second=30;}

       }

       TH0=0xd8;//重新装初值

       TL0=0xef;

       TR0=1;//启动定时器0

}

void grade_display()//全部选手得分显示

{unsigned char i,j,k,l,m,n,o,p;

       i=a/10;

       j=a%10;

       k=b/10;

       l=b%10;

       m=c/10;

       n=c%10;

       o=d/10;

       p=d%10;

       max7219_send(num_add[1],num_dat[j]);

       max7219_send(num_add[0],num_dat[i]);

       max7219_send(num_add[3],num_dat[l]);

       max7219_send(num_add[2],num_dat[k]);

       max7219_send(num_add[5],num_dat[n]);

       max7219_send(num_add[4],num_dat[m]);

       max7219_send(num_add[7],num_dat[p]);

       max7219_send(num_add[6],num_dat[o]);

}

void holderscan()//倒计时和选手编号初始化设置,时间设置30s,选手编号设置为0.并对编号,得分,倒计时进行显示

{     max7219_init();grade_display();people=0;second=30;

       time_display(second);people_display();

}

void main()

{     while(1)

       {

              do{holderscan();

              }while(begin);//一直进行倒计时和选手编号初始化设置,直到按下开始按钮

              while(~begin);//按键消抖

              timer_init();//定时器T0初始化,10ms产生一次中断

              TR0=1;//开启定时器计数

              do{time_display(second);

                     if(shuzi()



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有