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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

請大家幫我看看這個基于STC15W408AS的AD轉換程序

[復制鏈接]
跳轉到指定樓層
樓主
我用74HC595,串專并輸出到數碼管,但是不能正常輸出,麻煩大佬們幫我看下程序,也給我點用這個單片機檢測電壓并輸出到數碼管的建議,蟹蟹
  1. #include "reg51.h"
  2. #include "intrins.h"

  3. #define FOSC 18432000L
  4. #define BAUD 9600

  5. typedef unsigned char  BYTE;
  6. typedef unsigned int   WORD;
  7. BYTE code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  8. sbit SRCLK=P1^2;
  9. sbit RCLK=P1^3;
  10. sbit SER=P1^4;








  11. sfr  AUXR  =  0x8e;                                   //輔助寄存器
  12.                                                                   
  13. sfr  ADC_CONTR  =  0xBC;                         //ADC控制寄存器
  14. sfr  ADC_RES  =  0xBD;                                    //ADC高8位結果
  15. sfr  ADC_LOW2  =  0xBE;                                 //ADC低2位結果
  16. sfr  P1ASF  =  0x9D;                                //P1口第2功能控制寄存器

  17. #define ADC_POWER      0x80                         //ADC電源控制位
  18. #define ADC_FLAG       0x10                         //ADC完成標志
  19. #define ADC_START      0x08                         //ADC起始控制位
  20. #define ADC_SPEEDLL    0x00                         //540個時鐘
  21. #define ADC_SPEEDL     0x20                         //360個時鐘
  22. #define ADC_SPEEDH     0x40                         //180個時鐘
  23. #define ADC_SPEEDHH    0x60                         //90個時鐘


  24. void InitADC();
  25. void Hc595SendByte(BYTE dat);

  26. BYTE GetADCResult(BYTE ch);
  27. void Delay(WORD n);
  28.         BYTE  ch=0           ;
  29. void main()
  30. {
  31.         InitADC();                                                  //初始化ADC
  32.         IE=0xa0;                                                  //打開ADC轉換中斷

  33.         while(1)
  34.           {

  35.           }
  36. }

  37. /*---------------------------------------------
  38. ADC          中斷服務程序
  39. ---------------------------------------------*/
  40. void adc_isr() interrupt 5 using 1
  41. {

  42.                   double x;
  43.              WORD a,b;
  44.                 int i;
  45.             BYTE outData[3];

  46.          ADC_CONTR&=!ADC_FLAG;                                                                                 // 清除ADC中斷標志
  47.          a=ADC_RES;
  48.          b=ADC_LOW2;
  49.          a=a*4+b;
  50.          x=5.0*a/1023.0;

  51.      x=x/1.0;                                                
  52.       for(i = 0;i<3;i++)
  53.           {
  54.              outData[i] = (unsigned char)x;
  55.              x = x - outData[i];
  56.              x = x*10;
  57.           }
  58.              
  59.                  Hc595SendByte(smgduan[outData[0]]);                                          //此處先讓其輸出第一位,以測試
  60.                  Delay(500);
  61.                                                                 

  62.          ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch;
  63. }



  64. /*---------------------------------------------
  65. 讀取ADC結果
  66. ---------------------------------------------*/
  67. /*BYTE GetADCResult(BYTE ch)
  68. {
  69.        ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;
  70.            _nop_();                                                                                          //等待4個NOP
  71.            _nop_();                                                                                          //CLOSE ADC
  72.            _nop_();
  73.            _nop_();
  74.            while(!(ADC_CONTR&ADC_FLAG));
  75.            ADC_CONTR&=~ADC_FLAG;

  76.            return ADC_RES;                                                                          //返回ADC結果
  77. }           */


  78. /*---------------------------------------------
  79. 初始化ADC
  80. ---------------------------------------------*/
  81. void InitADC()
  82. {                                                                                                         
  83.            P1ASF=0x01;                                                                                 //設置P1口為AD口
  84.            ADC_RES=0;                                                         //清除結果寄存器
  85.            ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch;                                          
  86.            Delay(20);                                                                                     //ADC上電并延時
  87. }



  88. /*******************************************************************************
  89. * 函 數 名         : Hc595SendByte(u8 dat)
  90. * 函數功能                   : 向74H595發送一個字節的數據
  91. * 輸    入         : 無
  92. * 輸    出         : 無
  93. *******************************************************************************/
  94. void Hc595SendByte(BYTE dat)
  95. {
  96.         BYTE a;

  97.         SRCLK =1;
  98.         RCLK = 1;

  99.         for(a=0;a<8;a++)                 //發送8位數
  100.         {
  101.                 SER = dat >> 7;                 //從最高位開始發送
  102.                 dat <<= 1;

  103.                 SRCLK = 0;                         //發送時序
  104.                 _nop_();
  105.                 _nop_();
  106.                 SRCLK = 1;       
  107.         }
  108.         RCLK = 0;
  109.         _nop_();
  110.         _nop_();
  111.         RCLK = 1;
  112. }


  113. /*---------------------------------------------
  114. 軟件延時
  115. ---------------------------------------------*/
  116. void Delay(WORD n)
  117. {

  118.            WORD x;

  119.            while(n--)
  120.              {
  121.                          x=5000;
  122.                          while(x--);
  123.                  }
  124. }



復制代碼



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

使用道具 舉報

沙發
ID:164602 發表于 2017-12-6 10:31 | 只看該作者
程序太長,沒時間仔細看。只看清楚了你的ADC設置。
你的595沒有初始化,應該是問題所在吧。
主函數里,加一句:Hc595SendByte(0x00);
我有一個例子程序,是用ADC讀搖桿的,用串口發送數據。
#include <STC15F2K60S2.H>
#include <intrins.h>

unsigned int ADCdate;
unsigned char ADC_XS[4];

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

        _nop_();
        _nop_();
        i = 22;
        j = 3;
        k = 227;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

void UartInit(void)                //9600bps@11.0592MHz
{
        SCON = 0x50;
        AUXR = 0x40;
        TMOD &= 0x00;
        TL1 = 0xE0;
        TH1 = 0xFE;
        ET1 = 0;
        TR1 = 1;
}

void ADCInit (void)//ADC設置
{
        P1ASF=0x03;//P10、P11為ADC輸入口。
        CLK_DIV=0x20;//ADC轉換結果存放方式
}

void ADCXX(void)
{
        ADC_XS[3]=(ADCdate/1000)+0x30;
        ADC_XS[2]=((ADCdate%1000)/100)+0x30;
        ADC_XS[1]=((ADCdate%100)/10)+0x30;
        ADC_XS[0]=((ADCdate%10)/1)+0x30;
}

void ADC0 (void)
{
        ADC_CONTR=0xe8;
        while (!(ADC_CONTR&0x10));
        ADC_CONTR=0x00;
        ADCdate=ADC_RES;
        ADCdate=(ADCdate<<8);
        ADCdate=(ADCdate|ADC_RESL);
        ADCXX();
}

void ADC1 (void)
{
        ADC_CONTR=0xe9;
        while (!(ADC_CONTR&0x10));
        ADC_CONTR=0x00;
        ADCdate=ADC_RES;
        ADCdate=(ADCdate<<8);
        ADCdate=(ADCdate|ADC_RESL);
        ADCXX();
}

void UART (void)
{
        SBUF=ADC_XS[3];
        while (!TI);
        TI=0;
        SBUF=ADC_XS[2];
        while (!TI);
        TI=0;
        SBUF=ADC_XS[1];
        while (!TI);
        TI=0;
        SBUF=ADC_XS[0];
        while (!TI);
        TI=0;
}

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

        UartInit();
        ADCInit();
        while(1)
        {
                if (P12==0)
                {
                        P55=~P55;//此法只是為了驗證搖桿的按鍵功能,掃描不到就不行。
                }
                ADC0();
                UART();
                SBUF=' ';
                while (!TI);
                TI=0;
                SBUF=' ';
                while (!TI);
                TI=0;
                ADC1();
                UART();
                SBUF='\r';
                while (!TI);
                TI=0;
                SBUF='\n';
                while (!TI);
                TI=0;
                Delay500ms();
        }
}

頭文件STC15F2K60S2.H
#ifndef __STC15F2K60S2_H_
#define __STC15F2K60S2_H_

/////////////////////////////////////////////////
//注意: STC15W4K32S4系列的芯片,上電后所有與PWM相關的IO口均為
//      高阻態,需將這些口設置為準雙向口或強推挽模式方可正常使用
//相關IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
//        P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
/////////////////////////////////////////////////

/////////////////////////////////////////////////

//包含本頭文件后,不用另外再包含"REG51.H"

//內核特殊功能寄存器        // 復位值   描述
sfr ACC         =   0xE0;   //0000,0000 累加器Accumulator
sfr B           =   0xF0;   //0000,0000 B寄存器
sfr PSW         =   0xD0;   //0000,0000 程序狀態字
sbit CY         =   PSW^7;
sbit AC         =   PSW^6;
sbit F0         =   PSW^5;
sbit RS1        =   PSW^4;
sbit RS0        =   PSW^3;
sbit OV         =   PSW^2;
sbit P          =   PSW^0;
sfr SP          =   0x81;   //0000,0111 堆棧指針
sfr DPL         =   0x82;   //0000,0000 數據指針低字節
sfr DPH         =   0x83;   //0000,0000 數據指針高字節

