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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3974|回復: 8
打印 上一主題 下一主題
收起左側

stc8H3k32s2單片機中斷方式ADC轉換有問題,請大家指點一下

[復制鏈接]
跳轉到指定樓層
樓主
一直卡在ADC轉換等待那里,屏沒顯示。把ADC_IN();注示掉就可以顯示000.這個中斷程序是抄stc規格書里的.應該不會錯呀。下面是原理圖


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


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

         
        P_SW2|=0X80;    //打開特殊功能寄存器
        ADCTIM=0X3F;    //設置ADC內部時序
        P_SW2&=0X7F;    //關閉特殊功能寄存器
        ADCCFG=0X0F;    //設置ADC結果左對齊+ADC時鐘為系統時鐘/2/16
        
        ADC_CONTR=0X80; //使能ADC模塊(ADC電源打開并選擇ADC通道P1.0/ADC0)
        EADC=1;         //使能ADC中斷 (ADC中斷打開)
        EA=1;           //總開關打開
        ADC_CONTR|=0X40;        //啟動AD轉換

   while(1);
}

void ADC_ISR()interrupt 5
{
        
        ADC_CONTR&=~0X20;          //清中斷標志
        AD_Dat=(ADC_RES<<8)|ADC_RESL;               //讀取ADC結果
        ADC_CONTR|=0X40;          //繼續AD轉換
}
上面是.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"       //包含此頭文件后,里面聲明的寄存器不需要再手動輸入,避免重復定義
#include  "delay.h"
#include  "display.h"
#include  "key.h"
#include "ADC.H"

#define     MAIN_Fosc      12000000L   //定義主時鐘

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


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


unsigned char wnd=0;     //窗口變量,初始為P1    0可以改變默認窗口
unsigned char parm1=0;   //窗口P1 對應的變量
unsigned char parm2=0;   //窗口P2 對應的變量
unsigned char parm3=0;   //窗口P3 對應的變量
unsigned char parm4=0;   //窗口P4 對應的變量

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

/*******************************************************************************
* 文件名:主函數
* 描  述: 完成程序模塊的調用
* 功  能:
* 參  數:無
* 版本號:1.0.1(2017.05.23)
*******************************************************************************/                                 
                                 
void main()
{         
    P0M1 = 0x00;   P0M0 = 0x00;   //設置為準雙向口
    P2M1 = 0x00;   P2M0 = 0x00;   //設置為準雙向口
    P3M1 = 0x00;   P3M0 = 0x00;   //設置為準雙向口   
    P5M1 = 0x00;   P5M0 = 0x00;   //設置為準雙向口
    //P1M1 = 0x01;   P1M0 = 0x00;   //設置 P1.0 為 ADC 輸入口
         
//          led1=0; md1=0; fmq=0;
           a2=0; a3=0;
         
         
         
                 while(1)
           {
                        
//開機界面
// 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;
                        
                        
}

還有個顯示子程序
#include "display.h"

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

//位選信號
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.延時 1ms  全部數碼管顯示時間<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;
               
        }
        
}

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

使用道具 舉報

沙發
ID:301191 發表于 2021-12-27 04:43 | 只看該作者
頂一下
回復

使用道具 舉報

