久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: 關(guān)于STC15W408AS單片機(jī)的ADC程序疑問 [打印本頁]

作者: sq8422779    時(shí)間: 2020-11-3 12:38
標(biāo)題: 關(guān)于STC15W408AS單片機(jī)的ADC程序疑問
ADC是模轉(zhuǎn)數(shù).用的芯片是15W408AS 我是按照范例 用的是ADC查詢..

芯片是5V供電

P1.2作為ADC腳

然后P1.2短接GND 為啥讀出來的還是FF?

/* 如果要在程序中使用此代碼,請(qǐng)?jiān)诔绦蛑凶⒚魇褂昧薙TC的資料及程序        */
/* 如果要在文章中應(yīng)用此代碼,請(qǐng)?jiān)谖恼轮凶⒚魇褂昧薙TC的資料及程序        */
/*---------------------------------------------------------------------*/

//本示例在Keil開發(fā)環(huán)境下請(qǐng)選擇Intel的8058芯片型號(hào)進(jìn)行編譯
//若無特別說明,工作頻率一般為11.0592MHz


#include "reg51.h"
#include "intrins.h"

#define FOSC    11059200L
#define BAUD    115200

typedef unsigned char BYTE;
typedef unsigned int WORD;

#define     URMD    0           //0:使用定時(shí)器2作為波特率發(fā)生器
                                //1:使用定時(shí)器1的模式0(16位自動(dòng)重載模式)作為波特率發(fā)生器
                                //2:使用定時(shí)器1的模式2(8位自動(dòng)重載模式)作為波特率發(fā)生器

sfr T2H   = 0xd6;               //定時(shí)器2高8位
sfr T2L   = 0xd7;               //定時(shí)器2低8位

sfr P1M1 = 0x91;    //PxM1.n,PxM0.n     =00--->Standard,    01--->push-pull
sfr P1M0 = 0x92;    //                  =10--->pure input,  11--->open drain
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xB1;
sfr P3M0 = 0xB2;
sfr P4M1 = 0xB3;
sfr P4M0 = 0xB4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;

sfr  AUXR       =   0x8e;       //輔助寄存器                              

sfr ADC_CONTR   =   0xBC;           //ADC控制寄存器
sfr ADC_RES     =   0xBD;           //ADC高8位結(jié)果
sfr ADC_LOW2    =   0xBE;           //ADC低2位結(jié)果
sfr P1ASF       =   0x9D;           //P1口第2功能控制寄存器

#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í)鐘

void InitUart();
void InitADC();
void SendData(BYTE dat);
BYTE GetADCResult(BYTE ch);
void Delay(WORD n);
void ShowResult(BYTE ch);

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P6M0 = 0x00;
    P6M1 = 0x00;
    P7M0 = 0x00;
    P7M1 = 0x00;

    InitUart();                     //初始化串口
    InitADC();                      //初始化ADC
    while (1)
    {
        ShowResult(0);              //顯示通道0
                        Delay(100);
        ShowResult(1);              //顯示通道1
                        Delay(100);
        ShowResult(2);              //顯示通道2
                        Delay(100);
        ShowResult(3);              //顯示通道3
                        Delay(100);
        ShowResult(4);              //顯示通道4
                        Delay(100);
        ShowResult(5);              //顯示通道5

                        Delay(500);
                        
    }
}

/*----------------------------
發(fā)送ADC結(jié)果到PC
----------------------------*/
void ShowResult(BYTE ch)
{
    SendData(ch);                   //顯示通道號(hào)
    SendData(GetADCResult(ch));     //顯示ADC高8位結(jié)果

//    SendData(ADC_LOW2);           //顯示低2位結(jié)果
}

/*----------------------------
讀取ADC結(jié)果
----------------------------*/
BYTE GetADCResult(BYTE ch)
{
    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;         //Close ADC

    return ADC_RES;                 //返回ADC結(jié)果
}

/*----------------------------
初始化串口
----------------------------*/
void InitUart()
{
    SCON = 0x5a;                //設(shè)置串口為8位可變波特率
#if URMD == 0
    T2L = (65536 - (FOSC/4/BAUD));
    T2H = (65536 - (FOSC/4/BAUD)) >> 8;
    AUXR = 0x14;                //T2為1T模式, 并啟動(dòng)定時(shí)器2
    AUXR |= 0x01;               //選擇定時(shí)器2為串口1的波特率發(fā)生器
#elif URMD == 1
    AUXR = 0x40;                //定時(shí)器1為1T模式
    TMOD = 0x00;                //定時(shí)器1為模式0(16位自動(dòng)重載)
    TL1 = (65536 - (FOSC/4/BAUD));
    TH1 = (65536 - (FOSC/4/BAUD)) >> 8;
    TR1 = 1;                    //定時(shí)器1開始啟動(dòng)
#else
    TMOD = 0x20;                //設(shè)置定時(shí)器1為8位自動(dòng)重裝載模式
    AUXR = 0x40;                //定時(shí)器1為1T模式
    TH1 = TL1 = (256 - (FOSC/32/BAUD));
    TR1 = 1;
#endif
}

