找回密码
 立即注册
查看: 873|回复: 8

STC8H1K17T-TSSOP20系列实验之四----获取STC8H触摸数值并发送到串口

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:521
  • 最近打卡:2025-05-02 09:38:13

109

主题

1900

回帖

5214

积分

论坛元老

积分
5214
发表于 2024-1-3 10:30:04 | 显示全部楼层 |阅读模式
本帖最后由 xxkj2010 于 2024-1-3 10:31 编辑

/*

功能:获取STC8H触摸数值并发送到串口(每秒发送1次),可以通过串口发送指令变换要获取数据的触摸通道
变换通道方法:通过串口发送文本TK?即可变换通道,例如TK03、TK15(必须包含4个字符)
注意:
1、下载时选择频率11059200,串口波特率115200
2、用户需要设置以下参数:
P?M0\P?M1:开启触摸的引脚需要设置为高阻输入模式(本例只设置P13\P16\P17)
TSCHEN:开启触摸通道配置
TK_MAX:开启的通道中,最大通道

本例中代码大多来自STC论坛大佬的代码,在此致谢!
更多资料请访问:https://www.stcaimcu.com/
*/
主程序:
  1. #include "stc8h.h"
  2. #include "intrins.h"
  3. #include "stdio.h"
  4. typedef     unsigned char   u8;
  5. typedef     unsigned int    u16;
  6. typedef     unsigned long   u32;
  7. #define    MAIN_Fosc       11059200L   //定义主时钟(精确计算115200波特率)
  8. #define     Baudrate1           115200L
  9. #define     UART1_BUF_LENGTH    64
  10. #define     LED    P54
  11. #define    TSCHEN     (*(unsigned int  volatile xdata *)0xfb40)        /* 触摸按键使能寄存器 */       
  12. #define     TK8    1
  13. #define     TK9    1<<1
  14. #define     TK10    1<<2
  15. #define     TK11    1<<3
  16. #define     TK12    1<<4
  17. #define     TK13    1<<5
  18. #define     TK14    1<<6
  19. #define     TK15    1<<7
  20. #define     TK0    1<<8
  21. #define     TK1    1<<9
  22. #define     TK2    1<<10
  23. #define     TK3    1<<11
  24. #define     TK4    1<<12
  25. #define     TK5    1<<13
  26. #define     TK6    1<<14
  27. #define     TK7    1<<15
  28. /********************以下四项用户可根据需要自行设置!!****************************************/
  29. u8 TK_MAX =7 ;//使用的通道最大值,如启用TK3、TK6、TK7,则最大值就是7
  30. u8 tk =6 ;//通电后初始获取数据的触摸通道
  31. #define set_TSCHEN() TSCHEN  = TK3|TK6|TK7;//需要用到的触摸通道使能!!//        TSCHEN=0xffff;
  32. #define set_PinMode() P1M0 = 0x00,P1M1 = 0xff;
  33. u16 TK_CNT[16];
  34. u8 TK_OVER =0 ;
  35. u8  RX1_Cnt;    //接收计数
  36. bit fBusy; //发送忙标志
  37. u16 TK_CNT_MAX=0,TK_CNT_MIN=0xffff;//按键数据最大最小值
  38. u16 cp;//定时器计数
  39. u8  xdata RX1_Buffer[UART1_BUF_LENGTH]; //接收缓冲
  40. void UART1_config(u8 brt);    // UART1初始化函数: 1---使用Timer1做波特率   2---使用Timer2做波特率
  41.                
  42. void main(void)
  43. {
  44.         P_SW2 |= 0X80;
  45.         AUXR &= 0x7F;                        //定时器时钟12T模式
  46.         TMOD &= 0xF0;                        //设置定时器模式
  47.         TL0 = 0x66;                                //设置定时初始值
  48.         TH0 = 0xFC;                                //设置定时初始值
  49.         TF0 = 0;                                //清除TF0标志
  50.         TR0 = 1;                                //定时器0开始计时
  51.         ET0 = 1;                                //使能定时器0中断
  52.        
  53.         UART1_config(2);    // UART1初始化函数: 1---使用Timer1做波特率   2---使用Timer2做波特率
  54.    set_PinMode();//开启触摸的引脚需要设置为高阻输入模式!!
  55.                 P5M0 = 0x00; P5M1 = 0x0f;
  56.                 LED=0;
  57.         set_TSCHEN();//需要用到的触摸通道使能!!
  58.        
  59.         //设置触摸按键的开关频率,参考电压和放电时间
  60.         TSCFG1  = (7<<4) + 3;                        //工作频率设为最低,        时钟为1000个系统时钟       
  61.         TSCFG2  = 2;                                        //设置参考点
  62.        
  63.         TSCTRL = 0Xa0 ;//开启触摸       
  64.         IE2 |= 0X80;//开启触摸中断并保存数据
  65.         EA = 1;
  66.        
  67.         while(1)
  68.         {                       
  69.                 if( TK_OVER==1 )                                //一轮采集完成
  70.                 {
  71.                         TK_OVER = 0;
  72. //                        SEND_U16(TK_CNT[6]);
  73.                         if(TK_CNT[tk]>TK_CNT_MAX)TK_CNT_MAX=TK_CNT[tk];
  74.                         if(TK_CNT[tk]<TK_CNT_MIN)TK_CNT_MIN=TK_CNT[tk];
  75.                         if(TK_CNT[tk]<22000)LED=0;
  76.                         else LED=1;
  77.                 }
  78. //                if( TK_CNT[0] <7000)                        //触摸按键0按下       
  79. //                        COM7_DA_H = 0x80;
  80. //                else                                                        //松开
  81. //                        COM7_DA_H = 0x00;
  82.                
  83.                 if(cp>1000)
  84.                 {
  85.                         printf("TK%d_CNT:%d\r\n",(u16)tk,TK_CNT[tk]);
  86.                         printf("TK_CNT_MAX:%d\r\n",TK_CNT_MAX);
  87.                         printf("TK_CNT_MIN:%d\r\n",TK_CNT_MIN);
  88.                         TK_CNT_MAX=0;TK_CNT_MIN=0xffff;
  89.                         cp=0;
  90.                 }
  91.                 if(RX1_Cnt>3)
  92.                 {
  93.                         if(RX1_Buffer[0]=='T'&& RX1_Buffer[1]=='K')
  94.                                 tk=(RX1_Buffer[2]-'0')*10+(RX1_Buffer[3]-'0');
  95.                         RX1_Cnt=0;       
  96.                         printf("Data comes from channels:%d\r\n",(u16)tk);       
  97.                 }
  98.         }
  99.                
  100. }
  101. void UART1_config(u8 brt)    // UART1初始化函数: 1---使用Timer1做波特率   2---使用Timer2做波特率,
  102. {
  103.         u16 dat;
  104.         dat=65536UL - (MAIN_Fosc / 4) / Baudrate1;
  105.     /*********** 波特率使用定时器2 *****************/       
  106.     if(brt == 2)
  107.     {
  108.         AUXR |= 0x01;       //S1 BRT Use Timer2;                               
  109.                            AUXR &= ~(1<<4);    //Timer stop
  110.                                 AUXR &= ~(1<<3);    //Timer2 set As Timer
  111.                                 AUXR |=  (1<<2);    //Timer2 set as 1T mode
  112.                                 T2H = dat / 256;
  113.                                 T2L = dat % 256;
  114.                                 IE2  &= ~(1<<2);    //禁止中断
  115.                                 AUXR |=  (1<<4);    //Timer run enable                       
  116.     }
  117.     /*********** 波特率使用定时器1 *****************/
  118.     else
  119.     {
  120.         TR1 = 0;
  121.         AUXR &= ~0x01;      //S1 BRT Use Timer1;
  122.         AUXR |=  (1<<6);    //Timer1 set as 1T mode
  123.         TMOD &= ~(1<<6);    //Timer1 set As Timer
  124.         TMOD &= ~0x30;      //Timer1_16bitAutoReload;
  125.                                 T2H = dat / 256;
  126.                                 T2L = dat % 256;
  127.         ET1 = 0;    //禁止中断
  128.         INTCLKO &= ~0x02;   //不输出时钟
  129.         TR1  = 1;
  130.     }
  131.     /*************************************************/
  132.     SCON = (SCON & 0x3f) | 0x40;    //UART1模式, 0x00: 同步移位输出, 0x40: 8位数据,可变波特率, 0x80: 9位数据,固定波特率, 0xc0: 9位数据,可变波特率
  133. //  PS  = 1;    //高优先级中断
  134.     ES  = 1;    //允许中断
  135.     REN = 1;    //允许接收
  136.     P_SW1 &= 0x3f;
  137.     P_SW1 |= 0x00;      //UART1 switch to, 0x00: P3.0 P3.1, 0x40: P3.6 P3.7, 0x80: P1.6 P1.7, 0xC0: P4.3 P4.4
  138. //  PCON2 |=  (1<<4);   //内部短路RXD与TXD, 做中继, ENABLE,DISABLE
  139.     fBusy = 0;
  140.     RX1_Cnt = 0;
  141. }
  142. void UART1_int (void) interrupt 4//UART1中断函数
  143. {
  144.     if(RI)
  145.     {
  146.         RI = 0;
  147.         RX1_Buffer[RX1_Cnt] = SBUF;
  148.         if(++RX1_Cnt >= UART1_BUF_LENGTH)   RX1_Cnt = 0;    //防溢出
  149.     }
  150.     if(TI)
  151.     {
  152.         TI = 0;
  153.         fBusy = 0;
  154.     }
  155. }
  156. void TKSU_ISR(void) interrupt 13
  157. {
  158.         u8 j = TSSTA2;                                                //读到的寄存器先保存起来
  159.        
  160.         if( j & 0x40 )                                                //数据溢出中断
  161.         {
  162.                 TSSTA2 |= 0x40;
  163.         }
  164.        
  165.         if( j & 0x80 )                                                //一轮采集完成中断
  166.         {
  167.                 j &= 0x0f;                                                //获取当前通道号
  168.                 TSSTA2 |= 0x80;
  169.                
  170.                 TK_CNT[j] =  TSDAT;
  171.                
  172.                 if( j==TK_MAX )
  173.                         TK_OVER = 1;
  174.         }
  175. }
  176. void Timer0_Isr(void) interrupt 1  //1000微秒@11.0592MHz
  177. {
  178.         cp++;       
  179. }
  180. char putchar(char dat)                          //重定义putchar系统函数
  181. {
  182.     while (fBusy);
  183.     fBusy = 1;
  184.     SBUF = dat;   
  185.     return dat;
  186. }
