首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

單片機熱敏電阻測溫顯示數碼管(PCF8591 + 51單片機)

     編輯:關於C++

一、硬件連接

  • PCF8591 (ADC/DAC) 接 51 單片機 P2.0 (SCL)、P2.1 (SDA) 模擬 I²C
  • 熱敏電阻接 PCF8591 AIN1 (腳位 14),上拉電阻 10k
  • 數碼管共陽極,段碼 P0、位選 P2.6/P2.7
  • 蜂鳴器 P1.4 報警

二、PCF8591 控制流程

  1. 發送地址字節 (0x90 寫 / 0x91 讀)
  2. 發送控制字節:選擇通道 (0x41 選 AIN1)
  3. 重發地址字節 (讀模式)
  4. 讀取數據字節

三、溫度換算

ADC 值 0~255 對應電壓 0~Vref。熱敏電阻阻值隨溫度非線性變化,簡化為線性近似:溫度 ≈ 151 - ADC值(需實測標定)。

四、完整代碼 (C51)

#include 
#define uchar unsigned char
#define uint unsigned int
#define PCF8591 0x90

sbit SCL = P2^0;
sbit SDA = P2^1;
sbit SPK = P1^4;
sbit WEI = P2^7;
sbit DUAN = P2^6;

uchar code dofly_DuanMa[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
uchar code dofly_WeiMa[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

void delay(int z) { while(z--); }
void delay_1ms(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }

void Screen(int pos, int val) {
    P0=0; DUAN=1; DUAN=0;
    P0=dofly_WeiMa[pos]; WEI=1; WEI=0;
    P0=dofly_DuanMa[val]; DUAN=1; DUAN=0;
    delay(250);
}

void Get_out_print(uchar temp) {
    if(temp/100>0) { Screen(3,temp/100); temp%=100; }
    if(temp/10>0)  { Screen(4,temp/10); }
    Screen(5,temp%10);
    Screen(7,12); // 顯示 'C'
}

void start() { SDA=1; delay(); SCL=1; delay(); SDA=0; delay(); }
void stop()  { SDA=0; delay(); SCL=1; delay(); SDA=1; delay(); }
void respons() { uchar i; SCL=1; delay(); while((SDA==1)&&(i<250)) i++; SCL=0; delay(); }
void init() { SDA=1; delay(); SCL=1; delay(); }

uchar read_byte() {
    uchar i,k=0; SCL=0; delay(); SDA=1; delay();
    for(i=0;i<8;i++) { SCL=1; delay(); k=(k<<1)|SDA; SCL=0; delay(); }
    return k;
}
void write_byte(uchar dat) {
    uchar i; for(i=0;i<8;i++) { SCL=0; delay(); SDA=CY; delay(); SCL=1; delay(); dat<<=1; }
    SCL=0; delay(); SDA=1; delay();
}
void write_add(uchar ctrl, uchar dat) {
    start(); write_byte(PCF8591); respons();
    write_byte(ctrl); respons(); write_byte(dat); respons(); stop();
}
uchar read_add(uchar ctrl) {
    uchar dat; start(); write_byte(PCF8591); respons();
    write_byte(ctrl); respons(); start(); write_byte(PCF8591|1); respons();
    dat=read_byte(); stop(); return dat;
}

uchar temperatureNum=0;
void main() {
    TMOD=0x01; EA=1; ET0=1; TR0=1; // 定時器0 中斷 1ms 掃描數碼管
    init();
    while(1) {
        temperatureNum = read_add(0x41); // 讀 AIN1
        Get_out_print(151 - temperatureNum);
    }
}
void Timer0_isr(void) interrupt 1 {
    TH0=0xFE; TL0=0;
    if(temperatureNum < 118) SPK = !SPK; // 低溫報警
}

五、注意事項

  • I²C 時序需嚴格遵守啟動/停止/應答
  • 數碼管動態掃描用定時器中斷
  • 溫度公式需根據熱敏電阻 B 值、分壓電阻實測標定
  • 代碼為教學示例,工程應用需加濾波、抗干擾
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved