找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 39|回复: 1
收起左侧

求CAP1203触摸IC的程序

[复制链接]
ID:1176586 发表于 2026-9-18 10:48 | 显示全部楼层 |阅读模式
请问有没有哪位大佬用过这个IC,我根据手册调试了半天IIC通讯,就是没连接上设备。能否有大佬用过的提供下C51的代码,万分感谢!
回复

使用道具 举报

ID:1175769 发表于 2026-9-18 22:17 | 显示全部楼层
CAP1203是一款3通道电容式触摸传感器控制器,通过I2C接口通信(7位地址0x28)。
由于大多数51单片机(如STC89C52)没有硬件I2C外设,需要使用软件模拟I2C时序。
以下是完整的CAP1203 C51驱动程序:
  1. #include <reg52.h>
  2. #include <intrins.h>


  3. // I2C引脚定义(可根据实际硬件修改)
  4. sbit I2C_SDA = P2^0;
  5. sbit I2C_SCL = P2^1;


  6. // CAP1203寄存器地址定义
  7. #define CAP1203_ADDR        0x28    // 7位I2C地址
  8. #define REG_MAIN_CTRL       0x00
  9. #define REG_SENSOR_INPUTS   0x03
  10. #define REG_SENSITIVITY     0x1F
  11. #define REG_CONFIG          0x20
  12. #define REG_SENSOR_ENABLE   0x21
  13. #define REG_SENSOR_CONFIG   0x22
  14. #define REG_SENSOR_CONFIG2  0x23
  15. #define REG_AVG_SAMPLING    0x24
  16. #define REG_CALIBRATE       0x26
  17. #define REG_INT_ENABLE      0x27
  18. #define REG_REPEAT_ENABLE   0x28


  19. // 延时函数
  20. void delay_us(unsigned int us) {
  21.     while(us--) {
  22.         _nop_();
  23.         _nop_();
  24.         _nop_();
  25.         _nop_();
  26.     }
  27. }


  28. void delay_ms(unsigned int ms) {
  29.     unsigned int i, j;
  30.     for(i = ms; i > 0; i--)
  31.         for(j = 110; j > 0; j--);
  32. }


  33. // I2C起始信号
  34. void I2C_Start() {
  35.     I2C_SDA = 1;
  36.     I2C_SCL = 1;
  37.     delay_us(5);
  38.     I2C_SDA = 0;
  39.     delay_us(5);
  40.     I2C_SCL = 0;
  41. }


  42. // I2C停止信号
  43. void I2C_Stop() {
  44.     I2C_SDA = 0;
  45.     I2C_SCL = 1;
  46.     delay_us(5);
  47.     I2C_SDA = 1;
  48.     delay_us(5);
  49. }


  50. // I2C发送一个字节
  51. bit I2C_SendByte(unsigned char dat) {
  52.     unsigned char i;
  53.     for(i = 0; i < 8; i++) {
  54.         I2C_SDA = dat & 0x80;
  55.         I2C_SCL = 1;
  56.         delay_us(5);
  57.         I2C_SCL = 0;
  58.         dat <<= 1;
  59.     }
  60.     // 读取ACK
  61.     I2C_SDA = 1;
  62.     I2C_SCL = 1;
  63.     delay_us(5);
  64.     bit ack = I2C_SDA;
  65.     I2C_SCL = 0;
  66.     return ack; // 0=ACK, 1=NACK
  67. }


  68. // I2C接收一个字节
  69. unsigned char I2C_ReceiveByte(bit ack) {
  70.     unsigned char i, dat = 0;
  71.     I2C_SDA = 1; // 释放SDA
  72.     for(i = 0; i < 8; i++) {
  73.         dat <<= 1;
  74.         I2C_SCL = 1;
  75.         delay_us(5);
  76.         if(I2C_SDA) dat |= 0x01;
  77.         I2C_SCL = 0;
  78.         delay_us(5);
  79.     }
  80.     // 发送ACK/NACK
  81.     I2C_SDA = ack ? 0 : 1;
  82.     I2C_SCL = 1;
  83.     delay_us(5);
  84.     I2C_SCL = 0;
  85.     I2C_SDA = 1;
  86.     return dat;
  87. }


  88. // 向CAP1203寄存器写入数据
  89. void CAP1203_WriteReg(unsigned char reg, unsigned char dat) {
  90.     I2C_Start();
  91.     I2C_SendByte(CAP1203_ADDR << 1); // 写地址
  92.     I2C_SendByte(reg);
  93.     I2C_SendByte(dat);
  94.     I2C_Stop();
  95. }


  96. // 从CAP1203寄存器读取数据
  97. unsigned char CAP1203_ReadReg(unsigned char reg) {
  98.     unsigned char dat;
  99.     I2C_Start();
  100.     I2C_SendByte(CAP1203_ADDR << 1); // 写地址
  101.     I2C_SendByte(reg);
  102.     I2C_Start(); // 重复起始
  103.     I2C_SendByte((CAP1203_ADDR << 1) | 0x01); // 读地址
  104.     dat = I2C_ReceiveByte(1); // 发送NACK
  105.     I2C_Stop();
  106.     return dat;
  107. }


  108. // CAP1203初始化
  109. void CAP1203_Init() {
  110.     delay_ms(200); // 上电等待200ms
  111.    
  112.     // 设置灵敏度(0x01=高, 0x02=中, 0x03=低)
  113.     CAP1203_WriteReg(REG_SENSITIVITY, 0x02);
  114.    
  115.     // 启用所有3个传感器输入
  116.     CAP1203_WriteReg(REG_SENSOR_ENABLE, 0x07); // bit0,1,2 = CS1,CS2,CS3
  117.    
  118.     // 配置传感器输入(基本模式)
  119.     CAP1203_WriteReg(REG_SENSOR_CONFIG, 0xA4);
  120.    
  121.     // 启用连续扫描模式
  122.     unsigned char config = CAP1203_ReadReg(REG_CONFIG);
  123.     config |= (1 << 4); // bit4: 连续扫描模式
  124.     CAP1203_WriteReg(REG_CONFIG, config);
  125.    
  126.     // 启用中断
  127.     CAP1203_WriteReg(REG_INT_ENABLE, 0xFF);
  128.    
  129.     // 清除主控寄存器,启动正常工作
  130.     CAP1203_WriteReg(REG_MAIN_CTRL, 0x00);
  131.    
  132.     delay_ms(100); // 等待校准完成
  133. }


  134. // 获取触摸状态,返回bit0=CS1, bit1=CS2, bit2=CS3
  135. unsigned char CAP1203_GetTouchStatus() {
  136.     return CAP1203_ReadReg(REG_SENSOR_INPUTS) & 0x07;
  137. }


  138. // 主函数示例
  139. void main() {
  140.     unsigned char touch_status;
  141.    
  142.     CAP1203_Init();
  143.    
  144.     while(1) {
  145.         touch_status = CAP1203_GetTouchStatus();
  146.         
  147.         if(touch_status & 0x01) {
  148.             // CS1被触摸
  149.             P1 = 0xFE; // LED1亮(低电平点亮)
  150.         } else if(touch_status & 0x02) {
  151.             // CS2被触摸
  152.             P1 = 0xFD; // LED2亮
  153.         } else if(touch_status & 0x04) {
  154.             // CS3被触摸
  155.             P1 = 0xFB; // LED3亮
  156.         } else {
  157.             // 无触摸
  158.             P1 = 0xFF; // 所有LED灭
  159.         }
  160.         
  161.         delay_ms(50); // 消抖延时
  162.     }
  163. }
复制代码

硬件连接说明:
CAP1203的SCL引脚 → 51单片机的P2.1
CAP1203的SDA引脚 → 51单片机的P2.0
SCL和SDA线各接4.7kΩ上拉电阻到VCC
CAP1203的VDD接3.3V或5V电源
CAP1203的GND接地
LED接在P1口(低电平点亮)

程序功能:
初始化CAP1203,启用3个触摸通道
循环检测触摸状态
CS1触摸 → LED1亮,CS2触摸 → LED2亮,CS3触摸 → LED3亮

回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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