找回密码
 立即注册
查看: 229|回复: 5

STC8H3K64S2单片机制作OLED12832, USB电压电流容量表

[复制链接]
  • TA的每日心情
    奋斗
    2023-12-18 15:13
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    4

    主题

    221

    回帖

    884

    积分

    高级会员

    积分
    884
    发表于 2024-3-14 08:57:05 | 显示全部楼层 |阅读模式
    本设计为了方便的观察手机及其他设备充电时所输出的电流电压大小,可进行功耗、充电时间、及充电容量的计算。
    参数:输入电压:5-25v,输入电流0-3A


    设计说明:
    采用STC8H3K64S2单片机的12位adc进行电压及电流
    程序代码已完成显示wmahwh.zip (386.82 KB, 下载次数: 25) USB电压电流检测仪图纸.zip (106.04 KB, 下载次数: 20)

    的采样,用0.91英寸的OLED屏幕来进行显示。
    用嘉立创eda进行设计。先看成品如下(具体见附件哈哈):
    131310tm3fcmcdtwemiwzl.jpg

    原理图:
    131611tf78380gbcg5rglb.jpg

    PCB图:
    131532kdn66m66556xczma.jpg
    131532h1dipcm5piiimnip.jpg
    131531raq3lh8hjzfo444z.jpg

    代码部分截图(具体见附件):

    #include "STC8xxxx.H"
    #include "oled.h"
    #include "bmp.h"
    #include        "config.h"
    #include        "adc.h"
    #include        "gpio.h"
    #include        "delay.h"

    #define N 8        //ADC采样使用递推平均滤波算法,采样次数
                    u8        i;
            u16        j;
               u32 sum=0;  //数值和
                    u32 sum1=0;  //数值和
                    u16 cut=0;  //采样次数
             u16 cu=0;//平均数
                            u16 ca=0;//平均数
                             u16 u1=0;
       u16 u2=0;
        u16 u3=0;
       u16 a1=0;
       u16 a2=0;
       u16 a3=0;


    /*************        功能说明        **************

    本例程基于STC8H8K64U为主控芯片的实验箱8进行编写测试,STC8G、STC8H系列芯片可通用参考.

    本程序演示多路ADC查询采样,通过串口2发送给上位机,波特率115200,N,8,1。

    下载时, 选择时钟 22.1184MHz (可以在配置文件"config.h"中修改).

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


    /*************        本地常量声明        **************/
      unsigned int  ADC_Buf[N+1];                //采样数组mA
      unsigned char num,ADCcount=0,ADCcount2=0;        //ADC采样次数变量

    /*************        本地变量声明        **************/


    /*************        本地函数声明        **************/


    /*************  外部函数和变量声明 *****************/


    /******************* IO配置函数 *******************/
    void        GPIO_config(void)
    {
            GPIO_InitTypeDef        GPIO_InitStructure;                //结构定义
            //AD口设置为输入口
            GPIO_InitStructure.Pin  = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;                //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
            GPIO_InitStructure.Mode = GPIO_HighZ;        //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
            GPIO_Inilize(GPIO_P1,&GPIO_InitStructure);        //初始化

            GPIO_InitStructure.Pin  = GPIO_Pin_6 | GPIO_Pin_7;                //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
            GPIO_InitStructure.Mode = GPIO_PullUp;        //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
            GPIO_Inilize(GPIO_P4,&GPIO_InitStructure);        //初始化
    }

    /******************* AD配置函数 *******************/
    void        ADC_config(void)
    {
            ADC_InitTypeDef                ADC_InitStructure;                //结构定义
            ADC_InitStructure.ADC_SMPduty   = 31;                //ADC 模拟信号采样时间控制, 0~31(注意: SMPDUTY 一定不能设置小于 10)
            ADC_InitStructure.ADC_CsSetup   = 0;                //ADC 通道选择时间控制 0(默认),1
            ADC_InitStructure.ADC_CsHold    = 1;                //ADC 通道选择保持时间控制 0,1(默认),2,3
            ADC_InitStructure.ADC_Speed     = ADC_SPEED_2X1T;                //设置 ADC 工作时钟频率        ADC_SPEED_2X1T~ADC_SPEED_2X16T
            ADC_InitStructure.ADC_Power     = ENABLE;                                //ADC功率允许/关闭        ENABLE,DISABLE
            ADC_InitStructure.ADC_AdjResult = ADC_RIGHT_JUSTIFIED;        //ADC结果调整,        ADC_LEFT_JUSTIFIED,ADC_RIGHT_JUSTIFIED
            ADC_InitStructure.ADC_Priority    = Priority_0;                        //指定中断优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
            ADC_InitStructure.ADC_Interrupt = DISABLE;                        //中断允许        ENABLE,DISABLE
            ADC_Inilize(&ADC_InitStructure);                                        //初始化
            ADC_PowerControl(ENABLE);                                                        //单独的ADC电源操作函数, ENABLE或DISABLE
    }
    void        ADCCL(void)
    {


            if(cut<20000)
            {                  
            Get_ADCResult(1);  //电流
            Get_ADCResult(2); //电压
            sum1+=Get_ADCResult(1);
            sum+=Get_ADCResult(2);

            cut++;
            
            }
          if(cut>=20000)
              {
               cu=sum/20000;
               ca=sum1/20000;
               sum=0;
               sum1=0;
               cut=0;
                cu=cu*0.902077193; //ADC平均值转化成电压值
                    //        OLED_ShowNum(0,2,cu,7,16);
                       u1=cu/100;        //
                             OLED_ShowNum(0,0,u1,2,16);//整数部分电压值
                       u2=cu%100/10;
                            OLED_ShowNum(20,0,u2,1,16);         //小数部分1位电压值                  
                              u3=cu%1000;                                         
                            OLED_ShowNum(28,0,u3,1,16);         ////小数部分2位电压值
                   
                             ca=ca*0.20143615924092;        //ADC平均值转化成mA电流值
                             a1=ca/100;        //
                             OLED_ShowNum(75,0,a1,2,16);//整数部分电流值
                       a2=ca%100/10;
                            OLED_ShowNum(95,0,a2,1,16);         //小数部分1位电电流值                  
                              a3=ca%1000;                                         
                            OLED_ShowNum(103,0,a3,1,16);         ////小数部分2位电流值
                    //        OLED_ShowNum(75,2,ca,4,16);
              }      
             
                            
                   

                   



    }

    /**********************************************/
    void main(void)
    {
    //        u8        i;
    //        u16        j;
            
            GPIO_config();

            ADC_config();
            EA = 1;
            P3M1 = 0x00;
            P3M0 = 0x00;
            OLED_Init();//初始化OLED
            OLED_ColorTurn(0);//0正常显示,1 反色显示
       OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
              OLED_Clear();
            OLED_ShowString(17,0,".",16);
                    OLED_ShowString(40,0,"V",16);
                    OLED_ShowString(112,0,"A",16);
                    OLED_ShowString(91,0,".",16);
            
            while (1)
            {
               
    //                OLED_ShowString(0,2,"T:",16);
    //                OLED_ShowString(16,2,"00:00",16);
    //                OLED_ShowString(70,2,"5000",16);
    //                OLED_ShowString(102,2,"mAh",16);
                              ADCCL();
                   
                    //        delay_ms(250);

                   
                   
            
            }
    }



    1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
    回复 送花

    使用道具 举报

  • TA的每日心情

    8 小时前
  • 签到天数: 63 天

    [LV.6]常住居民II

    3

    主题

    560

    回帖

    776

    积分

    高级会员

    积分
    776
    发表于 2024-3-18 20:15:38 来自手机 | 显示全部楼层
    2个USB直连USB通讯和单片机无关就可以实现快充了。这方法不错啊
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    7 小时前
  • 签到天数: 67 天

    [LV.6]常住居民II

    4

    主题

    89

    回帖

    484

    积分

    中级会员

    积分
    484
    发表于 2024-3-19 14:33:59 | 显示全部楼层
    有时间模仿一下试试
     
    经常看看,偶尔玩玩——不过都是简单的,难的我也不会呀
     
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    回帖

    10

    积分

    新手上路

    积分
    10
    发表于 3 天前 | 显示全部楼层
    屏的驱动芯片是什么? 也想做一个
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 54 天

    [LV.5]常住居民I

    0

    主题

    105

    回帖

    428

    积分

    中级会员

    积分
    428
    发表于 6 小时前 | 显示全部楼层
    回复 送花

    使用道具 举报

  • TA的每日心情
    无聊
    2024-4-3 11:15
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    2

    主题

    26

    回帖

    162

    积分

    注册会员

    积分
    162
    发表于 4 小时前 | 显示全部楼层
    标记标记,有空了学习一下
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-7 14:55 , Processed in 0.069345 second(s), 52 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表