//I/O 口特殊功能寄存器
sfr P0          =   0x80;   //1111,1111 端口0
sbit P00        =   P0^0;
sbit P01        =   P0^1;
sbit P02        =   P0^2;
sbit P03        =   P0^3;
sbit P04        =   P0^4;
sbit P05        =   P0^5;
sbit P06        =   P0^6;
sbit P07        =   P0^7;
sfr P1          =   0x90;   //1111,1111 端口1
sbit P10        =   P1^0;
sbit P11        =   P1^1;
sbit P12        =   P1^2;
sbit P13        =   P1^3;
sbit P14        =   P1^4;
sbit P15        =   P1^5;
sbit P16        =   P1^6;
sbit P17        =   P1^7;
sfr P2          =   0xA0;   //1111,1111 端口2
sbit P20        =   P2^0;
sbit P21        =   P2^1;
sbit P22        =   P2^2;
sbit P23        =   P2^3;
sbit P24        =   P2^4;
sbit P25        =   P2^5;
sbit P26        =   P2^6;
sbit P27        =   P2^7;
sfr P3          =   0xB0;   //1111,1111 端口3
sbit P30        =   P3^0;
sbit P31        =   P3^1;
sbit P32        =   P3^2;
sbit P33        =   P3^3;
sbit P34        =   P3^4;
sbit P35        =   P3^5;
sbit P36        =   P3^6;
sbit P37        =   P3^7;
sfr P4          =   0xC0;   //1111,1111 端口4
sbit P40        =   P4^0;
sbit P41        =   P4^1;
sbit P42        =   P4^2;
sbit P43        =   P4^3;
sbit P44        =   P4^4;
sbit P45        =   P4^5;
sbit P46        =   P4^6;
sbit P47        =   P4^7;
sfr P5          =   0xC8;   //xxxx,1111 端口5
sbit P50        =   P5^0;
sbit P51        =   P5^1;
sbit P52        =   P5^2;
sbit P53        =   P5^3;
sbit P54        =   P5^4;
sbit P55        =   P5^5;
sbit P56        =   P5^6;
sbit P57        =   P5^7;
sfr P6          =   0xE8;   //0000,0000 端口6
sbit P60        =   P6^0;
sbit P61        =   P6^1;
sbit P62        =   P6^2;
sbit P63        =   P6^3;
sbit P64        =   P6^4;
sbit P65        =   P6^5;
sbit P66        =   P6^6;
sbit P67        =   P6^7;
sfr P7          =   0xF8;   //0000,0000 端口7
sbit P70        =   P7^0;
sbit P71        =   P7^1;
sbit P72        =   P7^2;
sbit P73        =   P7^3;
sbit P74        =   P7^4;
sbit P75        =   P7^5;
sbit P76        =   P7^6;
sbit P77        =   P7^7;
sfr P0M0        =   0x94;   //0000,0000 端口0模式寄存器0
sfr P0M1        =   0x93;   //0000,0000 端口0模式寄存器1
sfr P1M0        =   0x92;   //0000,0000 端口1模式寄存器0
sfr P1M1        =   0x91;   //0000,0000 端口1模式寄存器1
sfr P2M0        =   0x96;   //0000,0000 端口2模式寄存器0
sfr P2M1        =   0x95;   //0000,0000 端口2模式寄存器1
sfr P3M0        =   0xB2;   //0000,0000 端口3模式寄存器0
sfr P3M1        =   0xB1;   //0000,0000 端口3模式寄存器1
sfr P4M0        =   0xB4;   //0000,0000 端口4模式寄存器0
sfr P4M1        =   0xB3;   //0000,0000 端口4模式寄存器1
sfr P5M0        =   0xCA;   //0000,0000 端口5模式寄存器0
sfr P5M1        =   0xC9;   //0000,0000 端口5模式寄存器1
sfr P6M0        =   0xCC;   //0000,0000 端口6模式寄存器0
sfr P6M1        =   0xCB;   //0000,0000 端口6模式寄存器1
sfr P7M0        =   0xE2;   //0000,0000 端口7模式寄存器0
sfr P7M1        =   0xE1;   //0000,0000 端口7模式寄存器1

//系統管理特殊功能寄存器
sfr PCON        =   0x87;   //0001,0000 電源控制寄存器
sfr AUXR        =   0x8E;   //0000,0000 輔助寄存器
sfr AUXR1       =   0xA2;   //0000,0000 輔助寄存器1
sfr P_SW1       =   0xA2;   //0000,0000 外設端口切換寄存器1
sfr CLK_DIV     =   0x97;   //0000,0000 時鐘分頻控制寄存器
sfr BUS_SPEED   =   0xA1;   //xx10,x011 總線速度控制寄存器
sfr P1ASF       =   0x9D;   //0000,0000 端口1模擬功能配置寄存器
sfr P_SW2       =   0xBA;   //0xxx,x000 外設端口切換寄存器

//中斷特殊功能寄存器
sfr IE          =   0xA8;   //0000,0000 中斷控制寄存器
sbit EA         =   IE^7;
sbit ELVD       =   IE^6;
sbit EADC       =   IE^5;
sbit ES         =   IE^4;
sbit ET1        =   IE^3;
sbit EX1        =   IE^2;
sbit ET0        =   IE^1;
sbit EX0        =   IE^0;
sfr IP          =   0xB8;   //0000,0000 中斷優先級寄存器
sbit PPCA       =   IP^7;
sbit PLVD       =   IP^6;
sbit PADC       =   IP^5;
sbit PS         =   IP^4;
sbit PT1        =   IP^3;
sbit PX1        =   IP^2;
sbit PT0        =   IP^1;
sbit PX0        =   IP^0;
sfr IE2         =   0xAF;   //0000,0000 中斷控制寄存器2
sfr IP2         =   0xB5;   //xxxx,xx00 中斷優先級寄存器2
sfr INT_CLKO    =   0x8F;   //0000,0000 外部中斷與時鐘輸出控制寄存器

