CAP1203是一款3通道电容式触摸传感器控制器,通过I2C接口通信(7位地址0x28)。
由于大多数51单片机(如STC89C52)没有硬件I2C外设,需要使用软件模拟I2C时序。
以下是完整的CAP1203 C51驱动程序:
- #include <reg52.h>
- #include <intrins.h>
- // I2C引脚定义(可根据实际硬件修改)
- sbit I2C_SDA = P2^0;
- sbit I2C_SCL = P2^1;
- // CAP1203寄存器地址定义
- #define CAP1203_ADDR 0x28 // 7位I2C地址
- #define REG_MAIN_CTRL 0x00
- #define REG_SENSOR_INPUTS 0x03
- #define REG_SENSITIVITY 0x1F
- #define REG_CONFIG 0x20
- #define REG_SENSOR_ENABLE 0x21
- #define REG_SENSOR_CONFIG 0x22
- #define REG_SENSOR_CONFIG2 0x23
- #define REG_AVG_SAMPLING 0x24
- #define REG_CALIBRATE 0x26
- #define REG_INT_ENABLE 0x27
- #define REG_REPEAT_ENABLE 0x28
- // 延时函数
- void delay_us(unsigned int us) {
- while(us--) {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- }
- void delay_ms(unsigned int ms) {
- unsigned int i, j;
- for(i = ms; i > 0; i--)
- for(j = 110; j > 0; j--);
- }
- // I2C起始信号
- void I2C_Start() {
- I2C_SDA = 1;
- I2C_SCL = 1;
- delay_us(5);
- I2C_SDA = 0;
- delay_us(5);
- I2C_SCL = 0;
- }
- // I2C停止信号
- void I2C_Stop() {
- I2C_SDA = 0;
- I2C_SCL = 1;
- delay_us(5);
- I2C_SDA = 1;
- delay_us(5);
- }
- // I2C发送一个字节
- bit I2C_SendByte(unsigned char dat) {
- unsigned char i;
- for(i = 0; i < 8; i++) {
- I2C_SDA = dat & 0x80;
- I2C_SCL = 1;
- delay_us(5);
- I2C_SCL = 0;
- dat <<= 1;
- }
- // 读取ACK
- I2C_SDA = 1;
- I2C_SCL = 1;
- delay_us(5);
- bit ack = I2C_SDA;
- I2C_SCL = 0;
- return ack; // 0=ACK, 1=NACK
- }
- // I2C接收一个字节
- unsigned char I2C_ReceiveByte(bit ack) {
- unsigned char i, dat = 0;
- I2C_SDA = 1; // 释放SDA
- for(i = 0; i < 8; i++) {
- dat <<= 1;
- I2C_SCL = 1;
- delay_us(5);
- if(I2C_SDA) dat |= 0x01;
- I2C_SCL = 0;
- delay_us(5);
- }
- // 发送ACK/NACK
- I2C_SDA = ack ? 0 : 1;
- I2C_SCL = 1;
- delay_us(5);
- I2C_SCL = 0;
- I2C_SDA = 1;
- return dat;
- }
- // 向CAP1203寄存器写入数据
- void CAP1203_WriteReg(unsigned char reg, unsigned char dat) {
- I2C_Start();
- I2C_SendByte(CAP1203_ADDR << 1); // 写地址
- I2C_SendByte(reg);
- I2C_SendByte(dat);
- I2C_Stop();
- }
- // 从CAP1203寄存器读取数据
- unsigned char CAP1203_ReadReg(unsigned char reg) {
- unsigned char dat;
- I2C_Start();
- I2C_SendByte(CAP1203_ADDR << 1); // 写地址
- I2C_SendByte(reg);
- I2C_Start(); // 重复起始
- I2C_SendByte((CAP1203_ADDR << 1) | 0x01); // 读地址
- dat = I2C_ReceiveByte(1); // 发送NACK
- I2C_Stop();
- return dat;
- }
- // CAP1203初始化
- void CAP1203_Init() {
- delay_ms(200); // 上电等待200ms
-
- // 设置灵敏度(0x01=高, 0x02=中, 0x03=低)
- CAP1203_WriteReg(REG_SENSITIVITY, 0x02);
-
- // 启用所有3个传感器输入
- CAP1203_WriteReg(REG_SENSOR_ENABLE, 0x07); // bit0,1,2 = CS1,CS2,CS3
-
- // 配置传感器输入(基本模式)
- CAP1203_WriteReg(REG_SENSOR_CONFIG, 0xA4);
-
- // 启用连续扫描模式
- unsigned char config = CAP1203_ReadReg(REG_CONFIG);
- config |= (1 << 4); // bit4: 连续扫描模式
- CAP1203_WriteReg(REG_CONFIG, config);
-
- // 启用中断
- CAP1203_WriteReg(REG_INT_ENABLE, 0xFF);
-
- // 清除主控寄存器,启动正常工作
- CAP1203_WriteReg(REG_MAIN_CTRL, 0x00);
-
- delay_ms(100); // 等待校准完成
- }
- // 获取触摸状态,返回bit0=CS1, bit1=CS2, bit2=CS3
- unsigned char CAP1203_GetTouchStatus() {
- return CAP1203_ReadReg(REG_SENSOR_INPUTS) & 0x07;
- }
- // 主函数示例
- void main() {
- unsigned char touch_status;
-
- CAP1203_Init();
-
- while(1) {
- touch_status = CAP1203_GetTouchStatus();
-
- if(touch_status & 0x01) {
- // CS1被触摸
- P1 = 0xFE; // LED1亮(低电平点亮)
- } else if(touch_status & 0x02) {
- // CS2被触摸
- P1 = 0xFD; // LED2亮
- } else if(touch_status & 0x04) {
- // CS3被触摸
- P1 = 0xFB; // LED3亮
- } else {
- // 无触摸
- P1 = 0xFF; // 所有LED灭
- }
-
- delay_ms(50); // 消抖延时
- }
- }
复制代码
硬件连接说明:
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亮
|