xxkj2010 发表于 2024-1-3 10:30:04

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

本帖最后由 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/
*/
主程序:
#include "stc8h.h"
#include "intrins.h"
#include "stdio.h"
typedef   unsigned char   u8;
typedef   unsigned int    u16;
typedef   unsigned long   u32;

#define    MAIN_Fosc       11059200L   //定义主时钟(精确计算115200波特率)
#define   Baudrate1         115200L
#define   UART1_BUF_LENGTH    64
#define   LED    P54
#define    TSCHEN   (*(unsigned intvolatile xdata *)0xfb40)        /* 触摸按键使能寄存器 */       
#define   TK8    1
#define   TK9    1<<1
#define   TK10    1<<2
#define   TK11    1<<3
#define   TK12    1<<4
#define   TK13    1<<5
#define   TK14    1<<6
#define   TK15    1<<7
#define   TK0    1<<8
#define   TK1    1<<9
#define   TK2    1<<10
#define   TK3    1<<11
#define   TK4    1<<12
#define   TK5    1<<13
#define   TK6    1<<14
#define   TK7    1<<15


/********************以下四项用户可根据需要自行设置!!****************************************/
u8 TK_MAX =7 ;//使用的通道最大值,如启用TK3、TK6、TK7,则最大值就是7
u8 tk =6 ;//通电后初始获取数据的触摸通道
#define set_TSCHEN() TSCHEN= TK3|TK6|TK7;//需要用到的触摸通道使能!!//        TSCHEN=0xffff;
#define set_PinMode() P1M0 = 0x00,P1M1 = 0xff;


u16 TK_CNT;
u8 TK_OVER =0 ;
u8RX1_Cnt;    //接收计数
bit fBusy; //发送忙标志
u16 TK_CNT_MAX=0,TK_CNT_MIN=0xffff;//按键数据最大最小值
u16 cp;//定时器计数
u8xdata RX1_Buffer; //接收缓冲
void UART1_config(u8 brt);    // UART1初始化函数: 1---使用Timer1做波特率   2---使用Timer2做波特率
               
void main(void)
{
        P_SW2 |= 0X80;
        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0x66;                                //设置定时初始值
        TH0 = 0xFC;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
       
        UART1_config(2);    // UART1初始化函数: 1---使用Timer1做波特率   2---使用Timer2做波特率
   set_PinMode();//开启触摸的引脚需要设置为高阻输入模式!!
                P5M0 = 0x00; P5M1 = 0x0f;
                LED=0;

        set_TSCHEN();//需要用到的触摸通道使能!!
       
        //设置触摸按键的开关频率,参考电压和放电时间
        TSCFG1= (7<<4) + 3;                        //工作频率设为最低,        时钟为1000个系统时钟       
        TSCFG2= 2;                                        //设置参考点
       
        TSCTRL = 0Xa0 ;//开启触摸       
        IE2 |= 0X80;//开启触摸中断并保存数据
        EA = 1;
       
        while(1)
        {                       
                if( TK_OVER==1 )                                //一轮采集完成
                {
                        TK_OVER = 0;
//                        SEND_U16(TK_CNT);
                        if(TK_CNT>TK_CNT_MAX)TK_CNT_MAX=TK_CNT;
                        if(TK_CNT<TK_CNT_MIN)TK_CNT_MIN=TK_CNT;
                        if(TK_CNT<22000)LED=0;
                        else LED=1;
                }
//                if( TK_CNT <7000)                        //触摸按键0按下       
//                        COM7_DA_H = 0x80;
//                else                                                        //松开
//                        COM7_DA_H = 0x00;
               
                if(cp>1000)
                {
                        printf("TK%d_CNT:%d\r\n",(u16)tk,TK_CNT);
                        printf("TK_CNT_MAX:%d\r\n",TK_CNT_MAX);
                        printf("TK_CNT_MIN:%d\r\n",TK_CNT_MIN);
                        TK_CNT_MAX=0;TK_CNT_MIN=0xffff;
                        cp=0;
                }
                if(RX1_Cnt>3)
                {
                        if(RX1_Buffer=='T'&& RX1_Buffer=='K')
                                tk=(RX1_Buffer-'0')*10+(RX1_Buffer-'0');
                        RX1_Cnt=0;       
                        printf("Data comes from channels:%d\r\n",(u16)tk);       
                }
        }
               
}

