菁华如风 发表于 2017-12-6 08:55:42

请大家帮我看看这个基于STC15W408AS的AD转换程序

我用74HC595,串专并输出到数码管,但是不能正常输出,麻烦大佬们帮我看下程序,也给我点用这个单片机检测电压并输出到数码管的建议,蟹蟹哦:handshake #include "reg51.h"
#include "intrins.h"

#define FOSC 18432000L
#define BAUD 9600

typedef unsigned charBYTE;
typedef unsigned int   WORD;
BYTE code smgduan={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

sbit SRCLK=P1^2;
sbit RCLK=P1^3;
sbit SER=P1^4;








sfrAUXR=0x8e;                                   //辅助寄存器
                                                                  
sfrADC_CONTR=0xBC;                       //ADC控制寄存器
sfrADC_RES=0xBD;                                  //ADC高8位结果
sfrADC_LOW2=0xBE;                               //ADC低2位结果
sfrP1ASF=0x9D;                                //P1口第2功能控制寄存器

#define ADC_POWER      0x80                       //ADC电源控制位
#define ADC_FLAG       0x10                       //ADC完成标志
#define ADC_START      0x08                       //ADC起始控制位
#define ADC_SPEEDLL    0x00                       //540个时钟
#define ADC_SPEEDL   0x20                       //360个时钟
#define ADC_SPEEDH   0x40                       //180个时钟
#define ADC_SPEEDHH    0x60                       //90个时钟


void InitADC();
void Hc595SendByte(BYTE dat);

BYTE GetADCResult(BYTE ch);
void Delay(WORD n);
        BYTEch=0           ;
void main()
{
        InitADC();                                                  //初始化ADC
        IE=0xa0;                                                  //打开ADC转换中断

        while(1)
          {

          }
}

/*---------------------------------------------
ADC          中断服务程序
---------------------------------------------*/
void adc_isr() interrupt 5 using 1
{

                  double x;
           WORD a,b;
                int i;
            BYTE outData;

       ADC_CONTR&=!ADC_FLAG;                                                                               // 清除ADC中断标志
       a=ADC_RES;
       b=ADC_LOW2;
       a=a*4+b;
       x=5.0*a/1023.0;

   x=x/1.0;                                                
      for(i = 0;i<3;i++)
          {
             outData = (unsigned char)x;
             x = x - outData;
             x = x*10;
          }
             
               Hc595SendByte(smgduan]);                                          //此处先让其输出第一位,以测试
               Delay(500);
                                                              

       ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch;
}



/*---------------------------------------------
读取ADC结果
---------------------------------------------*/
/*BYTE GetADCResult(BYTE ch)
{
       ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;
           _nop_();                                                                                          //等待4个NOP
           _nop_();                                                                                          //CLOSE ADC
           _nop_();
           _nop_();
           while(!(ADC_CONTR&ADC_FLAG));
           ADC_CONTR&=~ADC_FLAG;

           return ADC_RES;                                                                          //返回ADC结果
}           */


/*---------------------------------------------
初始化ADC
---------------------------------------------*/
void InitADC()
{                                                                                                       
           P1ASF=0x01;                                                                               //设置P1口为AD口
           ADC_RES=0;                                                         //清除结果寄存器
           ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch;                                          
           Delay(20);                                                                                     //ADC上电并延时
}



/*******************************************************************************
* 函 数 名         : Hc595SendByte(u8 dat)
* 函数功能                   : 向74H595发送一个字节的数据
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Hc595SendByte(BYTE dat)
{
        BYTE a;

        SRCLK =1;
        RCLK = 1;

        for(a=0;a<8;a++)               //发送8位数
        {
                SER = dat >> 7;               //从最高位开始发送
                dat <<= 1;

                SRCLK = 0;                       //发送时序
                _nop_();
                _nop_();
                SRCLK = 1;       
        }
        RCLK = 0;
        _nop_();
        _nop_();
        RCLK = 1;
}


/*---------------------------------------------
软件延时
---------------------------------------------*/
void Delay(WORD n)
{

           WORD x;

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





页: [1]
查看完整版本: 请大家帮我看看这个基于STC15W408AS的AD转换程序