本帖最后由 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 int volatile 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[16];
- u8 TK_OVER =0 ;
- u8 RX1_Cnt; //接收计数
- bit fBusy; //发送忙标志
- u16 TK_CNT_MAX=0,TK_CNT_MIN=0xffff;//按键数据最大最小值
- u16 cp;//定时器计数
- u8 xdata RX1_Buffer[UART1_BUF_LENGTH]; //接收缓冲
- 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[6]);
- if(TK_CNT[tk]>TK_CNT_MAX)TK_CNT_MAX=TK_CNT[tk];
- if(TK_CNT[tk]<TK_CNT_MIN)TK_CNT_MIN=TK_CNT[tk];
- if(TK_CNT[tk]<22000)LED=0;
- else LED=1;
- }
- // if( TK_CNT[0] <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[tk]);
- 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[0]=='T'&& RX1_Buffer[1]=='K')
- tk=(RX1_Buffer[2]-'0')*10+(RX1_Buffer[3]-'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[RX1_Cnt] = 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[j] = 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;
- }
复制代码
测试效果:
|