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

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

QQ登錄

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

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

STC8a單片機(jī)雙通道AD采集問(wèn)題

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:282747 發(fā)表于 2019-3-20 17:27 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
10黑幣
單片機(jī) stc8a8k
2路電壓采集異常,求大佬指導(dǎo)一下程序,哪邊有問(wèn)題?
調(diào)試設(shè)置單通道,能采集單通道電壓,設(shè)置雙通道,2個(gè)都采集不了求大佬指導(dǎo)一下
#include"stc8f.h"#include <intrins.h>
#include <stdio.h>
#define VCC  2.50
#define uint unsigned int
#define uchar  unsigned char

#define ADC_CHANNEL0         0x00            //轉(zhuǎn)換通道P1.0
#define ADC_CHANNEL1         0x01            //轉(zhuǎn)換通道P1.1
#define ADC_CHANNEL2         0x02            //轉(zhuǎn)換通道P1.2
#define ADC_CHANNEL3         0x03            //轉(zhuǎn)換通道P1.3
#define ADC_CHANNEL4         0x04            //轉(zhuǎn)換通道P1.4
#define ADC_CHANNEL5         0x05            //轉(zhuǎn)換通道P1.5
#define ADC_CHANNEL6         0x06            //轉(zhuǎn)換通道P1.6
#define ADC_CHANNEL7         0x07            //轉(zhuǎn)換通道P1.7
#define ADC_CHANNEL8         0x08            //轉(zhuǎn)換通道P0.0
#define ADC_CHANNEL9         0x09            //轉(zhuǎn)換通道P0.1
#define ADC_CHANNEL10         0x0a            //轉(zhuǎn)換通道P0.2
#define ADC_CHANNEL11         0x0b            //轉(zhuǎn)換通道P0.3
#define ADC_CHANNEL12         0x0c            //轉(zhuǎn)換通道P0.4
#define ADC_CHANNEL13         0x0d            //轉(zhuǎn)換通道P0.5
#define ADC_CHANNEL14         0x0e            //轉(zhuǎn)換通道P0.6

uint a;
bit flag_1= 0;bit flag_2=0;bit flag_3=0; bit flag_4=0;
uchar count=0;  // 變量計(jì)數(shù)器


void Delay500ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        i = 29;
        j = 14;
        k = 54;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}


void Delay1ms(a)                //@11.0592MHz
{
        unsigned char i, j;

        i = 15;
        j = 90;
        do
        {
                while (--j);
        } while (--i);
}





void UartInit(void)                //9600bps@11.0592MHz
{
        SCON = 0x50;                //8位數(shù)據(jù),可變波特率
        AUXR |= 0x40;                //定時(shí)器1時(shí)鐘為Fosc,即1T
        AUXR &= 0xFE;                //串口1選擇定時(shí)器1為波特率發(fā)生器
        TMOD &= 0x0F;                //設(shè)定定時(shí)器1為16位自動(dòng)重裝方式
        TL1 = 0xE0;                //設(shè)定定時(shí)初值
        TH1 = 0xFE;                //設(shè)定定時(shí)初值
        ET1 = 0;                //禁止定時(shí)器1中斷
        TR1 = 1;                //啟動(dòng)定時(shí)器1
        TI=1;
}

void ADC_init()
  {
   P1M0 = 0x00;
   P1M1 = 0xff;
   P0M0 = 0x00;
   P0M1 = 0xff;
   ADCCFG = 0x0f;
   ADC_CONTR|=0x80; //開(kāi)啟AD轉(zhuǎn)換電源
   Delay1ms(2);
  }

