wjzhongshi 发表于 2013-1-3 20:27:26

新手求助了,关于stc单片机ADC转换的问题

看了杜洋的视频,感觉什么东西都没学到啊,主要的东西一点都没讲,
尤其是ADC转换这一点,我根据他讲的用他的模板改的程序如下
P1.0接的是一个电位器,调节电位器控制led1亮灭,我想在P1.1上也接一个电位器来控制led2的亮灭,
也就是采集两路ADC数据,程序应该怎么改啊?看了好几遍杜洋关于ADC的视频也没弄明白,求助各位了,谢谢了
/****************************************包含头文件*******************************************/
#include<15f204ea.H>
#include <intrins.h>        //51基本运算(包括_nop_空函数)
/*********************************************************************************************/

#define uchar unsigned char
#define uint unsigned int
uint m;
sbit led1 = P1^2;
sbit led2 = P1^3;


/*********************************************************************************************/


/*********************1ms延时程序(12MHz 10倍于51单片机速度时)********************************/
void delay (uint a)
{
        uint i;
        while( --a != 0)
        {
                for(i = 0; i < 600; i++);
        }                                     
}
/*********************************************************************************************/

/*********************************************************************************************
函数名:10位A/D转换初始化函数
调用:Read_init (?);
参数:输入的端口(0000 0XXX 其中XXX是设置输入端口号,可用十进制0~7表示,0表示P1.0,7表示P1.7)
返回值:无
结果:开启ADC功能并设置ADC的输入端口
备注:使用ADC功能时需要将对应的IO接口设置为高阻输入方式(例如:P1M1 = 0x01;)
/**********************************************************************************************/
void Read_init (unsigned char CHA){
        unsigned char AD_FIN=0; //存储A/D转换标志
    CHA &= 0x07;            //选择ADC的8个接口中的一个(0000 0111 清0高5位)
    ADC_CONTR = 0x40;                //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
    _nop_();
    ADC_CONTR |= CHA;       //选择A/D当前通道
    _nop_();
    ADC_CONTR |= 0x80;      //启动A/D电源
    delay(1);            //使输入电压达到稳定(1ms即可)
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:10位A/D转换函数
调用:? = ADC_Read();
参数:无
返回值:10位ADC数据高(从0到1023(十进制))
结果:读出指定ADC接口的A/D转换值,并返回数值
备注:适用于STC12C5A60S2系列单片机(必须使用STC12C5A60S2.h头文件)
/**********************************************************************************************/
unsigned int Read (void){
        unsigned char 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转换,
return (ADC_RES*4+ADC_RESL);//返回A/D转换结果(10位ADC数据高8位在ADC_RES中,低2位在ADC_RESL中)
}


/************************************主函数***************************************************/
void main(void)
{
   
        P1M1 = 0x01;//                           
        Read_init (0);
        while(1)
        {
             m = Read ();
             if(m>=30&&m<=90)
             {
               led1=0;
             }
             else
             {
                led1=1;
            }
        }
}
/*********************************************************************************************/


wjzhongshi 发表于 2013-1-4 14:51:45

没人能帮帮我吗

iphone4 发表于 2013-1-4 18:23:27

你看看stc的技术文档,比看教程明了。我昨天看的,今天基本上就明白的差不多了

wjzhongshi 发表于 2013-1-4 19:43:59

iphone4 发表于 2013-1-4 18:23
你看看stc的技术文档,比看教程明了。我昨天看的,今天基本上就明白的差不多了 ...

在看了,貌似明白一点了

iphone4 发表于 2013-1-4 21:03:56

他的网站上有例程下载,写的很简明。对着pdf看,一会就明白个大概了
我刚开始学这个,没有个老师真是痛苦啊。什么都要自己看~~~

topark 发表于 2013-1-4 21:23:43

STC的文档就够用了

wjzhongshi 发表于 2013-1-4 22:55:22

topark 发表于 2013-1-4 21:23
STC的文档就够用了

主要是有些地方看不明白阿

topark 发表于 2013-1-5 07:06:50

程序基本上可以直接拿来用

NFotxb 发表于 2013-1-5 11:13:52

把主函数这样改一下看行不?
Read_init (0); 这句应该就是改ADC通道及设置的,所以放到循环里。         



/************************************主函数***************************************************/
void main(void)
{
   
      
      P1M1 = 0x03; / P1M1=#0000011B; p1.0,p1.1改为高阻输入 /                           
      while(1)
      {
             Read_init (0);         
             m = Read ();
             if(m>=30&&m<=90)
             {
               led1=0;
             }
             else
             {
                led1=1;
            }
             Read_init (1);
             m = Read ();
             if(m>=30&&m<=90)
             {
               led2=0;
             }
             else
             {
               led2=1;
            }

      }
}
/*********************************************************************************************/

bbssilverkey 发表于 2013-1-5 14:36:22

本帖最后由 bbssilverkey 于 2013-1-5 14:46 编辑

函数名:10位A/D转换初始化函数
调用:Read_init (?);
参数:输入的端口(0000 0XXX 其中XXX是设置输入端口号,可用十进制0~7表示,0表示P1.0,7表示P1.7)
返回值:无
结果:开启ADC功能并设置ADC的输入端口
备注:使用ADC功能时需要将对应的IO接口设置为高阻输入方式(例如:P1M1 = 0x01;)
/**********************************************************************************************/
void Read_init (unsigned char CHA){
      unsigned char AD_FIN=0; //存储A/D转换标志
    CHA &= 0x07;            //选择ADC的8个接口中的一个(0000 0111 清0高5位)
    ADC_CONTR = 0x40;                //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
    _nop_();
    ADC_CONTR |= CHA;       //选择A/D当前通道
    _nop_();
    ADC_CONTR |= 0x80;      //启动A/D电源
    delay(1);            //使输入电压达到稳定(1ms即可)
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:10位A/D转换函数
调用:? = ADC_Read();
参数:无
返回值:10位ADC数据高(从0到1023(十进制))
结果:读出指定ADC接口的A/D转换值,并返回数值
备注:适用于STC12C5A60S2系列单片机(必须使用STC12C5A60S2.h头文件)
/**********************************************************************************************/
unsigned int Read (void){
      unsigned char 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转换,
return (ADC_RES*4+ADC_RESL);//返回A/D转换结果(10位ADC数据高8位在ADC_RES中,低2位在ADC_RESL中)
}

/************************************很傻,不过估计可行***************************************************/
void led0_turn()
{
             Read_init (0);
             if(Read()>=30 && Read()<=90)
             {
               led0=0;
             }
             else
             {
                led0=1;
             }
}

void led1_turn()
{
             Read_init (1);
             if(Read()>=30 && Read()<=90)
             {
               led1=0;
             }
             else
             {
                led1=1;
             }
}
/************************************主函数***************************************************/
void main(void)
{
       P1M0 = 0x00; //整个P1我都调高阻了,太懒
       P1M1 = 0xFF;                  
      while(1)
      {
                led0_turn();
                led1_turn();
      }
}
楼主有没有杜洋的很贵,能不能给我看看?

wjzhongshi 发表于 2013-1-5 17:32:10

bbssilverkey 发表于 2013-1-5 14:36
函数名:10位A/D转换初始化函数
调用:Read_init (?);
参数:输入的端口(0000 0XXX 其中XXX是设置输入 ...

个人感觉还不如看郭的

wjzhongshi 发表于 2013-1-7 09:36:07

问题已经解决,感谢各位的帮忙

lmt50211 发表于 2013-1-8 10:13:19

void readadc()
{
        uchar i,b;
        uint ad_shu;
    for(b=0;b<4;b++) //采集四个通道AD值
    {
            ad_shu=0;
            ADC_CONTR=adc_chanle;
      //ADC_CONTR=0xe6; //开A/D转换器,并定义P1.6为AD输入端口
      for(i=0;i<32;i++)//采集32次后取均值
            {
                    ADC_CONTR|=0x08;//启动AD转换
                 while((ADC_CONTR&0x10)==0);//等待AD转换结束
                    ADC_CONTR&=0xe7;//置0
//                    ad_shu=ADC_DATA;//高8位赋值
//                    ad_shu<<=2;   //左移2位
//                    ad_shu+=ADC_LOW2;//低2位赋值
//                    adc_val+=ad_shu;
            ad_shu+=(ADC_DATA<<2)+ADC_LOW2;
            }
      adc_val=ad_shu/32;               
    }
    vvc=(ulong)adc_val*2964/1000;//adc*(30V/1012(30V时测得的AD值))
        vva=(ulong)adc_val*3706/10000;//adc*(3.78A/1020(3.78A时测得的AD值))
}

canidream1 发表于 2013-1-8 17:20:52

楼上的, 还没有看明白
页: [1]
查看完整版本: 新手求助了,关于stc单片机ADC转换的问题