欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5390|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

這個(gè)STC15W408AS單片機(jī)兩路測(cè)量?jī)陕稟D的程序如何修改?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:229232 發(fā)表于 2019-10-23 22:35 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
200黑幣
需要一個(gè)STC15W408AS單片機(jī)測(cè)量?jī)蓚(gè)模擬量,測(cè)量一路的我會(huì),我測(cè)一個(gè)用的是P1.1口我不知道怎么測(cè)量?jī)蓚(gè),我把我的一路的得參考內(nèi)部電壓的AD程序發(fā)出來(lái)大家?guī)臀腋母模暮玫姆帜米撸。▍⒖家庖?jiàn):好像內(nèi)核就1個(gè)ADC,所以得測(cè)完一路然后計(jì)算發(fā)送給寄存器,也就是變量V是多少,然后在測(cè)量另外一路的,在重復(fù)此過(guò)程,在定義一個(gè)變量T是多少,有點(diǎn)像雙離合)

//內(nèi)部BandGap為基準(zhǔn)測(cè)電壓
//-----------------------------------------
#define  uchar unsigned char  
#define uint  unsigned int
unsigned int v;        
//ADC相關(guān)設(shè)定參數(shù)
#define ADC_POWER   0x80            //ADC電源控制位
#define ADC_FLAG    0x10            //ADC完成標(biāo)志
#define ADC_START   0x08            //ADC起始控制位
#define ADC_SPEEDLL 0x00            //540個(gè)時(shí)鐘
#define ADC_SPEEDL  0x20            //360個(gè)時(shí)鐘
#define ADC_SPEEDH  0x40            //180個(gè)時(shí)鐘
#define ADC_SPEEDHH 0x60            //90個(gè)時(shí)鐘
//-----------------------------------------
//BandGap相關(guān)參數(shù)
//注意:需要在下載代碼時(shí)選擇"在ID號(hào)前添加重要測(cè)試參數(shù)"選項(xiàng),才可在程序中獲取此參數(shù)
//#define ID_ADDR_ROM 0x03f7      //1K程序空間的MCU
//#define ID_ADDR_ROM 0x07f7      //2K程序空間的MCU
//#define ID_ADDR_ROM 0x0bf7      //3K程序空間的MCU
//#define ID_ADDR_ROM 0x0ff7      //4K程序空間的MCU
//#define ID_ADDR_ROM 0x13f7      //5K程序空間的MCU
#define ID_ADDR_ROM 0x1ff7      //8K程序空間的MCU
//#define ID_ADDR_ROM 0x27f7      //10K程序空間的MCU
//#define ID_ADDR_ROM 0x2ff7      //12K程序空間的MCU
//#define ID_ADDR_ROM 0x3ff7      //16K程序空間的MCU
//#define ID_ADDR_ROM 0x4ff7      //20K程序空間的MCU
//#define ID_ADDR_ROM 0x5ff7      //24K程序空間的MCU
//#define ID_ADDR_ROM 0x6ff7      //28K程序空間的MCU
//#define ID_ADDR_ROM 0x7ff7      //32K程序空間的MCU
//#define ID_ADDR_ROM 0x9ff7      //40K程序空間的MCU
//#define ID_ADDR_ROM 0xbff7      //48K程序空間的MCU
//#define ID_ADDR_ROM 0xcff7      //52K程序空間的MCU
//#define ID_ADDR_ROM 0xdff7      //56K程序空間的MCU
//#define ID_ADDR_ROM 0xeff7      //60K程序空間的MCU


//-----------------------------------------
//聲明

void Delay20ms()                //@12.000MHz
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 1;
        j = 234;
        k = 113;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}


