《微处理器与接口技术》课程设计 篮球计分器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《微处理器与接口技术》课程设计报告
篮球计分器
1.设计目标
任务:设计一个篮球计分器
要求:
(1)能显示两个队当前比分。

(2)根据各自得分情况进行加1、2、3分。

(3)显示当前进攻队的进攻倒计。

(4)计时归零时鸣响。

2 .总体设计
硬件系统结构图
程序设计组成框图
按键控制模块单






计分显示模块
计时显示模块
倒计时报警
3.详细设计
硬件逻辑图
计时模块流程图
开始
倒计时24秒
进攻结束
报警器报警
计分模块流程图
显示当前比分:
void show_point()
{
disp_cache[0] = LED_Table[((point_A/10)%10)];
disp_cache[1] = LED_Table[(point_A%10)];
disp_cache[2] = LED_Table[((point_B/10)%10)];
disp_cache[3] = LED_Table[(point_B%10)];
disp_cache[4] = 0x00; //空
disp_cache[5] = 0x00; //空
disp_cache[6] = LED_Table[((Daojishi_Cnt/10)%10)];
disp_cache[7] = LED_Table[(Daojishi_Cnt%10)];
}
显示结果,进行排序和输出到缓存数组
void show_daoji()
{
disp_cache[0] = 0x00; //空
disp_cache[1] = 0x00; //空
disp_cache[2] = 0x00; //空
disp_cache[3] = 0x00; //空
disp_cache[4] = 0x00; //空
disp_cache[5] = 0x00; //空
disp_cache[6] = 0x00; //空
disp_cache[7] = 0x00; //空
}
U8 Trg, Cont;
对按键内容进行判断
void Keyboard()
{
KeyRead();
switch(Trg)
{
case 0x01:
point_A ++;
show_point();
break;
case 0x02:
point_A +=2;
show_point();
break;
case 0x04:
point_A +=3;
show_point();
break;
case 0x08:
point_B ++;
show_point();
break;
case 0x10:
point_B +=2;
show_point();
break;
case 0x20:
point_B +=3;
show_point();
break;
case 0x40:
if(Daojishi_Cnt)
{
TR0 = !TR0; //定时器0如果暂停,那就开始,否则就反过来
EA = !EA;
}
show_point();
break;
case 0x80:
if(Daojishi_Cnt>0)
{
Daojishi_Cnt = 0;
TR0 = 0; //定时器0停止计时
EA = 0; //允许总中断
}
else
{
TR0 = 1; //定时器0开始计时
EA = 1; //允许总中断
Daojishi_Cnt = 24;
}
show_point();
break;
default:;
}
}
4. 调试与测试
对照原理图,对板子连线,能够实现倒计时,对各队进行加1、2、3分,并且计时归零后能够鸣响。

5.分析及结论
这个程序主要是通过按键来实现对各队加分的,以及倒计时。

这个程序主要问题是如何通过按键调用子程序来进行加分
6.运行结果
7.结束语
此次课程设计我收获很多,虽然单片机课程知识颇丰,但远不如这次设计带来的收获多,这次设计让我把理论运用于实际。

虽然过程曲折,但我没有放弃。

同组同学的帮助也让我收获很多。

设计过程中虽然遇到一些挫折,但经过我查资料,问老师,向同学请教,我渐渐克服这些困难,并且解决。

通过自己的动手实践,理论与实践的结合使得对知识的理解更加深刻,并且慢慢学会培养自己的创新精神,感觉很有成就感,但同时我也认识到自己在单片机方面还有很多不足。

