#include<STC12C5A60S2.h>
#include<stdio.h>
#include<intrins.h>
float wendu1, wendu2, wendu, reliang;
int jishu = 0;
void delayAD(unsigned int a) //延時約1ms
{
unsigned int i;
while (--a != 0)
for (i = 600; i>0; i--); //1T單片機i=600,若是12T單片機i=125
}
void AD_init() //AD初始化
{
P1ASF = 0x18; //P1口全部作為模擬功能AD使用
ADC_RES = 0; //清零轉換結果寄存器高8位
ADC_RESL = 0; //清零轉換結果寄存器低2位
ADC_CONTR = 0x80;//開啟電源
delayAD(2); //等待1ms,讓電源穩定
}
unsigned int AD_get(unsigned char channel)
{
ADC_CONTR = 0x88 | channel; //開啟AD轉換1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0
_nop_(); _nop_(); _nop_(); _nop_();//要經過4個CPU時鐘的延時,其值才能夠保證被設置進ADC_CONTR 寄存器
while (!(ADC_CONTR & 0x10)); //等待轉換完成
ADC_CONTR &= 0xe7; //關閉VF轉換,ADC_FLAG位由軟件清0
return(ADC_RES * 4 + ADC_RESL); //返回轉換完成的10位數據(16進制)
}
float AD_work(unsigned char channel)
{
float AD_val; //定義處理后的數值VF_val為浮點數
unsigned char i;
for (i = 0; i<250; i++)
VF_val += VF_get(channel); //轉換100次求平均值(提高精度)
AD_val /= 250;
AD_val = (AD_val * 5) / 1024; //AD的參考電壓是單片機上的5v,所以乘5即為實際電壓值
return AD_val;
}
void int_0() //中斷初始化
{
IT0 = 1; //set INT0 int type (1:Falling 0:Low level)
EX0 = 1; //enable INT0 interrupt
EA = 1; //open global interrupt switch
}
void serial_init() //串口初始化
{
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd; //設置9600波特率
SCON = 0x50; //串口方式1,允許接收
TR1 = 1;
}
void delay(unsigned int a) //延時約1ms
{
unsigned int i;
while (--a != 0)
for (i = 600; i>0; i--); //1T單片機i=600,若是12T單片機i=125
}
void main()
{
AD_init();
int_0();
serial_init();
while (1)
{
wendu1 = VF_work(1);
wendu2 = VF_work(2);
wendu = wendu1 - wendu2;
reliang = jishu * wendu;
TI = 1; //使用printf函數前須先將發送標志位TI置1
printf("當前熱量為 %f\n",reliang);
TI = 0;
delay(1000); //延時約1s
}
}
void exint0() interrupt 0 //下降沿出發的外部中斷0
{
jishu++;
}
|