找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 899|回复: 0
打印 上一主题 下一主题
收起左侧

STC12C5A60S2单片机测量流量及温度差的测量

[复制链接]
跳转到指定楼层
楼主
ID:1024008 发表于 2022-5-24 18:44 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

#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++;
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表