找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2378|回复: 0
收起左侧

51单片机3路抢答器设计文档

[复制链接]
ID:674854 发表于 2019-12-26 19:56 | 显示全部楼层 |阅读模式
设计要求
1、一位主持人和3位抢答者,复位后,甲乙丙的绿、红灯全亮,开始键、复位键的指示灯全暗;主持人按复位键则仅复位指示灯亮,其他都暗,准备开始;主持人按开始键,开始灯亮,允许甲乙丙抢答,此时优先者则相应成功指示灯亮,如允许前抢就相应犯规灯亮;答题开始进行倒计时,到规定时间不允许答题,并返回复位状态。
2、具有抢答控制和倒计时显示功能。
3、控制器应有复位控制、开始控制、抢答控制和状态指示等功能,并有答题时间控制和显示功能。

单片机源程序如下:
  1. #include"reg51.h"        //包括一个51标准内核的头文件
  2.         #include "ABSACC.H"      //库函数
  3.         #define a8255_PA XBYTE[0xD1FF]   /*PA口地址*/
  4.         #define a8255_PB XBYTE[0xD2FF]   /*PB口地址*/
  5.         #define a8255_PC XBYTE[0xD5FF]   /*PC口地址*/
  6.         #define a8255_CON XBYTE[0xD7FF]   /*控制字地址*/
  7.         unsigned char  Timer_Count=0;     //定义变量
  8.         unsigned char second=9;
  9.         unsigned char  light;
  10.         unsigned char const  num_table[16]={                                   
  11.              0xA0,       /*0*/
  12.              0xBB,       /*1*/
  13.              0x62,       /*2*/
  14.              0x2A,       /*3 */
  15.              0x39,       /*4*/
  16.              0x2C,       /*5 */
  17.              0x24,       /*6*/
  18.              0xBA,       /*7*/
  19.                            0x20,       /*8*/
  20.              0x28,       /*9 */
  21.              0x30,       /*A*/
  22.              0x25,       /*B*/
  23.              0xE4,       /*C*/
  24.              0x23,       /*D*/
  25.              0x64,       /*E*/
  26.              0x74,       /*F */
  27.              };
  28. void Timer1_Init(void);    //函数声明
  29. void GInt_Init(void);
  30. void delay (unsigned int x)  ;
  31. void display (unsigned char place,         unsigned char number)                ;
  32. unsigned char         keyboard();
  33.   main()        // 主程序
  34.   {unsigned char flag=0;
  35.   light=0xc0;
  36.     Timer1_Init();定时器工作模式设定及初始化  
  37. while(1)         //主程序循环
  38. {          GInt_Init();  //函数调用(打开中断及相应的设定)
  39.      P1=light;
  40.         display(6,second);
  41.          if(second==0)
  42.         {second=0x09;
  43.         TR1=0;
  44.         light=0x7f;
  45.         }
  46.     flag=keyboard();
  47.    if(light==0x3f)
  48.     {  switch(flag)
  49.      {case  1: light=        0xfd,TR1=1;  break;
  50.       case   2: light= 0xf7, TR1=1  ;    break;
  51.       case   3:light=0xdf,  TR1=1;  break;
  52.       default : light =0x3f;}
  53. }
  54.    if(light==0x7f)
  55. { switch(flag)         
  56.    {case  1: light=0xfe; break;
  57.     case   2:light=0xfb; break;
  58.     case   3:light= 0xef; break;
  59. default :  light =0x7f; }
  60.        }
  61. }
  62. }
  63. void GInt_Init(void)         //打开中断及相应的设定
  64.    { EA = 1;
  65.       EX0 = 1;
  66.           IT0 = 1;
  67.     EX1= 1;
  68.         IT1 = 1;
  69.          ET1=1;          
  70.                    }
  71.   void ISR_Ex0(void) interrupt 0   //外中断0
  72. {         light=0x7f;}
  73.   void ISR_Ex1(void) interrupt   2  //外中断1
  74.   {          light&=0xbf;}
  75.         void Timer1_Init(void)   // 定时器工作模式设定及初始化  
  76.         { TMOD=0x10;
  77.           TH1=(65535-50000 )/256;
  78.           TL1=(65535-50000)%256;
  79.    }
  80.    void ISR_Timer1(void) interrupt 3  //1秒时间的设定
  81. {Timer_Count++;
  82. if(Timer_Count == 20)
  83.             {Timer_Count = 0;                                                                  
  84.               second--; }
  85.                         Timer1_Init();        }
  86. void delay(unsigned int x)        //延时
  87. {unsigned char i,j,k;
  88.           while(x--)
  89.          {        for(i=0;i<=5;i++)
  90.             for(j=0;j<=10;j++)
  91.         ;        }
  92.         }
  93. void display(unsigned char place, unsigned char number)  //显示
  94.         { a8255_CON=0x89;
  95.           a8255_PA =0xff;
  96.           a8255_PB=0xff;
  97.       a8255_PA=~(0x01<<(place-1));
  98.       a8255_PB=num_table[number];
  99. }
  100.   unsigned char keyboard()   //键盘
  101. { unsigned         char  PC_data;
  102.           unsigned char j;
  103.           unsigned char y=0;
  104.                         a8255_CON=0x89;
  105.            a8255_PA=0xf1;
  106.                         a8255_PB=0xff;
  107.               delay(1);
  108.                            PC_data=a8255_PC;
  109.                            for(j = 0;j<4;j++)
  110.                           { if((PC_data&(1<<j)) == (1<<j))
  111.                                  y= j+1; }
  112.                                   return(y)         ; }
复制代码

完整的Word格式文档51黑下载地址:
#51单片机三路抢答器.doc (207.5 KB, 下载次数: 22)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表