您的位置 首页 培训

51单片机对无线抢答器的规划

51单片机对无线抢答器的设计-#define CLEAR 0x7f //定义清空的反码

#define LED_BEGIN 0x01 // 定义开始时数码管的显示

#define LED_FOUL 0x38 // 犯规后显示字母“F”,数码管编码

#define LED_C 0x31 // 字母“C”的编码

#define LED_L 0x71 // 字母“L”的编码,两个用来在主持人取消之后显示“CL”–cancel

#define GET 1 // 这个是作为一个函数的参数来混的,就是成功抢答的意思

#define FOUL 0 // 和上面的参数一起混的,犯规—这两个的用法在后面体现

#define READY 0x7e

#include

* 自界说Macro

//编码的均为反向编码

#define CLEAR 0x7f //界说清空的反码

#define LED_BEGIN 0x01 // 界说开端时数码管的显现

#define LED_FOUL 0x38 // 犯规后显现字母“F”,数码管编码

#define LED_C 0x31 // 字母“C”的编码

#define LED_L 0x71 // 字母“L”的编码,两个用来在主持人撤销之后显现“CL”–cancel

#define GET 1 // 这个是作为一个函数的参数来混的,便是成功抢答的意思

#define FOUL 0 // 和上面的参数一同混的,犯规—这两个的用法在后边表现

#define READY 0x7e

51单片机对无线抢答器的规划

//下面是给上位机发送的指令,对应的是cmdID

#define _STRING_READY_ 9//调整好抢答倒计时,预备开端抢答

#define _STRING_START_ 8//读秒完毕,抢答开端

#define _STRING_CANCEL_ 7//撤销抢答

#define _CHANGE_TIME_ 6//每次读秒

//发送1–4的指令代表抢答端的序号

//由于在板子上面选用的是12M的晶振,仿真时分选用的是11.0529M的晶振,为了便利不同时分编译便利,这儿与后边的条件编译一同使程序修改参数比较便利

//#define CLOCK_FREQUENCY_12M 1

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

* 自界说数据类型

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

typedef unsigned char Byte; // 一个字节

typedef unsigned int Word; // 一个字,两个字节

typedef bit Bool; // 仿照布尔型变量

//typedef sbit Port; // 本想用自界说一个端口类型的变量,比较便利,可是这句话步知道为何通不过编译

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

* 界说MAX7219寄存器

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

#define REG_NO_OP 0x00 // 界说空操作 register

#define DIG_1 0x01 // 界说数码管1 register

#define DIG_2 0x02 // 界说数码管2 register

#define DIG_3 0x03 // 界说数码管3 register

#define DIG_4 0x04 // 界说数码管4 register

#define DIG_5 0x05 // 界说数码管5 register

#define DIG_6 0x06 // 界说数码管6 register

#define DIG_7 0x07 // 界说数码管7 register

#define DIG_8 0x08 // 界说数码管8 register

#define REG_DECODE 0x09 // 界说解码操控 register

#define REG_INTENSITY 0x0a // 界说显现亮度 register

#define REG_SCAN_LIMIT 0x0b // 界说扫描约束 register

#define REG_SHUTDOWN 0x0c // 界说“shutdown”形式 register

#define REG_DISPLAY_TEST 0x0f // 界说“display test”形式 register

#define INTENSITY_MIN 0x00 // 界说最低显现亮度

#define INTENSITY_MAX 0x0f // 界说最高显现亮度

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

* 界说硬件引脚衔接

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

sbit DATA=P2^0; // MAX7219的数据口

sbit LOAD=P2^1; // MAX7219的锁存端口

sbit CLK=P2^2; // MAX7219的时钟端口

sbit HOST_START=P0^0; //主持人按键,用来重新开端的按键 start

sbit HOST_CANCEL=P0^1; //主持人用来撤销抢答的按键 clear

sbit SWITCH1_3=P1^4; // 调理倒计时时刻的拨码开关,下划线前面的号代表开关的序号,下划线后边的号代表该开关的数值

sbit SWITCH2_2=P1^5; // 同上

sbit SWITCH3_2=P1^6; // 同上

sbit SWITCH4_1=P1^7; // 同上

