OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5661|回复: 3

STC12c5a60s2单片机自带AD转换的使用求助

[复制链接]

2

主题

3

帖子

0

精华

新手入门

积分
35
金钱
35
注册时间
2015-9-16
在线时间
4 小时
发表于 2016-3-16 18:25:12 | 显示全部楼层 |阅读模式
1金钱
我想用STC12c5a60s2单片机自带的AD做一个电压检测,以保护电路的安全。单片机检测到的电压应该是1.0V时单片机停止PWM的输出,以保护外电路的安全。我试验的时候再程序中用蜂鸣器的响和停来代替PWM的输出。程序下载好后被测电压还是零伏的时候蜂鸣器就开始响了,不知道是为什么,一下是我的程序和电路,请各位大神帮我看看哪里有问题了,小弟将感激不尽。
#include "STC12C5A60S2.H "
#include  "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define ADC_POWER  0x80
#define ADC_FLAG  0x10
#define ADC_START  0x08
#define ADC_SPEEDLL  0x00
#define ADC_CHS0  0x01
#define ADC_CHS1 0x02
#define ADC_CHS2  0x04
sbit beer=P1^3;
sbit swei1=P1^1;
sbit swei2=P1^2;
sbit swei4=P3^7;
sbit swei3=P3^6;
uchar code table0[]={

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,  

0x80,0x90,0x88,0x83,

0xc6,0xa1,0x86,0x8e};
uchar q,b,s,g;
uint num,add,add1;
void display(uchar,uchar,uchar,uchar);
void adc_get();
void delay(uchar z)
{
        uchar i,j;
        for(i=z;i>0;i--)
        {
                for(j=110;j>0;j--);
        }       
}
void display(uchar qian,uchar bai, uchar shi ,uchar ge)  //数码管显示AD转
                                                                                                                //换结果即add=(((uint)ADC_RES<<2)|(ADC_RESL&3))
{
        P2=0xff;
        swei3=0;
        P2=table0[shi];
        delay(15);
        P2=0xff;
        swei3=1;
        swei4=0;
        P2=table0[ge];
        delay(15);                                                               
        P2=0xff;
        swei4=1;
        swei1=0;                                          
        P2=table0[qian];
        delay(15);
        P2=0xff;
        swei1=1;
    swei2=0;
        P2=table0[bai];
        delay(15);
        P2=0xff;
        swei2=1;
}
void adc_get()
{
                if(num>=10)
                {
                        num=0;
                        add1=add/10;
                        if(add1>=204)
                {  
               
                                q=add/1000;
                                b=add%1000/100;
                                s=add%1000%100/10;
                                g=add%10;
                                beer=0;
                                delay(10);
                                beer=1;
                                delay(10);

                        }
                }
}
void  init()
{
        P1ASF=0x80;                 //用的市P1.7口
        AUXR1=0x00;
        ADC_CONTR = ADC_POWER|ADC_SPEEDLL|ADC_START|ADC_CHS0|ADC_CHS1|ADC_CHS2;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        ADC_RES=0;
        ADC_RESL=0;
        EADC=1;                 //开ADC中断
        beer=1;
        EA=1;
}
void main()
{
   init();
   while(1)
   {
                   adc_get();
                display(q,b,s,g);
   }
}
void adc() interrupt  5
{  
        uint add;
        ADC_CONTR&=!ADC_FLAG;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        num++;
        add=(((uint)ADC_RES<<2)|(ADC_RESL&3));
        add1+=add;
        ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ADC_CHS0|ADC_CHS1|ADC_CHS2;
           _nop_();
        _nop_();
        _nop_();
        _nop_();
}  

QQ截图20160316181948.png
通往成功没有捷径唯有努力的拼搏!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-3-17 23:15:19 | 显示全部楼层
回复

使用道具 举报

6

主题

25

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3567
金钱
3567
注册时间
2016-3-17
在线时间
582 小时
发表于 2016-3-19 09:08:38 | 显示全部楼层
你不如这样,你试试采集一个3V的电压,看看你设置成3V和实际检测到的是不是一样。我以前试过不一样。还有就是你可以把检测的数值做个求平均值
回复