8.参考文献
[1] 增强型51单片机与仿真技术
[2] C语言程序设计教程
9.附录
/*
篮球比赛记分器,
1:能显示2个队比分,
2:根据各自得分情况进行加1,2,3分。

3:显示当前进攻队的进攻时间倒计,计时归零时鸣响
*/
#include "reg51.h"
#define U8 unsigned char
#define U16 unsigned short int
#define u8 unsigned char
#define u16 unsigned short int
#define uchar unsigned char
#define uint unsigned short int
typedef unsigned long u32;
#define U32 u32
#define TL0_NUM 0x00 //设置定时初值
#define TH0_NUM 0x4C //设置定时初值
//----蜂鸣器
sbit BEEP = P2^4;
//----按键
#define KEY_PORT P1
//-----数码管
#define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^2;//定义锁存使能端口段锁存
sbit LATCH2=P2^3;// 位锁存
unsigned char code LED_Table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 显示段码值01234567
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//分别对应相应的数码管点亮,即位码
u8 disp_cache[8] ={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
u8 point_A=0;
u8 point_B=0;
u8 Daojishi_Cnt = 24; //倒计时
void show_point() //显示当前比分
{
disp_cache[0] = LED_Table[((point_A/10)%10)];
disp_cache[1] = LED_Table[(point_A%10)];
disp_cache[2] = LED_Table[((point_B/10)%10)];
disp_cache[3] = LED_Table[(point_B%10)];
disp_cache[4] = 0x00; //空
disp_cache[5] = 0x00; //空
disp_cache[6] = LED_Table[((Daojishi_Cnt/10)%10)];
disp_cache[7] = LED_Table[(Daojishi_Cnt%10)];
}
void show_daoji() //显示结果,进行排序和输出到缓存数组
{
disp_cache[0] = 0x00; //空
disp_cache[1] = 0x00; //空
disp_cache[2] = 0x00; //空
disp_cache[3] = 0x00; //空
disp_cache[4] = 0x00; //空
disp_cache[5] = 0x00; //空
disp_cache[6] = 0x00; //空
disp_cache[7] = 0x00; //空
}
U8 Trg, Cont;
void KeyRead( void ) //读取按键
{
unsigned char ReadData = (KEY_PORT^0xff); // 0000 0111
Trg = ReadData & (ReadData ^ Cont); // 2
Cont = ReadData; // 3 }
void Keyboard() //对按键内容进行判断
{
KeyRead();
switch(Trg)
{
case 0x01:
point_A ++;
show_point();
break;
case 0x02:
point_A +=2;
show_point();
break;
case 0x04:
point_A +=3;
show_point();
break;
case 0x08:
point_B ++;
show_point();
break;
case 0x10:
point_B +=2;
show_point();
break;
case 0x20:
point_B +=3;
show_point();
break;
case 0x40:
if(Daojishi_Cnt)
{
TR0 = !TR0; //定时器0如果暂停,那就开始,否则就反过来
EA = !EA;
}
show_point();
break;
case 0x80:
if(Daojishi_Cnt>0)
{
Daojishi_Cnt = 0;
TR0 = 0; //定时器0停止计时
EA = 0; //允许总中断
}
else
{
TR0 = 1; //定时器0开始计时
EA = 1; //允许总中断
Daojishi_Cnt = 24;
}
show_point();
break;
default:;
}
}
void Delay(unsigned int t) //延迟
{
while(--t);
}
void display() //把disp_cache的内容显示到LED上
{
static u8 _cnt = 0;
DataPort=0xff; //取显示数据,段码
LATCH1=1; //段锁存
LATCH1=0;
DataPort=disp_cache[_cnt]; //取位码
LATCH2=1; //位锁存
LATCH2=0;
DataPort=dofly_WeiMa[_cnt]; //取显示数据,段码LATCH1=1; //段锁存
LATCH1=0;
_cnt++;
if(_cnt>7) _cnt=0;
}
void Alarm() //闹钟查询
{
if(Daojishi_Cnt == 0) //如果倒计时到了
{
BEEP = !BEEP;
}
else BEEP =0; //关闭蜂鸣器
}
void Timer0Init(void) //50毫秒@11.0592MHz {
// AUXR &= 0x7F; //定时器时钟12T模式TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = TL0_NUM; //设置定时初值
TH0 = TH0_NUM; //设置定时初值
TF0 = 0; //清除TF0标志
ET0 = 1; //允许产生中断
}
void main()
{
Timer0Init(); //定时器初始化
show_point(); //显示值开机时初始化
while(1)
{
Alarm(); //闹钟查询
Keyboard(); //按键
display(); //显示
Delay(20); //延迟一段时间再判断按键}
}
u8 count = 20;
void tm0_isr() interrupt 1
{
TL0 = TL0_NUM; //reload timer0 low byte TH0 = TH0_NUM; //reload timer0 high byte
if (count-- == 0) //50ms * 200 -> 1s
{
show_point(); //显示比分和倒计时
count = 20; //reset counter
if(Daojishi_Cnt) //倒计时没到0,则每秒减1
Daojishi_Cnt--;
else
{
TR0 = 0; //关掉
EA = 0;
}
}
}。

相关文档
最新文档