找回密码
 立即注册
查看: 310|回复: 9

8G1K08-38I-QFN20芯片编程求平均值,数据不对。

[复制链接]
已绑定手机

4

主题

22

回帖

66

积分

注册会员

积分
66
发表于 2024-12-30 13:05:53 | 显示全部楼层 |阅读模式
您好:我本来打算将采样的5个值,去掉一个最高一个最低,剩下三个求平均,后来发现数据都是0,然后用2个值求平均,后来发现,求和后值也不对,求平均后更不对,不知道为什么,帮我看看吧?



#include        "config.h"
//#include        "STC8G_PCA.h"
#include        "STC8G_H_GPIO.h"
#include        "STC8G_H_UART.h"
#include        "STC8G_H_NVIC.h"
#include        "STC8G_H_Delay.h"
#include        "STC8G_H_Switch.h"
#include        "STC8G_H_Timer.h"

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

本例程基于STC8G1K08-20PIN进行编写测试,STC8G系列芯片可通用参考.

/******************** IO口配置 ********************/
void        GPIO_config(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;                                //结构定义

        GPIO_InitStructure.Pin  = GPIO_Pin_All;                        //指定要初始化的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_P1,&GPIO_InitStructure);        //初始化
   
        GPIO_InitStructure.Pin  = GPIO_Pin_2;                        //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
        GPIO_InitStructure.Mode = GPIO_OUT_PP;                        //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
        GPIO_Inilize(GPIO_P1,&GPIO_InitStructure);        //初始化

        GPIO_InitStructure.Pin  = GPIO_Pin_7;                                //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7, 或操作
        GPIO_InitStructure.Mode = GPIO_OUT_PP;                        //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
        GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);        //初始化
    GPIO_InitStructure.Pin  = GPIO_Pin_6|GPIO_Pin_5|GPIO_Pin_4|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_P3,&GPIO_InitStructure);        //初始化
}

/***************  串口初始化函数 *****************/
void        UART_config(void)
{
        COMx_InitDefine                COMx_InitStructure;                                        //结构定义

        COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;        //模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
//        COMx_InitStructure.UART_BRT_Use   = BRT_Timer2;                        //选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
        COMx_InitStructure.UART_BaudRate  = 115200;                        //波特率, 一般 110 ~ 115200
        COMx_InitStructure.UART_RxEnable  = ENABLE;                                //接收允许,   ENABLE或DISABLE
        COMx_InitStructure.BaudRateDouble = DISABLE;                        //波特率加倍, ENABLE或DISABLE
        UART_Configuration(UART2, &COMx_InitStructure);                //初始化串口1 UART1,UART2,UART3,UART4
        NVIC_UART2_Init(ENABLE,Priority_3);                //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3

        UART2_SW(UART2_SW_P10_P11);                //UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
}

void        Timer1_config(void)
{
    TMOD =0x00;
    TL1 = 0XCD;                                 //65536-11.0592M/12/1000 FC66  922  1843  F8CD
    TH1 = 0XF8;
    TR1 = 1;                                    //启动定时器
    ET1 = 1;                                    //使能定时器中断
    IPH=IPH|PT1H;
    PT1 =1;
}


void Timer0_config(void)
{
    TMOD=0x05;                                //外部计数模式,不自动重载值
    TL0 =0X0;
    TH0 =0X0;
    TR0 = 1;                                    //启动定时器
    ET0 = 1;                                    //使能定时器中断
    IPH =IPH;
    PT0 = 1;
}

u16  CYCLE_COUNT=0,CYCLE_COUNT_L=0, th=0,th1=0;tl=0;
u16  CYCLE_COUNT1=0;
u8   CYCLE_COUNT_H=0;
u16  Five_Average[5]={0};
u16  Average_Value[5]={0};
u8   i=0,j=0;
u16 max_val,min_val,sum=0,average=0;

