📄 temperature.c
字号:
#include <REG1210.H>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
// Vref=1.25V, bipolar results give 1.25*2/2^24
#define LSB (1.25/8388608)
#define M0 2586.67098545498
#define C0 -271.7529
#define A1 -1.08436244851484e3
#define B1 2.83158996601634e3
#define C1 -285.1293
#define WINDOWSIZE 16
signed long summer(void);
extern void putspace4(void);
extern void tx_byte(char);
// Print a message
void putstr(char code * data msg)
{
while (*msg != 0) {
tx_byte((unsigned char) *msg);
if( *msg=='\n') tx_byte('\r');
msg++;
}
}
// recursive digit display routine
void prt_digit(unsigned long int i, signed char d) reentrant
{ unsigned long int j; char c;
j=i/10; c=i-j*10; d--;
if (j!=0 || !(d &0x80)) prt_digit(j,d);
if (d==0) tx_byte('.');
tx_byte(c+48);
}
// Display long integer number with sign and decimal
void print(signed long int i, unsigned char d)
{
if (i<0) { tx_byte('-'); i*=-1;}
prt_digit(i,d); putspace4();
}
void main(void)
{
signed long int data sum;
float data window[16]={0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0};
float data adres=0, vt, tc_lin, tc_poly;
unsigned char fill_ptr=1, mod_ptr=0;
T2CON = 0x34; // T2 as baudrate generator
RCAP2 = 65535; // 57600 Baud @ 1.8432MHz
SCON = 0x52; // Async mode 1, 8-bit UART, enable rcvr, TI=1, RI=0
putstr("\x1b[1;33;46m\x1b[2J\x1b[12CTemperature Sensor\n");
PDCON &= 0x0f7; //turn on adc
PASEL=0xff;
ACLK=1; // ACLK = 1.8432MHz/(1+1)= 0.9216MHz
DECIMATION = 0x7ff;
ADCON0 = 0x20; // Vref on 1.25V, Buff off, BOD off, PGA 1
ADMUX=0xff;
ADCON1 = 0x01; // bipolar, auto, self calibration, offset, gain
SSCON=0; // Clear SUMR0~3
SSCON=0xe4; // Set SSCON for ADC 32 summations and div by 32
sum=summer(); // Discard 1st summation result
SSCON=0; // Clear SUMR0~3
SSCON=0xe4; // Set SSCON for ADC 32 summations and div by 32
while(1){
sum=summer();
SSCON=0; // Clear SUMR0~3
SSCON=0xe4; // Set SSCON for ADC 32 summations and div by 32
adres=adres-window[mod_ptr]; // Moving Window of 10 results
window[mod_ptr]=(float) sum;
adres=adres+ window[mod_ptr];
vt=adres/(float)fill_ptr*LSB;
print((signed long int)(vt*1000000),3);
tc_lin=M0*vt + C0;
print((signed long int)(tc_lin*1000),3);
tc_poly=A1*vt*vt + B1*vt +C1;
print((signed long int)(tc_poly*1000),3);
if (fill_ptr==WINDOWSIZE) fill_ptr=WINDOWSIZE; else fill_ptr++;
if (mod_ptr==(WINDOWSIZE-1)) mod_ptr=0; else mod_ptr++;
putstr("\n");
if (RI==1){ // Any key will pause, any key again to start
putstr("Pause....");
RI=0;
while(RI==0) {;}
putstr("Continue\n");
RI=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -