打印
[STM32]

STM32 TM74HC595显示ADC值,乱码,求助原因,代码附上

[复制链接]
954|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
416112364|  楼主 | 2022-12-14 12:31 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
粘上代码“adc.h”文件
#ifndef _adc_H
#define _adc_H
#include "system.h"
void ADCx_Init(void);
u16 Get_ADC_Value(u8 ch,u8 times);
#endif

//adc.c 文件
#include "adc.h"
#include "SysTick.h"

/*******************************************************************************
* 函 数 名         : ADCx_Init
* 函数功能                   : ADC初始化      
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void ADCx_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量      
        ADC_InitTypeDef       ADC_InitStructure;
      
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);
      
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
      
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//ADC
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;        //模拟输入
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
      
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式      
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//禁止触发检测,使用软件触发
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐      
        ADC_InitStructure.ADC_NbrOfChannel = 1;//1个转换在规则序列中 也就是只转换规则序列1
        ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
      
        ADC_Cmd(ADC1, ENABLE);//开启AD转换器
      
        ADC_ResetCalibration(ADC1);//重置指定的ADC的校准寄存器
        while(ADC_GetResetCalibrationStatus(ADC1));//获取ADC重置校准寄存器的状态
      
        ADC_StartCalibration(ADC1);//开始指定ADC的校准状态
        while(ADC_GetCalibrationStatus(ADC1));//获取指定ADC的校准程序

        ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能或者失能指定的ADC的软件转换启动功能
}

/*******************************************************************************
* 函 数 名         : Get_ADC_Value
* 函数功能                   : 获取通道ch的转换值,取times次,然后平均        
* 输    入         : ch:通道编号
                                         times:获取次数
* 输    出         : 通道ch的times次转换结果平均值
*******************************************************************************/
u16 Get_ADC_Value(u8 ch,u8 times)
{
        u32 temp_val=0;
        u8 t;
        //设置指定ADC的规则组通道,一个序列,采样时间
        ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);        //ADC1,ADC通道,239.5个周期,提高采样时间可以提高精确度                           
      
        for(t=0;t<times;t++)
        {
                ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能指定的ADC1的软件转换启动功能      
                while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
                temp_val+=ADC_GetConversionValue(ADC1);
                delay_ms(5);
        }
        return temp_val/times;
}

//smg.h文件
#ifndef        _SMG_H
#define        _SMG_H
#include "SysTick.h"

#define SCL  GPIO_Pin_10//时钟脉冲信号——上升沿有效ST
#define RCL  GPIO_Pin_11//打入信号————上升沿有效SH
#define DIO  GPIO_Pin_9//串行数据入DS...............
#define SMG_PORT  GPIOB
#define SCL_LOW   GPIO_ResetBits(SMG_PORT,SCL)
#define SCL_HIGH  GPIO_SetBits(SMG_PORT,SCL)

#define RCL_LOW   GPIO_ResetBits(SMG_PORT,RCL)
#define RCL_HIGH  GPIO_SetBits(SMG_PORT,RCL)

#define DIO_LOW    GPIO_ResetBits(SMG_PORT,DIO)
#define DIO_HIGH   GPIO_SetBits(SMG_PORT,DIO)

void Smg_Init(void);
void SMG_Write_Byte (u8 dat,u8 dat1);
void SMG_Number (u16 vo);
#endif


//smg.c文件
#include"smg.h"
#include"adc.h"
u16 smgduan[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳
//u16 smgduan[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴
u8 DisPlayData[8];
extern u16 count;
extern u16 sec,min,hour;
extern u8 i;
u16 value;
u8 vo;
float vol;
/**************************************************************************************
****
****
****
****
***************************************************************************************/

void Smg_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能,PORTB时钟
      
        GPIO_InitStructure.GPIO_Pin = DIO|RCL|SCL;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
    GPIO_Init(GPIOB, &GPIO_InitStructure);      
        GPIO_ResetBits(SMG_PORT,DIO|RCL|SCL);
}
/*************************************************************************************************
****函数名:                SMG_Write_Bite (u8 dat,u8 dat1)
****功能                        写入数据
****
****
***************************************************************************************************/
void SMG_Write_Byte (u8 dat,u8 dat1)
{
        u8 i;
        for(i=0;i<8;i++)
        {
                ((dat<<i)&0x80)? DIO_HIGH:DIO_LOW;                                //        三目运算
                SCL_HIGH;
                SCL_LOW;
        }
        for(i=0;i<8;i++)
        {
                ((dat1<<i)&0x80)? DIO_HIGH:DIO_LOW;                                //        三目运算
                SCL_HIGH;
                SCL_LOW;
        }
      
        RCL_HIGH;
        RCL_LOW;
}

void SMG_Number (u16 vo)
{

        value=Get_ADC_Value(ADC_Channel_1,20);
        vol=(float)value*(3.3/4096);
        vo=vol*1000;

        {
                SMG_Write_Byte (smgduan[vo%1000],0x01);
                delay_ms(10);
                SMG_Write_Byte (smgduan[(vo%100)%10],0x02);
                delay_ms(10);
                SMG_Write_Byte (smgduan[(vo%100)/10],0x04);
                delay_ms(10);
                SMG_Write_Byte (smgduan[vo/1000],0x08);
                delay_ms(10);
      
        }


      
}


//main.c文件
#include "system.h"
#include "SysTick.h"
#include "smg.h"
#include "adc.h"
extern u16 vo;
/*******************************************************************************
* 函 数 名         : main
* 函数功能                   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
int main()
{
      
      
        SysTick_Init(72);
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        ADCx_Init();
      
        while(1)
        {

                SMG_Number ( vo);
                delay_ms(100);      
      
                       
        }
}

编译下载后,数码管显示乱码闪烁,有知道的麻烦给出指正

使用特权

评论回复
评论
416112364 2022-12-22 15:21 回复TA
主函数里缺少 Smg_Init();函数,加上就好了。 

相关帖子

沙发
416112364|  楼主 | 2022-12-22 15:23 | 只看该作者
下面是74HC595串联,8位数码管显示原理图:


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:我所发表的回复,全是基于个人理解与思考,如果大家发现有错误的地方,请一定要指出来

21

主题

107

帖子

2

粉丝