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

QQ登錄

只需一步,快速開始

搜索
查看: 4082|回復(fù): 8
收起左側(cè)

stc8H3k32s2單片機(jī)中斷方式ADC轉(zhuǎn)換有問(wèn)題,請(qǐng)大家指點(diǎn)一下

[復(fù)制鏈接]
ID:686513 發(fā)表于 2021-12-26 13:38 | 顯示全部樓層 |閱讀模式
一直卡在ADC轉(zhuǎn)換等待那里,屏沒顯示。把ADC_IN();注示掉就可以顯示000.這個(gè)中斷程序是抄stc規(guī)格書里的.應(yīng)該不會(huì)錯(cuò)呀。下面是原理圖

芯片和基準(zhǔn)電壓供電

芯片和基準(zhǔn)電壓供電

氣壓力傳感器

氣壓力傳感器


單片機(jī)源程序如下:
//ADC基本操作(中斷方式)
#include "ADC.H"
unsigned int AD_Dat;


        
void ADC_IN()
{         
          P1M1 = 0x01;   P1M0 = 0x00;   //設(shè)置 P1.0 為 ADC 輸入口

         
        P_SW2|=0X80;    //打開特殊功能寄存器
        ADCTIM=0X3F;    //設(shè)置ADC內(nèi)部時(shí)序
        P_SW2&=0X7F;    //關(guān)閉特殊功能寄存器
        ADCCFG=0X0F;    //設(shè)置ADC結(jié)果左對(duì)齊+ADC時(shí)鐘為系統(tǒng)時(shí)鐘/2/16
        
        ADC_CONTR=0X80; //使能ADC模塊(ADC電源打開并選擇ADC通道P1.0/ADC0)
        EADC=1;         //使能ADC中斷 (ADC中斷打開)
        EA=1;           //總開關(guān)打開
        ADC_CONTR|=0X40;        //啟動(dòng)AD轉(zhuǎn)換

   while(1);
}

void ADC_ISR()interrupt 5
{
        
        ADC_CONTR&=~0X20;          //清中斷標(biāo)志
        AD_Dat=(ADC_RES<<8)|ADC_RESL;               //讀取ADC結(jié)果
        ADC_CONTR|=0X40;          //繼續(xù)AD轉(zhuǎn)換
}
上面是.C文件 ,下面是.H文件
#ifndef __ADC_H__
#define __ADC_H__

#include  "stc8hxx.h"
sbit a2=P1^1;
sbit a3=P1^7;

void ADC_IN();
extern unsigned int AD_Dat;

#endif


main程序
//頭文件
#include  "stc8hxx.h"       //包含此頭文件后,里面聲明的寄存器不需要再手動(dòng)輸入,避免重復(fù)定義
#include  "delay.h"
#include  "display.h"
#include  "key.h"
#include "ADC.H"

#define     MAIN_Fosc      12000000L   //定義主時(shí)鐘

/*******************************************************************************
* 文件名: 重定義
* 描  述:   
* 功  能:
* 作  者:
* 版本號(hào):1.0.1(2017.05.23)
*******************************************************************************/
//typedef unsigned char u8;
//typedef unsigned int u16;
//typedef     unsigned long   u32;


/*******************************************************************************
* 文件名:全局變量定義區(qū)域
* 描  述:
* 功  能:
* 作  者:
* 版本號(hào):1.0.1(2015.03.03)
*******************************************************************************/


unsigned char wnd=0;     //窗口變量,初始為P1    0可以改變默認(rèn)窗口
unsigned char parm1=0;   //窗口P1 對(duì)應(yīng)的變量
unsigned char parm2=0;   //窗口P2 對(duì)應(yīng)的變量
unsigned char parm3=0;   //窗口P3 對(duì)應(yīng)的變量
unsigned char parm4=0;   //窗口P4 對(duì)應(yīng)的變量

