xxkj2010 发表于 2023-12-27 08:09:44

STC8H1K17T-TSSOP20系列实验之二----ADC测试

本帖最后由 xxkj2010 于 2023-12-27 08:13 编辑

自制的STC8H1K17T-TSSOP20测试板,插入tm1637四位数码管模块作为显示。
从stc-isp工具的ADC(中断模式)例程中复制几行代码,随即进行ADC测量实验。

测试板上的ADC可调电阻中心抽头接的是P33,
通过查看手册,是选中了第11通道ADC,所以例程中的通道必须修改一下。





主要代码随后贴出,欢迎大佬指教。


xxkj2010 发表于 2023-12-27 08:17:07

main.c


#include "STC8H.h"
#include <intrins.h>
#include <stdio.h>
#include "config.h"
#include "delay.h"
//#include "key.h"
#include "WS2812.h"
#include "IRC.h"
#include "TM1637.h"

bit fBusy;                                     //串口发送忙标志
u8 bStage;                                    //用户自定义命令检测阶段

#define CPUIDBASE   0xfde0
#define ID_ADDR   ((unsigned char volatile xdata *)(CPUIDBASE + 0x00))
#define ADCTIM(*(unsigned char volatile xdata *)0xfea8)
      
uint cp;
u8 ADCval;                                    //ADC测量结果

/*******************************************************************************
*******************************************************************************/

void UartInit();//串口、定时器初始化      
void Timer0_Init(void);                //100微秒+16位自动装载+12T模式@24.000MHz
void CheckCustomCmd(u8 dat);//自动下载检测
      
void main()
{
      uchar i=1,d;
      //以下初始化
      fBusy = 0;
      delay_us(1);      
      delay_ms(1500);//等待稳定
      UartInit();//串口、定时器初始化

      while(1)
      {
                if(cp>5000)
                {
                        LED=!LED;                        
                        cp=0;
                        TM1637_display(ADCval/16,ADCval%16,21 ,21, 0); // 按顺序显示      
                        printf("ADC:0x%x\r\n",(u16)ADCval);
                }
               
      }
}


void UartInit()//串口及定时器初始化
{
          P0M0 = 0x00; P0M1 = 0x00;
    P1M0 = 0x00; P1M1 = 0x00;
    P2M0 = 0x00; P2M1 = 0x00;
    P3M0 = 0x00; P3M1 = 0x00;
          P5M0 = 0x10; P5M1 = 0x00;
      
                //以下设置内部IRC频率
      P_SW2 |= 0x80;//使能访问XFR
      SetIRC();//手动设置内部IRC频率      
      
      //以下设置定时器0
                Timer0_Init()      ;      //100微秒@24.000MHz      
#if defined BRT_T1
    AUXR = 0x40;                              //使用定时器1作为串口波特率发生器
    TMOD = 0x00;
    TL1 = BAUD;
    TH1 = BAUD >> 8;
    TR1 = 1;
#elif defined BRT_T2
    T2L = BAUD;                                 //使用定时器2作为串口波特率发生器
    T2H = BAUD >> 8;
    AUXR = 0x15;
#else
    #error "Baudrate generator select error !"
#endif
    SCON = 0x50;
    ES = 1;
          EA=1;//
               
               
    P3M0 = 0x00; P3M1 = 0x08;                  //设置P33为ADC输入口
    P_SW2 |= 0x80;
    ADCTIM = 0x3f;                              //设置ADC内部时序
    P_SW2 &= 0x7f;
    ADCCFG = 0x0f;                              //设置ADC时钟为系统时钟/2/16
    ADC_CONTR = 0x8B;                      //开启ADC电源,选择第11通道ADC
    EADC = 1;                                 //使能ADC中断
//    EA = 1;
    ADC_CONTR |= 0x40;                        //启动AD转换
               
               
}

void CheckCustomCmd(u8 dat)                   //检测命令序列:"@STCISP#"
{
    switch (bStage++)
    {
    default:
L_Check1st:
    case 0:                                     //检测命令头
      bStage = (dat == '@');
      break;
    case 1:
      if (dat != 'S') goto L_Check1st;
      break;
    case 2:
      if (dat != 'T') goto L_Check1st;
      break;
    case 3:
      if (dat != 'C') goto L_Check1st;
      break;
    case 4:
      if (dat != 'I') goto L_Check1st;
      break;
    case 5:
      if (dat != 'S') goto L_Check1st;
      break;
    case 6:
      if (dat != 'P') goto L_Check1st;
      break;
    case 7:
      if (dat != '#') goto L_Check1st;
      delay_ms(10);                           //检测到正确的命令序列后复位到系统区,此处的延时可省去
      IAP_CONTR = 0x60;                     //复位到系统区
      break;
    }
}


char putchar(char dat)                        //重定义putchar系统函数
{
    while (fBusy);
    fBusy = 1;
    SBUF = dat;
   
    return dat;
}

void uart_isr() interrupt 4
{
    if (TI)
    {
      TI = 0;
      fBusy = 0;
    }
   
    if (RI)
    {
      RI = 0;
      CheckCustomCmd(SBUF);                   //检测命令序列
    }
}

void Timer0_Isr(void) interrupt 1
{
      cp++;
      
}

void Timer0_Init(void)                //100微秒+16位自动装载+12T模式@24.000MHz
{
      AUXR &= 0x7F;                        //定时器时钟12T模式
      TMOD &= 0xF0;                        //设置定时器模式
      TL0 = 0x38;                              //设置定时初始值
      TH0 = 0xFF;                              //设置定时初始值
      TF0 = 0;                              //清除TF0标志
      TR0 = 1;                              //定时器0开始计时
      ET0 = 1;                              //使能定时器
}

void ADC_Isr() interrupt 5
{
    ADC_CONTR &= ~0x20;                         //清中断标志
    ADCval = ADC_RES;                               //读取ADC结果      
    ADC_CONTR |= 0x40;                        //继续AD转换
}
上面代码大多来源于本论坛或stc-isp,谢谢各位大佬的分享和STC工作人员的辛劳!

ljm10000 发表于 2025-1-5 13:27:43

tm1637的驱动程序能贴出来借鉴一下吗

xxkj2010 发表于 2025-1-5 16:41:53

ljm10000 发表于 2025-1-5 13:27
tm1637的驱动程序能贴出来借鉴一下吗
https://www.stcaimcu.com/forum.p ... =1&extra=#pid110798
从网上下载下来的,修改一下引脚定义,基本都可以用
页: [1]
查看完整版本: STC8H1K17T-TSSOP20系列实验之二----ADC测试