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

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

QQ登錄

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

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

stc12c5a60s2單片機(jī)內(nèi)部AD功能為什么電壓無(wú)法讀取?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
stc12c5a60s2 為什么我這個(gè)電壓無(wú)法讀取 請(qǐng)大師看看呢    我是直接用的單片機(jī)5V供電的
#include <STC12C5A60S2.H>
#include "intrins.h"

//typedef unsigned char BYTE;
//typedef unsigned int WORD;

#define uchar unsigned char
#define uint  unsigned int
/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER   0x80            //ADC 電源控制位  10000000  0X80  /
#define ADC_FLAG    0x10            //ADC 完成標(biāo)志          00010000  0x10
#define ADC_START   0x08            //ADC 啟動(dòng)ADC開(kāi)關(guān) 00001000        0x08  /
#define ADC_SPEEDLL 0x00            //420 轉(zhuǎn)換速度          00000000        0x00  /
#define ADC_SPEEDL  0x20            //280 轉(zhuǎn)換速度          00100000  0x20
#define ADC_SPEEDH  0x40            //140 轉(zhuǎn)換速度          01000000  0x40
#define ADC_SPEEDHH 0x60            //70  轉(zhuǎn)換速度          01100000        0x60

float temp;    //定義temp為浮點(diǎn)型參數(shù)

uint num,i;

sbit    lcden = P2^7;
sbit    rs = P2^6;
sbit    rw = P2^5;


void Delay(uint n);              //延時(shí)函數(shù)
uchar GetADCResult(uchar ch);                 // ad轉(zhuǎn)換函數(shù)
void InitADC();                                         //ad初始化函數(shù)
float  count(uchar ch);                     //ad計(jì)算函數(shù)
uchar code table[3]={"000"};
uchar code table2[10]={"zheng chao"};

/*  延時(shí)函數(shù)*/
void delayms(uint xms)
{                                       
     uint i,j;                                         
         for(i=xms;i>0;i--)
           for (j=960;j>0;j--);
}
/******寫(xiě)命令****/
void   lcd_write_com(uchar com)
{

         rw=0;
                 rs=0;        //寫(xiě)命令狀態(tài)
                 P0=com;
                 lcden=1;
             delayms(5);
                 lcden=0;
}
/**寫(xiě)數(shù)據(jù) ***/
void  write_date_(uchar date)
{
         rw=0; //寫(xiě)數(shù)據(jù)
                 rs=1; //寫(xiě)數(shù)據(jù)狀態(tài)
                 P0=date;
                 delayms(5);
                 lcden=1;  //使能
             delayms(5);
                 lcden=0;   
}
/*初始化顯示屏*/
void lcd_init(void)
{
   
  lcden=0;
  lcd_write_com(0x38); //設(shè)置8位格式,2行,5*7
  lcd_write_com(0x0c); //整體顯示,關(guān)光標(biāo),不顯示
  lcd_write_com(0x06); // 設(shè)定輸入方式,增量不移位
  lcd_write_com(0x01);//清屏幕
  delayms(5);  //延時(shí)
  
   
}

/*顯示函數(shù)*********/
void  disp(uchar date3)
{        
     uchar bai,shi,ge;
     bai=date3/100;
         shi=date3/10%10;
         ge=date3%10;  
            lcd_write_com(0x80+0x10);
//         lcd_disp_char(1,0,(0x30+bai) );
         write_date_(0x30+bai);
     write_date_(0x30+shi);
         write_date_(0x30+ge);
//   lcd_disp_char(1,1,(0x30+shi) );
//   lcd_disp_char(1,2,(0x30+ge) );


}

void init()

