#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++;
}
|