//定時器特殊功能寄存器
sfr TCON        =   0x88;   //0000,0000 T0/T1控制寄存器
sbit TF1        =   TCON^7;
sbit TR1        =   TCON^6;
sbit TF0        =   TCON^5;
sbit TR0        =   TCON^4;
sbit IE1        =   TCON^3;
sbit IT1        =   TCON^2;
sbit IE0        =   TCON^1;
sbit IT0        =   TCON^0;
sfr TMOD        =   0x89;   //0000,0000 T0/T1模式寄存器
sfr TL0         =   0x8A;   //0000,0000 T0低字節
sfr TL1         =   0x8B;   //0000,0000 T1低字節
sfr TH0         =   0x8C;   //0000,0000 T0高字節
sfr TH1         =   0x8D;   //0000,0000 T1高字節
sfr T4T3M       =   0xD1;   //0000,0000 T3/T4模式寄存器
sfr T3T4M       =   0xD1;   //0000,0000 T3/T4模式寄存器
sfr T4H         =   0xD2;   //0000,0000 T4高字節
sfr T4L         =   0xD3;   //0000,0000 T4低字節
sfr T3H         =   0xD4;   //0000,0000 T3高字節
sfr T3L         =   0xD5;   //0000,0000 T3低字節
sfr T2H         =   0xD6;   //0000,0000 T2高字節
sfr T2L         =   0xD7;   //0000,0000 T2低字節
sfr WKTCL       =   0xAA;   //0000,0000 掉電喚醒定時器低字節
sfr WKTCH       =   0xAB;   //0000,0000 掉電喚醒定時器高字節
sfr WDT_CONTR   =   0xC1;   //0000,0000 看門狗控制寄存器

//串行口特殊功能寄存器
sfr SCON        =   0x98;   //0000,0000 串口1控制寄存器
sbit SM0        =   SCON^7;
sbit SM1        =   SCON^6;
sbit SM2        =   SCON^5;
sbit REN        =   SCON^4;
sbit TB8        =   SCON^3;
sbit RB8        =   SCON^2;
sbit TI         =   SCON^1;
sbit RI         =   SCON^0;
sfr SBUF        =   0x99;   //xxxx,xxxx 串口1數據寄存器
sfr S2CON       =   0x9A;   //0000,0000 串口2控制寄存器
sfr S2BUF       =   0x9B;   //xxxx,xxxx 串口2數據寄存器
sfr S3CON       =   0xAC;   //0000,0000 串口3控制寄存器
sfr S3BUF       =   0xAD;   //xxxx,xxxx 串口3數據寄存器
sfr S4CON       =   0x84;   //0000,0000 串口4控制寄存器
sfr S4BUF       =   0x85;   //xxxx,xxxx 串口4數據寄存器
sfr SADDR       =   0xA9;   //0000,0000 從機地址寄存器
sfr SADEN       =   0xB9;   //0000,0000 從機地址屏蔽寄存器

//ADC 特殊功能寄存器
sfr ADC_CONTR   =   0xBC;   //0000,0000 A/D轉換控制寄存器
sfr ADC_RES     =   0xBD;   //0000,0000 A/D轉換結果高8位
sfr ADC_RESL    =   0xBE;   //0000,0000 A/D轉換結果低2位

//SPI 特殊功能寄存器
sfr SPSTAT      =   0xCD;   //00xx,xxxx SPI狀態寄存器
sfr SPCTL       =   0xCE;   //0000,0100 SPI控制寄存器
sfr SPDAT       =   0xCF;   //0000,0000 SPI數據寄存器

//IAP/ISP 特殊功能寄存器
sfr IAP_DATA    =   0xC2;   //0000,0000 EEPROM數據寄存器
sfr IAP_ADDRH   =   0xC3;   //0000,0000 EEPROM地址高字節
sfr IAP_ADDRL   =   0xC4;   //0000,0000 EEPROM地址第字節
sfr IAP_CMD     =   0xC5;   //xxxx,xx00 EEPROM命令寄存器
sfr IAP_TRIG    =   0xC6;   //0000,0000 EEPRPM命令觸發寄存器
sfr IAP_CONTR   =   0xC7;   //0000,x000 EEPROM控制寄存器