{

        lcd_write_com(0x80+0x10);           //定義顯示的位置 起始地址     
        for(num=0;num<3;num++)
                {        
               
                        write_date_(table[num]);               //初始化屏幕的初始數(shù)字“000”
                        delayms(5);                          
                }

        lcd_write_com(0x80+0x40+0x10+3);   //定義第二排,顯示的地址 0x80是顯示屏寄存器第一排起始地址
    for(num=0;num<10;num++)                         //0x40是第二排起始地址
              {
                           write_date_(table2[num]);
                           delayms(5);                  
                  }
                  for(num=0;num<16;num++)        //整屏左移動(dòng)
                  {
                      lcd_write_com(0x18);
                          delayms(500);
                     }        
                  

}



void main()

{
    lcd_init();
        init();
    InitADC();                      //Init ADC sfr
    while (1)
    {

            i=0;
      while(i<1000)
           {
              
        disp((int)count(0)*100);
                delayms(500);        
            i++;
           }
    }
}

/*************************
*  功能        ADC轉(zhuǎn)換函數(shù)
*  帶結(jié)果返回  帶結(jié)果返回
**************************/

uchar GetADCResult(uchar ch)  //參數(shù)的定義“ch”初始化就是為0  所以這里的“ch”應(yīng)該是用來(lái)設(shè)置用哪個(gè)端口     
{                                                   //來(lái)設(shè)置AD的 這個(gè)“ADC_POWER|ADC_SPEEDLL|ch|ADC_START”;或出來(lái)的結(jié)果是
                          //10001000   后面三個(gè)0對(duì)應(yīng)的是 CHS2 CHS1 CHS0 查表格 剛好是P1.0口
                                             //作為AD模擬輸入的。如果要改變端口就要給ch賦值 假如要P1.2 就需要賦值為ch=0x02;
        ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;    //配置相關(guān)項(xiàng)目打開(kāi)  
        _nop_();
        _nop_();
        _nop_();                                            //4個(gè)機(jī)器時(shí)間的延時(shí) 以保障轉(zhuǎn)換完成
        _nop_();
        while(!(ADC_CONTR&ADC_FLAG));   //判斷是否轉(zhuǎn)換完成
        ADC_CONTR&=~ADC_FLAG;                //關(guān)閉ADC
    return (ADC_RES*4+ADC_RESL);            //返回結(jié)果  也就是電壓值
}
/******************************
*  功能        計(jì)算結(jié)果函數(shù)
*  函數(shù)類(lèi)型    float 型  浮點(diǎn)型
*  帶結(jié)果返回  帶結(jié)果返回
******************************/

float  count(uchar ch)
{
        
   temp=(float)GetADCResult(ch)*4.85/1024;

   return temp;
}


/*----------------------------
功能   ADC初始化函數(shù)
----------------------------*/
void InitADC()                                //adc初始化函數(shù)
{
    P1ASF = 0xff;                   //開(kāi)放P1.0通道ADC功能  就是8個(gè)I/O口全部開(kāi)放
    ADC_RES = 0;                    //清除之前的結(jié)果
        ADC_RESL = 0;
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;   //打開(kāi)AD電壓  轉(zhuǎn)換速度540
    Delay(2);                       //ADC 延時(shí)一下
}