void Timer1_ISR_Handler (void) interrupt TMR1_VECTOR                //进中断时已经清除标志
{
    start:   
    th=TH0;
    tl=TL0;
    th1=TH0;
    if(th1!=th)goto start;
   
    CYCLE_COUNT=th*0xff+tl;
    TH0=0;TL0=0;
        
     Five_Average
=CYCLE_COUNT;
     sum += Five_Average
;
     i++;
    if(i==2)
    {
//        max_val = Five_Average[0];
//        min_val = Five_Average[0];
//        for(j = 0; j < 5; j++)
//        {
//            if(Five_Average[j] > max_val) {
//                max_val = Five_Average[j];
//            }
//            if(Five_Average[j] < min_val) {
//                min_val = Five_Average[j];
//            }
//            sum += Five_Average[j];
//         }        
//            // 减去最大值和最小值
//         sum -= (max_val + min_val);
//            
            // 计算平均值
         average = sum >>1;
         i=0;
     }   


    CYCLE_COUNT1++;
    if(CYCLE_COUNT1>1000){CYCLE_COUNT1=0;OUT_PIN=!OUT_PIN;}
    //
}


void Timer0_ISR_Handler (void) interrupt TMR0_VECTOR                //进中断时已经清除标志
{

}

void main(void)
{   
    EAXSFR();                /* 扩展寄存器访问使能 */
    GPIO_config();
    UART_config();
    Timer1_config();
    Timer0_config();
//    INTCLKO = 0x10;
//    IPH=IPH|PX1H;
    AUXR=AUXR|0x80;
    EA = 1;
    printf("****************printf test********************** \r\n");  

    while(1)//改为1ms计数一次判断高低电平
    {
//        CYCLE_COUNT=100;
        printf("average=%d\n\r,CYCLE_COUNT=%d\n\r",average,CYCLE_COUNT);
   

        delay_ms(100);
    }
}



截图202412301305421751.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:298
  • 最近打卡:2025-05-02 16:41:54
已绑定手机

4

主题

339

回帖

1562

积分

金牌会员

积分
1562
发表于 2024-12-30 13:59:04 | 显示全部楼层

回复

使用道具 举报 送花

已绑定手机

4

主题

22

回帖

66

积分

注册会员

积分
66
发表于 2024-12-30 14:00:13 | 显示全部楼层
haiya*** 发表于 2024-12-30 13:59
平均值不一定是整数,改成浮点数试试

谢谢您的回复,刚查到问题了是sum没有及时清零导致的。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2024-12-30 14:28:13 | 显示全部楼层
STC8G*** 发表于 2024-12-30 14:00
谢谢您的回复,刚查到问题了是sum没有及时清零导致的。

CYCLE_COUNT=th*256+tl;
不是乘以0xff
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:26
  • 最近打卡:2025-02-02 05:15:26
已绑定手机

1

主题

46

回帖

99

积分

注册会员

积分
99
发表于 2024-12-30 15:54:20 | 显示全部楼层
加油
回复

使用道具 举报 送花

已绑定手机

4

主题

22

回帖

66

积分

注册会员

积分
66
发表于 2024-12-30 16:01:13 | 显示全部楼层
Ayb_*** 发表于 2024-12-30 14:28
CYCLE_COUNT=th*256+tl;
不是乘以0xff

不是,类似十进制100=1*100+0;而不是=1*99+0;我刚才验证了下,是256。谢谢您的回复,我又好好思考了下。
回复 支持 反对

使用道具 举报 送花

已绑定手机

4

主题

22

回帖

66

积分

注册会员

积分
66
发表于 2024-12-30 16:05:35 | 显示全部楼层

谢谢您的鼓励!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:513
  • 最近打卡:2025-05-02 07:32:37

21

主题

564

回帖

2678

积分

金牌会员

积分
2678
发表于 2024-12-30 19:58:35 | 显示全部楼层

能找到问题、解决问题就前途大大滴

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:26
  • 最近打卡:2025-02-02 05:15:26
已绑定手机

1

主题

46

回帖

99

积分

注册会员

积分
99
发表于 2024-12-31 09:07:53 | 显示全部楼层

哈哈哈一样
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:26
  • 最近打卡:2025-02-02 05:15:26
已绑定手机

1

主题

46

回帖

99

积分

注册会员

积分
99
发表于 2025-1-5 00:32:31 | 显示全部楼层

加油吧
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 03:14 , Processed in 0.183580 second(s), 122 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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