//PCA/PWM 特殊功能寄存器
sfr CCON        =   0xD8;   //00xx,xx00 PCA控制寄存器
sbit CF         =   CCON^7;
sbit CR         =   CCON^6;
sbit CCF2       =   CCON^2;
sbit CCF1       =   CCON^1;
sbit CCF0       =   CCON^0;
sfr CMOD        =   0xD9;   //0xxx,x000 PCA 工作模式寄存器
sfr CL          =   0xE9;   //0000,0000 PCA計數器低字節
sfr CH          =   0xF9;   //0000,0000 PCA計數器高字節
sfr CCAPM0      =   0xDA;   //0000,0000 PCA模塊0的PWM寄存器
sfr CCAPM1      =   0xDB;   //0000,0000 PCA模塊1的PWM寄存器
sfr CCAPM2      =   0xDC;   //0000,0000 PCA模塊2的PWM 寄存器
sfr CCAP0L      =   0xEA;   //0000,0000 PCA模塊0的捕捉/比較寄存器低字節
sfr CCAP1L      =   0xEB;   //0000,0000 PCA模塊1的捕捉/比較寄存器低字節
sfr CCAP2L      =   0xEC;   //0000,0000 PCA模塊2的捕捉/比較寄存器低字節
sfr PCA_PWM0    =   0xF2;   //xxxx,xx00 PCA模塊0的PWM寄存器
sfr PCA_PWM1    =   0xF3;   //xxxx,xx00 PCA模塊1的PWM寄存器
sfr PCA_PWM2    =   0xF4;   //xxxx,xx00 PCA模塊1的PWM寄存器
sfr CCAP0H      =   0xFA;   //0000,0000 PCA模塊0的捕捉/比較寄存器高字節
sfr CCAP1H      =   0xFB;   //0000,0000 PCA模塊1的捕捉/比較寄存器高字節
sfr CCAP2H      =   0xFC;   //0000,0000 PCA模塊2的捕捉/比較寄存器高字節

//比較器特殊功能寄存器
sfr CMPCR1      =   0xE6;   //0000,0000 比較器控制寄存器1
sfr CMPCR2      =   0xE7;   //0000,0000 比較器控制寄存器2

//增強型PWM波形發生器特殊功能寄存器
sfr PWMCFG      =   0xf1;   //x000,0000 PWM配置寄存器
sfr PWMCR       =   0xf5;   //0000,0000 PWM控制寄存器
sfr PWMIF       =   0xf6;   //x000,0000 PWM中斷標志寄存器
sfr PWMFDCR     =   0xf7;   //xx00,0000 PWM外部異常檢測控制寄存器

//如下特殊功能寄存器位于擴展RAM區域
//訪問這些寄存器,需先將P_SW2的BIT7設置為1,才可正常讀寫
#define PWMC        (*(unsigned int  volatile xdata *)0xfff0)
#define PWMCH       (*(unsigned char volatile xdata *)0xfff0)
#define PWMCL       (*(unsigned char volatile xdata *)0xfff1)
#define PWMCKS      (*(unsigned char volatile xdata *)0xfff2)
#define PWM2T1      (*(unsigned int  volatile xdata *)0xff00)
#define PWM2T1H     (*(unsigned char volatile xdata *)0xff00)
#define PWM2T1L     (*(unsigned char volatile xdata *)0xff01)
#define PWM2T2      (*(unsigned int  volatile xdata *)0xff02)
#define PWM2T2H     (*(unsigned char volatile xdata *)0xff02)
#define PWM2T2L     (*(unsigned char volatile xdata *)0xff03)
#define PWM2CR      (*(unsigned char volatile xdata *)0xff04)
#define PWM3T1      (*(unsigned int  volatile xdata *)0xff10)
#define PWM3T1H     (*(unsigned char volatile xdata *)0xff10)
#define PWM3T1L     (*(unsigned char volatile xdata *)0xff11)
#define PWM3T2      (*(unsigned int  volatile xdata *)0xff12)
#define PWM3T2H     (*(unsigned char volatile xdata *)0xff12)
#define PWM3T2L     (*(unsigned char volatile xdata *)0xff13)
#define PWM3CR      (*(unsigned char volatile xdata *)0xff14)
#define PWM4T1      (*(unsigned int  volatile xdata *)0xff20)
#define PWM4T1H     (*(unsigned char volatile xdata *)0xff20)
#define PWM4T1L     (*(unsigned char volatile xdata *)0xff21)
#define PWM4T2      (*(unsigned int  volatile xdata *)0xff22)
#define PWM4T2H     (*(unsigned char volatile xdata *)0xff22)
#define PWM4T2L     (*(unsigned char volatile xdata *)0xff23)
#define PWM4CR      (*(unsigned char volatile xdata *)0xff24)
#define PWM5T1      (*(unsigned int  volatile xdata *)0xff30)
#define PWM5T1H     (*(unsigned char volatile xdata *)0xff30)
#define PWM5T1L     (*(unsigned char volatile xdata *)0xff31)
#define PWM5T2      (*(unsigned int  volatile xdata *)0xff32)
#define PWM5T2H     (*(unsigned char volatile xdata *)0xff32)
#define PWM5T2L     (*(unsigned char volatile xdata *)0xff33)
#define PWM5CR      (*(unsigned char volatile xdata *)0xff34)
#define PWM6T1      (*(unsigned int  volatile xdata *)0xff40)
#define PWM6T1H     (*(unsigned char volatile xdata *)0xff40)
#define PWM6T1L     (*(unsigned char volatile xdata *)0xff41)
#define PWM6T2      (*(unsigned int  volatile xdata *)0xff42)
#define PWM6T2H     (*(unsigned char volatile xdata *)0xff42)
#define PWM6T2L     (*(unsigned char volatile xdata *)0xff43)
#define PWM6CR      (*(unsigned char volatile xdata *)0xff44)
#define PWM7T1      (*(unsigned int  volatile xdata *)0xff50)        
#define PWM7T1H     (*(unsigned char volatile xdata *)0xff50)        
#define PWM7T1L     (*(unsigned char volatile xdata *)0xff51)
#define PWM7T2      (*(unsigned int  volatile xdata *)0xff52)
#define PWM7T2H     (*(unsigned char volatile xdata *)0xff52)
#define PWM7T2L     (*(unsigned char volatile xdata *)0xff53)
#define PWM7CR      (*(unsigned char volatile xdata *)0xff54)

