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

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

[复制链接]
  • TA的每日心情
    开心
    昨天 09:18
  • 签到天数: 180 天

    [LV.7]常住居民III

    67

    主题

    876

    回帖

    2948

    积分

    金牌会员

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

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

    15.29 KB, 下载次数: 9

    回复 送花

    使用道具 举报

    该用户从未签到

    553

    主题

    9617

    回帖

    1万

    积分

    管理员

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

    截图202401031248438002.jpg


    截图202401031249151360.jpg

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    553

    主题

    9617

    回帖

    1万

    积分

    管理员

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 09:18
  • 签到天数: 180 天

    [LV.7]常住居民III

    67

    主题

    876

    回帖

    2948

    积分

    金牌会员

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

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

    使用道具 举报

    该用户从未签到

    553

    主题

    9617

    回帖

    1万

    积分

    管理员

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 09:18
  • 签到天数: 180 天

    [LV.7]常住居民III

    67

    主题

    876

    回帖

    2948

    积分

    金牌会员

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

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

    使用道具 举报

    该用户从未签到

    553

    主题

    9617

    回帖

    1万

    积分

    管理员

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

    使用道具 举报

  • TA的每日心情
    郁闷
    2024-1-18 18:18
  • 签到天数: 1 天

    [LV.1]初来乍到

    6

    主题

    22

    回帖

    138

    积分

    注册会员

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

    使用道具 举报

    该用户从未签到

    553

    主题

    9617

    回帖

    1万

    积分

    管理员

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-26 07:11 , Processed in 0.074881 second(s), 65 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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