注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
菁华如风的个人空间 https://home.eeworld.com.cn/space-uid-840253.html [收藏] [复制] [分享] [RSS]
日志

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

已有 1038 次阅读2017-12-6 09:02

我用74HC595,串转并输出到数码管,但是不能正常输出,麻烦大佬们帮我看下程序,也给我点用这个单片机检测电压并输出到数码管的建议,蟹蟹不知道哪里出了问题,请大神们帮下忙

[C] 纯文本查看 复制代码
#include "reg51.h"
#include "intrins.h"

#define FOSC 18432000L
#define BAUD 9600

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

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








sfr  AUXR  =  0x8e;                                   //辅助寄存器
                                                                  
sfr  ADC_CONTR  =  0xBC;                         //ADC控制寄存器
sfr  ADC_RES  =  0xBD;                                    //ADC高8位结果
sfr  ADC_LOW2  =  0xBE;                                 //ADC低2位结果
sfr  P1ASF  =  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);
        BYTE  ch=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[3];

         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[outData[0]]);                                          //此处先让其输出第一位,以测试
                 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--);
                 }
}


本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册