作者共發了1篇帖子。 內容轉換:不轉換▼
 
點擊 回復
424 0
今天晚上写的PCF8591的AD转换程序
一派護法 十九級
1樓 發表于:2017-3-10 22:16
int fputc(int ch, FILE *fp)
{
    if (fp == &__stdout)
        LCD1602_WriteData(ch);
    return ch;
}

uint8_t PCF8591_ADC(void)
{
    uint8_t temp;
    I2C1->CR1 |= I2C_CR1_START; // 开始信号
    while ((I2C1->SR1 & I2C_SR1_SB) == 0);
    I2C1->DR = 0x90; // 地址码(写)
    while ((I2C1->SR1 & I2C_SR1_ADDR) == 0); // PB6~7必须接外部上拉电阻, 否则程序会卡死在这里
    temp = I2C1->SR2; // 读SR2, 清ADDR
    I2C1->DR = 0x04; // 四路单输入, 通道0, 自动增益
    while ((I2C1->SR1 & I2C_SR1_TXE) == 0);
   
    I2C1->CR1 |= I2C_CR1_START; // 重新发送开始信号
    while ((I2C1->SR1 & I2C_SR1_SB) == 0);
    I2C1->DR = 0x91; // 地址码(读)
    while ((I2C1->SR1 & I2C_SR1_ADDR) == 0);
    temp = I2C1->SR2; // 读SR2, 清ADDR
   
    while ((I2C1->SR1 & I2C_SR1_RXNE) == 0);
    temp = I2C1->DR;
    I2C1->CR1 |= I2C_CR1_STOP; // 停止信号
    while (I2C1->CR1 & I2C_CR1_STOP);
    return temp;
}

int main(void)
{
    uint8_t value;
    RCC->APB1ENR = RCC_APB1ENR_DACEN | RCC_APB1ENR_I2C1EN;
    RCC->APB2ENR = RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN;
   
    GPIOA->CRL = 0x00000333;
    GPIOB->CRL = 0xff000000; // PB6~7设为复用开漏50MHz输出
    GPIOC->CRL = 0x33333333;
   
    I2C1->CR2 = 36; // FREQ=100100(36MHz)
    I2C1->CCR = 90; // CCR=FREQ/2f, f=200kHz
    I2C1->CR1 = I2C_CR1_PE; // 启动总线
   
    LCD1602_Init();
    while (1)
    {
        value = PCF8591_ADC();
        LCD1602_WriteCmd(0x80);
        printf("Value:%d    ", value);
        delay2();
    }
}

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:424 回複數:0
評論數: ?
作者:巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2017-3-10 22:16
 
©2010-2024 Arslanbar Ver2.0
除非另有聲明,本站採用共享創意姓名標示-相同方式分享 3.0 Unported許可協議進行許可。