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;
}
测试效果:
串口绘图,还没用起来 ?
这有 串口绘图 视频讲解
视频讲解:串口助手高级应用、串口绘图功能、STC8库函数|串口库函数功能介绍 - 串行口,DMA支持的4组串口,RS232,RS485 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
神农鼎 发表于 2024-1-3 12:49
串口绘图,还没用起来 ?
用了,昨天下午弄了好久都没有出来,昨晚弄了,出来了,但觉得用起来不习惯。 多用几次就爱上他了 神农鼎 发表于 2024-1-3 14:02
多用几次就爱上他了
我暂时还是喜欢数据直读。 是并行的,不冲突 搭车问,这颗芯片,设置仿真时要选哪个型号,没找到这个型号. STC8H1K08T 可以仿真,STC8H1K17T 不可以仿真
页:
[1]