搜索
bottom↓
回复: 9

海尔单片机数字IO口测量模拟量的方法与实例

[复制链接]

出0入0汤圆

发表于 2013-3-22 18:44:18 | 显示全部楼层 |阅读模式
通过数字IO口对电容充放电,读取高低电平变化的时间来判断模拟量的值。硬件成本有要求,精度不是很高的情况下可以参考一下。C代码。

/*
项目:数字IO口取ADC值
芯片:HR6P59P2S2HL 内部4M
功能:
热敏电阻与电容(224)并联,再串联100欧电阻到59 PA0
采样一次花时25ms左右
*/

#include <hic.h>

#define uint8 unsigned char
#define uint16 unsigned int
#define bool sbit

static volatile section0 sbit        CHG_PIN                @ (unsigned) &PA * 8 + 0 ;

volatile uint8 t8_ms;
volatile uint8 adcs_ms;
volatile uint8 adcs_value;

volatile uint16 delay;
volatile bool adcs_en;

void Clr_Ram_Asm()
{
        __asm{
        LCALL        0X3FF
        MOVA        CALR
   
        BCC                PSW,RP0
        MOVI        0X10
        MOVA        IAA
CLR_BANK0
        CLR                IAD                        ;清除存储组0的RAM数据
        INC                IAA
        JBS                IAA,5
        JUMP        CLR_BANK0
        MOVI        0X30
        MOVA        IAA
CLR_BANK1
        CLR                IAD                        ;清除存储组1的RAM数据
        INC                IAA
        JBS                IAA,6
        JUMP        CLR_BANK1
        MOVI        0X50
        MOVA        IAA
CLR_BANK2
        CLR                IAD                        ;清除存储组2的RAM数据
        INC                IAA
        JBS                IAA,5
        JUMP        CLR_BANK2
        MOVI        0X70
        MOVA        IAA
CLR_BANK3
        CLR                IAD                        ;清除存储组3的RAM数据
        INC                IAA
        JBS                IAA,7
        JUMP        CLR_BANK3

        CLR                IAA
    };
}

void Init_Config()
{
        __asm{
                MOVI        0XFF
                MOVA        T8
                MOVI        B'00000000'
                OPTION
               
                MOVI        B'11110001'
                TRIS        PA
                MOVI        B'00000000'
                TRIS        PB
        };
        PA = 0B00000000;
        PB = 0B11111111;
       
        INTC0 = 0;
        T8IF = 0;
        T8IE = 1;
        GIE = 1;
}

void io_charge_cap()
{
        t8_ms++;
        if(t8_ms == 240)
        {
                __asm{
                MOVI        B'11110000'
                TRIS        PA
                }
                CHG_PIN = 1;
        }
        else if(t8_ms == 255)
        {
                t8_ms = 0;
                __asm{
                MOVI        B'11110001'
                TRIS        PA
                }
                adcs_en = 1;
        }
}

void cap_discharge_timer()
{
        if(adcs_en == 1)
        {
                adcs_ms++;                        //最大时间25ms
                if(adcs_ms >= 255)
                        adcs_ms = 254;
                if(CHG_PIN == 0)                //电压为1V时认为是低电平
                {
                        adcs_value = adcs_ms;
                        adcs_en = 0;
                }
        }
        else
        {
                adcs_ms = 0;
        }
}


void isr(void) interrupt
{
        if(T8IE&T8IF)
        {
                T8IF = 0;
                T8 += 209;                //4M 100us
               
                //        PA2 = PA2^1;
                io_charge_cap();
                cap_discharge_timer();
        }
        else
        {
                T8IF = 0;
        }
}

void main()
{
        Clr_Ram_Asm();
        Init_Config();
       
        while(1)
        {
                __Asm CWDT;
                delay++;
                if(delay==10000)
                {
                        delay = 0;
                        PB = adcs_value;
                }
        }
}

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2013-3-23 16:23:59 | 显示全部楼层
这个帖子对产品成本敏感的项目很有借鉴价值。虽然好多老的工程师都已经了解这应用,
但是对于新入门的工程师和客户是很有帮助的,我经常遇到客户提出想了解这样的应用的具体实施方法。
多谢 楼主!

出0入0汤圆

发表于 2013-3-23 22:04:52 | 显示全部楼层
,盼望能上汇编的案例!不胜感激!

出0入0汤圆

发表于 2013-6-14 10:09:27 | 显示全部楼层
請問這個時 SIGMA-DELTA ADC 的軟件算法嗎

出0入0汤圆

发表于 2013-6-14 22:02:48 | 显示全部楼层
多谢 楼主!

出0入0汤圆

发表于 2014-2-20 20:50:26 | 显示全部楼层
记号。有用

出0入0汤圆

发表于 2014-2-20 21:09:41 | 显示全部楼层
海尔_小海 发表于 2013-3-23 16:23
这个帖子对产品成本敏感的项目很有借鉴价值。虽然好多老的工程师都已经了解这应用,
但是对于新入门的工程 ...

经常遇到客户提出想了解这样的应用的具体实施方法。。。。可能是因为手册写得有点那个

出0入0汤圆

发表于 2014-2-20 22:14:38 | 显示全部楼层
还有汇编啊

出0入0汤圆

发表于 2014-4-9 10:53:52 | 显示全部楼层
xiaolaba 发表于 2013-6-14 10:09
請問這個時 SIGMA-DELTA ADC 的軟件算法嗎

这个不是 SIGMA-DELTA ADC 的软件算法

出0入0汤圆

发表于 2014-11-13 21:44:57 | 显示全部楼层
不错,挺好!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-29 21:53

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

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