/******************************************************************************
功能说明:S0-S7为8路抢答按键输入,LD0-LD7为8路指示输出,抢答成功的路其相应的
LD亮,平时为灭。接于INT0上的S8作为裁判、启动键。当按下此键后抢答才有效,否则
视为违规,有效抢答响一长声,违规抢答响2短声。启动后LD按1秒速度流动闪亮30秒,
每秒响一短嘀声。超过30秒未抢答作废:响四长声。有效抢答后对应的LD亮,LD停止流
动。此时只有2个裁判健有效:按下ok-key为回答正确键,蜂鸣器响4声,按下cp-key为
回答错误,蜂鸣器响3声。此时又回到初始状态,等待出题并按下cp-key开始抢答
******************************************************************************/
#include <iom16v.h>
#include <macros.h>
//宏定义
#define rdkey ~PINA //定义按键端口
#define led PORTB //定义LED显示端口
#define cp_key (PIND&0x04) //定义裁判2、启动键、错误键。
#define ok_key (PIND&0x02) //定义裁判1:正确键.
#define on_spk PORTD|=1<<7 //定义蜂鸣器开
#define off_spk PORTD&=~(1<<7) //定义蜂鸣器关
//宏定义:定义无符号数据的简写
#define uchar unsigned char
#define uint unsigned int
//全局变量定义
uchar ld=0; //定义LED移动位
uchar flag=0; //定义LED移动方向标志
uchar i=0; //定义30秒计时数值
uchar stop_flag=0; //定义时间到标志
uchar start_flag; //定义启动计时标志
/******************************************************************************
延时函数1:入口i,单位mS,最大65536mS
******************************************************************************/
void delay_ms(uint i)
{
uchar a;
for(;i;i--)
{for(a=1141;a;a--) //针对时钟频率为1M
{;}
}
}
/******************************************************************************
延时函数2:入口i,单位uS,最大65536uS
******************************************************************************/
void delay_us(uint i)
{
for(;i;i--)
{;}
}
/******************************************************************************
响声函数:入口i:响声长度i*10ms,n:响声次数
******************************************************************************/
void sound1(uchar i,uchar n)
{
for(;n;n--)
{
uint a=i*10;
for(;a;a--)
{
on_spk; //开蜂鸣器
delay_us(100);
off_spk; //关蜂鸣器
delay_us(100);
}
delay_ms(200);
}
}
/******************************************************************************
响正确音函数
******************************************************************************/
void sound_ok(void)
{
uchar a,b;
for(a=4;a;a--)
{
for(b=250;b;b--)
{
on_spk; //开蜂鸣器
delay_us((a+10)*10);
off_spk; //关蜂鸣器
delay_us((a+10)*10);
}
delay_ms(20);
}
}
/*****************************************************************************
响错误音函数
*****************************************************************************/
void sound_err(void)
{
uchar a,b;
for(a=1;a<4;a++)
{
for(b=250;b;b--)
{
on_spk; //开蜂鸣器
delay_us((a+4)*25);
off_spk; //关蜂鸣器
delay_us((a+4)*25);
}
delay_ms(20);
}
}
/******************************************************************************
端口初始化函数
******************************************************************************/
void port_init(void) //端口初始化函数
{
DDRB = 0xFF; //B口定义为输出
PORTB=0xff;
DDRA=0x00;
PORTA=0xFF;
DDRC=0xFF;
PORTC=0xFF;
DDRD=0xF0;
PORTD=0x3F;
}
/******************************************************************************
定时器1初始化函数
******************************************************************************/
void timer1_init(void) //定时器1初始化:0.5秒定时,预分频256
{
TCCR1B = 0x00; //关闭定时器1
TCNT1H = 0xC2; //装初值 //F3;//C2;
TCNT1L = 0xF7; //CB;//F7;
TCCR1A = 0x00;
TCCR1B = 0x03; //启动定时器1
}
/*****************************************************************************
定时器1中断函数
*****************************************************************************/
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void) //定时中断入口
{
TCNT1H = 0xC2; //装初值 //F3;//C2;
TCNT1L = 0xF7; //CB;//F7;
led = ~(1<<ld); //LED流动闪亮
if((++i)==30) //计时满30秒,停止标志置1
{
start_flag=0; //清启动标志
TCCR1B = 0x00;
led=0x00;
i=0;
sound1(60,4); //计时到:响4长声,所有LD均亮
}
if(flag==0) //正向流动
{
ld++;
if(ld==7)flag=1;
}
else //反向流动
{
ld--;
if(ld==0)flag=0;
}
sound1(5,1); //响一短声
}
/*****************************************************************************
按键扫描函数
*****************************************************************************/
uchar rd_key(void)
{
uchar key,a=0;
if(rdkey!=0) //如果读按键不为0,有键按下
{
key=rdkey; //先保存按键值
delay_ms(10); //延时消抖
if(rdkey==key) //如果键值相等:有效按键
a=key;
}
return(a);
}
/******************************************************************************
数码管显示按键函数
******************************************************************************/
void show_key(uchar k)
{uchar Player;
Player=k;
switch(Player)
{
case 0x00: PORTC=0xFF; break;
case 0x01: PORTC=0x9F; break;
case 0x02: PORTC=0x25; break;
case 0x04: PORTC=0x0D; break;
case 0x08: PORTC=0x99; break;
case 0x10: PORTC=0x49; break;
case 0x20: PORTC=0x41; break;
case 0x40: PORTC=0x1F; break;
case 0x80: PORTC=0x01; break;
default: PORTC=0xFF; break;
}
}
/******************************************************************************
裁判1键扫描函数:回答正确按键
******************************************************************************/
uchar cp1(void)
{
uchar a=0;
if(ok_key==0) //如果裁判1键按下
{
delay_ms(20);
if(ok_key==0)a=1;
}
while(cp_key==0)delay_ms(10); //等待裁判键释放
return(a);
}
/*****************************************************************************
裁判2键扫描函数:回答错误、启动计时
*****************************************************************************/
uchar cp2(void)
{
uchar a=0;
if(cp_key==0) //如果裁判2键按下
{
delay_ms(20);
if(cp_key==0)a=1;
}
while(cp_key==0)delay_ms(10); //等待裁判键释放
return(a);
}
/*****************************************************************************
启动计时函数:可以抢答
*****************************************************************************/
void start(void)
{
stop_flag=0; //计时到标志清0
i=0;
qdq.rar_8路抢答器_key S7_s7-200_长响短响
版权申诉
169 浏览量
2022-09-21
05:33:56
上传
评论
收藏 3KB RAR 举报
林当时
- 粉丝: 100
- 资源: 1万+
最新资源
- 二层独栋别墅占地面积 286.16平方米D081-两层-19.60&14.60米-施工图.dwg
- 基于JavaScript + Servlet + MySQL开发的图书管理系统+非常适合小白入手学习+源码+文档(高分优秀项目)
- 北方某二层美式别墅建筑结构施工图别墅-结构.dwg
- 双层别墅图纸建筑图纸cad图纸-建筑.dwg
- 二层独栋别墅平屋顶与坡屋顶相结合D078-两层-17.10&20.01米- 施工图.dwg
- 基于HTML+CSS+JS的网页设计-各类页面设计(优质资源)
- 双层别墅图纸D077-两层-17.10&13.80米-施工图.dwg
- 接口文件,相关接口文件
- %E7%81%AB%E7%AE%AD%E5%8A%A0%E9%80%9F_1.0.apk
- QTabWidget实现的炫酷标签工具栏+源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0