/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
           P1ASF = 0x02;                   //設(shè)置P1口為AD口
    ADC_RES = 0;                    //清除結(jié)果寄存器
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
        Delay20ms();
}
/*----------------------------
讀取ADC結(jié)果
----------------------------*/
uint GetADCResult(uchar ch)
{
    uint ADC_10BIT_RES;
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
    _nop_();                        //等待4個(gè)NOP
    _nop_();
    _nop_();
    _nop_();
    while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉(zhuǎn)換完成
    ADC_CONTR &= ~ADC_FLAG;         //關(guān)閉 ADC
    ADC_10BIT_RES=ADC_RES;      //得到高8位
    ADC_10BIT_RES<<=2;
    ADC_10BIT_RES+=ADC_RESL;     //得到低2位
        
    return ADC_10BIT_RES;                 //返回ADC結(jié)果

}

/*----------------------------
發(fā)送ADC結(jié)果
----------------------------*/
void ShowResult(uchar ch)
{
    uint adc_res10,//測(cè)量設(shè)定通道adc值
    bandgap,       //bandgap預(yù)儲(chǔ)存校準(zhǔn)值,單位毫伏
    adc_9gallery_res; //測(cè)量第九通道(bandgap)值
    float power_voltage,        //系統(tǒng)供電電壓,單位毫伏
    ADC_voltage;     //設(shè)定通道電壓值,單位毫伏

    uchar  code *cptr; //定義ROM(代碼)區(qū)指針
    //uchar  idata *iptr;//定義RAM(內(nèi)存)區(qū)指針

    cptr = ID_ADDR_ROM;         //從程序區(qū)讀取BandGap電壓值(單位:毫伏mV)
    bandgap=*cptr++;
    bandgap<<=8;
    bandgap+=*cptr;
    /*iptr = ID_ADDR_RAM;         //從內(nèi)存區(qū)讀取BandGap電壓值(單位:毫伏mV)
    bandgap=*iptr++;              //兩種方法結(jié)果一樣,上面的方法需要在下載式勾選"在ID號(hào)前添加重要測(cè)試參數(shù)"選項(xiàng),才可在程序中獲取此參數(shù)
    bandgap<<=8;                  //下面的方法不需要
    bandgap+=*iptr;    */
    //測(cè)量設(shè)定通道adc值
    ADC_RES = 0;                    //清除結(jié)果寄存器
    P1ASF = 0x02;                   //設(shè)置P1口為AD口
    GetADCResult(ch);
    GetADCResult(ch);                 //讀三次獲得穩(wěn)定
    adc_res10= GetADCResult(ch);
    //測(cè)量第九通道(bandgap)值
    ADC_RES = 0;                    //清除結(jié)果寄存器
    P1ASF = 0x00;                   //設(shè)置讀第九通道
    GetADCResult(0);                 //測(cè)bandgap時(shí),調(diào)用此函數(shù)時(shí)通道數(shù)只能填0
    GetADCResult(0);                 //讀三次獲得穩(wěn)定
    adc_9gallery_res=GetADCResult(0);
    //計(jì)算系統(tǒng)供電電壓
    power_voltage=(float)bandgap*1024/adc_9gallery_res;
    //計(jì)算ADC通道測(cè)得電壓值
    ADC_voltage=(float)bandgap*adc_res10/adc_9gallery_res;
        v=ADC_voltage;
        
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:213173 發(fā)表于 2019-10-24 11:00 | 只看該作者
測(cè)量1個(gè)ADC通道與測(cè)量8個(gè)通道是一樣的,內(nèi)部ADC硬件只有一套,通過(guò)控制選擇開(kāi)關(guān)輪流轉(zhuǎn)換。
需要使用哪個(gè)通道只要把相應(yīng)端口模式設(shè)為高阻:
P1M0 = 0x00
P1M1 = 0x01~0xff(1~8通道)
模擬輸入通道設(shè)為:
P1ASF = 0x01~0xff(1~8通道)
再多設(shè)幾個(gè)變量保存讀取的數(shù)據(jù):
adc_res10= GetADCResult(0);//第一通道
adc_res11= GetADCResult(1);
adc_res12= GetADCResult(2);
adc_res13= GetADCResult(3);
adc_res14= GetADCResult(4);
adc_res15= GetADCResult(5);
adc_res16= GetADCResult(5);
adc_res17= GetADCResult(7);//第八通道
濾波、比較、算法等函數(shù)都是共用的。
讀新增第九通道內(nèi)部參考電壓時(shí)只要改設(shè)P1ASF = 0x00;
與GetADCResult(0);括號(hào)內(nèi)參數(shù)無(wú)關(guān),習(xí)慣填0。
回復(fù)

使用道具 舉報(bào)

板凳
ID:229232 發(fā)表于 2019-10-24 17:56 | 只看該作者
wulin 發(fā)表于 2019-10-24 11:00
測(cè)量1個(gè)ADC通道與測(cè)量8個(gè)通道是一樣的,內(nèi)部ADC硬件只有一套,通過(guò)控制選擇開(kāi)關(guān)輪流轉(zhuǎn)換。
需要使用哪個(gè)通 ...

大哥方便幫我直接把程序改好嗎?
回復(fù)

使用道具 舉報(bào)

地板
ID:170318 發(fā)表于 2019-10-24 20:32 | 只看該作者
我一直在用STC15系列的多通道ADC檢測(cè)程序,下面給一個(gè)3通道P1.0-P1.2的只取高八位的程序,可以直接使用
void get_ADC()                                //P1.0-P1.2檢測(cè)
{
        uchar n;
        for(n=0;n<3;n++)
        {
                ADC_CONTR=0x80;
                ADC_CONTR=(ADC_CONTR|0x00+n);  // 設(shè)定轉(zhuǎn)換的通道
                ADC_CONTR|=0x08;                   // 開(kāi)始AD轉(zhuǎn)換,即ADC_START=1
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                while(!(ADC_CONTR & 0x10));   //  等待轉(zhuǎn)換完成 ,即ADC_FLAG=1
                ADC_CONTR&=0xE7;               //  清零 即D3位start清零,D4位轉(zhuǎn)換結(jié)束標(biāo)志位ADC_flag清零
                if(n==2)                                     //  取P1.2
                {
                        zs=ADC_RES;                 //  取高八位送zs               
                }
                if(n==1)                                    //  取P1.1
                {
                        Tp=ADC_RES;              //  取高八位送Tp         
                }               
                if(n==0)                                  //  取P1.0               
               {
                        Td=ADC_RES;                //  取高八位送Td
                }
        }
}                         

void InitADC()             //ADC初始化
{
        P1M0 = 0x00;     //P1.2、P1.1、P1.0高阻模式
        P1M1 = 0x07;
        P1ASF=0x07;             //P1.0\P1.1\P1.2設(shè)為輸入通道
        ADC_RES=0;             //清除結(jié)果
        ADC_CONTR=ADC_POWER|ADC_SPEEDLL;
        delay1ms(2);     //延時(shí)
}
回復(fù)

使用道具 舉報(bào)

5#
ID:123289 發(fā)表于 2019-10-24 20:53 | 只看該作者
太呆板了吧,將你會(huì)的程序再寫一遍,并將其它的采樣端口改一下,相關(guān)的參數(shù)也改一下就行了。
最后讓這兩個(gè)程序輪流運(yùn)行。
回復(fù)

使用道具 舉報(bào)

6#
ID:65956 發(fā)表于 2019-10-25 08:42 | 只看該作者
/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
           P1ASF = 0x02;                   //設(shè)置P1口為AD口
    ADC_RES = 0;                    //清除結(jié)果寄存器
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
        Delay20ms();
}

把這個(gè)改成下面這樣,這樣后你的P1口8個(gè)接口都是AD口,然后在下一個(gè)函數(shù)的ch選擇對(duì)應(yīng)的端口0-7任一個(gè)作AD口就可以了,切記,現(xiàn)有P1口都作AD口了,所以不能作其它用,如要作其它用重新改這個(gè)“P1ASF = 0xFF; //設(shè)置P1口為AD口”就可以了
/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
           P1ASF = 0xFF;                   //設(shè)置P1口為AD口
    ADC_RES = 0;                    //清除結(jié)果寄存器
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
        Delay20ms();
}
回復(fù)

使用道具 舉報(bào)

7#
ID:36359 發(fā)表于 2020-2-11 21:30 | 只看該作者
正在調(diào)試類似程序,借鑒一下
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表