找回密码
 立即注册
查看: 898|回复: 3

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 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, 下载次数: 105

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 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工作人员的辛劳!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:103
  • 最近打卡:2025-05-01 05:00:32
已绑定手机

0

主题

3

回帖

438

积分

中级会员

积分
438
发表于 2025-1-5 13:27:43 | 显示全部楼层
tm1637的驱动程序能贴出来借鉴一下吗
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 2025-1-5 16:41:53 | 显示全部楼层
ljm1*** 发表于 2025-1-5 13:27
tm1637的驱动程序能贴出来借鉴一下吗

https://www.stcaimcu.com/forum.p ... =1&extra=#pid110798
从网上下载下来的,修改一下引脚定义,基本都可以用
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 09:02 , Processed in 0.115442 second(s), 67 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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