uint ADC_GetResult(unsigned char ch)
{
   uint ADC_Value=0;
   ADC_RES=0;
   ADC_RESL=0;
   ADC_CONTR|= ch;
   ADC_CONTR|= 0x40;//啟動(dòng)AD轉(zhuǎn)換
   Delay1ms(1);
   while(!(ADC_CONTR&0x20));
   ADC_CONTR&=~0x20;                  //清完成標(biāo)志
   ADC_Value=ADC_RES;                                                                //讀取ADC高八位
  ADC_Value=(ADC_Value<<8)|ADC_RESL;//讀取ADC低四位,并且數(shù)據(jù)合并
  ADC_Value>>=4;                                                                                //數(shù)據(jù)右移4位,高12位為所需要的數(shù)據(jù)
  return ADC_Value;  

  }

void Timer0Init(void)                //1毫秒@11.0592MHz
{
        AUXR |= 0x80;                //定時(shí)器時(shí)鐘1T模式
        TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
        TL0 = 0xCD;                //設(shè)置定時(shí)初值
        TH0 = 0xD4;                //設(shè)置定時(shí)初值
        TF0 = 0;                //清除TF0標(biāo)志
        TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
        EA = 1;                        //開(kāi)總中斷
        ET0 = 1;           //開(kāi)定時(shí)器T1中斷
}

void Timer0(void) interrupt 1
  {
   TL0 = 0xCD;                //設(shè)置定時(shí)初值
   TH0 = 0xD4;                //設(shè)置定時(shí)初值
        count++;                 //每次中斷加1
   if(count>=20)         //如果計(jì)數(shù)到了100ms
         {
           flag_1= 1;
         }
   if (count>=40)
     {
           flag_2= 1;
         }
   if (count>=60)
          {
           flag_3= 1;
          }
   if (count>=80)
      {
           count=0;
           flag_4= 1;
          }
   }


void main()
{
  float Vin1,Vin2;
  uint AD1=0;
  uint AD2=0;
  ADC_init();
  Timer0Init();
  UartInit();
  printf("串口初始化完畢");
  while(1)
  {
    if(flag_1==1)
          {        
           flag_1=0;
           AD1=ADC_GetResult(ADC_CHANNEL6);
                }                           
        if(flag_2==1)
          {
           flag_2=0;
         Vin1 = VCC*AD1/4090;
          }
        if(flag_3==1)
          {        
           flag_3=0;
          AD2=ADC_GetResult(ADC_CHANNEL5);
          }                           
         if(flag_4==1)
          {        
           flag_4=0;
         Vin2 = VCC*AD2/4090;
           }
        printf ("%.2f,%.2f",Vin1,Vin2);
        Delay500ms();
   }
}

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

使用道具 舉報(bào)

沙發(fā)
ID:491577 發(fā)表于 2019-3-20 21:18 | 只看該作者
紅色部分有問(wèn)題,應(yīng)該用else if語(yǔ)句,先寫(xiě):
if (count>=80)

flag_4= 1;

else if (count>=60)

flag_3= 1;

......
void Timer0(void) interrupt 1
  {
   TL0 = 0xCD;                //設(shè)置定時(shí)初值
   TH0 = 0xD4;                //設(shè)置定時(shí)初值
        count++;                 //每次中斷加1
  if(count>=20)         //如果計(jì)數(shù)到了100ms
         {
           flag_1= 1;
         }
   if (count>=40)
     {
           flag_2= 1;
         }
   if (count>=60)
          {
           flag_3= 1;
          }
   if (count>=80)
      {
           count=0;
           flag_4= 1;

          }
   }
回復(fù)

使用道具 舉報(bào)

板凳
ID:282747 發(fā)表于 2019-3-20 23:40 來(lái)自手機(jī) | 只看該作者
hhh402 發(fā)表于 2019-3-20 21:18
紅色部分有問(wèn)題,應(yīng)該用else if語(yǔ)句,先寫(xiě):
if (count>=80)


不行啊,朋友這樣改,連子程序都進(jìn)不去
回復(fù)

使用道具 舉報(bào)

地板
ID:282747 發(fā)表于 2019-3-21 00:10 來(lái)自手機(jī) | 只看該作者
自己解決了,多通道采集需要把原通道清零
回復(fù)

