22624|10

81

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于STC12C5A60S2的AD基准电压怎么设置? [复制链接]

手册上面说在P1.7口接一个1.25V的电压,然后可以计算出其他口的电压,不怎么明白

最新回复

学习学习   详情 回复 发表于 2016-3-14 19:58
点赞 关注

回复
举报

68

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
该芯片内部没有基准电压源,所以在精确应用时需要通过对外接的基准电压的测量换算得到。
设P1.7口接一个1.25V的基准电压,待测电压接在P1.3口,P1.7口AD后的值为VP17,P1.3口AD后的值为VP13,则P1.3口实际值为:
         VP13
   V = ------ × 1.25 (V)
        VP17
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
V= (VP13×1.25)/VP17
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

4
 
1.    P1.7是厂家规定做基准电压?其他口都不行?
2.    待测电压接在P1.3口,P1.7口AD后的值为VP17,P1.3口AD后的值为VP13,P1.7口怎么还有AD后的值啊?是用P1.3做输入口的啊?
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

5
 
就是你向P1口的任意两个引脚分别接入两个电压信号,其中一个是已知的1.25V(上文中假定从P1.7接入),另一个是待测电压(上文中假定从P1.3接入)。
AD后是指你通过单片机A/D转换后得到的那个数值。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
补充一下楼上的,现在的问题是作为模拟参考电压的VCC不是很精确,可以在某模拟端口接入一电压值精确的不变的输入电压,用来作为模拟参考电压。

由ADC_RES[7:0] = 256*VIN/Vcc                                   ----(1)
=> Vcc=256*VIN_x/ADC_RES_x                                     ----(2)
=> VIN_x = Vcc * ADC_RES_x /256                                ----(3)

对P1.7口, ADC_RES_ref = 256*1250mV/VCC                         ----(4)
ADC_RES_ref  通过CPU可以读出, VCC可以求出
=> Vcc=256*1250mV/ADC_RES[7:0]_ref
代入(3)即可求出VIN_x

VIN_x = 256*1250mV/ADC_RES[7:0]_ref * ADC_RES_x /256
VIN_x = 1250mV * ADC_RES_x/ ADC_RES[7:0]_ref                   ----(5)

很显然读出参考通道的AD转化值和待测通道的AD值, 由(5)就可以得到待测通道的准确电压值。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

7
 
谢谢楼上两位大哥
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

8
 

STC12C5A60S2单片机电压表采集问题?

请问:

    有谁用过STC12C5A60S2单片机的内部的ad转换模块,我在网上弄了个一路通道的程序,可是我要采集两路的电压,然后对两个数据进行比较,得出最大的值,然后到单片机中进行处理,最后显示出来。

     可是我不知道在选通一个ad通道后,得到数据。然后在采集第二个通道的数据。请各位前辈帮忙指点指点。谢谢!

    下面是通过lcd1602实现的。









#include
#include

//接口定义   
//1602的数据接口为P0      
sbit RSPIN = P2^0;
sbit RWPIN = P2^1;
sbit EPIN =  P2^2;

unsigned char xdata shuzi[]={'0','1','2','3','4','5','6','7','8','9'};


///////////    延时函数/////////////////////////
void delay(unsigned int  t)  //毫秒延时(用在延时不需很精确地情况下)
{  unsigned int xdata j;
   while(--t){
   for(j=600;j>0;j--);}
}

//下面的是1602的驱动   
void testbusy(void)//判忙   
{  
   P0=0xff;
   RSPIN=0;
   RWPIN=1;
  _nop_();  
  _nop_();
   EPIN=1;
   while((P0&0x80)==0x80);
   EPIN=0;
}

void lcdcmd(unsigned char c) //写入命令字符的底层操作         
{  
   RSPIN=0;
   RWPIN=0;
   P0=c;
  _nop_();  
  _nop_();
   EPIN=1;
   _nop_();
   _nop_();
   EPIN=0;
}

void inputcmd(unsigned char c)  //写入名令字符的底层函数        
{
   testbusy();
   //delay(5);
   lcdcmd(c);
}

void lcdwd(unsigned char d)  //写入数据字符的底层函数
{  testbusy();
  // delay(5);
   RSPIN=1;
   RWPIN=0;
   P0=d;
  _nop_();
   _nop_();
   EPIN=1;
   _nop_();
    _nop_();
   EPIN=0;
}