/*******************************************************************************
* 文件名:函數(shù)前置聲明
* 描  述:   
* 功  能:
* 作  者:
* 版本號(hào):1.0.1(2017.05.23)
*******************************************************************************/
void dis_Service();  //顯示的功能函數(shù)
void key_Service();  //按鍵的功能函數(shù)

/*******************************************************************************
* 文件名:主函數(shù)
* 描  述: 完成程序模塊的調(diào)用
* 功  能:
* 參  數(shù):無(wú)
* 版本號(hào):1.0.1(2017.05.23)
*******************************************************************************/                                 
                                 
void main()
{         
    P0M1 = 0x00;   P0M0 = 0x00;   //設(shè)置為準(zhǔn)雙向口
    P2M1 = 0x00;   P2M0 = 0x00;   //設(shè)置為準(zhǔn)雙向口
    P3M1 = 0x00;   P3M0 = 0x00;   //設(shè)置為準(zhǔn)雙向口   
    P5M1 = 0x00;   P5M0 = 0x00;   //設(shè)置為準(zhǔn)雙向口
    //P1M1 = 0x01;   P1M0 = 0x00;   //設(shè)置 P1.0 為 ADC 輸入口
         
//          led1=0; md1=0; fmq=0;
           a2=0; a3=0;
         
         
         
                 while(1)
           {
                        
//開機(jī)界面
// unsigned int i;
//         
//    for(i=0;i<5000;i++)
//     {
//                        Display();
//                 }
                                      
                          ADC_IN();               
                          dis_Service();
              Display();
           }

}


void dis_Service()
{
        
                         LEDBuf[0]=AD_Dat/100;
                          LEDBuf[1]=AD_Dat%100/10;                          
                          LEDBuf[2]=AD_Dat%10;
                          LEDBuf[3]=wnd;
                        
                        
}

還有個(gè)顯示子程序
#include "display.h"

        
//共陽(yáng)數(shù)碼管編碼表
unsigned char code leddata[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
                            0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,0x91};
//共陰數(shù)碼管編碼表
//unsigned char code table[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
//                           0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
                                                                                                               
//數(shù)據(jù)顯示緩沖區(qū)
unsigned char LEDBuf[]= {16,13,2,8};        

//位選信號(hào)
unsigned char code PLACE_CODE[] ={0xfe,0xfd,0xfb,0xf7};
//單位段碼
unsigned char code unit[] ={0xfe,0xfd,0xf7,0xfb};
void Display()
{
        unsigned char i;
        //1.送段碼        
        //2.送位選
  //3.延時(shí) 1ms  全部數(shù)碼管顯示時(shí)間<10ms
  //4.消隱
        switch(i)
        {
                case 0:
                        duan=leddata[LEDBuf[0]];
                  wei=PLACE_CODE[0];
                  DelayXms(1);
                  duan=0xff;
                  i++;
                  break;
          case 1:
                        duan=leddata[LEDBuf[1]];
                  wei=PLACE_CODE[1];
                  DelayXms(1);
                  duan=0xff;
                  i++;
                break;
                 
                case 2:
                        duan=leddata[LEDBuf[2]];
                  wei=PLACE_CODE[2];
                  DelayXms(1);
                  duan=0xff;
                  i++;
                break;
               
                case 3:
                        duan=unit[LEDBuf[3]];
                  wei=PLACE_CODE[3];
                  DelayXms(1);
                  duan=0xff;
                  i=0;
                break;
               
               
                default:break;
               
        }
        
}

回復(fù)

使用道具 舉報(bào)

ID:301191 發(fā)表于 2021-12-27 04:43 | 顯示全部樓層
頂一下
回復(fù)

使用道具 舉報(bào)