void UART1_config(u8 brt)    // UART1初始化函数: 1---使用Timer1做波特率   2---使用Timer2做波特率,
{
        u16 dat;
        dat=65536UL - (MAIN_Fosc / 4) / Baudrate1;
    /*********** 波特率使用定时器2 *****************/       
    if(brt == 2)
    {
      AUXR |= 0x01;       //S1 BRT Use Timer2;                             
                           AUXR &= ~(1<<4);    //Timer stop
                                AUXR &= ~(1<<3);    //Timer2 set As Timer
                                AUXR |=(1<<2);    //Timer2 set as 1T mode
                                T2H = dat / 256;
                                T2L = dat % 256;
                                IE2&= ~(1<<2);    //禁止中断
                                AUXR |=(1<<4);    //Timer run enable                       
    }

    /*********** 波特率使用定时器1 *****************/
    else
    {
      TR1 = 0;
      AUXR &= ~0x01;      //S1 BRT Use Timer1;
      AUXR |=(1<<6);    //Timer1 set as 1T mode
      TMOD &= ~(1<<6);    //Timer1 set As Timer
      TMOD &= ~0x30;      //Timer1_16bitAutoReload;
                                T2H = dat / 256;
                                T2L = dat % 256;
      ET1 = 0;    //禁止中断
      INTCLKO &= ~0x02;   //不输出时钟
      TR1= 1;
    }
    /*************************************************/

    SCON = (SCON & 0x3f) | 0x40;    //UART1模式, 0x00: 同步移位输出, 0x40: 8位数据,可变波特率, 0x80: 9位数据,固定波特率, 0xc0: 9位数据,可变波特率
//PS= 1;    //高优先级中断
    ES= 1;    //允许中断
    REN = 1;    //允许接收
    P_SW1 &= 0x3f;
    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
//PCON2 |=(1<<4);   //内部短路RXD与TXD, 做中继, ENABLE,DISABLE

    fBusy = 0;
    RX1_Cnt = 0;
}


void UART1_int (void) interrupt 4//UART1中断函数
{
    if(RI)
    {
      RI = 0;
      RX1_Buffer = SBUF;
      if(++RX1_Cnt >= UART1_BUF_LENGTH)   RX1_Cnt = 0;    //防溢出
    }

    if(TI)
    {
      TI = 0;
      fBusy = 0;
    }
}

void TKSU_ISR(void) interrupt 13
{
        u8 j = TSSTA2;                                                //读到的寄存器先保存起来
       
        if( j & 0x40 )                                                //数据溢出中断
        {
                TSSTA2 |= 0x40;
        }
       
        if( j & 0x80 )                                                //一轮采集完成中断
        {
                j &= 0x0f;                                                //获取当前通道号
                TSSTA2 |= 0x80;
               
                TK_CNT =TSDAT;
               
                if( j==TK_MAX )
                        TK_OVER = 1;
        }
}

void Timer0_Isr(void) interrupt 1//1000微秒@11.0592MHz

{
        cp++;       
}


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



测试效果:








神农鼎 发表于 2024-1-3 12:49:20

串口绘图,还没用起来 ?







神农鼎 发表于 2024-1-3 12:52:26

这有 串口绘图 视频讲解




视频讲解:串口助手高级应用、串口绘图功能、STC8库函数|串口库函数功能介绍 - 串行口,DMA支持的4组串口,RS232,RS485 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)


xxkj2010 发表于 2024-1-3 13:22:35

神农鼎 发表于 2024-1-3 12:49
串口绘图,还没用起来 ?

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

神农鼎 发表于 2024-1-3 14:02:03

多用几次就爱上他了

xxkj2010 发表于 2024-1-3 14:16:28

神农鼎 发表于 2024-1-3 14:02
多用几次就爱上他了

我暂时还是喜欢数据直读。

神农鼎 发表于 2024-1-3 15:33:05

是并行的,不冲突

LFB 发表于 2024-1-18 18:10:06

搭车问,这颗芯片,设置仿真时要选哪个型号,没找到这个型号.

神农鼎 发表于 2024-1-18 19:56:38

STC8H1K08T 可以仿真,STC8H1K17T 不可以仿真
页: [1]
查看完整版本: STC8H1K17T-TSSOP20系列实验之四----获取STC8H触摸数值并发送到串口