zoukankan      html  css  js  c++  java
  • STM8S005 ADC采集 5位共阴数码管显示

        程序包含TM1618驱动的4位或5位共阴数码管函数,包含ADC采集函数,求平均函数,

    实现STM8S005单片机B0口采集后,将电压值用4位或5位共阴数码管显示。

        在IAR环境编译通过

        下面贴出main.c程序 :

    // 要用到stm8s_clk.c和stm8s_gpio.c
    // 要用到stm8s_adc1.c,该文件头要有 #include "stm8s.h"和 #include "stm8s_adc1.h"
    // 且"stm8s.h"放在"stm8s_adc1.h"之前,否则编译出错
    //******************************************************************************************
    //

    //#include "stm8s.h" //用 V2.0.0 25-February-2011 版本
    #include "stm8s_gpio.h" //用 V2.0.0 25-February-2011 版本
    #include "stm8s_clk.h" //用 V2.0.0 25-February-2011 版本
    #include "stm8s_adc1.h" //用 V2.1.0 18-November-2011 版本

    void command(unsigned char com) ; //1618命令参数com函数
    void send_8bit(unsigned char dat); //1618发送显示参数dat的函数
    void TM1618_IOset();
    void TM1618_CMDset();

    void dpy(unsigned int sz); //显示函数

    void Adc_cfg(); //ADC配置函数
    void adc_zs8(); //ADC采集函数


    unsigned int sz=0;                                 // TM1618 要显示的数值 全局变量

    //*****************************************************************************
    // 定义数据 数码管0-9 4位8段模式下,共阴数码管0-9的编码
    // 高8位:***edcba 低8位:**pgf***

    unsigned const CODE[ ][2]={{0x1f,0x08},{0x06,0x00},{0x1b,0x10},{0x0f,0x10},
    {0x06,0x18},{0x0d,0x18},{0x1d,0x18},{0x07,0x00},
    {0x1f,0x18},{0x0f,0x18} }; //可放在main 的前面

    //***************************************************************
    //*** 延时函数3
    void delay3(void) //用于ADC开启稳定的间隔
    {
    unsigned int i0,i2;
    for (i0=0;i0<30000;i0++)
    {for (i2=0;i2<100;i2++);}
    }

    //***** 功能:TM1618端口设置 ***************************************************
    //****************************************************************************
    void TM1618_IOset(void)
    {
    #define DIO_0 GPIO_WriteLow(GPIOC,GPIO_PIN_6) //定义LED芯片TM1618 输入口低
    #define DIO_1 GPIO_WriteHigh(GPIOC,GPIO_PIN_6) //定义LED芯片TM1618 输入口高
    #define STB_0 GPIO_WriteLow(GPIOC,GPIO_PIN_7) //定义LED芯片TM1618
    #define STB_1 GPIO_WriteHigh(GPIOC,GPIO_PIN_7) //定义LED芯片TM1618 低
    #define CLK_0 GPIO_WriteLow(GPIOC,GPIO_PIN_5) //定义LED芯片TM1618 时钟低
    #define CLK_1 GPIO_WriteHigh(GPIOC,GPIO_PIN_5) //定义LED芯片TM1618 时钟高
    #define K2_0 GPIO_WriteLow(GPIOE,GPIO_PIN_5) //定义LED芯片TM1618 键扫低
    #define K2_1 GPIO_WriteHigh(GPIOE,GPIO_PIN_5) //定义LED芯片TM1618 键扫高
    //***********************************************
    GPIO_Init(GPIOC, GPIO_PIN_6, GPIO_MODE_OUT_PP_HIGH_FAST ); //初始化1618的DIO
    GPIO_Init(GPIOC, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST ); //初始化1618的CLK
    GPIO_Init(GPIOC, GPIO_PIN_7, GPIO_MODE_OUT_PP_HIGH_FAST ); //初始化1618的STB
    GPIO_Init(GPIOE, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST ); //初始化1618的K2
    }

    //*** 功能:配置 TM1618 ************************************************************
    //*****************************************************************************
    void TM1618_CMDset(void)
    {
    command(0x00);            //显示模式指令,0x00为 4位8段模式;0x01为 5位7段模式
    command(0x40);            //芯片设为写数据模式指令,地址自动加1模式;
                                           //0x44 为写固定地址指令;0x42 为读键扫指令
    command(0x88);            //显示控制命令,打开显示并设置为最暗
    //command(0x8F);          //8F设置为最亮
    //command(0x87);         //87设置为关
    //command(0xC0);        //设置显示首地址命令,放在每次发送显示数据函数中
    }

    // ********** 功能:向TM1618发送1字节8位数据 *******************************************
    // *************************************************************************************
    void send_8bit(unsigned char dat) //dat是要发的数据变量
    {
    STB_0;                                 //C7;STB=0保证“STB”为低电平,程序不依赖于之前端
                                                 //口的状态保证程序在实际运行中不会出现“端口迷失”
    for(char i=0;i<8;i++)              // i为轮发循环次数发送8位,移位8次一个字节
      {
      if (dat&0x01)
          DIO_1;                            // C6口置高
      else
          DIO_0;                            //C6口置低
         CLK_0;                            //C5口置低 TM1618最大输入时钟1MHz
         CLK_1;                            //C5口置高
         dat=dat>>1;                    //移位发送
        }
    }

    //**** 功能:向TM1618发送命令 ***********************************************************
    //***********************************************************************************
    void command(unsigned char com)            //com是命令字符参数变量
    {
       STB_1;                    //C7口置高
       STB_0;                    //C7口置低
       send_8bit(com);      //调发送字节函数
    }                                 //下降沿后由DIO输入的第一个字节作为指令
                                       //下降沿后由DIO输入的第一个字节作为指令

    // **************************************************************
    // 功能:在1-5位数码管显示数字 全局变量sz,在main中
    // **************************************************************
    void dpy(unsigned int sz)
    {
    /*                                                   //sz_n 本函数要显示数值
    unsigned char i,nxs[5];                 //5位显示
    nxs[0]=sz_n%100000/10000;
    nxs[1]=sz_n%10000/1000;
    nxs[2]=sz_n%1000/100;
    nxs[3]=sz_n%100/10;
    nxs[4]=sz_n%10/1;
    */
    unsigned char i,nxs[4];                 //4位显示,定义数组nxs
    if(sz>9999)
    sz=9999;
    nxs[0]=sz%10000/1000;              //定义i为轮发次数和位数组位置 变量
    nxs[1]=sz%1000/100;                 //sz 要显示的数值,全局变量
    nxs[2]=sz%100/10;                     //计算显示的个十百千位
    nxs[3]=sz%10/1;

    command(0xC0);                        //轮发4位首地址设置指令,非轮发可其它地址
    for(i=0;i<4;i++)                            //轮发次数 i=4次
    //for(i=0;i<5;i++)                          //轮发送显示数5位
    {
    send_8bit(CODE[nxs[i]][0]);        //i是nxs数组位置变量,如i=3,则取出nxs[3]的值
    send_8bit(CODE[nxs[i]][1]);        //如nxs[3]的值=7,去CODE数组取7高低8位并发送
    }
    STB_1;                                       //C7=1 关片选
    }

    //**************************************************************************************
    //*** ADC设置函数,可与ADC采集放一起,更好的是分开 *************************

    void Adc_cfg(void) //使用ADC1的转换共12步
    {
    GPIO_Init(GPIOB, GPIO_PIN_0, GPIO_MODE_IN_FL_NO_IT );  //  设置B0口为悬浮无中断输入
    ADC1_DeInit();                                                                                //  ADC1口复位初始状态
    ADC1_Init(ADC1_CONVERSIONMODE_SINGLE,                        //  设置ADC1为单次转
    ADC1_CHANNEL_0,                                                                      //   选择ADC1的通道0
    ADC1_PRESSEL_FCPU_D2,                                                        //   设ADC内置时钟 2分频
    ADC1_EXTTRIG_TIM, DISABLE,                                                  //  外部触发ADC事件关闭
    ADC1_ALIGN_RIGHT,                                                                   //  数据对齐方向右对齐
    ADC1_SCHMITTTRIG_CHANNEL0, DISABLE);                          //  关闭ADC1通道0的施密特触发器
    // ADC1_Cmd(ENABLE);                                                               //  使能ADC1
    }

    //************************************************************************************
    //*** ADC采集函数 ********************************************************************

    void adc_zs8()
    {
    float adsz1=0;
    delay1();                                                   //加入延时,防止采集间隔太快

    ADC1_Cmd(ENABLE);                            //  使能ADC1
    ADC1_StartConversion();                        //   ADC1开始转换
    adsz1 = ADC1_GetConversionValue();   //   得到转换结果

    //ADC1_Cmd(DISABLE);                         //   关闭ADC1,下次重开
    adsz1=(adsz1/1024)*3339;                     //1024对应转速满量程 ;
    sz=adsz1;
    }

    //*************************************************************************************
    //***** 求平均函数
    void sumpj(void)
    {
    unsigned int sum = 0;
    unsigned char i;
    for (i=0;i<15;i++)
     {
      adc_zs8(); //AD采集
      sum=sum+sz; //累加
      }
    sz=sum/15; //求平均
    }


    //***********************************************************
    // 主程序开始
    //*********************************************************

    main(void)
    {
    CLK_DeInit();                                                                     //复位时钟寄存器
    CLK_HSICmd(ENABLE);                                                   //内部高速时钟使能
    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //内部1分频 16M
    sim();                                                                                  //关总中断

    TM1618_IOset();                                                               //配置TM1618芯片的IO
    TM1618_CMDset();                                                          //配置TM1618芯片的指令
    Adc_cfg();                                                                         //配置ADC

    while (1)                                                                            //死循环
      {
        sumpj();                                                                         //AD求平均
        dpy(sz);                                                                         //ADC显示
        delay3();
       }
    }

  • 相关阅读:
    CODEVS4650 破损的键盘
    洛谷P1656 炸铁路
    洛谷 P3225 [HNOI2012]矿场搭建
    1265 四点共面
    1406: [AHOI2007]密码箱
    1193: [HNOI2006]马步距离
    1800: [Ahoi2009]fly 飞行棋
    1923: [Sdoi2010]外星千足虫
    I
    2017CCPC秦皇岛G ZOJ 3987Numbers(大数+贪心)
  • 原文地址:https://www.cnblogs.com/beiyhs/p/12753313.html
Copyright © 2011-2022 走看看