基于PIC单片机篮球计分计时器

一、系统方案

本设计采用PIC单片机作为主控制器,矩阵键盘控制,比分,计时控制,24秒,液晶12864显示。

二、硬件设计

原理图如下:

三、单片机软件设计

1、首先是系统初始化

2、液晶显示程序

/********************************************************************************************

  • 函数名称:Lcd_Write_Command()

  • 功 能:写指令代码

  • 入口参数:无

  • 出口参数:无

    */
    void Lcd_Write_Command(uchar temp)
    {
    port=temp;
    rs=0;
    rw=0;
    e=1;
    e=0;
    }
    /

  • 函数名称:Lcd_Write_Byte()

  • 功 能:写数据

  • 入口参数:无

  • 出口参数:无

    *****************/
    void Lcd_Write_Byte(uchar temp)
    {
    port=temp;
    rs=1;
    rw=0;
    e=1;
    e=0;
    }
    /

    *名称:Lcd_Character_16X8( bit bit_flag, uchar x, uchar y, uchar code *point )

    *功能:显示16X8字符(字母)

    *入口参数:

    *出口参数:

    *说明:bit_flag = 1 正常显示 bit_flag = 0 黑白反相显示
    */
    void Lcd_Character_16X8( uchar bit_flag, uchar x, uchar y, uchar point )
    {
    uchar i , j,temp;
    temp=y;
    if( bit_flag )
    {
    for( i=0; i<2; i++ )
    {
    x+=i;
    y=temp;
    for( j=0;j<8;j++ )
    {
    Lcd_Set_X_Y( x, y ); y++;
    Lcd_Write_Byte( point i* 8 + j );
    }
    }
    }
    else
    {
    for( i = 0; i < 2; i++ )
    {
    x += i;
    y = temp;
    for( j = 0; j < 8; j++ )
    {
    Lcd_Set_X_Y( x, y ); y++;
    Lcd_Write_Byte( ~point i \* 8 + j );
    }
    }
    }
    }
    /

  • 名称:Lcd_Character_16X16( bit bit_flag, uchar x, uchar y, uchar code *point )

  • 功能:显示16*16字符(汉字)

  • 入口参数:x y data

  • 出口参数:无

    *说明:bit_flag = 1 正常显示 bit_flag = 0 黑白反相显示

    ****************************************************************************/

    void Lcd_Character_16X16( uchar bit_flag, uchar x, uchar y, uchar *point )
    {
    uchar i,j,temp ;
    temp=y;
    if( bit_flag )
    {
    for( i=0; i<2; i++ )
    {
    x+=i;
    y=temp;
    for( j=0;j<16;j++ )
    {
    Lcd_Set_X_Y( x, y ); y++;
    Lcd_Write_Byte( point i* 16 + j );

    }

    }

    }

    else

    {

    for( i = 0; i<2; i++ )

    {

    x += i;

    y = temp;

    for( j = 0; j < 16; j++ )

    {

    Lcd_Set_X_Y( x, y ); y++;

    Lcd_Write_Byte( ~ point i \* 16 + j );

    }

    }

    }

    }

    3、按键程序

    RD4=0;//第一行赋值低电平

    RD5=1;//其他行赋值高电平

    RD6=1;//其他行赋值高电平

    RD7=1;//其他行赋值高电平

    if(RD00)//判断第一列是否有按键按下
    {
    delay_uint(10);//延时消去按键抖动
    if(RD00)//再次判断按下是否按下

    {

    key_can=0;//按键键盘

    changshu++;//场数加1

    if(changshu>4) changshu=0;//场数大于4,清零

    while(!RD0)//判断按键可释放

    {

    }

    }

    }

    if(RD10)//第二列
    {
    delay_uint(10);//延时消去按键抖动
    if(RD10)

    {

    key_can=1;

    en_flag1=1;

    while(!RD1)

    {

    复制代码
      	}
      }

    }

    if(RD20)//第3列
    {
    delay_uint(10);//延时消去按键抖动
    if(RD20)

    {

    key_can=2;

    复制代码
            en_flag1=0;
            en_flag2=0;
      	while(!RD2)
      	{
           
      	}
      }

    }

    if(RD30)//第四列
    {
    delay_uint(10);//延时消去按键抖动
    if(RD30)

    {

    key_can=3;

    flag=!flag;//交换场地

    while(!RD3)

    {

    复制代码
      	}
      }

    }

    4、核心算法程序

    /*主程序函数

    ************************************************/

    void main(void)

    {

    TRISD=0x0f;//RD高四位输出,低四位输入

    TRISC=0x00;//输出设置

    TRISB=0x00;//输出设置

    Lcd_Initial(); //LCD初始化

    TMR1L=(65536-12500)%256; //定时12500个时钟初始值

    TMR1H=(65536-12500)/256; //定时12500个时钟初始值

    GIE=1; //总中断允许

    PEIE=1; //外围功能模块中断允许

    TMR1IE=1; //TMR1中断允许

    TMR1ON=1; //启动TMR1

    while(1)

    {

    Lcd_Character_16X16(1,0,8,data_shuju0); //显示蓝

    Lcd_Character_16X16(1,0,24,data_shuju1); //显示球

    Lcd_Character_16X16(1,0,40,data_shuju2); //显示计

    Lcd_Character_16X16(1,0,56,data_shuju3); //显示分

    Lcd_Character_16X16(1,0,70,data_shuju4); //显示器

    复制代码
      Lcd_Character_16X16(1,2,0,data_shuju[5]);	//显示第
      Lcd_Character_16X8( 1,2,16, data_shuju1[changshu]);//显示场数
      Lcd_Character_16X16(1,2,24,data_shuju[6]);	//显示场
      Lcd_Character_16X8( 1,2,48, data_shuju1[fen/10]);//显示倒计时分的十位
      Lcd_Character_16X8( 1,2,56, data_shuju1[fen%10]);//显示倒计时分的个位
       Lcd_Character_16X8( 1,2,64, data_shuju1[12]);//显示:
      
      Lcd_Character_16X8( 1,2,72, data_shuju1[miao/10]);//显示倒计时秒的十位
      Lcd_Character_16X8( 1,2,80, data_shuju1[miao%10]); //显示倒计时秒的个位
      
             Lcd_Character_16X8( 1,4,72, data_shuju1[ss/10]);//显示倒计时秒的十位
      Lcd_Character_16X8( 1,4,80, data_shuju1[ss%10]); //显示倒计时秒的个位
       
      key();//按键检测
      if(flag==0)//场数交换
      {
      Lcd_Character_16X8( 1,4,0 ,data_shuju1[10]);//A队
      Lcd_Character_16X8( 1,4,8 ,data_shuju1[12]);//冒号
      Lcd_Character_16X8( 1,4,16, data_shuju1[fen1/100]);//A队分数千位
      Lcd_Character_16X8( 1,4,24, data_shuju1[fen1%100/10]);//分数十位
      Lcd_Character_16X8( 1,4,32, data_shuju1[fen1%10]);//分数个位
      
      
      Lcd_Character_16X8( 1,6,0, data_shuju1[11]);//B队
      Lcd_Character_16X8( 1,6,8 ,data_shuju1[12]);//冒号
       Lcd_Character_16X8( 1,6,16, data_shuju1[fen2/100]);//B队分数千位
      Lcd_Character_16X8( 1,6,24, data_shuju1[fen2%100/10]);//分数十位
      Lcd_Character_16X8( 1,6,32, data_shuju1[fen2%10]);//分数个位
      }
      else// 交换显示
      {
      Lcd_Character_16X8( 1,6,0 ,data_shuju1[10]);//A队
      Lcd_Character_16X8( 1,6,8 ,data_shuju1[12]);//冒号
      Lcd_Character_16X8( 1,6,16, data_shuju1[fen1/100]);//A队分数千位
      Lcd_Character_16X8( 1,6,24, data_shuju1[fen1%100/10]);//分数十位
      Lcd_Character_16X8( 1,6,32, data_shuju1[fen1%10]);//分数个位
      
      
      Lcd_Character_16X8( 1,4,0, data_shuju1[11]);//B队
      Lcd_Character_16X8( 1,4,8 ,data_shuju1[12]);//冒号
       Lcd_Character_16X8( 1,4,16, data_shuju1[fen2/100]);//B队分数千位
      Lcd_Character_16X8( 1,4,24, data_shuju1[fen2%100/10]);//分数十位
      Lcd_Character_16X8( 1,4,32, data_shuju1[fen2%10]);//分数个位
      }

    }

    }

    四、proteus仿真设计

    Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。

相关推荐
kebidaixu1 小时前
FreeRTOS 移植到 STM32F407VETX 记录(一)
stm32·单片机·嵌入式硬件
CSDN官方博客2 小时前
「谁说嵌入式只是调包和焊板子?」—— 2026嵌入式全栈技术征锋令
嵌入式硬件·物联网·embedding
点灯小铭2 小时前
基于单片机的数码管定时插座设计与定时开关功能实现
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
云栖梦泽2 小时前
玩转RK3506SDK
linux·嵌入式硬件
数智工坊4 小时前
机器人四大主控板系统分层选型指南:树莓派、ESP32、STM32与Arduino的能力边界与实战定位
stm32·嵌入式硬件·机器人
进击的小头5 小时前
第8篇:IGBT 从零到精通:核心原理、关键参数、选型指南与工业级应用要点
经验分享·嵌入式硬件·学习
点灯小铭5 小时前
基于单片机的多模式智能洗衣机设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
项目題供诗5 小时前
STM32-AD单通道&AD多通道(十九)
stm32·单片机·嵌入式硬件
南岸的水5 小时前
BMS国标充电解析
单片机·嵌入式硬件·mcu
清风6666665 小时前
基于单片机的可调数控电源设计
单片机·嵌入式硬件·mongodb·毕业设计·课程设计·期末大作业