/*----------------------------
Software delay function
----------------------------*/
void Delay(uint n)
{
   uint x;

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



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

使用道具 舉報(bào)

沙發(fā)
ID:213173 發(fā)表于 2019-11-4 06:58 | 只看該作者
//函數(shù)類(lèi)型unsigned int
uint GetADCResult(uchar ch)
{
        ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        while(!(ADC_CONTR&ADC_FLAG));
        ADC_CONTR&=~ADC_FLAG;   
        return (ADC_RES*4+ADC_RESL);//返回10位結(jié)果
}
//函數(shù)類(lèi)型unsigned int
uint count(uchar ch)
{      
        ADC_RESX=GetADCResult(ch);
        ADC_mV=(VCC_V*(long)ADC_RESX*10000/1024+5)/10;//強(qiáng)制轉(zhuǎn)換長(zhǎng)整型運(yùn)算,得到結(jié)果mV(4舍5入)
        return ADC_mV;
}
回復(fù)

使用道具 舉報(bào)

板凳
ID:491577 發(fā)表于 2019-11-4 10:34 | 只看該作者
主函數(shù)沒(méi)有調(diào)用到:uchar GetADCResult(uchar ch),
return (ADC_RES*4+ADC_RESL);//會(huì)發(fā)生數(shù)據(jù)溢出錯(cuò)誤
改成:return ((uint)ADC_RES*4+ADC_RESL);
回復(fù)

使用道具 舉報(bào)

地板
ID:254747 發(fā)表于 2019-11-4 10:48 | 只看該作者
wulin 發(fā)表于 2019-11-4 06:58
//函數(shù)類(lèi)型unsigned int
uint GetADCResult(uchar ch)
{

用了你這段還是不可以啊
回復(fù)

使用道具 舉報(bào)

5#
ID:254747 發(fā)表于 2019-11-4 11:06 | 只看該作者
wulin 發(fā)表于 2019-11-4 06:58
//函數(shù)類(lèi)型unsigned int
uint GetADCResult(uchar ch)
{

可以了 可以了  我沒(méi)有給VCC_V賦值
回復(fù)

使用道具 舉報(bào)

6#
ID:213173 發(fā)表于 2019-11-4 11:34 | 只看該作者
還要把P1端口設(shè)置為高阻模式。
P1M1=0xff;
P1M0=0x00;
回復(fù)

使用道具 舉報(bào)

7#
ID:254747 發(fā)表于 2019-11-4 16:08 | 只看該作者
wulin 發(fā)表于 2019-11-4 11:34
還要把P1端口設(shè)置為高阻模式。
P1M1=0xff;
P1M0=0x00;

這是為什么啊  我只用一個(gè)p1.0口
回復(fù)

使用道具 舉報(bào)

8#
ID:213173 發(fā)表于 2019-11-4 16:49 | 只看該作者
不將就123 發(fā)表于 2019-11-4 16:08
這是為什么啊  我只用一個(gè)p1.0口

只一個(gè)P1.0口用作ADC
P1ASF = 0x01;//設(shè)置P1.0做模擬輸入
P1M1=0x01;//設(shè)置P1.0高阻模式
P1M0=0x00;//設(shè)置P1.0高阻模式
回復(fù)

使用道具 舉報(bào)

9#
ID:254747 發(fā)表于 2019-11-4 20:52 | 只看該作者
wulin 發(fā)表于 2019-11-4 16:49
只一個(gè)P1.0口用作ADC
P1ASF = 0x01;//設(shè)置P1.0做模擬輸入
P1M1=0x01;//設(shè)置P1.0高阻模式

可以說(shuō)一下為什么嗎?   謝謝你 大師    我現(xiàn)在要測(cè)量0-30V的電壓    然后電阻分壓是 10k  2k     5/30=0.167比率   然后我 用temp=temp/0.167   以后測(cè)量不出來(lái)啦    是不是我分離有問(wèn)題
回復(fù)

使用道具 舉報(bào)

10#
ID:254747 發(fā)表于 2019-11-4 20:53 | 只看該作者
hhh402 發(fā)表于 2019-11-4 10:34
主函數(shù)沒(méi)有調(diào)用到:uchar GetADCResult(uchar ch),
return (ADC_RES*4+ADC_RESL);//會(huì)發(fā)生數(shù)據(jù)溢出錯(cuò)誤
...

謝謝師傅
回復(fù)

使用道具 舉報(bào)

11#
ID:213173 發(fā)表于 2019-11-5 12:45 | 只看該作者
不將就123 發(fā)表于 2019-11-4 20:52
可以說(shuō)一下為什么嗎?   謝謝你 大師    我現(xiàn)在要測(cè)量0-30V的電壓    然后電阻分壓是 10k  2k     5/30=0 ...

    STC12C5A60S2單片機(jī)的P1上電默認(rèn)高電平為準(zhǔn)雙向口,用作ADC輸入的端口必須設(shè)置為高阻模式,否則端口內(nèi)部上拉電阻會(huì)影響測(cè)量精度,其它口保持準(zhǔn)雙向口模式可以另作它用。設(shè)置P1ASF寄存器的目的是開(kāi)通MCU內(nèi)部ADC模擬輸入通道。其它口保持TTL模式可以另作它用。
    ADC測(cè)量范圍0~VCC,被測(cè)電壓高于VCC需要通過(guò)分壓電阻降到VCC以?xún)?nèi),測(cè)量結(jié)果按降壓比例放大還原。如果分壓是電阻是 10K和2K,取樣電壓是實(shí)際電壓的1/6,等測(cè)量結(jié)果換算成電壓后*6就是實(shí)際電壓值。
回復(fù)

使用道具 舉報(bào)

12#
ID:254747 發(fā)表于 2019-11-5 22:34 | 只看該作者
wulin 發(fā)表于 2019-11-5 12:45
STC12C5A60S2單片機(jī)的P1上電默認(rèn)高電平為準(zhǔn)雙向口,用作ADC輸入的端口必須設(shè)置為高阻模式,否則端口 ...
  1. <blockquote>#include <STC12C5A60S2.H>
復(fù)制代碼
大哥呀  我被這個(gè)東西折磨壞了    我設(shè)置了高阻態(tài)模式  同時(shí) 也設(shè)置了 P1ASF = 0x01;   
但是現(xiàn)在出現(xiàn)的問(wèn)題是   測(cè)量誤差相當(dāng)?shù)拇?nbsp; 
我測(cè)量的是30V的電壓   通過(guò)  10k 2k 分壓后為5v  然后比例是6   結(jié)果當(dāng)被測(cè)電壓為3.0V的時(shí)候   單片機(jī)測(cè)量出來(lái)的就是6.78V  麻煩大哥看一下  是哪里出問(wèn)題了  給我指導(dǎo)一下  非常感謝!!!