使用道具 舉報(bào)

5#
ID:401564 發(fā)表于 2019-3-21 09:57 | 只看該作者
shijie240 發(fā)表于 2019-3-21 00:10
自己解決了,多通道采集需要把原通道清零

緩存要清除而已,兩個(gè)ADC結(jié)果保存的寄存器不需要清除的,一次完整的ADC運(yùn)行之后,這兩個(gè)寄存器自然就保存了本次ADC的結(jié)果了
回復(fù)

使用道具 舉報(bào)

6#
ID:282747 發(fā)表于 2019-3-21 11:46 | 只看該作者
Y_G_G 發(fā)表于 2019-3-21 09:57
緩存要清除而已,兩個(gè)ADC結(jié)果保存的寄存器不需要清除的,一次完整的ADC運(yùn)行之后,這兩個(gè)寄存器自然就保存了 ...

ADC_CONTR|= ch;通道選擇要清除上一個(gè)選擇的通道,要不然進(jìn)不了下一個(gè),多通道循環(huán)采集不了
回復(fù)

使用道具 舉報(bào)

7#
ID:401564 發(fā)表于 2019-3-21 16:29 | 只看該作者
shijie240 發(fā)表于 2019-3-21 11:46
ADC_CONTR|= ch;通道選擇要清除上一個(gè)選擇的通道,要不然進(jìn)不了下一個(gè),多通道循環(huán)采集不了

ADC_CONTR|= ch
這個(gè)是通道選擇,單片機(jī)只有一個(gè)ADC電路,但它有15個(gè)ADC的IO端口,所以,你是一定要選擇哪個(gè)通道進(jìn)行ADC才能正確的進(jìn)行ADC,它實(shí)際上是一個(gè)類似選擇開(kāi)關(guān)的樣子
其實(shí)我看不懂你的程序,我是用匯編的,但我感覺(jué)你的代碼是有點(diǎn)多了,就是匯編也用不了那么多的代碼量的,更何況是C呢
回復(fù)

使用道具 舉報(bào)

8#
ID:282747 發(fā)表于 2019-3-25 11:42 | 只看該作者
Y_G_G 發(fā)表于 2019-3-21 16:29
ADC_CONTR|= ch
這個(gè)是通道選擇,單片機(jī)只有一個(gè)ADC電路,但它有15個(gè)ADC的IO端口,所以,你是一定要選擇哪個(gè) ...

我這個(gè)是測(cè)試代碼,隨便編的
回復(fù)

使用道具 舉報(bào)

9#
ID:394367 發(fā)表于 2019-3-29 13:45 | 只看該作者
學(xué)習(xí)了,樓主,我也正用到
回復(fù)

使用道具 舉報(bào)

10#
ID:375092 發(fā)表于 2019-3-30 11:20 | 只看該作者
樓主,你不把這個(gè)寫(xiě)在中斷里面,直接在主函數(shù)中調(diào)用一個(gè)函數(shù)直接在主函數(shù)中直接顯示會(huì)比較好,我之前都有做過(guò),最多幾毫秒的延時(shí)就夠了,直接改變通道就行了
回復(fù)

使用道具 舉報(bào)

11#
ID:282747 發(fā)表于 2019-4-3 09:50 | 只看該作者
609763691 發(fā)表于 2019-3-30 11:20
樓主,你不把這個(gè)寫(xiě)在中斷里面,直接在主函數(shù)中調(diào)用一個(gè)函數(shù)直接在主函數(shù)中直接顯示會(huì)比較好,我之前都有做 ...

我采集的13個(gè)通道數(shù)據(jù),必須精確的微秒,這個(gè)是我的測(cè)試程序,項(xiàng)目是在子程序里面的
回復(fù)

使用道具 舉報(bào)

