二位计数显示器

设计一个计数显示器,可对生产流水线上物品或包装进行计数显示,用二位数码管显示计数,当计数达到某一设定值时,输出一个正脉冲包装命令(可用点亮LED灯模拟)。要求计数值可按键清零;设定值可通过按键修改。

#include "stm32f10x.h"
typedef unsigned int uint32t;

void SEG_GPIO_Config(void);//数码管GPIO初始化
void LED_GPIO_Config(void);//LED灯和按键GPIO初始化
void wei_GPIO_Config(void);//数码管位选择GPIO初始化

void show(int num);  //数码管显示数据函数
void GPIO_NF(uint32t x);//LED灯控制开和灭函数
void select(int num1);//数码管位号选择显示函数,0各位显示,1十位显示

char num[]={0x0001,0x0002};//数码管位选择数据
u16 number[]={0xff3f,0xff06,0xff5b,0xff4f,0xff66,0xff6d,0xff7d,0xff07,0xff7f,0xff6f};//共阴极0到9显示数据
#define ON 1
#define OFF 0 //标志led开关操作数据
int jishu=0;//计数值初始化0
int sdjishuzhi=1;//计数设定值初始化最少1.

void SEG_GPIO_Config(void)//数码管GPIO初始化
{
    GPIO_InitTypeDef GPIO_InitStruct;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_All;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA,&GPIO_InitStruct);

}
void LED_GPIO_Config(void)//LED灯和按键GPIO初始化
{
    GPIO_InitTypeDef GPIO_InitStruct;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_Init(GPIOB,&GPIO_InitStruct);
    
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB,&GPIO_InitStruct);

}

void wei_GPIO_Config(void)//数码管位选择GPIO初始化
{
    GPIO_InitTypeDef GPIO_InitStruct;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_Init(GPIOC,&GPIO_InitStruct);

}

void show(int num)//数码管显示数据
{
    GPIO_Write(GPIOA,number[num]);//a端口写数据显示
}
void GPIO_NF(uint32t x)//LED灯控制开和灭
{
    if(x) GPIO_ResetBits(GPIOB,GPIO_Pin_4);//开灯
    else GPIO_SetBits(GPIOB, GPIO_Pin_4);//灭灯
}

void select(int num1)//数码管位号选择显示函数,0各位显示,1十位显示
{
    GPIO_Write(GPIOC,num[num1]);//c端口写数据控制数码管显示操作
}

void delay (uint32t count)//延时操作函数
{
    uint32t x=80000;
    for(;count!=0;count--)
        {
          for(;x!=0;x--);

        };
}
int main()
{    
    
    int rra[]={0,0};//存十位和各位数据的数组
    int i=0;
    SEG_GPIO_Config();
    LED_GPIO_Config();
    wei_GPIO_Config();//一系gpio列初始化
    GPIO_NF(OFF);
    while(1)
    {
        
                
                rra[1]=jishu/10;//存十位
                rra[0]=jishu%10;//存各位
                for(int i=0;i<2;i++)//数码管依次显示操作
                    {
                        select(i);
                        show( rra[i] );
                        delay (9000);    
                    }

            
 if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0)==0) jishu++;//一号按键低电平模仿计数
        while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0)==0);//等待检测完
 if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0) sdjishuzhi++;//二号按键加一增加设定值并显示操作
                if(sdjishuzhi>=100)sdjishuzhi=1;    //按键值大于等于一百为最小设定值
                rra[1]=sdjishuzhi/10;//显示设定值计算
                rra[0]=sdjishuzhi%10;
                
                    
      while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)==0)//等待松开并持续显示设定值
      {
      for(int i=0;i<2;i++)//显示设定值
                    {
                        select(i);
                        show( rra[i] );
                        delay (9000);    
                    }
      };
 if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2)==0) sdjishuzhi+=10;//三号按键加十增加设定值并显示操作
      if(sdjishuzhi>=100)sdjishuzhi=1;//按键值大于等于一百为最小设定值
                rra[1]=sdjishuzhi/10;//显示设定值计算
                rra[0]=sdjishuzhi%10;
      
      while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2)==0)//等待松开并持续显示设定值
          for(int i=0;i<2;i++)//显示设定值
                    {
                        select(i);
                        show( rra[i] );
                        delay (9000);    
                    };
 if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3)==0) //计数值复位0操作
         {
            jishu=0;
            GPIO_NF(OFF);//灯灭操作
         }
      while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3)==0);//等待松开

         if(jishu==sdjishuzhi) //计数值等于设定值,灯亮,持续显示计数值并复位才能下次计数
         {
             GPIO_NF(ON);
             
             while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3)==1)//显示计数值等待复位
              {
                 rra[1]=jishu/10;
                rra[0]=jishu%10;
                for(int i=0;i<2;i++)
                    {
                        select(i);
                        show( rra[i] );
                        delay (9000);    
                    }  
              };
              jishu=0;//复位成功,计数值为零
         }  
    
  }
}

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在工业生产的过程中对产品的数量进行统计是非常常见的,一般采用的产品计数方式就是通过安装计数器来自动完成的。光电计数器是众多的计数器的一种,它主要是利用光学原理来对自动生产线的产品数量进行统计,这种传感器的基本工作原理是通过一套信号转换装置将光信号转换成电信号,它的基本理论就是著名的光电效应。一般来说光电效应主要分为三个类别,第一类也被称为世外光电效应,物体在接受光照的时候,它的表面会有一些电子逃逸出来,采用这种外光电效应制成的光学器件主要有光电倍增管和真空光电管等类型;第二种称之为内光电效应,也就是说物体的电阻率随着光照的变化而发生变化,根据内光电效应制成的主要元器件包括各种各样的光敏电阻;第三种光电效应指的是光生伏特效应,也就是说物体在一定的外界光线的照射作用下所产生的内部电动势现象,这种由于光照产生的电动势称之为光生电动势,根据光生伏特效应制成的电子元器件主要包括光电晶体管和光电池等,所有的光电效应器件都是根据物体在受到外界光照之后它的内部一些特性发生变化的原理所制成的。从目前来说市场上比较常见的光电计数器所采用的传感器元器件主要是光电管和摄像头,而光源一般都是用激光或者是普通光来提供的,另外还有不可见光以及可见光的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值