tyun1990 发表于 2023-10-27 21:36:16

学习打卡 第17课 第3部分
出问题了,第0个ADC值不对,程序也跟老师的一样。不解???求助





↓ADC.C文件

#include "ADC.H"
#include "INTRINS.H"

void ADC_Init()
{
        P1M0 = 0x00; P1M1 = 0x01; //设置P10为高阻输入
       
        ADCTIM = 0X3F;//时序寄存器,ADCTIM.6.5=0 1,ADCTIM.4.3.2.1.0=11111 =选择32个时钟(最慢)
        ADCCFG = 0X2F;//配置寄存器,ADCCFG.5(RESFMT)=1 使用12位右对齐模式;ADCCFG.3.2.1.0=1111,速度越慢转换越稳定
        ADC_POWER = 1;//打开adc电源
}


u16 ADC_Read(u8 no)
{
        u16 adcval;//保存转换成功的ADC值
        ADC_CONTR &= 0xf0;//清空通道
        ADC_CONTR |= no;//选择通道
        ADC_START = 1;//开启ADC转化
        _nop_();
        _nop_();
        while(!ADC_FLAG);//ADC_FLAG是结束转换标志位
        ADC_FLAG = 0;
        adcval = (ADC_RES << 8)+ADC_RES;//高八位加上第八位的值
        return adcval;
}


↓ADC.H文件

#ifndef __ADC_H
#define __ADC_H

#include "COMM/stc.h"                //调用头文件
#include "COMM/usb.h"
//------------------------------变量声明------------------------------

//------------------------------函数声明------------------------------

void ADC_Init();
u16 ADC_Read(u8 no);
#endif






tyun1990 发表于 2023-10-29 09:42:17

第17课打卡

综述:前面发送2个回帖都为由经过实际实验,这一次是经过实验回复了。之前抄程序的时候不仔细,抄错了一个代码导致按键值错误。现在改正回帖






#include <STC32G.H>
#include <intrins.h>
#include"sys_init.h"
#include"LED_display.h"

unsigned char cnt1ms=0;
unsigned int ad_volume=0;
#define ADC_OFFSET 64
unsigned char KeyCode=0;
void CalculateAdcKey(unsigned int adc);
unsigned int Get_ADC12BitResult(unsigned char channel);
void Timer0Init(void)
{
        AUXR |= 0X7F;
        TMOD &= 0XF0;
        TL0=0X30;
        TH0=0XF8;
        TF0=0;
        TR0=1;
}

void main()
{
        unsigned int j;
        sys_init();
        ADCCFG=ADCCFG | 0X20;
        ADC_POWER = 1;
        P1M1=P1M1 | 0X01;
        Timer0Init();
        ET0 = 1;
        TR0 = 1;
        EA = 1;
        while(1)
        {
                Dis_buf = ad_volume /1000%10;
                Dis_buf = ad_volume /100%10;
                Dis_buf = ad_volume /10%10;
                Dis_buf = ad_volume %10;
                Dis_buf = KeyCode /10;
                Dis_buf = KeyCode %10;
                LED_display();
                if(cnt1ms>=10)
                {
                        cnt1ms=0;
                        j = Get_ADC12BitResult(0);
                        if(((256-ADC_OFFSET)<j) && (j<4096))
                        {
                                LED_display();
                                LED_display();
                                j = Get_ADC12BitResult(0);
                                if(((256-ADC_OFFSET)<j) && (j<4096))
                                {
                                        ad_volume = j;
                                        CalculateAdcKey(j);
                                        Dis_buf = ad_volume /1000%10;
                                        Dis_buf = ad_volume /100%10;
                                        Dis_buf = ad_volume /10%10;
                                        Dis_buf = ad_volume %10;
                                        Dis_buf = KeyCode /10;
                                        Dis_buf = KeyCode %10;
L1:                                        j = Get_ADC12BitResult(0);
                                        while(((256-ADC_OFFSET)<j) && (j<4096))
                                        {
                                                LED_display();
                                                goto L1;
                                        }
                                }
                        }
                }
        }
}

unsigned int Get_ADC12BitResult(unsigned char channel)
{
        ADC_RES = 0;
        ADC_RESL = 0;
        ADC_CONTR = (ADC_CONTR & 0XE0) | 0X40 | channel;
        _nop_();_nop_();
        _nop_();_nop_();
        while((ADC_CONTR & 0X20) == 0);
        ADC_FLAG=0;
        return <font color="#ff0000">(((unsigned int)ADC_RES << 8) | ADC_RESL);</font>
}

void CalculateAdcKey(unsigned int adc)
{
        unsigned char i;
        unsigned int j=256;
        for(i=1;i<=16; i++)
        {
                if((adc >= (j - ADC_OFFSET)) && (adc <= (j+ADC_OFFSET))) break;
                j+=256;
        }
        if(i<17) KeyCode = i;
}

void timer0(void) interrupt 1
{
        cnt1ms++;
}

晨露 发表于 2025-1-11 14:30:06

优秀
页: 1 2 [3]
查看完整版本: 实验箱已收到!看冲哥《STC32位8051单片机视频教程》学习记录