12#
ID:272876 發(fā)表于 2019-4-23 15:43 | 只看該作者
609763691 發(fā)表于 2019-3-30 11:20
樓主,你不把這個(gè)寫(xiě)在中斷里面,直接在主函數(shù)中調(diào)用一個(gè)函數(shù)直接在主函數(shù)中直接顯示會(huì)比較好,我之前都有做 ...

分下下你的程序唄大佬
回復(fù)

使用道具 舉報(bào)

13#
ID:272876 發(fā)表于 2019-4-23 15:45 | 只看該作者
我想寫(xiě)一個(gè)7通道的  該怎么搞啊  能不能分享下你的程序
回復(fù)

使用道具 舉報(bào)

14#
ID:272876 發(fā)表于 2019-4-24 15:35 | 只看該作者
shijie240 發(fā)表于 2019-3-21 00:10
自己解決了,多通道采集需要把原通道清零

怎么清零原通道 我試了下 沒(méi)成功
回復(fù)

使用道具 舉報(bào)

15#
ID:272876 發(fā)表于 2019-4-24 17:25 | 只看該作者
609763691 發(fā)表于 2019-3-30 11:20
樓主,你不把這個(gè)寫(xiě)在中斷里面,直接在主函數(shù)中調(diào)用一個(gè)函數(shù)直接在主函數(shù)中直接顯示會(huì)比較好,我之前都有做 ...

能分享下程序嗎
回復(fù)

使用道具 舉報(bào)

16#
ID:157579 發(fā)表于 2019-7-10 16:11 | 只看該作者
您好,關(guān)于STC8A單片機(jī)雙通道AD采集源碼,您這邊能不能分享一下。
回復(fù)

使用道具 舉報(bào)

17#
ID:581932 發(fā)表于 2019-7-10 21:13 | 只看該作者
樓主。怎么清零通道?我也遇到這個(gè)問(wèn)題了。
我的ADC函數(shù)和你差不多的。
uint GetADCresults(uchar adcch)
{
        ADC_RES  = 0;
        ADC_RESL = 0;

        ADC_CONTR |= ADC_START|adcch;               //¿aÆôADC
        Delay(10);
        while(!(ADC_CONTR & ADC_FLAG));            
        ADC_CONTR &= ~ADC_FLAG;                  
        ADC_CONTR &= ~ADC_START;                  
       
        return (ADC_RES<<8 | ADC_RESL);
}
主函數(shù)里面調(diào)用函數(shù),傳通道值獲得ADC結(jié)果,但是兩個(gè)通道得到的數(shù)據(jù)是一樣的。
DZ_Data = GetADCresults(ADCch_dz);
GD_Data = GetADCresults(ADCch_gd);

這兩句之間做了500ms 的延時(shí),結(jié)果取出來(lái)還是差不多的,有時(shí)候還一樣。
請(qǐng)幫忙!~
回復(fù)

使用道具 舉報(bào)

18#
ID:581305 發(fā)表于 2019-7-18 10:56 | 只看該作者
echowilson 發(fā)表于 2019-7-10 21:13
樓主。怎么清零通道?我也遇到這個(gè)問(wèn)題了。
我的ADC函數(shù)和你差不多的。
uint GetADCresults(uchar adcch) ...

ADC_CONTR |= ADC_START|adcch; 這里有問(wèn)題
回復(fù)

使用道具 舉報(bào)