void add (signed char x,signed char y)//确定字符的显示位置            
{
signed char xdata a;
switch(x)
{
case 1:
  a=y;
  break;
case 2:
  a=0x40+y;
  break;
}
a+=0x80;
inputcmd(a);
}
void lcdreset()          //液晶屏初始化        
{
   delay(50);
   inputcmd(0x38);          //0011 1000  四位总线  双行显示  5*7         
   inputcmd(0x38);              
   inputcmd(0x08);               //0000 1000   关显示 关光标  光标不闪
   inputcmd(0x01);               //0000 0001   清屏         
   inputcmd(0x06);               //0000 0110   光标右移  文字不移         
   inputcmd(0x0c);               //0000 1100   开显示 关光标  光标不闪
}
//上面的1602驱动*********************************************************

//此函数用于显示屏幕上固定不变的字符
void _char()
{
    add(1,0);     //确定字符的显示位置        
   lcdwd('V');
   lcdwd('1');
   lcdwd('=');
   add(2,0);
   lcdwd('V');
   lcdwd('2');
   lcdwd('=');
}
//下面的也是我从杜洋工作室的网站上下载的stc12c5a60s2的ad转换有关的函数                  
/*********************************************************************************************
函数名:10位A/D转换初始化函数
调  用:Read_init (?)     
参  数:输入的端口(0000 0XXX 其中XXX是设置输入端口号,可用十进制0~7表示,0表示P1.0,7表示P1.7)
返回值:无   
结  果:开启ADC功能并设置ADC的输入端口           
备  注:适用于STC12C5A60S2系列单片机(必须使用STC12C5A60S2.h头文件)               
/**********************************************************************************************/
void ADC_init (unsigned char  CHA   )            //CHA选择转换通道   
{  

    CHA &= 0x07;            //选择ADC的8个接口中的一个(0000 0111 清0高5位)                  
    ADC_CONTR = 0x40;                //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
    _nop_();
     _nop_();
    ADC_CONTR |= CHA;       //选择A/D当前通道   
    _nop_();
     P1ASF=0x01;      //选择A/D当前通道     
    _nop_();
    ADC_CONTR |= 0x80;      //启动A/D电源      
    delay(1);            //使输入电压达到稳定(1ms即可)      
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:10位A/D转换函数
调  用:ADC_Read ();
参  数:无     
返回值:无(10位ADC数据高8位存放在ADC_RES中,低2位存放在ADC_RESL中)
结  果:读出指定ADC接口的A/D转换值,并返回数值
备  注:适用于STC12C5A60S2系列单片机(必须使用STC12C5A60S2.h头文件)
/**********************************************************************************************/
void ADC_Read (void){

    unsigned char xdata AD_FIN=0; //存储A/D转换标志           
    ADC_CONTR |= 0x08;      //启动A/D转换(0000 1000 令ADCS = 1)      
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    while (AD_FIN ==0){     //等待A/D转换结束     
    AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否      
    }
    ADC_CONTR &= 0xE7;      //1111 0111 清ADC_FLAG位, 关闭A/D转换,
}
/**********************************************************************************************/

void main ()  //主函数   
{  
  
   unsigned long int v1;   
   
   EPIN=0;       //1602能使端的初始状态   
   _nop_();  
   _nop_();
   _nop_();
   lcdreset();   //液晶屏初始化   
   ADC_init(0);  //AD转化初始化  选择通道P1^0      
   inputcmd(0x01);   //0000 0001   清屏         
   _char();              //确定要显示的固定不变的显示字符         

while(1)
   {
    delay(500); //读取延时 (此处延时是因为读取电压的速度太快)
   ADC_Read();    //AD转换启动函数           
   _nop_();
   _nop_();
  _nop_();

   v1=ADC_RES*50000/256;   //计算转换结果   
   add(1,3);     //电压数值字符显示开始地址         

   lcdwd(shuzi[(v1/10000)]);  //提取万位
   v1=v1%10000;   // 求余除掉万位
     lcdwd('.');  //一下的数值为小数点后面的数字
   lcdwd(shuzi[(v1/1000)]);   //提取千位
  v1=v1%1000;    //求余去掉千位
   lcdwd(shuzi[(v1/100)]);    //提取百位
  v1=v1%100;     //求余去掉百位
   lcdwd(shuzi[(v1/10)]);     //提取十位
  v1=v1%10;     //求余去掉十位
   lcdwd(shuzi[v1]);
   lcdwd('v');
  }  
   
}
 
 
 

回复

176

帖子

0

TA的资源

一粒金砂(中级)

9
 
整好需要这个,学习一下,谢谢
 
 
 

回复

98

帖子

0

TA的资源

一粒金砂(中级)

10
 
恩,不错的,学习学习
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

11
 
学习学习
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表