51单片机对无线抢答器的设计

#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
//下面是给上位机发送的指令,对应的是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

小米平板3价格配置曝光!4GB运存+64GB+Win10,四月回归!
什么是光耦隔离_光耦隔离的主要作用
为什么需要使用virtual,不用可不可以?
硕数物联科技RSC-910主板介绍
一个关于三相Vienna拓扑技术知识(下)
51单片机对无线抢答器的设计
国自机器人三款产品及两套行业解决方案亮相
网络搜索平台Seznam.cz已从Google索赔90.72亿克朗
rfid是什么技术 rfid技术应用领域 rfid怎么用手机识别
电感器的参数和特性
六要素气象传感器介绍
时控开关怎么设置定时时间?
“人造眼”把大量纳米级光传感器整合到半球形视网膜状组件中,
电子白板的计算机接口
[组图]调频立体声广播发射机(BA1404)
实用的集成芯片测试仪方案
热流传感器采集系统的设计
安川大功率大容量伺服电机有哪些技术优势
如何减轻安装变频器时产生的电磁干扰
走向聚光灯前的蜕变 正拓能源践行方法论