ID:155507 發(fā)表于 2021-12-27 08:33 | 顯示全部樓層
void ADC_IN()
{         
          P1M1 = 0x01;   P1M0 = 0x00;   //設(shè)置 P1.0 為 ADC 輸入口

         
        P_SW2|=0X80;    //打開特殊功能寄存器
        ADCTIM=0X3F;    //設(shè)置ADC內(nèi)部時(shí)序
        P_SW2&=0X7F;    //關(guān)閉特殊功能寄存器
        ADCCFG=0X0F;    //設(shè)置ADC結(jié)果左對(duì)齊+ADC時(shí)鐘為系統(tǒng)時(shí)鐘/2/16
        
        ADC_CONTR=0X80; //使能ADC模塊(ADC電源打開并選擇ADC通道P1.0/ADC0)
        EADC=1;         //使能ADC中斷 (ADC中斷打開)
        EA=1;           //總開關(guān)打開
        ADC_CONTR|=0X40;        //啟動(dòng)AD轉(zhuǎn)換

   //while(1); <-------- 這個(gè)不用加了
}
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2021-12-27 08:36 | 顯示全部樓層
void ADC_IN()
{         
        P1M1 = 0x01;   P1M0 = 0x00;   //設(shè)置 P1.0 為 ADC 輸入口
       
        P_SW2|=0X80;    //打開特殊功能寄存器
        ADCTIM=0X3F;    //設(shè)置ADC內(nèi)部時(shí)序
        P_SW2&=0X7F;    //關(guān)閉特殊功能寄存器
        ADCCFG=0X0F;    //設(shè)置ADC結(jié)果左對(duì)齊+ADC時(shí)鐘為系統(tǒng)時(shí)鐘/2/16
       
        ADC_CONTR=0X80; //使能ADC模塊(ADC電源打開并選擇ADC通道P1.0/ADC0)
        EADC=1;         //使能ADC中斷 (ADC中斷打開)
        EA=1;           //總開關(guān)打開
        ADC_CONTR|=0X40;//啟動(dòng)AD轉(zhuǎn)換
       
        while(1);//不能這樣生搬硬套
}
回復(fù)

使用道具 舉報(bào)

ID:686513 發(fā)表于 2021-12-27 13:25 | 顯示全部樓層
angmall 發(fā)表于 2021-12-27 08:33
void ADC_IN()
{         
          P1M1 = 0x01;   P1M0 = 0x00;   //設(shè)置 P1.0 為 ADC 輸入口

謝謝,我試試。
回復(fù)

使用道具 舉報(bào)

ID:686513 發(fā)表于 2021-12-27 13:27 | 顯示全部樓層
wulin 發(fā)表于 2021-12-27 08:36
void ADC_IN()
{         
        P1M1 = 0x01;   P1M0 = 0x00;   //設(shè)置 P1.0 為 ADC 輸入口

明白了,謝謝了,我回去試試。不行再請(qǐng)教。
回復(fù)

使用道具 舉報(bào)

ID:686513 發(fā)表于 2021-12-29 09:06 | 顯示全部樓層
單端輸入,可以了,傳感器要是差分輸入,程序該如何修改?
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2021-12-29 09:55 | 顯示全部樓層
zhth1979 發(fā)表于 2021-12-29 09:06
單端輸入,可以了,傳感器要是差分輸入,程序該如何修改?

ADC不能采集處理負(fù)電壓信號(hào)。在量程范圍內(nèi)使差分放大器的輸出電壓限制在0~AVCC范圍即可。
回復(fù)

使用道具 舉報(bào)

ID:686513 發(fā)表于 2021-12-29 21:02 | 顯示全部樓層
wulin 發(fā)表于 2021-12-29 09:55
ADC不能采集處理負(fù)電壓信號(hào)。在量程范圍內(nèi)使差分放大器的輸出電壓限制在0~AVCC范圍即可。

可能我描述的不清楚,這個(gè)壓力傳感器共4個(gè)腳,I+ I-為供電,有氣壓時(shí)O+和O-兩個(gè)腳會(huì)有0-60mV的壓差。問(wèn)了一下單片機(jī)廠商,這種情況應(yīng)該是用兩路ADC口分別檢測(cè),結(jié)果相減,能不能在上面的中斷程序里同時(shí)選兩個(gè)通道,分時(shí)得結(jié)果,最好有例子。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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