上海专业的网站建设公司,著名的wordpress主题公园,银川网站建设redu,优化网站建设seo篮球记分牌设计 1 系统设计1.1 设计任务 1.2 性能指标要求1.2 设计思路及设计框图1.2.1设计思路1.2.2总体设计框图1.2.3电路原理图1.2.3 PCB布线图 2 主要程序模块的设计及原理2.1 外部中断0 2.2 菜单2.3 两队比分及两队犯规次数显示及修改2.3.1选择功能2.3.2修改功能2.3.3显示… 篮球记分牌设计 1 系统设计1.1 设计任务 1.2 性能指标要求1.2 设计思路及设计框图1.2.1设计思路1.2.2总体设计框图1.2.3电路原理图1.2.3 PCB布线图 2 主要程序模块的设计及原理2.1 外部中断0 2.2 菜单2.3 两队比分及两队犯规次数显示及修改2.3.1选择功能2.3.2修改功能2.3.3显示功能 2.4 24秒倒计时2.4.1 T0计时器2.4.2 24秒倒计时显示/复位/暂停 3 调试过程3.1 硬件3.1.1 实物正面3.1.1 实物背面 3.2 软件 4 功能测试4.1 测试仪器与设备4.2 性能指标测试 附录2:程序清单 1 系统设计
1.1 设计任务
设计一个基于单片机的篮球计分牌实现两队的计分和犯规次数功能及24秒计时功能。
1.2 性能指标要求
1按照题目要求独立设计系统所需电路并完成硬件电路的制作及调试。 2结合硬件能够正常计分123。 3能够正常显示分值。 4能够正常修改工作模式计分与24秒。 5能够24秒的误差不小于1秒。 6能够两队球员犯规次数计数。
1.2 设计思路及设计框图
1.2.1设计思路
(1)了解设计要求后查询各元件的特性及使用方法。 (2)查找类似实验资料吸收其设计经验。 (3)由于本次下发的是万能板需要己排版并焊接。为焊接电路我决定先用制图软件进行排版绘制结束门根据电路图直按焊接即可。 (4)焊接结束后测试数码管显示。 (5)对拓展功能进行设计及实现,增加犯规和比分减减的功能并有Led灯指示操作。
1.2.2总体设计框图 1.2.3电路原理图 1.2.3 PCB布线图 2 主要程序模块的设计及原理
2.1 外部中断0 由于菜单的切换可能发生在任意地方所以采用中断切换的方式能更快捷。与P3_2连接的按钮每按一次会触发一次外部中断0IN0_num也随之,但IN0_num到达3后会变为0,使IN0_num数值范围始终在02;每个值对应一个功能
当触发外部中断0且P3_5 状态为 0 则两队比分及犯规次数在LED上左右显示位置交换模拟换场地
2.2 菜单
当IN0_num为0时进入两队比分显示及调整功能
当IN0_num为1时进入两队犯规次数显示及调整功能
IN0_num为2时进入24秒倒计时功能
2.3 两队比分及两队犯规次数显示及修改
2.3.1选择功能 该函数是可以复用的 1当执行两队比分显示或修改时给queue_Ajusth函数传两队比分变量的地址及数字0即可
2当执行两队犯规次数显示或修改时给queue_Ajusth函数传两队犯规次数变量的地址及数字1即可
如何复用及复用之间的差异 1函数参数c1传0或1用于分辨当前执行的时两队比分显示或修改还是两队犯规次数显示或修改c1为0时操作指示灯常亮c1为1时指示灯闪烁
2P3_6按钮每按一次pat变量加一当始终是在01循环0时实验板上左边操作指示LED灯会发出指示行为0时右边操作指示LED灯会发出指示行为
3当左边LED灯发出指示行为时按下修改按键后修改的的是左边数码管对应的值当有边LED灯发出指示行为时按下修改按键后修改的的是右边数码管对应的值
2.3.2修改功能 原理 在2.3.1中的queue_Ajusth函数对要修改的变量进行了选择将变量地址传送给Score函数。
功能 1P3_1/P3_3/P3_4所接的按钮被按下对应对要修改的变量进行加1/2/3 2P3_1/P3_3/P3_4所接的按钮被按下与P3_5一同被按下时对应对要修改的变量进行减1/2/3 3由于数码管两位显示一个值所以所显示的值超过99时会显示异常所以当执行加操作后值超过99将忽略该操作 4由于比分及犯规次数没有负数所以当执行减操作后值小于0将忽略该操作
2.3.3显示功能 原理 LED函数传要显示的位和段码数组的下标即可如Led(16)表示在数码管第一位显示6
2.4 24秒倒计时
2.4.1 T0计时器 原理 1由于24秒倒计时时需显示两位小数分辨率为10ms所以T0定时器每10ms触发一次中断使用T0_num计数当达到100时说明以达到一秒time_24变量减减大概到-1后计时结束
224秒计时结束后P1_0连接的蜂鸣器发声模拟哨声
3每次24秒倒计时结束后TR0会被置零需按复位键后才能启动计时器
2.4.2 24秒倒计时显示/复位/暂停 功能 1显示24秒倒计时是当前所剩时间 2P3_6所连接按键被按下时对倒计时进行暂停或启动 3P3_5所连接按键被按下时对时间进行复位使其回到24秒并将TR0置零需按下启动/暂停间才能启动倒计
3 调试过程
3.1 硬件
1由于S8050三极管的不熟悉一开始焊接好后蜂鸣器处于不可控状态查找资料时发现自己集电极和发射极接反了改进后蜂鸣器才正常运行
2LED灯由于是临时改变位置因为是操作指示灯改在图中位置能更好指示操作导致LED不跳线的情况下只能采用共阴接法。但是所使用的8052复位后I/O口默认为高电平复位后不处理的话LED默认为亮的状态。
3.1.1 实物正面 3.1.1 实物背面 3.2 软件
1由于复位后LED默认为亮的状态所以程序一开始就要给LED置对应电平以达到LED的正确显示
2一开始24秒倒计时分辨率只有秒后面思考后数码管一共有四位前两位显示十秒和秒后两位可以用来显示100ms和10ms
2由于篮球比赛时间过半后会交换双方场地也就意味着比分和犯规数的左右显示也要交换。我通过交换双方比分及犯规变量的值来达到场地交换后比分及犯规数后的显示。
4 功能测试
4.1 测试仪器与设备
开发板USB转串口CH340驱动 STC-ISP单片机下载器 STC89C52单片机1个 1K电阻1个10K电阻2个 30u电容2个 LED二极管3个 晶振原件1个 电解质电容1个 锡线、排针导线若干 笔记本电脑一台
4.2 性能指标测试
1结合硬件能够正常显示分值且能够正常计分123。 2能够正常修改工作模式计分与24秒。 3能够实现24秒的误差不小于1秒。 4能够显示两队球员犯规次数计数。 5半场交换场地后对应数据的显示也左右交换 4能控制蜂鸣器及为防止误触后比分不可逆实现比分及犯规数的减功能
附录2:程序清单
#include AT89X51.H
sbit ALM P1^0; //警报char queue_1 0, queue_2 0;//两队分数char war_1 0 , war_2 0;//两队犯规数char IN0_num 0,T0_num 0 , T1_num 0,time_24 24 , p10 0, pat 0 , cur 0;unsigned char arr[] {0x5f , 0x44 , 0x9d, 0xd5 , 0xc6, 0xd3 , 0xdb , 0x45 , 0xdf ,0xd7 ,0x20 };//最后一个是dp小数点
void delay(unsigned int n)
{unsigned int i , j;for( i 0 ; i n ; i){for(j 0 ; j 200 ; j);}
}
void IN0_Init()
{EA 1 ; EX0 1; IT0 1;//外部中断0下降沿触发
}void T0_Init()
{TMOD 0xf0; TMOD | 0x01;//清第四位并设置T0工作方式1ET0 1; TR0 0;//开启T0TH0 (65536 - 10000)%256;TH0 (65536 - 10000)/256;
}void T1_Init()
{TMOD 0x0f; TMOD | 0x10;//清第四位并设置T0工作方式1ET1 1; TR1 1;//开启T0TH1 (65536 - 10000)%256;TH1 (65536 - 10000)/256;
}void IN0_fun()interrupt 0
{IN0_num;P1_0 1;delay(100);P1_0 0;//每次切换菜单发出提示音if(P3_5 0)//两队数据交换{IN0_num--;P0 0x00;P1_0 1;delay(70);P1_0 0;delay(70);P1_0 1;delay(70);P1_0 0;//声音提醒cur queue_1;queue_1 queue_2;queue_2 cur;//交换比分左右位置cur war_1;war_1 war_2;war_2 cur;//交换犯规次数左右位置}if(IN0_num 3)//数值控制在0~2{IN0_num 0;}
}
void T1_fun()interrupt 3 //中断号3 默认使用第0组寄存器
{T1_num;if(T1_num 100 ){T1_num 0;}TH1 (65536 - 10000)/256;TL1 (65536 - 10000)%256;
}
void T0_fun()interrupt 1 //中断号1 默认使用第0组寄存器
{T0_num;if(T0_num 100 ){T0_num 0;time_24--;if(time_24 -1){time_24 0;P1_0 1;p10 1;TR0 0;//完成一次计时后暂停计时}}TH0 (65536 - 10000)/256;TL0 (65536 - 10000)%256;
}
#includeInterrupt.h
void add(char* num , char i)
{*num i;
}
void sub(char* num , char i)
{*num - i;
}
void Led(unsigned int wei ,unsigned int duan )
{char sub 0x10;P2 ~(subwei);P0 arr[duan];//位选delay(1);
}
void Score(char* num )
{if(P3_1 0 (P3_5 1 *num 99)){while(P3_1 0);add(num , 1);//加1分}else if(P3_3 0 (P3_5 1 *num 98)){while(P3_3 0);add(num , 2);//加1分}else if(P3_4 0 (P3_5 1 *num 97)){while(P3_4 0);add(num , 3);//加1分}if(P3_1 0 (P3_5 0 *num 0)){while(P3_1 0);sub(num , 1);//减1分}else if(P3_3 0 (P3_5 0 *num 1)){while(P3_3 0 );sub(num , 2);//减1分}else if(P3_4 0 (P3_5 0 *num 2)){while(P3_4 0);sub(num , 3);//减1分}
}
void time_fun()
{char _T0 (100 - T0_num);Led(0 , time_24/10);Led(1 , time_24%10);Led(1 , 10 );//小数点Led(2 , (_T0/10)%10 );//100%10会出现10段码错误Led(3 , _T0% 10);if(P3_5 0)//复位{p10 0;P1_0 0;TR0 0;T0_num 0;time_24 24;while(P3_5 0);}if(P3_6 0 p10 ! 1 )//暂停{if(time_24 24){time_24 23;}TR0 ~TR0;while(P3_6 0);delay(15);}}
void queue_Ajust(char* num1 , char* num2 ,char c1)//c1 为0为比分 1为犯规
{if(pat 0)//默认为左调整{Score(num1);P1_1 0;if(c1 0) P1_2 1;else P1_2 (T1_num 50);}else{Score(num2); P1_2 0;if(c1 0) P1_1 1;else P1_1 (T1_num 50);}if(P3_6 0)//左右位选择{while(P3_6 0);pat (pat1)%2;//控制在0 ~ 1}/// 数码管显示Led(0 , *num1/10);//队1比分/犯规次数十位Led(1 , *num1%10);//队1比分/犯规次数个位Led(2 , *num2/10);//队2比分/犯规次数十位Led(3 , *num2%10);//队2比分/犯规次数个位
}void main()
{ALM 0;//高电平响T0_Init();IN0_Init();T1_Init();while(1){if(IN0_num 0)//比分加/减{queue_Ajust( queue_1 , queue_2 ,0 );}else if(IN0_num 1)//犯规次数加/减{queue_Ajust( war_1 , war_2 ,1 );}else if(IN0_num 2)//倒计时{P1_1 0;P1_2 0;time_fun();}}
}