代碼有些亂   費(fèi)心了
回復(fù)

使用道具 舉報(bào)

13#
ID:213173 發(fā)表于 2019-11-6 06:57 | 只看該作者
不將就123 發(fā)表于 2019-11-5 22:34
大哥呀  我被這個(gè)東西折磨壞了    我設(shè)置了高阻態(tài)模式  同時(shí) 也設(shè)置了 P1ASF = 0x01;   
但是現(xiàn)在出現(xiàn)的 ...

代碼在哪?
回復(fù)

使用道具 舉報(bào)

14#
ID:254747 發(fā)表于 2019-11-6 11:10 | 只看該作者
我發(fā)了  但是沒(méi)有顯示出來(lái) 我重新給您發(fā)一下
回復(fù)

使用道具 舉報(bào)

15#
ID:254747 發(fā)表于 2019-11-6 11:10 | 只看該作者
#include <STC12C5A60S2.H>
#include "intrins.h"

//typedef unsigned char BYTE;
//typedef unsigned int WORD;

#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long
/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER   0x80            //ADC 電源控制位  10000000  0X80  /
#define ADC_FLAG    0x10            //ADC 完成標(biāo)志          00010000  0x10
#define ADC_START   0x08            //ADC 啟動(dòng)ADC開(kāi)關(guān) 00001000        0x08  /
#define ADC_SPEEDLL 0x00            //420 轉(zhuǎn)換速度          00000000        0x00  /
#define ADC_SPEEDL  0x20            //280 轉(zhuǎn)換速度          00100000  0x20
#define ADC_SPEEDH  0x40            //140 轉(zhuǎn)換速度          01000000  0x40
#define ADC_SPEEDHH 0x60            //70  轉(zhuǎn)換速度          01100000        0x60

