找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1446|回复: 8
打印 上一主题 下一主题
收起左侧

STC8H3K64S2单片机制作oled12832USB电压电流容量表

  [复制链接]
跳转到指定楼层
楼主
设计目的(声明:仅作为个人参考用,希望能多给我点积分以便于下载更多的学习资料,谢谢):
    本设计为了方便的观察手机及其他设备充电时所输出的电流电压大小,可进行功耗、充电时间、及充电容量的计算。参数:输入电压:5-25v,输入电流0-3A
设计说明:
    采用STC8H3K64S2单片机的12位adc进行电压及电流 程序代码已完成显示wmahwh.zip (386.82 KB, 下载次数: 69)

USB电压电流检测仪图纸.zip (106.04 KB, 下载次数: 46)

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


原理图:
PCB图:


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

#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);

               
               
        
        }
}

评分

参与人数 2黑币 +60 收起 理由
admin + 50 共享资料的黑币奖励!
jialishoushi + 10 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏11 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:35873 发表于 2023-12-3 04:58 | 只看该作者
谢谢分享 手上还有好几个这屏 得闲了也整个玩玩
回复

使用道具 举报

板凳
ID:672765 发表于 2023-12-3 13:02 | 只看该作者
jialishoushi 发表于 2023-12-3 04:58
谢谢分享 手上还有好几个这屏 得闲了也整个玩玩

可以的,哈哈
回复

使用道具 举报

地板
ID:1086066 发表于 2023-12-5 09:40 | 只看该作者
楼主高手,准备买元件做一个。
回复

使用道具 举报

5#
ID:430492 发表于 2023-12-6 09:26 | 只看该作者
楼主高手,动手设计就成功一半!!
回复

使用道具 举报

6#
ID:672765 发表于 2023-12-6 20:12 | 只看该作者
ycw701123 发表于 2023-12-5 09:40
楼主高手,准备买元件做一个。

可以的,有问题可以随时交流
回复

使用道具 举报

7#
ID:672765 发表于 2023-12-6 20:16 | 只看该作者
cooleaf 发表于 2023-12-6 09:26
楼主高手,动手设计就成功一半!!

哈哈,还得多多学习,
回复

使用道具 举报

8#
ID:1087912 发表于 2023-12-20 21:24 | 只看该作者
请问,用的是什么型号的屏?
回复

使用道具 举报

9#
ID:371734 发表于 2024-3-29 22:15 | 只看该作者
楼主高手  学习了
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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