搜索
bottom↓
回复: 2

c8051f120片上温度传感器实用的问题

[复制链接]

出0入0汤圆

发表于 2013-6-18 23:20:47 | 显示全部楼层 |阅读模式
//内部温度传感器调试程序//
//ADC0_TEMP.c
#include <C8051F040.h>
#define ADC0START temppage=SFRPAGE;SFRPAGE=0x00;AD0BUSY=1;SFRPAGE=temppage
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;
sfr16 RCAP2=0xca;
sfr16 RCAP3=0xca;
sfr16 RCAP4=0xca;
sfr16 TMR4=0xcc;
sfr16 TMR3=0xcc;
sfr16 TMR2=0xcc;
sfr16 PCA0CP0=0xfb;
sfr16 PCA0CP1=0xfd;
sfr16 PCA0CP2=0xe9;
sfr16 PCA0CP3=0xeb;
sfr16 PCA0CP4=0xed;
sfr16 PCA0CP5=0xe1;
sfr16 ADC0VAL=0xbe;
sfr16 ADC0GT=0xc4;
sfr16 ADC0LT=0xc6;
uchar temppage;
bit isnewdata;
uint kk;
float temp;
xdata float t[20];//存放温度检测数据,为20个数据
void adc0_mux(uchar type,uchar source);
void adc0_source(uchar source);
void p3anolog_ini(uchar port);
void HVDA_ini(uchar gaind);
void adc0_ini();
void delay1ms(uint time);
void config();
void adc0_mux(uchar type,uchar source){//type 配置测量方式为差动还是单端输入
//source 为ADC0通道选择(共有9个通道)
        SFRPAGE=0x00;
        AMX0CF=type;
        AMX0SL=source;
}
void adc0_source(uchar source){//ADC0通道选择,为adc0_mux()的简化函数
        SFRPAGE=0x00;
        AMX0SL=source;
}
void p3anolog_ini(uchar port){//配置p3口模拟输入管脚
        SFRPAGE=0x00;
        AMX0PRT=port;
        SFRPAGE=0x0f;
        P3MDIN&=~port;//将相应管脚配置成模拟输入口
}
void HVDA_ini(uchar gaind){//高压差动放大器配置
        SFRPAGE=0x00;
        HVA0CN=gaind;
}
void adc0_ini(){
        SFRPAGE=0x00;
        ADC0CF=0x80;//ADC0时钟为系统时钟17分频,PGA增益为1
        ADC0CN=0x80;
        /*AD0EN=1,ADC0模块使能
        AD0TM=0,ADC0为连续跟踪模式
        AD0CM1:AD0CM0=00b,为AD0BUSY启动方式
        AD0LJST=0,数据存储格式右对齐,即ADC0H存放12bit高四位*/
        REF0CN&=0x0f;//AD0VRS=0,ADC0参考电压为VREFA
        REF0CN|=0x07;//TEMPE=1,内部温度传感器工作
        /*BIASE=1,偏移产生器工作
        REFBE=1,内部参考电平工作,电路部分须将VREF参考输出(C8051F40的第12管脚)与VREF0(C8051F040的16管脚相连,并最好并联一个4.7uF和0.1uF的旁路电容以电平滤波*/
        adc0_source(9);//选择第9通道,即选择温度信号为AD转换
        EIE2 |= 0x02;        //开ADC0中断
}
void delay1ms(uint time){//延迟1ms
        uint i;
        uint j;
        for (i=0;i<time;i++){
                for(j=0;j<300;j++);
        }
}        
void config(){
//看门狗禁止
        WDTCN = 0x07;        
    WDTCN = 0xDE;   
           WDTCN = 0xAD;
        SFRPAGE = 0x0F;
//交叉开关使能,但没有进行外围设备配置
        XBR0 = 0x00;        
        XBR1 = 0x00;        
        XBR2 = 0x40;
        XBR3 = 0x00;   
//管脚输出配置,P0口为开漏输出,其中P0.6接上拉电阻,P0为数字输入口
        SFRPAGE = 0x0F;
        P0MDOUT = 0x00;
        P1MDIN = 0xFF;  
//晶振配置,采用内部晶振8分频
        SFRPAGE = 0x0F;
        CLKSEL = 0x00;  
        OSCXCN = 0x00;        
        OSCICN = 0x84;        
}
void main(){
        char i;
        config();
        adc0_ini();//ADC0初始化
        ADC0START;//ADC0启动
        EA=1;
        i=0;
        while(1){
AD0BUSY=1;
                if(isnewdata){//由该位查询ADC0转化值是否更新
                        kk=ADC0H*256;
                        kk+=ADC0L;//可用sfr16一次性读取
                        temp=(float)kk/4096.0;
                        temp*=2.43;
                        temp-=0.776;
                        temp/=0.00286;//将测量值转化成真实温度值
                        isnewdata=0;
                        t[i]=temp;//将温度检测值存入长度为20的数组中
                        i++;
                        if(i>19)
                                i=0;//在此设断点,观察程序运行结果
                        delay1ms(100);
                        ADC0START;
                }
        }
}
void ADC0_ISR() interrupt 15{//ADC0中断
        SFRPAGE=0x00;
        AD0INT=0;
        isnewdata=1;
        
}
执行程序后,不管温度变化,ADC0H和ADC0L始终等于0XFF和0X0F,测出的温度始终不变,为什么这样呢?也不知道ADC0H和ADC0L的值正确不?

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出70入0汤圆

发表于 2013-6-19 11:04:39 | 显示全部楼层
本帖最后由 绿茶山人 于 2013-6-19 11:08 编辑

你用的哪一个定时器溢出启动ADC0?!

出0入0汤圆

 楼主| 发表于 2013-6-19 14:44:22 | 显示全部楼层
我采用的是ADC0中断的方式。我参照的是C8051F040片上温度传感器的例子,C8051F系列单片机片上温度传感器采样的程序一致。在采样该程序调试的时候,进入void ADC0_ISR() interrupt 15
{//ADC0中断
        SFRPAGE=0x00;
        AD0INT=0;
        isnewdata=1;
        
}
中断函数时,SFRPAGE都等于0x00。在中断外SFRPAGE都不等于0x00。可是,为什么ADC0H和ADC0L始终等于0XFF和0X0F?是不是与硬件有关?是不是单个C8051F120就可以实现片上温度传感器采样啊?谢谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 09:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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