//float  temp;    //定義temp為浮點(diǎn)型參數(shù)
/*----------------------------------------------------------------------------------------------
meidangzuidivoltage:表示AD最高電壓5V對(duì)應(yīng)10bit_AD轉(zhuǎn)換的最小電壓是多少 5/1024= 0.00488V 也就是AD在
//10bit下測(cè)量的最小電壓,
//那么在計(jì)算AD電壓值的時(shí)候?qū)⒐?“GetADCResult(ch)*5/1024”分兩步進(jìn)行 方便后面對(duì)數(shù)據(jù)分離顯示到
//1602上面  先計(jì)算ADC_jiancedaozuidivoltage=5*10000000/1024  先將這個(gè)數(shù)放大100萬(wàn)倍
//最后在算AD_jie_guo=(ADC_jiancedaozuidivoltage*GetADCResult(ch);
----------------------------------------------------------------------------------------------*/
ulong  ADC_jiancedaozuidivoltage,AD_jie_guo,temp;

uint num,i,vlue;//ADC_mV,ADC_RESX,VCC_V=5.2;

sbit    lcden = P2^7;
sbit    rs = P2^6;
sbit    rw = P2^5;
sbit    LED = P3^0;

void Delay(uint n);              //延時(shí)函數(shù)
uint GetADCResult(uchar ch);                 // ad轉(zhuǎn)換函數(shù)
void InitADC();                                         //ad初始化函數(shù)
//ulong  count(uchar ch);                     //ad計(jì)算函數(shù)
uchar code table[20]= {"     Shu Kong QuDong"};
uchar code table2[20]={"     CQDZ Alan V1.01"};
float count(uchar ch);
/*  延時(shí)函數(shù)*/
void delayms(uint xms)
{                                       
     uint i,j;                                         
         for(i=xms;i>0;i--)
           for (j=960;j>0;j--);
}
/******寫(xiě)命令****/
void   lcd_write_com(uchar com)
{

         rw=0;
                 rs=0;        //寫(xiě)命令狀態(tài)
                 P0=com;
                 lcden=1;
             delayms(5);
                 lcden=0;
}
/**寫(xiě)數(shù)據(jù) ***/
void  write_date_(uchar date)
{
         rw=0; //寫(xiě)數(shù)據(jù)
                 rs=1; //寫(xiě)數(shù)據(jù)狀態(tài)
                 P0=date;
                 delayms(5);
                 lcden=1;  //使能
             delayms(5);
                 lcden=0;   
}
/*初始化顯示屏*/
void lcd_init(void)
{

                  lcden=0;
                  lcd_write_com(0x38); //設(shè)置8位格式,2行,5*7
                  lcd_write_com(0x0c); //整體顯示,關(guān)光標(biāo),不顯示
                  lcd_write_com(0x06); // 設(shè)定輸入方式,增量不移位
                  lcd_write_com(0x01);//清屏幕
                  delayms(5);  //延?


}

/*-----------------------
函數(shù)名稱(chēng)    格式定義
函數(shù)的介紹  在某個(gè)屏幕位置上顯示一個(gè)字符,X(0-16),y(1-2)
X:表示字的格式 一共16個(gè)  Y:表示行 一共2行
-------------------------*/
//格式定義

void lcd_disp_char(uchar y,uchar x, uint dat)
{
         uint  address;
             if(y==1)                   //y為1  在第一行
                   address=0x80+0x10+4+x;          //整屏左移動(dòng)以后 從新定義新的起始位置 但是要加上之前移動(dòng)后的地址
             else
               address=0xc0+0x10+x;           //y為2 在第二行  X顯示字的位置   0XC0是 0x80+0x40的結(jié)果

           lcd_write_com(address);          //寫(xiě)入要寫(xiě)的位置
                   write_date_( dat);       //寫(xiě)入你要寫(xiě)的數(shù)據(jù)         
}        