sbit BEEP=P0^7; //界说蜂鸣器端口

#ifdef USE_SOUND //能够经过define来挑选要不要运用仿真时分的声响

sbit LS138_C=P2^4; //界说译码器输入端

sbit LS138_B=P2^5; //同上

sbit LS138_A=P2^6; //同上

sbit LS138_E1=P2^7; //界说译码器使能端

#endif

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

* 界说全局变量

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

Byte data intrCounter; // 计时器中止次数

Byte data beginNum; // 开端倒计时的时刻

Byte data counterBack; // 将中止次数放在里边以备后用

Byte data showNum; // 数码管正在显现的时刻

Bool data isStart; // 是否开端抢答

Bool data isFoul; // 是否犯规

Bool data isPressed; // 是否有抢答的键按下

Byte data number_temp; // 用来记载P1口前次状况的一个变量

Bool data needResetTImes;//记载是否需求重设TImer0的溢出次数

code unsigned char C51BOX2[3] _at_ 0x43; //运用C51Box时分避免程序跑丢

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

* 共阴极七段数码管显现对应段查询表(数字0-9别离对应code_table[0]-[9])

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

Byte code code_table_zheng[10]=

{0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b};

Byte code code_table[10]=

{0x01,0x4f,0x12,0x06,0x4c,0x24,0x20,0x0f,0x00,0x04};

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

* 函数声明

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

void MAX7219_SendByte (Byte dataout);

void MAX7219_Write (Byte reg_number, Byte dataout);

void MAX7219_DisplayChar(Byte digit, Byte character);

void MAX7219_Clear (void);

void MAX7219_SetBrightness (Byte brightness);

void MAX7219_DisplayTestStart (void);

void MAX7219_DisplayTestStop (void);

void MAX7219_ShutdownStart (void);

void MAX7219_ShutdownStop (void);

void MAX7219_Init (void);

void Delay10ms(void);

Bool GetHostStartKey (void);

Bool GetHostCancelKey (void);

void GetCounter(void);

Byte GetPressed(Byte KeyState);

Byte GetPressedWireless(Byte KeyState);

void IT0_Init(void);

void TImer0_Overflow();

void PressedHandle(Byte keyPressed);

void GetOrFoulHandle(Bool state);

void CancelHandle();

void SPEAKER_count (void); //声明倒计时声响函数

void SPEAKER_start(void); //声明开端抢答声响函数

void SPEAKER_get(void); //声明抢到声响函数

void SPEAKER_foul(void); // 声明犯规声响函数

void initialSerial();

void sendNumber(int number);//串口发送数字,这儿发送的是CommandID

void sendString(unsigned char *string);//串口发送字符

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

* MAX7219_SendByte()

*

* 描绘: 向MAX7219传送一个字节的数据

* Arguments : dataout = data to send

* Returns : none

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

void MAX7219_SendByte (Byte dataout)

{

Byte i;

for (i=8;i》0;i–)

{

Byte mask=1《《(i-1);//mask是个掩码,取位运用

CLK=0;//MAX7219的位传入是在时钟的上升沿之前,所以在每发一位之前都要变为低电平

if (dataout&mask)

DATA=1;

else

DATA=0;

CLK=1;//八个bit都传递完成后变为高电平,锁存

}

}

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

* MAX7219_Write()

*

* 描绘: 向 MAX7219 写指令

* Arguments : reg_number = register to write to

* dataout = data to write to MAX7219

* Returns : none

未完~

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

void MAX7219_Write (Byte reg_number, Byte dataout)

{

LOAD=0;//也是锁存上升沿之前的,发这两个字节之前要变为低电平

MAX7219_SendByte(reg_number);//发送寄存器地址

MAX7219_SendByte(dataout);//发送数据

LOAD=1;//变为高电平,锁存

}

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

* MAX7219_DisplayChar()

*

* 描绘: 使某一位显现一个数字

* Arguments : digit = digit number (0-7)

* character = character to display (0-9, A-Z)

* Returns : none

void MAX7219_DisplayChar(Byte digit, Byte character)

{

MAX7219_Write(digit, character);

}

* MAX7219_Clear()

* 描绘: 铲除一切位的显现

* Arguments : none

* Returns : none

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/345653.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部