硬件设计
链接:https://pan.baidu.com/s/1PRoD4YJ-xOPqUw7rNGydqg
提取码:ft3l
方案
在像羽毛球这样的竞技比赛中,计分器占着很大的作用。如果我们就只在心里记着双方的比分,显然是不实际的,而且在现在的乒乓球比赛中采用的都是21分制。因此我们不能再用传统的计分方式了。本次课题采用单片机设计了一个羽毛球的计分器,该计分器操作简单,使用安全,方便,能满足广大羽毛球爱好者的需要。
仿真图:
程序设计
程序流程图
系统的操作过程和工作过程在程序的设计过程中起着很重要的指导作用,因此在软件设计之前应首先分析羽毛球比赛记分器的工作原理。当比赛开始时,先判断是哪队得分,每次加分加1分。如果不小心加错分了,则按键减去多加的分。当比赛开始时,首先按下开始按钮S1显示开始工作,加分和误操作,暂停等按钮可工作。设计程序流程图如图3-1。
主函数
void main()
{
EA = 1; //开总中断
ConfigTimer0(1); //配置T0定时1ms
InitLcd1602(); //初始化液晶
while (1)
{
KeyDriver(); //调用按键功能
if(k==1)
LcdInit(); //显示字幕
}
}
3.2.2 显示函数
/* 等待液晶准备好 */
void LcdWaitReady()
{
unsigned char sta;
LCD1602_DB = 0xFF;
LCD1602_RS = 0;
LCD1602_RW = 1;
do {
LCD1602_E = 1;
sta = LCD1602_DB; //读取状态字
LCD1602_E = 0;
} while (sta & 0x80); //bit7等于1表示液晶正忙,重复检测直到其等于0为止
}
/* 向LCD1602液晶写入一字节命令,cmd-待写入命令值 */
void LcdWriteCmd(unsigned char cmd)
{
LcdWaitReady();
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
LCD1602_E = 1;
LCD1602_E = 0;
}
//显示字母及计时器
void LcdInit()
{
if(flag1s == 1)
{
sec++;
flag1s = 0;
}
if(sec>=60)
{ minute++;
sec = 0;
if(minute>59)
minute = 59;
}
LcdShowStr(0, 1, "T");
len = LongToString(str, minute);
LcdShowStr(1, 1, str);
LcdShowStr(3, 1, ":");
len = LongToString(str, sec);
LcdShowStr(4, 1, str);
LcdShowStr(7, 1, "A:B");
len = LongToString(str, a);
LcdShowStr(11, 1, str);
LcdShowStr(13, 1, ":");
len = LongToString(str, b);
LcdShowStr(14, 1, str);
}
/* 向LCD1602液晶写入一字节数据,dat-待写入数据值 */
void LcdWriteDat(unsigned char dat)
{
LcdWaitReady();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
LCD1602_E = 1;
LCD1602_E = 0;
}
/* 设置显示RAM起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标 */
void LcdSetCursor(unsigned char x, unsigned char y)
{
unsigned char addr;
if (y == 0) //由输入的屏幕坐标计算显示RAM的地址
addr = 0x00 + x; //第一行字符地址从0x00起始
else
addr = 0x40 + x; //第二行字符地址从0x40起始
LcdWriteCmd(addr | 0x80); //设置RAM地址
}
.
文件仅供参考:
.