板凳
ID:155507 發表于 2021-12-27 08:33 | 只看該作者
void ADC_IN()
{         
          P1M1 = 0x01;   P1M0 = 0x00;   //設置 P1.0 為 ADC 輸入口

         
        P_SW2|=0X80;    //打開特殊功能寄存器
        ADCTIM=0X3F;    //設置ADC內部時序
        P_SW2&=0X7F;    //關閉特殊功能寄存器
        ADCCFG=0X0F;    //設置ADC結果左對齊+ADC時鐘為系統時鐘/2/16
        
        ADC_CONTR=0X80; //使能ADC模塊(ADC電源打開并選擇ADC通道P1.0/ADC0)
        EADC=1;         //使能ADC中斷 (ADC中斷打開)
        EA=1;           //總開關打開
        ADC_CONTR|=0X40;        //啟動AD轉換

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

使用道具 舉報

地板
ID:213173 發表于 2021-12-27 08:36 | 只看該作者
void ADC_IN()
{         
        P1M1 = 0x01;   P1M0 = 0x00;   //設置 P1.0 為 ADC 輸入口
       
        P_SW2|=0X80;    //打開特殊功能寄存器
        ADCTIM=0X3F;    //設置ADC內部時序
        P_SW2&=0X7F;    //關閉特殊功能寄存器
        ADCCFG=0X0F;    //設置ADC結果左對齊+ADC時鐘為系統時鐘/2/16
       
        ADC_CONTR=0X80; //使能ADC模塊(ADC電源打開并選擇ADC通道P1.0/ADC0)
        EADC=1;         //使能ADC中斷 (ADC中斷打開)
        EA=1;           //總開關打開
        ADC_CONTR|=0X40;//啟動AD轉換
       
        while(1);//不能這樣生搬硬套
}
回復

使用道具 舉報

5#
ID:686513 發表于 2021-12-27 13:25 | 只看該作者
angmall 發表于 2021-12-27 08:33
void ADC_IN()
{         
          P1M1 = 0x01;   P1M0 = 0x00;   //設置 P1.0 為 ADC 輸入口

謝謝,我試試。
回復

使用道具 舉報

6#
ID:686513 發表于 2021-12-27 13:27 | 只看該作者
wulin 發表于 2021-12-27 08:36
void ADC_IN()
{         
        P1M1 = 0x01;   P1M0 = 0x00;   //設置 P1.0 為 ADC 輸入口

明白了,謝謝了,我回去試試。不行再請教。
回復

使用道具 舉報

7#
ID:686513 發表于 2021-12-29 09:06 | 只看該作者
單端輸入,可以了,傳感器要是差分輸入,程序該如何修改?
回復

使用道具 舉報

8#
ID:213173 發表于 2021-12-29 09:55 | 只看該作者
zhth1979 發表于 2021-12-29 09:06
單端輸入,可以了,傳感器要是差分輸入,程序該如何修改?

ADC不能采集處理負電壓信號。在量程范圍內使差分放大器的輸出電壓限制在0~AVCC范圍即可。
回復

使用道具 舉報

9#
ID:686513 發表于 2021-12-29 21:02 | 只看該作者
wulin 發表于 2021-12-29 09:55
ADC不能采集處理負電壓信號。在量程范圍內使差分放大器的輸出電壓限制在0~AVCC范圍即可。

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 男女羞羞在线观看 | 无码日韩精品一区二区免费 | 精品久久久久久亚洲精品 | 亚洲国产成人精品在线 | 欧美在线亚洲 | 国产精品亚洲成在人线 | 国产一区二区三区久久久久久久久 | 狠狠干美女 | 色婷婷综合久久久中字幕精品久久 | 国产精品久久久久久久久久久免费看 | 欧美高清免费 | 91在线看片 | 国产视频1 | 日韩欧美精品在线 | 91视频免费观看 | 中文字幕一区在线观看视频 | 久久一 | 992tv人人草| 在线天堂免费中文字幕视频 | 国产成人久久av免费高清密臂 | 亚洲天堂中文字幕 | 精品美女视频在线观看免费软件 | 91一区二区| 91在线精品秘密一区二区 | 欧美最猛性xxxxx亚洲精品 | 无毛av| 精品在线一区二区 | 亚洲视频免费在线观看 | 欧美a∨ | 亚洲欧美另类在线观看 | 久久精品一级 | 精品亚洲一区二区三区 | 最近中文字幕在线视频1 | 亚洲一区二区在线视频 | 国产精品www | 国产激情第一页 | 国产成人一区二区 | 一级片成人 | 亚洲福利精品 | 黄色小视频大全 | 国产一级一片免费播放 |