/////////////////////////////////////////////////

#endif

回復

使用道具 舉報

板凳
ID:213173 發表于 2017-12-6 12:45 | 只看該作者
你屏蔽了BYTE GetADCResult(BYTE ch)就不會發生ADC轉換中斷,所有程序都在中斷里運行,這怎么跑得起來?
回復

使用道具 舉報

地板
ID:246779 發表于 2017-12-6 18:53 | 只看該作者
wulin 發表于 2017-12-6 12:45
你屏蔽了BYTE GetADCResult(BYTE ch)就不會發生ADC轉換中斷,所有程序都在中斷里運行,這怎么跑得起來?

不是的啊,我在main函數里進行了ADC的初始化,在ADC初始化函數里是打開了AD轉換的
  1. /*---------------------------------------------
  2. 初始化ADC
  3. ---------------------------------------------*/
  4. void InitADC()
  5. {                                                                                                         
  6.            P1ASF=0x01;                                                                                 //設置P1口為AD口
  7.            ADC_RES=0;                                                         //清除結果寄存器
  8.            ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch;                                          
  9.            Delay(20);                                                                                     //ADC上電并延時
  10. }
復制代碼


謝謝你認真看了我的代碼。我又檢查了下,是我昨天把數碼管的高低位連接亂了(尷尬……),但是,現在的問題是,AD轉換的數值不會及時更新,要斷電后重新上電才能檢測到新的待測電壓。由于手頭沒有74HC595的芯片,所以借用單片機上的,因此595和STC15W408AS單片機是分別供電的。這又出現了個問題,要先打開595的電源,再給單片機供電才能正常顯示…………
回復

使用道具 舉報

5#
ID:246779 發表于 2017-12-6 19:57 | 只看該作者
HC6800-ES-V2.0 發表于 2017-12-6 10:31
程序太長,沒時間仔細看。只看清楚了你的ADC設置。
你的595沒有初始化,應該是問題所在吧。
主函數里,加 ...

現在可以正常顯示了,但是無法及時更新AD檢測的值,要重新上電,并且先給595供電才能正常地顯示新的數值
回復

使用道具 舉報

6#
ID:246779 發表于 2017-12-6 21:11 | 只看該作者
我又檢查了下,是我昨天把數碼管的高低位連接亂了(尷尬……),但是,現在的問題是,AD轉換的數值不會及時更新,要斷電后重新上電才能檢測到新的待測電壓。由于手頭沒有74HC595的芯片,所以借用單片機上的,因此595和STC15W408AS單片機是分別供電的。這又出現了個問題,要先打開595的電源,再給單片機供電才能正常顯示…………
這是現階段的一些圖片:




回復

使用道具 舉報

7#
ID:258375 發表于 2017-12-6 21:46 | 只看該作者
菁華如風 發表于 2017-12-6 21:11
我又檢查了下,是我昨天把數碼管的高低位連接亂了(尷尬……),但是,現在的問題是,AD轉換的數值不會及時 ...

ADC_CONTR&=!ADC_FLAG;             // 清除ADC中斷標志
應改為ADC_CONTR&=~ADC_FLAG;
回復

使用道具 舉報

8#
ID:258375 發表于 2017-12-6 21:48 | 只看該作者
ADC_CONTR&=!ADC_FLAG;     // 清除ADC中斷標志
改為ADC_CONTR&=~ADC_FLAG;

評分

參與人數 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

9#
ID:246779 發表于 2017-12-7 17:03 | 只看該作者
17771904441 發表于 2017-12-6 21:48
ADC_CONTR&=!ADC_FLAG;     // 清除ADC中斷標志
改為ADC_CONTR&=~ADC_FLAG;

還是不行的     我的改進如下
回復

使用道具 舉報