/*顯示函數(shù)2*********/
void  disp()
{
         temp=(ADC_jiancedaozuidivoltage*AD_jie_guo);
         temp=(temp*6)/100;            //擴(kuò)大電壓   我的量程是0-30V  分壓電阻是 10k 2k 電阻比的5  反推 當(dāng)測(cè)試電壓為5v
                            //的時(shí)候 最高電壓為25V 測(cè)量后調(diào)試  

        //0x30是顯示數(shù)字 0-9 30表示第一個(gè)數(shù)0  int是將count轉(zhuǎn)換為整數(shù)
        lcd_disp_char(1,0, temp%10000000/1000000+0x30 );   //十位
        lcd_disp_char(1,1, temp%1000000/100000+0x30);   //個(gè)位       
        lcd_disp_char(1,2,'.' );                                 // 小數(shù)點(diǎn)
        lcd_disp_char(1,3, temp%100000/10000+0x30 ); //個(gè)分位
        lcd_disp_char(1,4, temp%10000/1000+0x30 ); //百分位
        lcd_disp_char(1,5,'V' );
}
                                          //count(0)
/*-----------------------------------                  
功能 開(kāi)機(jī)的時(shí)候顯示一下銘牌
for來(lái)完成 屏幕左移動(dòng)
----------------------------------*/
void init()

{       



//        lcd_write_com(0x80+0x10);  //定義顯示的位置 起始地址       
        lcd_write_com(0x80);           //定義顯示的位置 起始地址

        for(num=0;num<20;num++)
         {       
               
                        write_date_(table[num]);               //初始化屏幕的初始數(shù)字“0000”
                        delayms(5);                         
     }
                 
//        lcd_write_com(0x80+0x40+0x10);   //定義第二排,顯示的地址 0x80是顯示屏寄存器第一排起始地址
        lcd_write_com(0xc0);                  //定義顯示的位置 起始地址
    for(num=0;num<20;num++)                         //0x40是第二排起始地址
      {
                   write_date_(table2[num]);
                   delayms(5);                  
          }

          for(num=0;num<20;num++)        //整屏左移動(dòng) 這里的21就是指可以移動(dòng)多少格  可以是100可以是1000 相當(dāng)于是電子屏幕一樣
          {
              lcd_write_com(0x18);        //0x18是整屏左移 指令
                  delayms(50);
          }       
          

}



void main()

{       

       
    lcd_init();
        init();
    InitADC();                      //Init ADC sfr

        ADC_jiancedaozuidivoltage=49700000/1024;  //5V參考電壓,計(jì)算分度值的時(shí)候,數(shù)值過(guò)小會(huì)出現(xiàn)很大偏差
                                                          //所以放大1000萬(wàn)倍 這樣精度會(huì)高一些

    while (1)
    {
          /*
          if(temp > 3)
                   {
                  LED = 0;
                                                 //  調(diào)試的時(shí)候用的   通過(guò)判斷temp來(lái)判斷是否過(guò)壓 如果過(guò)壓就啟動(dòng)保護(hù)  
                 }
           if(temp < 3)
                   {
                  LED = 1;
                 
                 }*/

           AD_jie_guo = count(0);   //經(jīng)過(guò)上面的計(jì)算求出來(lái)100次的平均值存放在AD_jie_guo里面
       disp();
          
    }
}

/*************************
*  功能        ADC轉(zhuǎn)換函數(shù)
*  帶結(jié)果返回  帶結(jié)果返回
**************************/