19#
ID:117310 發(fā)表于 2019-9-12 23:36 | 只看該作者
我也是做八通道順序采集,開(kāi)始沒(méi)有在循環(huán)結(jié)束時(shí)候加禁用ADC指令時(shí)候,第八通道電壓不對(duì),而且零點(diǎn)也有十幾個(gè)字,加了禁用后,零點(diǎn)只有一個(gè)字,但是第一個(gè)通道沒(méi)有數(shù)據(jù),始終是0,不知道怎么回事了?


        ADCCFG = 0x20; //設(shè)置ADC結(jié)果右對(duì)齊,轉(zhuǎn)換速度為最快
        for (i = 0; i < 8; i++)
            {
                ADC_CONTR = (0x80 | i );                       //使能ADC模塊并設(shè)置通道
                ADC_CONTR |= 0x40;                          //啟動(dòng)AD轉(zhuǎn)換
                _nop_();
                _nop_();
                while (!(ADC_CONTR & 0x20));                //查詢ADC完成標(biāo)志
                ADC_CONTR &= ~0x20;                         //清完成標(biāo)志
                ADC[i] = (ADC_RES << 8) | ADC_RESL;
            }
                ADC_CONTR = 0x00;//禁用ADC模塊
            //8個(gè)AD結(jié)果顯示輸出
        for (i = 0; i < 8; i++)
            {
                UartSend(ADC[i]>>8);
                UartSend(ADC[i]);
            }            
        UartSendStr("\r\n");//輸出回車(chē)換行符
回復(fù)

使用道具 舉報(bào)

20#
ID:189860 發(fā)表于 2021-10-26 16:27 | 只看該作者
回復(fù)19#,你在選擇通道的時(shí)候要先將ADC_CONTR &=0XF0;這樣將低四位清了,再或上通道號(hào)才能真正的到你要的通道。不然一直或或的,你想想或成什么通道了?
回復(fù)

使用道具 舉報(bào)

21#
ID:562627 發(fā)表于 2022-9-19 17:17 | 只看該作者
6726234500 發(fā)表于 2019-4-24 15:35
怎么清零原通道 我試了下 沒(méi)成功

uint ADC_GetResult(unsigned char ch)
{
   uint ADC_Value=0;
   ADC_RES=0;
   ADC_RESL=0;
   ADC_CONTR|= ch;
   ADC_CONTR|= 0x40;//啟動(dòng)AD轉(zhuǎn)換
   Delay1ms(1);
   while(!(ADC_CONTR&0x20));
   ADC_CONTR&=~0x20;                  //清完成標(biāo)志
   ADC_Value=ADC_RES;                                                                //讀取ADC高八位
  ADC_Value=(ADC_Value<<8)|ADC_RESL;//讀取ADC低四位,并且數(shù)據(jù)合并
  ADC_Value>>=4;                                                                                //數(shù)據(jù)右移4位,高12位為所需要的數(shù)據(jù)
  ADC_RES=0;                           //清除ADC高8位數(shù)據(jù)
ADC_RESL=0;                           //清除ADC低4位數(shù)據(jù)
  return ADC_Value;  

  }

即轉(zhuǎn)換1次清除1次數(shù)據(jù)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久一区二区 | 精品成人在线观看 | 久久一区视频 | 日本一区二区三区四区 | 久久久国产视频 | 亚洲日本中文 | 成人天堂噜噜噜 | 日本免费一区二区三区四区 | 日韩爱爱网 | 国产亚洲精品美女久久久久久久久久 | 中文字幕日韩一区 | 免费视频一区二区三区在线观看 | 天天弄天天操 | 欧美精品二区 | 在线观看成人小视频 | 中文字幕视频在线观看免费 | 日韩视频国产 | 亚洲视频中文字幕 | 国产在线精品一区二区三区 | 亚洲午夜精品视频 | 国产精品久久久久久久免费观看 | 亚洲一区 中文字幕 | 久久这里有精品 | 欧美精品久久久久久久久老牛影院 | 久久新 | 国产精品久久久久久高潮 | 中文字幕国产在线 | 亚洲国产成人精品久久久国产成人一区 | 久久精品在线免费视频 | 欧美日韩精品久久久免费观看 | 91九色麻豆 | 欧美久久影院 | 日韩成人在线视频 | 综合久久亚洲 | 午夜精品在线观看 | 精品国产欧美 | 影视先锋av资源噜噜 | 色婷婷精品国产一区二区三区 | 欧美日本亚洲 | 亚洲一区| 一区二区国产精品 |