/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
    P1ASF = 0xff;                   //設(shè)置P1口為AD口
    ADC_RES = 0;                    //清除結(jié)果寄存器
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
    Delay(2);                       //ADC上電并延時(shí)
}

/*----------------------------
發(fā)送串口數(shù)據(jù)
----------------------------*/
void SendData(BYTE dat)
{
    while (!TI);                    //等待前一個(gè)數(shù)據(jù)發(fā)送完成
    TI = 0;                         //清除發(fā)送標(biāo)志
    SBUF = dat;                     //發(fā)送當(dāng)前數(shù)據(jù)
}

/*----------------------------
軟件延時(shí)
----------------------------*/
void Delay(WORD n)
{
    WORD x;

    while (n--)
    {
        x = 5000;
        while (x--);
    }
}



作者: wulin    時(shí)間: 2020-11-3 15:22
        P1M1 = 0xff;                                         //設(shè)置P1.0~1.7高阻:1111 1111 ADC輸入高阻
        P1M0 = 0x00;                                         //設(shè)置P1.0~1.7高阻:0000 0000 ADC輸入高阻
作者: dzbj    時(shí)間: 2020-11-3 22:25
你試試把P1口設(shè)置成高阻
作者: sq8422779    時(shí)間: 2020-11-4 11:01
wulin 發(fā)表于 2020-11-3 15:22
P1M1 = 0xff;                                         //設(shè)置P1.0~1.7高阻:1111 1111 ADC輸入高阻
        P1M0 = 0x00;                                         //設(shè)置P1.0~1.7高阻 ...

修改了還是不行.是跟GND短接嗎?我跟GND 跟VDD 短接讀出來的都是FF FE
作者: Y_G_G    時(shí)間: 2020-11-4 11:45
一步一步去找問題
1:在開發(fā)板或者是現(xiàn)成的板子上進(jìn)行測(cè)試:設(shè)定一個(gè)輸出,不管是數(shù)碼管還是8個(gè)LED都可以,只要能大概顯示一個(gè)輸出就行
2:P1.2接上一個(gè)可調(diào)電壓,調(diào)節(jié)電壓輸出有變化,就說明你ADC設(shè)置是可以進(jìn)行ADC的了,如果是有完整的顯示就更好了
3:只有完成前面兩個(gè)測(cè)試,證明ADC可以正常轉(zhuǎn)換之后,再進(jìn)行串口顯示,
有的串口軟件并不成正常的顯示8051發(fā)送的數(shù)據(jù)的,如果你已經(jīng)證明ADC可以正常進(jìn)行,并且可以輸出可以變化的數(shù)據(jù),但串口還是FF,那就說明是串口這一塊有問題,不是代碼就是串口軟件不行,慢慢找 就可以的了
作者: sq8422779    時(shí)間: 2020-11-4 12:06
Y_G_G 發(fā)表于 2020-11-4 11:45
一步一步去找問題
1:在開發(fā)板或者是現(xiàn)成的板子上進(jìn)行測(cè)試:設(shè)定一個(gè)輸出,不管是數(shù)碼管還是8個(gè)LED都可以,只 ...

謝謝了.我本以為串口輸出會(huì)比較好..我最開始用的就是4個(gè)LED來讀去的但是讀去的一直是1655所以才嘗試用串口輸出的..我再試試
作者: Y_G_G    時(shí)間: 2020-11-4 13:53
sq8422779 發(fā)表于 2020-11-4 12:06
謝謝了.我本以為串口輸出會(huì)比較好..我最開始用的就是4個(gè)LED來讀去的但是讀去的一直是1655所以才嘗試用串 ...

