keil单片机篮球计时计分
时间: 2024-01-05 20:03:57 浏览: 107
根据提供的引用内容,有两种篮球计时计分器的设计方案,分别基于AT89S52单片机和STM32单片机。下面将分别介绍这两种方案的设计思路和实现方法。
1. 基于AT89S52单片机的篮球计时计分器设计方案
硬件部分:
- AT89S52单片机
- 两个四位七段数码管
- 两个74HC595芯片
- 两个按键
- 一个蜂鸣器
软件部分:
- 使用Keil C51编写程序,实现计分和计时功能
- 通过74HC595芯片驱动数码管,实现分数和时间的显示
- 通过按键控制计分和计时功能的实现
- 通过蜂鸣器发出提示音
下面是AT89S52单片机篮球计时计分器的部分代码示例:
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1 = P3^2; // 按键1
sbit key2 = P3^3; // 按键2
sbit beep = P3^4; // 蜂鸣器
uchar code table[] = { // 数码管显示表
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
uchar code time[] = { // 时间设置表
0x00, 0x3c, 0x78, 0xb4, 0xf0
};
uchar sec = 0; // 秒数
uchar min = 10; // 分钟数
uchar score1 = 0; // 球队1得分
uchar score2 = 0; // 球队2得分
void delay(uint x) { // 延时函数
uint i, j;
for (i = x; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
void display(uchar num, uchar pos) { // 数码管显示函数
P0 = 0xff;
P2 = ~(1 << pos);
P0 = table[num];
}
void main() {
uchar i = 0;
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0x3c; // 定时器0初值
TL0 = 0xb0;
TR0 = 1; // 启动定时器0
ET0 = 1; // 允许定时器0中断
EA = 1; // 开启总中断
while (1) {
if (key1 == 0) { // 按键1按下
delay(10); // 延时去抖动
if (key1 == 0) {
score1++; // 球队1得分加1
beep = 1; // 发出提示音
delay(100);
beep = 0;
}
while (!key1); // 等待按键1释放
}
if (key2 == 0) { // 按键2按下
delay(10); // 延时去抖动
if (key2 == 0) {
score2++; // 球队2得分加1
beep = 1; // 发出提示音
delay(100);
beep = 0;
}
while (!key2); // 等待按键2释放
}
display(score1, 0); // 显示球队1得分
display(score2, 4); // 显示球队2得分
}
}
void timer0() interrupt 1 { // 定时器0中断函数
TH0 = 0x3c; // 定时器0初值
TL0 = 0xb0;
i++;
if (i == 20) { // 1秒钟
i = 0;
sec--;
if (sec == 0xff) { // 1分钟
sec = 59;
min--;
if (min == 0xff) { // 时间到
min = 10;
sec = 0;
beep = 1; // 发出提示音
delay(1000);
beep = 0;
}
}
display(time[sec % 5], 2); // 显示本次进攻剩余时间
display(time[sec / 5], 3);
display(time[min % 5], 0); // 显示本节剩余时间
display(time[min / 5], 1);
}
}
```
2. 基于STM32单片机的篮球计时计分器设计方案
硬件部分:
- STM32单片机
- 一个LCD液晶屏幕
- 两个按键
- 一个蜂鸣器
软件部分:
- 使用Keil MDK编写程序,实现计分和计时功能
- 通过LCD液晶屏幕显示比赛时间和得分
- 通过按键控制计分和计时功能的实现
- 通过蜂鸣器发出提示音
下面是STM32单片机篮球计时计分器的部分代码示例:
```c
#include "stm32f10x.h"
#include "delay.h"
#include "lcd.h"
#define KEY1 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)
#define KEY2 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)
#define BEEP_ON GPIO_SetBits(GPIOB, GPIO_Pin_8)
#define BEEP_OFF GPIO_ResetBits(GPIOB, GPIO_Pin_8)
u8 sec = 0; // 秒数
u8 min = 10; // 分钟数
u8 score1 = 0; // 球队1得分
u8 score2 = 0; // 球队2得分
void TIM2_IRQHandler(void) { // 定时器2中断函数
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
sec--;
if (sec == 0xff) { // 1分钟
sec = 59;
min--;
if (min == 0xff) { // 时间到
min = 10;
sec = 0;
BEEP_ON; // 发出提示音
delay_ms(1000);
BEEP_OFF;
}
}
LCD_ShowNum(0, 0, min, 2, 16); // 显示本节剩余时间
LCD_ShowChar(2 * 16, 0, ':', 16);
LCD_ShowNum(3 * 16, 0, sec / 10, 1, 16);
LCD_ShowNum(4 * 16, 0, sec % 10, 1, 16);
LCD_ShowNum(0, 1, score1, 2, 16); // 显示球队1得分
LCD_ShowNum(3 * 16, 1, score2, 2, 16); // 显示球队2得分
}
}
int main(void) {
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 使能定时器2时钟
TIM_TimeBaseStructure.TIM_Period = 999; // 自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler = 7199; // 分频系数
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 初始化定时器2
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 使能定时器2更新中断
TIM_Cmd(TIM2, ENABLE); // 启动定时器2
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; // 定时器2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 子优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // IRQ通道使能
NVIC_Init(&NVIC_InitStructure); // 初始化NVIC
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOA和GPIOB时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; // KEY1和KEY2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; // BEEP
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化GPIOB
LCD_Init(); // 初始化LCD液晶屏幕
LCD_Clear(WHITE); // 清屏
while (1) {
if (KEY1 == 0) { // 按键1按下
delay_ms(10); // 延时去抖动
if (KEY1 == 0) {
score1++; // 球队1得分加1
BEEP_ON; // 发出提示音
delay_ms(100);
BEEP_OFF;
}
while (!KEY1); // 等待按键1释放
}
if (KEY2 == 0) { // 按键2按下
delay_ms(10); // 延时去抖动
if (KEY2 == 0) {
score2++; // 球队2得分加1
BEEP_ON; // 发出提示音
delay_ms(100);
BEEP_OFF;
}
while (!KEY2); // 等待按键2释放
}
}
}
```
阅读全文