复制代码



测试效果:

01.jpg
02.jpg

03.jpg



Video_2024-01-03.mp4

883.17 KB, 下载次数: 88

获取STC8H触摸数值并发送到串口.rar

15.29 KB, 下载次数: 99

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

718

主题

1万

回帖

1万

积分

管理员

积分
15626
发表于 2024-1-3 12:49:20 | 显示全部楼层
串口绘图,还没用起来 ?
截图202401031248089298.jpg

截图202401031248438002.jpg


截图202401031249151360.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

718

主题

1万

回帖

1万

积分

管理员

积分
15626
发表于 2024-1-3 12:52:26 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:521
  • 最近打卡:2025-05-02 09:38:13

109

主题

1900

回帖

5214

积分

论坛元老

积分
5214
发表于 2024-1-3 13:22:35 | 显示全部楼层
神*** 发表于 2024-1-3 12:49
串口绘图,还没用起来 ?

用了,昨天下午弄了好久都没有出来,昨晚弄了,出来了,但觉得用起来不习惯。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

718

主题

1万

回帖

1万

积分

管理员

积分
15626
发表于 2024-1-3 14:02:03 | 显示全部楼层
多用几次就爱上他了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:521
  • 最近打卡:2025-05-02 09:38:13

109

主题

1900

回帖

5214

积分

论坛元老

积分
5214
发表于 2024-1-3 14:16:28 | 显示全部楼层
神*** 发表于 2024-1-3 14:02
多用几次就爱上他了

我暂时还是喜欢数据直读。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

718

主题

1万

回帖

1万

积分

管理员

积分
15626
发表于 2024-1-3 15:33:05 | 显示全部楼层
是并行的,不冲突
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-01-18 18:18:52

8

主题

24

回帖

220

积分

中级会员

积分
220
发表于 2024-1-18 18:10:06 | 显示全部楼层
搭车问,这颗芯片,设置仿真时要选哪个型号,没找到这个型号.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

718

主题

1万

回帖

1万

积分

管理员

积分
15626
发表于 2024-1-18 19:56:38 | 显示全部楼层
STC8H1K08T 可以仿真,STC8H1K17T 不可以仿真
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 15:46 , Processed in 0.232422 second(s), 98 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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