×
单片机 > 单片机程序设计 > 详情

基于51单片机八路抢答器资料

发布时间:2020-06-17 发布时间:
|

(1)设计一个可供8人进行的抢答器。
(2)系统设置复位按钮,按动后,重新开始抢答。
(3)抢答器开始时数码管显示序号0,选手抢答实行优先显示,优先抢答选手的编号一直保持到主持人将系统清除为止。抢答后显示优先抢答者序号,同时发出音响。,并且不出现其他抢答者的序号。
(4)抢答器具有定时抢答功能,且一次抢答的时间有主持人设定,本抢答器的时间设定为30秒,当主持人启动“开始”开关后,定时器开始减计时,同时蜂鸣器有短暂的声响。
(5)设定的抢答时间内,选手可以抢答,这时定时器停止工作,显示器上显示选手的号码和抢答时间。并保持到主持人按复位键。
(6)当设定的时间到,而无人抢答时,本次抢答无效,扬声器报警发出声音,并禁止抢答。定时器上显示00。

仿真原理图如下
 

制作出来的实物图如下:
 

元件型号    元件名称    元件标号    数量
SMG04_1    数码管    *1    1
蜂鸣器    蜂鸣器    B1    1
10uF    电容    C1    1
20pF    电容    C2, C3    2
9012    三极管    Q1, Q2, Q3, Q4, Q5    5
10K    电阻    R6    1
SW-PB    按键    S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, S11    11
sw-灰色    电源开关    SW1    1
U1    单片机    U1    1
12M    晶振    Y1    1

单片机源程序如下:


#include                  //调用单片机头文件

#define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255

#define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535


//数码管段选定义      0     1    2    3    4    5         6         7          8           9        

uchar code smg_du[]={0x05,0xdd,0x46,0x54,0x9c,0x34,0x24,0x5d,0x04,0x14};         //断码


sbit smg_we1 = P3^3;          //数码管位选定义8

sbit smg_we2 = P3^4;

sbit smg_we3 = P3^5;

sbit smg_we4 = P3^6;

sbit beep    = P3^7;      //蜂鸣器IO口定义 



uchar flag_start;         //开始抢答标志位

uchar flag_weigui;        //抢答违规标志位


uchar dis_smg[4] = {0};         //数码管显示缓冲区

uchar miao,s_time = 30,s2_time = 25;        //时间

uchar flag_num;           //号码 

uchar menu_1 ;            //菜单设置变量

bit flag_200ms = 1;       //200ms的标志位

uchar flag_qd_en;          //抢答

uchar i,qd2_en;


/***************************数码管位选函数****************************/

void smg_we_switch(uchar i)

{

        switch(i)

        {

                case 0: smg_we1 = 0;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 1; break;

                case 1: smg_we1 = 1;  smg_we2 = 0; smg_we3 = 1;  smg_we4 = 1; break;

                case 2: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 0;  smg_we4 = 1; break;

                case 3: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 0; break;

        }        

}



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

* 名称 : delay_1ms()

* 功能 : 延时1ms函数

* 输入 : q

* 输出 : 无

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

void delay_1ms(uint q)         //延时1ms函数

{

        uint i,j;

        for(i=0;i

                for(j=0;j<120;j++);

}



/********************独立按键程序*****************/

uchar key_can;         //按键值

void key()         //独立按键程序

{

        static uchar key_new;

        key_can = 0;                            //按键值还原

        if((P2 & 0xff) != 0xff)                //按键按下

        {

                delay_1ms(1);                     //按键消抖动

                if(((P2 & 0xff) != 0xff) && (key_new == 1))

                {                                                //确认是按键按下

                        key_new = 0;                        //key_new = 0   说明按键已按下

                        switch(P2 & 0xff)

                        {

                                case 0xfe:  key_can = 1;  break;         //得到按键值

                                case 0xfd:  key_can = 2;  break;         //得到按键值

                                case 0xfb:  key_can = 3;  break;         //得到按键值

                                case 0xf7:  key_can = 4;  break;         //得到按键值

                                case 0xef:  key_can = 5;  break;         //得到按键值

                                case 0xdf:  key_can = 6;  break;         //得到按键值

                                case 0xbf:  key_can = 7;  break;         //得到按键值

                                case 0x7f:  key_can = 8;  break;         //得到按键值

                        }

                }                        

        }

        else 

                key_new = 1;  //key_new = 1   说明按键已经松开了        

}



/********************独立按键程序*****************/

uchar key_can1;         //按键值

void key_1()           //主持人独立按键程序

{

        static uchar key_new;

        key_can1 = 0;

        P3 |= 0x07;

        if((P3 & 0x07) != 0x07)                //按键按下

        {

                delay_1ms(1);                     //按键消抖动

                if(((P3 & 0x07) != 0x07) && (key_new == 1))

                {                                                //确认是按键按下

                        key_new = 0;

                        switch(P3 & 0x07)

                        {

                                case 0x05:  key_can1 = 9;   break;         //得到按键值

                                case 0x06:  key_can1 = 10;  break;         //得到按键值

                                case 0x03:  key_can1 = 11;  



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会