找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC15W402AS做电压表,电源电压变化时显示电压间隔0.2V显示,如12.2直接跳到12.4,没12.3

[复制链接]
跳转到指定楼层
楼主
ID:116109 发表于 2016-4-23 15:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
10黑币
/**********************************************************************
*函 数 名: read_adc()
*函数功能: 读8位ADC结果
*其    它:
**********************************************************************/
unsigned char read_adc(){                                //AD转换函数,返回8位结果

        unsigned char ad_flg = 0;                        //存储AD转换标志
        WDT_CONTR = 0X3C;                                        //喂狗
        ADC_CONTR = adc_chan;                                //开ADC电源并置转换通道
        Delay1ms(1);
        ADC_CONTR = ADC_CONTR | 0x08;                //开启ADC转换
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        while(ad_flg == 0){                                        //等待AD转换结束
                WDT_CONTR = 0X3C;                                //喂狗
                ad_flg = (ADC_CONTR & 0X10);
        }
        ADC_CONTR &= 0xe7;                                        //停ADC转换,清ADC_FLAG
        return (ADC_RES);
}

/**********************************************************************
*函 数 名: vol_conver()
*函数功能: 检测电压AD值并转为电压显示数字
*其    它:
**********************************************************************/
void vol_conver(){                                //将测得的电压四次平均按分压比换算成十进制的电压数
        unsigned char i, j, temp;
        unsigned char buf[AD_TIMES];
        WDT_CONTR = 0X3C;                        //喂狗
        adc_chan = ADC_V;                        //电压通道

        for(i=0;i<AD_TIMES;i++){                //采样AD_TIMES次
                  buf[i]=read_adc();
        }
        for(i=0;i<AD_TIMES-1; i++){
                for(j=i+1;j<AD_TIMES;j++){
                        if(buf[i]>buf[j]){                //升序排列
                                temp=buf[i];
                                buf[i]=buf[j];
                                buf[j]=temp;
                        }
                }
        }
        value_v=0;
        for(i=2;i<AD_TIMES-2;i++)value_v+=buf[i];
        value_v >>= 3;
        value_v *= 13;                                //data*3.3/256*1000 单位mV
        value_v <<=4;                                //乘16倍电阻分压比

        dis_done = 0;
        v_10=value_v/10000;                                                        //10V
        v_1=(value_v-v_10*10000)/1000;                                //1V
        v_01=(value_v-v_10*10000-v_1*1000)/100;                //0.1V
        dis_done = 1;
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:188031 发表于 2017-7-15 10:49 | 只看该作者
能用吗?源程序,仿真有没
回复

使用道具 举报

板凳
ID:249808 发表于 2018-5-4 10:30 | 只看该作者
你这个最好有个仿真电路别人才能容易分析……
回复

使用道具 举报

地板
ID:213173 发表于 2018-5-4 13:13 | 只看该作者
使用12位ADC转换,提高转换精度,每隔2ms采一次样,10次为一个计算周期,可以有效减小无所不在的50Hz共/差模干扰造成的影响,计算时末位+5以得到四舍五入结果。
回复

使用道具 举报

5#
ID:126608 发表于 2018-5-4 13:31 | 只看该作者
10位AD的片子,不要做成99.9v的,做成30.0v的就没问题.精度受限,STC新出的12位AD的片子能解决这个
问题。
回复

使用道具 举报

6#
ID:12041 发表于 2018-5-17 15:49 | 只看该作者
楼上说的对,新款单片机是STC8A系列的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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