ADC 值 0~255 對應電壓 0~Vref。熱敏電阻阻值隨溫度非線性變化,簡化為線性近似:溫度 ≈ 151 - ADC值(需實測標定)。
#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; // 低溫報警
}