当前位置: 首页 > news >正文

基于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(RD0
    0)//再次判断按下是否按下
    {
    key_can=0;//按键键盘
    changshu++;//场数加1
    if(changshu>4) changshu=0;//场数大于4,清零
    while(!RD0)//判断按键可释放
    {
    }
    }
    }
    if(RD10)//第二列
    {
    delay_uint(10);//延时消去按键抖动
    if(RD1
    0)
    {
    key_can=1;
    en_flag1=1;
    while(!RD1)
    {

      	}}
    

    }
    if(RD20)//第3列
    {
    delay_uint(10);//延时消去按键抖动
    if(RD2
    0)
    {
    key_can=2;

            en_flag1=0;en_flag2=0;while(!RD2){}}
    

    }
    if(RD30)//第四列
    {
    delay_uint(10);//延时消去按键抖动
    if(RD3
    0)
    {
    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_shuju[0]); //显示蓝
    Lcd_Character_16X16(1,0,24,data_shuju[1]); //显示球
    Lcd_Character_16X16(1,0,40,data_shuju[2]); //显示计
    Lcd_Character_16X16(1,0,56,data_shuju[3]); //显示分
    Lcd_Character_16X16(1,0,70,data_shuju[4]); //显示器

      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仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。
    在这里插入图片描述

http://www.lryc.cn/news/144883.html

相关文章:

  • 关于Maxwell与Kafka和数据库的监控
  • 【设计模式】Java设计模式详细讲解
  • 【MySQL】表的增删查改(进阶)
  • Vim几种跳转方式
  • element-ui 弹窗里面嵌套弹窗,解决第二个弹窗被遮罩层掩盖无法显示的问题
  • 【业务功能篇76】微服务网关路由predicates断言条件-filters路由转换地址-跨域问题-多级目录树化层级设计-mybatisPlus逻辑删除
  • apache的ab工具测试网页优化效果速度以及服务器承载
  • 【进阶篇】MySQL 存储引擎详解
  • Spring集成【MyBatis】和【PageHelper分页插件】整合---详细介绍
  • PyCharm下安装配置PySide6开发环境(Qt Designer(打开,编辑)、PyUIC和PyRCC)
  • pytest fixture 创建一个 requests.session() 对象
  • 深入分析负载均衡情景
  • WPF基础入门-Class5-WPF命令
  • 云安全攻防(十三)之 使用minikube安装搭建 K8s 集群
  • Python数据分析 | 各种图表对比总结
  • linux系统(centos、ubuntu、银河麒麟服务、uos、deepin)判断程序是否已安装,通用判断方法:适用所有应用和命令的判断
  • Python3多线程/多进程解决方案(持续更新ing...)
  • 在`CentOS`中安装`Docker Engine`
  • [ VMware 虚拟机 ] 启动不了图形界面,报 “The system is running in low-graphics mode” 错误
  • 如何提高视频清晰度?视频调整清晰度操作方法
  • IO进程线程,文件与目录,实现linux任意目录下ls -la
  • R语言如果列表中有列表,且每个子列表有一个向量:如何转变为仅仅一个列表里面含有向量
  • nrm管理源仓库及发布私人npm包
  • 云计算——虚拟化中的网络架构与虚拟网络(文末送书)
  • B - 负环
  • 居中一个元素(水平+垂直居中)
  • React笔记(二)JSX
  • [多标签分类]MultiLabelBinarizer: 从one-hot 到multi-hot
  • 【校招VIP】前端算法考察之排序
  • 集创北方ICN6211 是一款MIPIDSI转RGB视频桥接IC