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
优秀