10#
ID:246779 發表于 2017-12-7 17:17 | 只看該作者
聽說中斷函數不能太長,我就把AD數據處理函數移動到了while里,如下:
  1.            while(1)
  2.           {


  3.                  SS=0;           //檢測循環是否正常
  4.                  Delay(50) ;
  5.              SS=1;
  6.              Delay(50) ;
  7.             if(RT==1)           //RT初值為0,進入中斷置1,故可當做中斷標志位
  8.                 {
  9.                 double x;
  10.              WORD a,b;
  11.                 int i;
  12.             BYTE outData[3];
  13.                 SSQ=0;                  //檢測是否可以正常進入中斷


  14.          a=ADC_RES;
  15.          b=ADC_LOW2;
  16.          a=a*4+b;
  17.          x=5.0*a/1023.0;

  18.      x=x/1.0;                                                
  19.       for(i = 0;i<3;i++)
  20.           {
  21.              outData[i] = (unsigned char)x;
  22.              x = x - outData[i];
  23.              x = x*10;
  24.           }
  25.                if(outData[0]>2)         
  26.                                            { LED=0;}
  27.                         else {LED=1;}


  28.                  Hc595SendByte(smgduan[outData[0]]);           //此處先讓其輸出第一位,以測試
  29.                  
  30.                  RT=0;                                                               / /清除中斷標注位
  31.             Delay(100) ;
  32.                 SSQ=1;
  33.                  for(i = 0;i<3;i++)
  34.           {                                                                     //測試AD是否在正常狀態下轉換電壓
  35.              outData[i] = 0;  
  36.                 }  
  37.                  Hc595SendByte(0x00);
  38.       }
  39.    }
  40. }
復制代碼
  1. /*---------------------------------------------
  2. ADC          中斷服務程序
  3. ---------------------------------------------*/
  4. void adc_isr() interrupt 5 using 1
  5. {

  6.                         RT=1;
  7.                    ADC_CONTR&=~ADC_FLAG;                                                                                 // 清除ADC中斷標志
  8.           ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch;
  9.                     
  10. }
復制代碼
現在可以正常進行AD轉換了,并且數據處理也正常了(之前的故障原因是在第一次數據處理后,沒有把outData[]數組清零)。但是現在的精度變差了……還有就是,我不明白為什么我的這個ADC中斷函數為什么也不能太長,因為我認為只有本次中斷處理結束后,才會開始新的AD轉換,才會有下一次的AD中斷,不會出現在處理本次中斷時又來了一個中斷的情況啊。數碼管的顯示還是不能更新,盡管數據處理的結果已經可以更新了(通過LED的0或1判斷)。明天換新的595試試。如果是程序問題的話,望大佬們指正~~  謝謝