使用道具 举报

36

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
680
金钱
680
注册时间
2015-12-13
在线时间
243 小时
发表于 2016-3-19 23:06:25 | 显示全部楼层
看别人的代码头都晕!!!
这是我自己写的!!!绝对能用!!!
压频转换部分 不相干的 我就删掉了!
[mw_shl_code=c,true]#ifndef __STCADC_H_
#define __STCADC_H_

#include<stc15f2k60s2.h>
#include<math.h>

#define V_ADC        0x89 //电压采样触发指令        时间540个时钟
#define A_ADC        0x88 //电流采样触发指令

unsigned int  xdata dianliu=0;
unsigned char xdata dianya=0;
unsigned char xdata dianliu_p=0;
unsigned int  xdata DC_temp_1,DC_temp_2,HVDC_1,HVDC_2,dianliu_x;
unsigned char xdata DC_1,DC_2,DC_i,HV_1,HV_2;
unsigned int  xdata DC_1_tab[10],HV_1_tab[10],HV_2_tab[10];
bit ADC_falg,HDC_falg;

void ADC_init();
void ADC_running();
unsigned int VF_ADC(unsigned int t);
void HADC_start();
//=========================================================
void HADC_start()
{
        unsigned char i;
        unsigned int j;
        if(HDC_falg)
                {
                if(DC_2!=10)HV_2_tab[HV_2]=0;
                else HV_2_tab[HV_2]=VF_ADC(DC_temp_2);
                if(HV_2>8)HV_2=0;
                else HV_2++;
                j=0;
                for(i=0;i<10;i++)j+=HV_2_tab;
                HVDC_2=j/10;
                DC_1=0;
                DC_temp_1=0;
                EX1=0;
                EX0=1;
                }
        else
                {
                if(DC_1!=10)HV_1_tab[HV_1]=0;
                else HV_1_tab[HV_1]=VF_ADC(DC_temp_1);
                if(HV_1>8)HV_1=0;
                else HV_1++;
                j=0;
                for(i=0;i<10;i++)j+=HV_1_tab;
                HVDC_1=j/10;
                DC_2=0;
                DC_temp_2=0;
                EX0=0;
                EX1=1;
                }
}
void ADC_running()
{
        unsigned char i;
        unsigned int j;
        if(ADC_falg)
                ADC_CONTR        =        V_ADC;
        else
                {
                j=0;
                for(i=0;i<10;i++)
                                j+=DC_1_tab;                //数字滤波
                dianliu_x=j/10;
                ADC_CONTR        =        A_ADC;
                }
}

void ADC_init()
{
        HV_1                =        0;
        HV_2                =        0;
        DC_i                =        0;
        HVDC_1                =        0;
        HVDC_2                =        0;
        HDC_falg        =        0;
        ADC_falg        =        0;
        P1ASF                =        0x03;        //0000 0011  
        ADC_CONTR        =        0x80;
//        ADC_CONTR        |=        ADC_TIME;
        CLK_DIV                &=        0xDF;
        EADC                =        1;
        EA                        =        1;
//        ADC_CONTR        =        0xAB;        //360 周期 采样频率33KHz
//        V_adc_running();        //初始化启动电流转换
}

void ADC_INT() interrupt 5
{
        unsigned int ADC_temp;
        float f;
        ADC_temp=ADC_RES;
        ADC_temp<<=2;
        ADC_temp+=ADC_RESL&0x03;
        f=ADC_temp;
        ADC_CONTR        =        0x80;
        if(ADC_falg)
                {
                f*=0.1761719f;
                dianya=(int)f;
                ADC_falg        =        0;
                }
        else
                {
                ADC_falg        =        1;
                f*=1.6113f;
                ADC_temp=(int)f;
                if(ADC_temp<dianliu_p)dianliu=0;
                else dianliu=ADC_temp-dianliu_p;
                DC_1_tab[DC_i]=dianliu;
                DC_i++;
                if(DC_i>9)DC_i=0;
                }
}
//========================================

/*==========================*/

#endif[/mw_shl_code]
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 13:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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