搜索
bottom↓
回复: 5

这段中颖单片机代码检测12V电压,有什么问题?

[复制链接]

出0入0汤圆

发表于 2020-8-6 12:03:03 | 显示全部楼层 |阅读模式
中颖单片机SHF79F1618,使用内部AD测量12V电压,请大神们看看,程序有什么问题,谢谢。

#include <sh79f1618.h>
#include <intrins.h>
#include <stdio.h>
#include "BINARY.H"
#define VCC 5        //单片机供电电压
unsigned int ADvalue;//存放A/D转换返回的结果
float Vin;           //存放计算出来的外部输入电压
unsigned int AD_Dat=0;   //10位A/D转换值
unsigned char Tmp=0;     //临时变量用于将A/D转换出来的2个字节合成1个字节



void init_mcu (void)
{
        CLKCON=0x0c;  //内部RC12M
        P1CR=B1111_1111;           // 端口输入/输出控制寄存器                0:输入模式                                1:输出模式       
        P1PCR=B0000_0000 ;                // 输入端口内部上拉电阻控制                0:内部上拉电阻关闭                1:内部上拉电阻开启
        P1=B0000_0000 ;
}

void delay_ms()
{
        unsigned int i,j;
        for(i=0;i<400;i++)
                for(j=0;j<450;j++);
}

void init_adc()
{
        unsigned int i;    //用于软件延时程序
        for(i=0;i<10000;i++);//适当延时等待A/D转换供电稳定

        ADT=B1000_0000;          //1.选择tAD=12*tSYS=1us@12MHz 2.选择采样时间为2*tAD
        ADCON=B0000_1110; //1.选择VDD作为内部参考电压 2.选择模拟输入通道AN7(12v)         
        ADCH = B1000_0000;      //设置P3.7为ADC口
        IEN0 |= 0xC0;          //开总中断,开ADC中断
        ADCON |= 0x80;         // 打开ADC模块
        ADCON |= 0x01; // 启动AD转换
}

unsigned long AD_VALUE(void)
{
        unsigned char data Temp;  //判断转换完成
        while(1)
        {
                Temp=ADCON&0x40;
                if(Temp==0x40) break;
                delay_ms();
        }         
        AD_Dat=ADDH;  //默认高字节高8位
        AD_Dat<<=2;   //左移2位给低位
        Tmp=ADDL;            //默认低字节低2位
        Tmp&=0x03;               //屏蔽无关位
        AD_Dat|=Tmp;             //高、低字节拼接成一个10位数
        ADvalue=AD_Dat;
        ADCON &= B1011_1111;    //ADC转换完成中断,清ADCIF
        return         ADvalue;
}         
       
void main()
{
        init_mcu();
        init_adc();
        while(1)
    {
                ADvalue=AD_VALUE();
                Vin=VCC*ADvalue/1024;   
                if((Vin>2.6)&&(Vin<3.2))   //外部分压电路,到达端口约为2.9V(外部12V电压)
                 {
                        P1_0=1;//串接LED显示
                                       
                 }
               
        }
       
       
}

出0入96汤圆

发表于 2020-8-6 17:04:17 | 显示全部楼层
ADCON=B0000_1110; //1.选择VDD作为内部参考电压 2.选择模拟输入通道AN7(12v)   
改成   ADCON=B1000_1110;  最高位置1 打开ADC
给你一个通道0的参考
  1. unsigned int  ad_value;
  2. void adc(void)
  3. {  
  4.   unsigned int  ad_value;
  5. //通道AN0,
  6.   ADCH=0x03;                                    //AD
  7.   ADT=0xe7;                                     //AD时钟等于系统时钟32分频  转换时间320us   
  8.   ADCON=0x80;                                   //打开ADC,AN0,关比较,.3~.1为通道号
  9.   ADCON|=0x01;                                  //开始转换
  10.   while((ADCON&0x81) == 0x81);                  //判断AD转换是否完成
  11.   ad_value=ADDH*4+ADDL;
  12. }
复制代码

出0入96汤圆

发表于 2020-8-6 17:04:51 | 显示全部楼层
AD不用初始化,启动AD功能自动就初始化了,
另外 AD调用不要太频繁,在主循环中做个10ms左右循环调用一次比较好

出0入0汤圆

 楼主| 发表于 2020-8-7 11:59:27 | 显示全部楼层
谢谢回复,已经从别处找到答案。

出0入0汤圆

发表于 2020-8-7 15:34:02 | 显示全部楼层
hlabsttie 发表于 2020-8-7 11:59
谢谢回复,已经从别处找到答案。

答案是啥呢?

出16170入6148汤圆

发表于 2020-8-15 21:26:30 来自手机 | 显示全部楼层
 【中颖单片机12V电压检测】标题不合格。标题不合格,这次我帮你修改了。警告一次(累计2次警告,封锁ID一个星期。
    标题必须充分说明帖子内容
     比如你要问AVR的ADC如何才能测量得比较准确,使用标题:“AVR的ADC如何消除干扰测量得比较准确?”。以下的标题不合格:
           不合格举例1:小女子冰天雪地裸体跪求解决方法
          不合格举例2:高手请出招,一个无法解决的AVR问题
          不合格举例3:一个困扰学习单片机初学者,惊动单片机开发者的难题 
          不合格举例4:AVR的ADC测量   (点评:问问题,或是有技术心得与大家分享?)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-20 05:15

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

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