最后附上最新修改的全程序:
  1. #include "reg51.h"
  2. #include "intrins.h"

  3. #define FOSC 18432000L
  4. #define BAUD 9600

  5. typedef unsigned char  BYTE;
  6. typedef unsigned int   WORD;
  7. BYTE code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  8. sbit SRCLK=P1^2;
  9. sbit RCLK=P1^3;
  10. sbit SER=P1^4;
  11. sbit LED=P3^2;
  12. sbit SS=P3^3;
  13. sbit SSQ=P3^6;





  14. sfr  AUXR  =  0x8e;                                   //輔助寄存器
  15.                                                                   
  16. sfr  ADC_CONTR  =  0xBC;                         //ADC控制寄存器
  17. sfr  ADC_RES  =  0xBD;                                    //ADC高8位結果
  18. sfr  ADC_LOW2  =  0xBE;                                 //ADC低2位結果
  19. sfr  P1ASF  =  0x9D;                                //P1口第2功能控制寄存器

  20. #define ADC_POWER      0x80                         //ADC電源控制位
  21. #define ADC_FLAG       0x10                         //ADC完成標志
  22. #define ADC_START      0x08                         //ADC起始控制位
  23. #define ADC_SPEEDLL    0x00                         //540個時鐘
  24. #define ADC_SPEEDL     0x20                         //360個時鐘
  25. #define ADC_SPEEDH     0x40                         //180個時鐘
  26. #define ADC_SPEEDHH    0x60                         //90個時鐘
  27. BYTE  ch=0x00           ;

  28. void InitADC();
  29. //void delay3s500ms();
  30. void Hc595SendByte(BYTE dat);

  31. //BYTE GetADCResult(BYTE ch);
  32. void Delay(WORD n);
  33. BYTE RT;
  34. void main()
  35. {
  36.         InitADC();                                                  //初始化ADC
  37.         Hc595SendByte(0x00);                          //初始化595
  38.         RT=0;
  39.         IE=0xa0;                                                  //打開ADC轉換中斷

  40.            while(1)
  41.           {


  42.                  SS=0;                                                          //檢測循環是否正常
  43.                  Delay(50) ;
  44.              SS=1;
  45.              Delay(50) ;
  46.             if(RT==1)
  47.                 {
  48.                 double x;
  49.              WORD a,b;
  50.                 int i;
  51.             BYTE outData[3];
  52.                 SSQ=0;                                                                   //檢測是否可以正常進入中斷


  53.          a=ADC_RES;
  54.          b=ADC_LOW2;
  55.          a=a*4+b;
  56.          x=5.0*a/1023.0;

  57.      x=x/1.0;                                                
  58.       for(i = 0;i<3;i++)
  59.           {
  60.              outData[i] = (unsigned char)x;
  61.              x = x - outData[i];
  62.              x = x*10;
  63.           }
  64.                if(outData[0]>2)         
  65.                                            { LED=0;}
  66.                         else {LED=1;}


  67.                  Hc595SendByte(smgduan[outData[0]]);                                          //此處先讓其輸出第一位,以測試
  68.                  
  69.                  RT=0;                                                                                                           //清除中斷標注位
  70.             Delay(100) ;
  71.                 SSQ=1;
  72.                  for(i = 0;i<3;i++)
  73.           {                                                                                                                    //測試AD是否在正常狀態下轉換電壓
  74.              outData[i] = 0;  
  75.                 }  
  76.                  Hc595SendByte(0x00);
  77.       }
  78.    }
  79. }

  80. /*---------------------------------------------
  81. ADC          中斷服務程序
  82. ---------------------------------------------*/
  83. void adc_isr() interrupt 5 using 1
  84. {

  85.                         RT=1;
  86.                    ADC_CONTR&=~ADC_FLAG;                                                                                 // 清除ADC中斷標志
  87.           ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch;
  88.                     
  89. }
  90.           


  91. /*---------------------------------------------
  92. 讀取ADC結果
  93. ---------------------------------------------*/
  94. /*BYTE GetADCResult(BYTE ch)
  95. {
  96.        ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;
  97.            _nop_();                                                                                          //等待4個NOP
  98.            _nop_();                                                                                          //CLOSE ADC
  99.            _nop_();
  100.            _nop_();
  101.            while(!(ADC_CONTR&ADC_FLAG));
  102.            ADC_CONTR&=~ADC_FLAG;

  103.            return ADC_RES;                                                                          //返回ADC結果
  104. }           */


  105. /*---------------------------------------------
  106. 初始化ADC
  107. ---------------------------------------------*/
  108. void InitADC()
  109. {                                                                                                         
  110.            P1ASF=0x01;                                                                                 //設置P1.0口為AD口
  111.            ADC_RES=0;                                                         //清除結果寄存器
  112.            ADC_LOW2=0;
  113.            ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch;                                          
  114.            //delay3s500ms();
  115.                 Delay(20);                                                                     //ADC上電并延時
  116. }



  117. /*******************************************************************************
  118. * 函 數 名         : Hc595SendByte(u8 dat)
  119. * 函數功能                   : 向74H595發送一個字節的數據
  120. * 輸    入         : 無
  121. * 輸    出         : 無
  122. *******************************************************************************/
  123. void Hc595SendByte(BYTE dat)
  124. {
  125.         BYTE a;

  126.         SRCLK =1;
  127.         RCLK = 1;

  128.         for(a=0;a<8;a++)                 //發送8位數
  129.         {
  130.                 SER = dat >> 7;                 //從最高位開始發送
  131.                 dat <<= 1;

  132.                 SRCLK = 0;                         //發送時序
  133.                 _nop_();
  134.                 _nop_();
  135.                 _nop_();
  136.                 _nop_();
  137.                 SRCLK = 1;       
  138.         }
  139.         RCLK = 0;
  140.         _nop_();
  141.         _nop_();
  142.         _nop_();
  143.         _nop_();
  144.         RCLK = 1;
  145. }


  146. /*---------------------------------------------
  147. 軟件延時
  148. ---------------------------------------------*/
  149. void Delay(WORD n)
  150. {

  151.            WORD x;

  152.            while(n--)
  153.              {
  154.                          x=5000;
  155.                          while(x--);
  156.                  }
  157. }
復制代碼




回復

使用道具 舉報

11#
ID:283332 發表于 2019-7-25 17:25 | 只看該作者
采樣到的數據應該要進行冒泡法處理過后比較好吧
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久粉嫩 | 一区二区三区四区国产 | 久久久久久成人 | 日韩精品一区二区久久 | 国产精品久久久久久久久久久久久 | 国产一级在线观看 | 99久久久无码国产精品 | 欧美成年黄网站色视频 | 精品国产欧美一区二区三区成人 | 日韩欧美中文字幕在线观看 | 青青久久av北条麻妃海外网 | 欧美群妇大交群中文字幕 | 国产精品久久一区二区三区 | 懂色av色香蕉一区二区蜜桃 | 国产精品视频在线播放 | 午夜天堂 | 欧美日韩免费视频 | 成人免费福利视频 | 久久丁香 | 日韩欧美三区 | 欧美性久久 | 久久久久久国产免费视网址 | 亚洲一区二区三区在线免费观看 | 欧美日韩三级 | 一区二区三区影院 | 在线免费观看一区二区 | 国产日韩欧美一区 | 97超碰中文网 | 国产不卡一区 | 久久久久久91 | 免费h在线| 欧美日韩国产高清 | 精品视频一区二区三区在线观看 | 国产成人jvid在线播放 | 男女羞羞视频在线 | 中文字幕日韩欧美 | 日本在线网址 | 亚洲欧美激情四射 | 亚洲av一级毛片 | 中文字幕三区 | 久久精品国产亚洲 |