只要是IO能夠隨著P1.2的電壓變動(dòng),這就說明ADC已經(jīng)在正常轉(zhuǎn)換了,數(shù)據(jù)不對(duì)就只是ADC格式或者算法不對(duì)而已
加了串口就不一樣了,STC串口實(shí)際上是有好幾個(gè)的,要去設(shè)定,而且電腦端的串口軟件有一些并不是通用的,無形中增加了出現(xiàn)問題的可能性
作者: sq8422779    時(shí)間: 2020-11-5 09:03
Y_G_G 發(fā)表于 2020-11-4 13:53
只要是IO能夠隨著P1.2的電壓變動(dòng),這就說明ADC已經(jīng)在正常轉(zhuǎn)換了,數(shù)據(jù)不對(duì)就只是ADC格式或者算法不對(duì)而已
...

謝謝.已經(jīng)能正常顯示了..有個(gè)問題請(qǐng)教一下.這個(gè)數(shù)值,我用的是平均值..線路設(shè)計(jì)的時(shí)候.光感直接2個(gè)角接在P1.2和GND嗎?中間不用加電阻,和電容嗎??
作者: Y_G_G    時(shí)間: 2020-11-5 09:25
sq8422779 發(fā)表于 2020-11-5 09:03
謝謝.已經(jīng)能正常顯示了..有個(gè)問題請(qǐng)教一下.這個(gè)數(shù)值,我用的是平均值..線路設(shè)計(jì)的時(shí)候.光感直接2個(gè)角接在P ...

如果光敏電阻,就是串聯(lián)一個(gè)電阻,分壓取ADC
進(jìn)入ADC端口串聯(lián)不串聯(lián)的,沒什么影響,你可以試一下就知道了,實(shí)際感覺不到它有什么用,但是,如果是實(shí)際的項(xiàng)目,一定是要用個(gè)串聯(lián)的電阻的,大概100歐左右就可以了,焊盤可以靠近一點(diǎn),方便以后焊接元件或者直接短路
P1.2端口一定要并聯(lián)一個(gè)104電容到地,這是最基本的,如果你的電源用的是開關(guān)電源,可以換成102或者103的都行,電池或者變壓器就用104的.這個(gè)電容一定要有
這104電容就這樣:它有作用的時(shí)候,你感覺不到它存在,它沒有的時(shí)候你才感覺它有作用
作者: sq8422779    時(shí)間: 2020-11-10 08:22
Y_G_G 發(fā)表于 2020-11-5 09:25
如果光敏電阻,就是串聯(lián)一個(gè)電阻,分壓取ADC
進(jìn)入ADC端口串聯(lián)不串聯(lián)的,沒什么影響,你可以試一下就知道了, ...

嗯.我試了下.串聯(lián)一個(gè)500k電阻剛好所有量程都在..10bit能采集到.然后這個(gè)并的電容.起到什么作用呢?除了這個(gè)光感外,還有一個(gè)音量采集...這個(gè)好像直接接在P1.2上采集不到..是不是要放大電路?
作者: Y_G_G    時(shí)間: 2020-11-10 08:55
sq8422779 發(fā)表于 2020-11-10 08:22
嗯.我試了下.串聯(lián)一個(gè)500k電阻剛好所有量程都在..10bit能采集到.然后這個(gè)并的電容.起到什么作用呢?除了這 ...

104電容是抗干擾用的
音頻采樣是要整流才能采樣的,這個(gè)我沒有玩過,你上網(wǎng)找一下,自己測(cè)試一下
作者: aayon1979    時(shí)間: 2020-11-10 09:25
并聯(lián)電容是起到濾波的作用吧




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 免费小视频在线观看 | 91社区视频| 久久99精品久久久 | 成人欧美一区二区三区黑人孕妇 | 久久精品久久久久久 | 免费一二区 | 日韩在线中文字幕 | 亚洲 欧美 日韩在线 | 日韩一区精品 | 日韩三区在线 | 久久久久久久一区 | 在线日韩不卡 | 高清国产午夜精品久久久久久 | 999久久久国产精品 欧美成人h版在线观看 | 国产一区二区三区四区五区加勒比 | 综合久久亚洲 | 欧美精品一区二区三区四区五区 | 尤物在线视频 | 久久久久久久久久久91 | 一二三四在线视频观看社区 | 久热精品在线观看视频 | 一级毛片在线播放 | 中文字幕91 | 亚洲综合国产精品 | 国偷自产av一区二区三区 | 国产婷婷精品 | 日韩在线不卡 | 久久99蜜桃综合影院免费观看 | 自拍偷拍av | 精品中文字幕视频 | 久久久久久精 | 国产精彩视频 | 欧洲精品码一区二区三区免费看 | 国产精品日韩欧美一区二区 | 99精品免费久久久久久久久日本 | 亚洲精品www久久久久久广东 | 久久夜视频| 久久久久久久一级 | 日本福利一区 | 日本一区二区在线视频 | 中文精品视频 |