找回密码
 立即注册
查看: 549|回复: 2

看了冲哥教学视频,触摸值成功读取。修改一次发16通道触摸0点键值到串口。

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:313
  • 最近打卡:2025-06-29 11:51:08
已绑定手机

5

主题

56

回帖

128

积分

注册会员

积分
128
发表于 2024-4-8 17:39:22 | 显示全部楼层 |阅读模式

//刚开始看官方的例程包时,感觉头大,没什么经验看不出那跟那;后来搜到冲哥视频,觉得蛮简单的,跟着教学弄就有了初步收获。
//一开始用自己的串口收发,不知道为什么没有数据,后来跟视频用官方例程就收到数据了。
#include "stc8h.h" /*STC8H1K08T调用8H系列单片机文件*///参考了:STC8H实验箱9.6例程包--10-串口1中断模式与电脑收发测试.c
#include "stdio.h"
#define MAIN_Fosc 11059200L //定义主时钟(精确计算115200波特率)
#define Baudrate1 115200L
#define UART1_BUF_LENGTH 64
unsigned char  TX1_Cnt; //发送计数
unsigned char  RX1_Cnt; //接收计数
bit B_TX1_Busy; //发送忙标志
unsigned char  xdata RX1_Buffer[UART1_BUF_LENGTH]; //接收缓冲
unsigned int tk_cnt[16]/*触摸扫描值*/,tk_ldjz[16]/*触摸0点键值*/;unsigned char tk_over=0/*采集状态*/;
/**********延时函数**********/
void delayms(unsigned int j){unsigned int i;for(;j>0;j--){for(i=0;i<150;i++);}}
/**********发送一个字符串**********/
void PrintString1(unsigned char *puts)
{
    for (; *puts != 0;  puts++) //遇到停止符0结束
    {
        SBUF = *puts;
        B_TX1_Busy = 1;
        while(B_TX1_Busy);
    }
}
/**********选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.**********/
void SetTimer2Baudraye(unsigned int dat)
{
    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
}
/**********选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.**********/
void UART1_config(unsigned char brt)   
{
    /*********** 波特率使用定时器2 *****************/
    if(brt == 2)
    {
        AUXR |= 0x01; //S1 BRT Use Timer2;
        SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / Baudrate1);
    }
    /*********** 波特率使用定时器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;
        TH1 = (unsigned char)((65536UL - (MAIN_Fosc / 4) / Baudrate1) / 256);
        TL1 = (unsigned char)((65536UL - (MAIN_Fosc / 4) / Baudrate1) % 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
    B_TX1_Busy = 0;
    TX1_Cnt = 0;
    RX1_Cnt = 0;
}
/**********UART1中断函数**********/
void UART1_int (void) interrupt 4
{
    if(RI)
    {
        RI = 0;
        RX1_Buffer[RX1_Cnt] = SBUF;
        if(++RX1_Cnt >= UART1_BUF_LENGTH)   RX1_Cnt = 0; //防溢出
    }
    if(TI)
    {
        TI = 0;
        B_TX1_Busy = 0;
    }
}
/**********主函数**********/
void main()
{
        char xdata dat[50];unsigned int i;
        P_SW2 |= 0x80; //允许访问XSF
        //1.需要用到的触摸引脚设置为高阻输入
        P1M1 = 0xff;   P1M0 = 0x00; //P1端口设置为高阻
        P3M1 = 0xfc;   P3M0 = 0x00; //P3端口设置为高阻  先不占用串口引脚,要不然收不到数据
        P5M1 = 0x10;   P5M0 = 0x00; //P5端口设置为高阻
        UART1_config(1); // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
//2.配置是否需要同时使用触摸LED指示和触摸检测
  TSRT = 0;//不需要使用LED

//3.需要用到的触摸通道使能
  TSCHEN1= 0xff;
  TSCHEN2= 0xfc;//先不占用串口引脚,要不然收不到数据

//4.设置触摸按键的开关频率,参考电压和放电时间
  TSCFG1= (7<<4) + 3;//工作频率设为最低,时钟为1000个系统时钟
        TSCFG2 = 2;//设置参考点

//5.开启触摸
  TSCTRL = 0xa0;
       
//6.开启触摸中断并保存数据
        IE2|=0x80;       
  EA = 1; //允许总中断
        delayms(100);/*给时间扫描触摸按键*/
        while(tk_over==1)/*等待采集完成*/
  tk_over=0;i=0;                         
                for(i=0; i<16; i++)
        {
                tk_ldjz[i] = tk_cnt[i];//录入0点键值
                sprintf(dat,"TK%d:%u\r\n",i,tk_ldjz[i]);/*字符串格式化命令*/                 
          PrintString1(dat);  //UART1发送字符串               
        }  
                while (1)
  {         
                  if((TX1_Cnt != RX1_Cnt) && (!B_TX1_Busy)) //收到数据, 发送空闲
        {
            SBUF = RX1_Buffer[TX1_Cnt]; //把收到的数据远样返回
            B_TX1_Busy = 1;
            if(++TX1_Cnt >= UART1_BUF_LENGTH)   TX1_Cnt = 0;
        }
        }
}
/**********触摸中断**********/
void        TKSU_ISR(void) interrupt 35
{
        unsigned char j=TSSTA2;//读到的数值先保存起来
        if(j & 0x40)//数据溢出中断
        {
                TSSTA2 |= 0x40;
        }
        if(j & 0x80)//一轮采集完成中断
        {
                j &= 0x0f;//获取当前通道号
                TSSTA2 |= 0x80;//清空采集完成的中断
                tk_cnt[j]=TSDAT;/*保存采集到的数值*/
                if(j==15){tk_over=1;}/*采集完成*/
        }
}
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:112
  • 最近打卡:2025-06-29 00:35:48

741

主题

1万

回帖

1万

积分

管理员

积分
17194
发表于 2024-4-8 17:45:52 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:313
  • 最近打卡:2025-06-29 11:51:08
已绑定手机

5

主题

56

回帖

128

积分

注册会员

积分
128
发表于 2024-4-8 17:47:56 | 显示全部楼层
神*** 发表于 2024-4-8 17:45
https://www.stcaimcu.com/plugin.php?id=x7ree_v:x7ree_v&code_7ree=1&id_7ree=362

一开始我就是看郭老师的,就是修改串口弄不出数据,我这小板板,木有数码管。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-29 17:01 , Processed in 0.140060 second(s), 60 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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