uint GetADCResult(uchar ch)  //參數(shù)的定義“ch”初始化就是為0  所以這里的“ch”應(yīng)該是用來(lái)設(shè)置用哪個(gè)端口     
{                                                   //來(lái)設(shè)置AD的 這個(gè)“ADC_POWER|ADC_SPEEDLL|ch|ADC_START”;或出來(lái)的結(jié)果是
                          //10001000   后面三個(gè)0對(duì)應(yīng)的是 CHS2 CHS1 CHS0 查表格 剛好是P1.0口
                                             //作為AD模擬輸入的。如果要改變端口就要給ch賦值 假如要P1.2 就需要賦值為ch=0x02;
        ADC_CONTR = ADC_POWER|ADC_SPEEDLL|ch|ADC_START;    //配置相關(guān)項(xiàng)目打開(kāi)  
        _nop_();
        _nop_();
        _nop_();                                            //4個(gè)機(jī)器時(shí)間的延時(shí) 以保障轉(zhuǎn)換完成
        _nop_();       
        while(!(ADC_CONTR&ADC_FLAG));   //判斷是否轉(zhuǎn)換完成
        ADC_CONTR &= ~ADC_FLAG;                //關(guān)閉ADC
    vlue = (ADC_RES*4+ADC_RESL);            //返回結(jié)果10bit  也就是電壓值
        Delay(2);                                                  //延時(shí)一下不然電壓的后2位變化的太快
        return vlue;

}
/******************************
*  功能:計(jì)算1結(jié)果函數(shù) 將10bit的結(jié)果計(jì)算為對(duì)應(yīng)電壓值MV
*  函數(shù)類(lèi)型    float 型  浮點(diǎn)型
*  帶結(jié)果返回  帶結(jié)果返回
******************************/
/*
ulong count(uchar ch)
{      
        ADC_RESX=GetADCResult(ch);
        ADC_mV=(VCC_V*(long)ADC_RESX*10000/1024+5)/10;//強(qiáng)制轉(zhuǎn)換長(zhǎng)整型運(yùn)算,得到結(jié)果mV(4舍5入)
        return ADC_mV;
}*/




/******************************
*  功能:計(jì)算2結(jié)果函數(shù) 將10bit的結(jié)果計(jì)算為對(duì)應(yīng)電壓值MV
*  函數(shù)類(lèi)型    float 型  浮點(diǎn)型
*  帶結(jié)果返回  帶結(jié)果返回
******************************/

float count(uchar ch)
{
    float AD_val;     //定義處理后的數(shù)值A(chǔ)D_val為浮點(diǎn)數(shù)
        uchar n;
        for(n=0;n<100;n++)
        AD_val+=GetADCResult(ch); //轉(zhuǎn)換100次求平均值(提高精度)
        AD_val/=100;                          //意思是GetADCResult(ch)經(jīng)過(guò)了100次轉(zhuǎn)換后的值保存到了AD_val里面 然后在
                                  //除以100 就是求平均值 這樣的精度高一點(diǎn)
//        AD_val=(AD_val*5)/1024; //AD的參考電壓是單片機(jī)上的5v,所以乘5即為實(shí)際電壓值,應(yīng)為分段計(jì)算這個(gè)就
                            //暫時(shí)不用  如果測(cè)量0-5v就可以這樣計(jì)算
        return AD_val;






  // temp = (float)GetADCResult(ch)*5/1024;  //5表示單片機(jī)的供電 這個(gè)公式在手冊(cè)上可以看到

   //temp = (float) temp*5;

  // return  temp;       
                        //這里的temp值就是最終的電壓值MV 轉(zhuǎn)換成V就在乘以1000
}                                                                          //在顯示屏函Dispy數(shù)里面已經(jīng)做了倍率乘法









/*----------------------------
功能   ADC初始化函數(shù)
----------------------------*/
void InitADC()                                //adc初始化函數(shù)
{         
    P1M1=0x01;       //設(shè)置P1.0高阻模式                  
    P1M0=0x00;       //設(shè)置P1.0高阻模式
       
    P1ASF = 0x01;                   //開(kāi)放P1.0通道ADC功能  就是8個(gè)I/O口全部開(kāi)放
    ADC_RES = 0;                    //清除之前的結(jié)果
        ADC_RESL = 0;
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;   //打開(kāi)AD電壓  轉(zhuǎn)換速度540
    Delay(2);                       //ADC 延時(shí)一下
}


