找回密码
 立即注册
查看: 261|回复: 1

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

[复制链接]
  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 169 天

    [LV.7]常住居民III

    67

    主题

    852

    回帖

    2856

    积分

    金牌会员

    积分
    2856
    发表于 2023-12-27 08:09:44 | 显示全部楼层 |阅读模式
    本帖最后由 xxkj2010 于 2023-12-27 08:13 编辑

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

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

    02.jpg


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


    20231227-STC8H1K17T测试之二.mp4

    26.71 MB, 下载次数: 1

    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 169 天

    [LV.7]常住居民III

    67

    主题

    852

    回帖

    2856

    积分

    金牌会员

    积分
    2856
     楼主| 发表于 2023-12-27 08:17:07 | 显示全部楼层
    main.c


    1. #include "STC8H.h"
    2. #include <intrins.h>
    3. #include <stdio.h>
    4. #include "config.h"
    5. #include "delay.h"
    6. //#include "key.h"
    7. #include "WS2812.h"
    8. #include "IRC.h"
    9. #include "TM1637.h"
    10. bit fBusy;                                     //串口发送忙标志
    11. u8 bStage;                                    //用户自定义命令检测阶段
    12. #define CPUIDBASE   0xfde0
    13. #define ID_ADDR     ((unsigned char volatile xdata *)(CPUIDBASE + 0x00))
    14. #define ADCTIM  (*(unsigned char volatile xdata *)0xfea8)
    15.         
    16. uint cp;
    17. u8 ADCval;                                    //ADC测量结果
    18. /*******************************************************************************
    19. *******************************************************************************/
    20. void UartInit();//串口、定时器初始化        
    21. void Timer0_Init(void);                //100微秒+16位自动装载+12T模式@24.000MHz
    22. void CheckCustomCmd(u8 dat);//自动下载检测
    23.         
    24. void main()
    25. {
    26.         uchar i=1,d;
    27.         //以下初始化
    28.         fBusy = 0;
    29.         delay_us(1);        
    30.         delay_ms(1500);//等待稳定
    31.         UartInit();//串口、定时器初始化
    32.         while(1)
    33.         {
    34.                 if(cp>5000)
    35.                 {
    36.                         LED=!LED;                        
    37.                         cp=0;
    38.                         TM1637_display(ADCval/16,ADCval%16,21 ,21, 0); // 按顺序显示        
    39.                         printf("ADC:0x%x\r\n",(u16)ADCval);
    40.                 }
    41.                
    42.         }
    43. }
    44. void UartInit()//串口及定时器初始化
    45. {
    46.           P0M0 = 0x00; P0M1 = 0x00;
    47.     P1M0 = 0x00; P1M1 = 0x00;
    48.     P2M0 = 0x00; P2M1 = 0x00;
    49.     P3M0 = 0x00; P3M1 = 0x00;
    50.           P5M0 = 0x10; P5M1 = 0x00;
    51.         
    52.                 //以下设置内部IRC频率
    53.         P_SW2 |= 0x80;  //使能访问XFR
    54.         SetIRC();//手动设置内部IRC频率        
    55.         
    56.         //以下设置定时器0
    57.                 Timer0_Init()        ;        //100微秒@24.000MHz        
    58. #if defined BRT_T1
    59.     AUXR = 0x40;                                //使用定时器1作为串口波特率发生器
    60.     TMOD = 0x00;
    61.     TL1 = BAUD;
    62.     TH1 = BAUD >> 8;
    63.     TR1 = 1;
    64. #elif defined BRT_T2
    65.     T2L = BAUD;                                 //使用定时器2作为串口波特率发生器
    66.     T2H = BAUD >> 8;
    67.     AUXR = 0x15;
    68. #else
    69.     #error "Baudrate generator select error !"
    70. #endif
    71.     SCON = 0x50;
    72.     ES = 1;
    73.           EA=1;//
    74.                
    75.                
    76.     P3M0 = 0x00; P3M1 = 0x08;                  //设置P33为ADC输入口
    77.     P_SW2 |= 0x80;
    78.     ADCTIM = 0x3f;                              //设置ADC内部时序
    79.     P_SW2 &= 0x7f;
    80.     ADCCFG = 0x0f;                              //设置ADC时钟为系统时钟/2/16
    81.     ADC_CONTR = 0x8B;                      //开启ADC电源,选择第11通道ADC
    82.     EADC = 1;                                   //使能ADC中断
    83. //    EA = 1;
    84.     ADC_CONTR |= 0x40;                          //启动AD转换
    85.                
    86.                
    87. }
    88. void CheckCustomCmd(u8 dat)                   //检测命令序列:"@STCISP#"
    89. {
    90.     switch (bStage++)
    91.     {
    92.     default:
    93. L_Check1st:
    94.     case 0:                                     //检测命令头
    95.         bStage = (dat == '@');
    96.         break;
    97.     case 1:
    98.         if (dat != 'S') goto L_Check1st;
    99.         break;
    100.     case 2:
    101.         if (dat != 'T') goto L_Check1st;
    102.         break;
    103.     case 3:
    104.         if (dat != 'C') goto L_Check1st;
    105.         break;
    106.     case 4:
    107.         if (dat != 'I') goto L_Check1st;
    108.         break;
    109.     case 5:
    110.         if (dat != 'S') goto L_Check1st;
    111.         break;
    112.     case 6:
    113.         if (dat != 'P') goto L_Check1st;
    114.         break;
    115.     case 7:
    116.         if (dat != '#') goto L_Check1st;
    117.         delay_ms(10);                           //检测到正确的命令序列后复位到系统区,此处的延时可省去
    118.         IAP_CONTR = 0x60;                       //复位到系统区
    119.         break;
    120.     }
    121. }
    122. char putchar(char dat)                          //重定义putchar系统函数
    123. {
    124.     while (fBusy);
    125.     fBusy = 1;
    126.     SBUF = dat;
    127.    
    128.     return dat;
    129. }
    130. void uart_isr() interrupt 4
    131. {
    132.     if (TI)
    133.     {
    134.         TI = 0;
    135.         fBusy = 0;
    136.     }
    137.    
    138.     if (RI)
    139.     {
    140.         RI = 0;
    141.         CheckCustomCmd(SBUF);                   //检测命令序列
    142.     }
    143. }
    144. void Timer0_Isr(void) interrupt 1
    145. {
    146.         cp++;
    147.         
    148. }
    149. void Timer0_Init(void)                //100微秒+16位自动装载+12T模式@24.000MHz
    150. {
    151.         AUXR &= 0x7F;                        //定时器时钟12T模式
    152.         TMOD &= 0xF0;                        //设置定时器模式
    153.         TL0 = 0x38;                                //设置定时初始值
    154.         TH0 = 0xFF;                                //设置定时初始值
    155.         TF0 = 0;                                //清除TF0标志
    156.         TR0 = 1;                                //定时器0开始计时
    157.         ET0 = 1;                                //使能定时器
    158. }
    159. void ADC_Isr() interrupt 5
    160. {
    161.     ADC_CONTR &= ~0x20;                         //清中断标志
    162.     ADCval = ADC_RES;                               //读取ADC结果        
    163.     ADC_CONTR |= 0x40;                          //继续AD转换
    164. }
    复制代码
    上面代码大多来源于本论坛或stc-isp,谢谢各位大佬的分享和STC工作人员的辛劳!
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-14 13:55 , Processed in 0.059302 second(s), 35 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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