/*----------------------------
Software delay function
----------------------------*/
void Delay(uint n)
{
   uint x;

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




回復(fù)

使用道具 舉報(bào)

16#
ID:254747 發(fā)表于 2019-11-6 11:11 | 只看該作者

大哥  我重新發(fā)了一次   您在給我看看
回復(fù)

使用道具 舉報(bào)

17#
ID:254747 發(fā)表于 2019-11-6 22:07 | 只看該作者

可以了 大哥   哎呀 我知道為什么我的高阻模式不管用了  是應(yīng)為我在開(kāi)發(fā)板上面弄的  這個(gè)上面有上拉電阻 導(dǎo)致p1^0始終都有電壓存在 這才導(dǎo)致電壓檢測(cè)誤差特別大  我現(xiàn)在把這個(gè)叫 拿出來(lái) 就對(duì)了 程序沒(méi)有問(wèn)題   但是我是參考網(wǎng)上的  這里有一句我不是特別懂 為什么要/100       temp=(ADC_jiancedaozuidivoltage*AD_jie_guo);
         temp=(temp*6)/100;    //這里為什么要除以100   麻煩講一下  謝謝      

IMG20191106215829.jpg (3.2 MB, 下載次數(shù): 68)

IMG20191106215829.jpg

IMG20191106215832.jpg (2.7 MB, 下載次數(shù): 52)

IMG20191106215832.jpg
回復(fù)

使用道具 舉報(bào)

18#
ID:254747 發(fā)表于 2019-11-6 22:09 | 只看該作者
感謝論壇的各位朋友  問(wèn)題現(xiàn)在已經(jīng)解決了  是開(kāi)發(fā)板上面的 上拉電阻導(dǎo)致的誤差  將I0口拿出來(lái)測(cè)試 問(wèn)題得到完美的解決了      
temp=(ADC_jiancedaozuidivoltage*AD_jie_guo);
temp=(temp*6)/100;   //這里為什么要/100     這個(gè)是我參考網(wǎng)上大師做的     
                        
回復(fù)

使用道具 舉報(bào)

19#
ID:213173 發(fā)表于 2019-11-7 10:57 | 只看該作者
不將就123 發(fā)表于 2019-11-6 22:07
可以了 大哥   哎呀 我知道為什么我的高阻模式不管用了  是應(yīng)為我在開(kāi)發(fā)板上面弄的  這個(gè)上面有上拉電阻  ...

給你把程序改好了,有詳細(xì)注釋。
電壓表.zip (18.9 KB, 下載次數(shù): 32)



回復(fù)

使用道具 舉報(bào)

20#
ID:254747 發(fā)表于 2019-11-9 13:05 | 只看該作者
wulin 發(fā)表于 2019-11-7 10:57
給你把程序改好了,有詳細(xì)注釋。

非常感謝 我下載了 我需要好好去學(xué)習(xí)哈
回復(fù)

使用道具 舉報(bào)

21#
ID:600631 發(fā)表于 2020-1-29 09:47 來(lái)自觸屏版 | 只看該作者
wulin 發(fā)表于 2019-11-7 10:57
給你把程序改好了,有詳細(xì)注釋。

師傅,這個(gè)程序,如果再增加一路測(cè)試電壓的話(huà),程序應(yīng)該怎么寫(xiě)呢
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 午夜网| 韩日av在线 | 成人在线视频看看 | 日韩一区二区免费视频 | www狠狠干| 成人精品一区二区三区中文字幕 | 国产一区二区三区网站 | 免费一区二区三区在线视频 | 亚洲成人免费视频 | 欧美成人精品一区二区男人看 | 爱草在线 | 蜜桃视频成人 | 色接久久 | 观看av| 老妇激情毛片免费 | www.99热| 国产www成人 | 美日韩精品 | 99精品一区二区 | 日本一区二区三区在线观看 | 亚州毛片 | 日韩精品一区二区三区视频播放 | 色综合久久天天综合网 | 国产不卡视频 | 99热播放| 超碰人人人 | 国产高清在线精品 | 99re国产| 国产精品美女www | 亚洲国产精品va在线看黑人 | 国产免费黄网 | 自拍视频精品 | 国产激情一区二区三区 | 午夜寂寞福利视频 | 亚洲成人高清 | 亚洲大片一区 | 一本一道久久a久久精品综合 | 欧美久久久电影 | 久久久91精品国产一区二区三区 | 国产高清在线 | 国产欧美一区二区三区在线看 |