⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc0832.c

📁 WL025_ADC0832数字电压表数码管显示
💻 C
字号:

/********************************************************************/
/*                                                                  */
/* ME300B单片机开发系统演示程序 - ADC0832电压表                     */
/*                                                                  */
/* 采用三位数码管显示                                               */
/* 参考电压接至5V电源                                               */
/* 最小输出电压:0.00V  最大输出电压:5.00V  分辨率:0.02V          */
/*                                                                  */
/* 邮箱:  gguoqing@willar.com                                       */
/* 网站: http://www.willar.com                                     */
/* 作者: gguoqing                                                  */
/* 时间: 2006/01/20                                                */
/*                                                                  */
/*                                                                  */
/*【版权】Copyright(C)伟纳电子 www.willar.com  All Rights Reserved  */
/*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!        */
/*                                                                  */
/********************************************************************/

#include"reg51.h"
#include"intrins.h"

#define uchar unsigned char
#define uint  unsigned int

#define disdata  P0        //显示数据段码输出口

#define channel_0  0x02   //单通道0输入选择
#define channel_1  0x03   //单通道1输入选择

sbit ADC_CS = P3^4;        //片选端
sbit ADC_CLK= P1^0;        //时钟端
sbit ADC_DI = P1^1;        //数据输入输出复用
sbit ADC_DO = P1^1;        //DI和DO端都接在P1.1

sbit  ACC0=ACC^0;          //通道与输入方式控制字
sbit  ACC1=ACC^1;          //通道与输入方式控制字
sbit  DISX=P0^7;           //LED小数点

uchar code disply[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; 

                     // 0    1    2    3    4    5    6    7    8    9   关闭

uchar code dis_scan[3]={0x7f,0xbf,0xdf}; //列扫描控制字

uint data dis[4]={0x00,0x00,0x00,0x00}; //定义3个显示数据单元和一个数据存储单元 

/********************************************************************/
/*                                                                  */
/* 延时函数                                                         */
/*                                                                  */
/********************************************************************/

delay(int ms)
{                           
    int i;
    while(ms--)
    {
      for(i = 0; i< 250; i++)
      {
       _nop_();
       _nop_();
       _nop_();
       _nop_();
      }
    }
}

/********************************************************************/
/*                                                                  */
/*  启动ADC转换                                                     */
/*                                                                  */
/********************************************************************/

ADC_start() 
{
    ADC_CS=1;         //一个转换周期开始
    _nop_(); 
    ADC_CLK=0;      
    _nop_();
    ADC_CS=0;         //CS置0,片选有效
    _nop_();
    ADC_DI=1;         //DI置1,起始位
    _nop_();
    ADC_CLK=1;        //第一个脉冲
    _nop_();
    ADC_DI=0;         //在负跳变之前加一个DI反转操作
    _nop_();
    ADC_CLK=0;      
    _nop_();      
}
 
/********************************************************************/
/*                                                                  */
/*AD转换函数                                                        */
/*选择输入通道,输入信号的模式《单端输入,或差分输入》              */
/*                                                                  */
/********************************************************************/
           
ADC_read(uchar mode)
{
    uchar i;
    ADC_start();      //启动转换开始
    ACC=mode;
    ADC_DI=ACC1;      //输出控制位1,DI=1,单通道输入,DI=0,差分输入。
    ADC_CLK=1;        //第二个脉冲
    _nop_();
    ADC_DI=0;
    ADC_CLK=0;
    _nop_();
    ADC_DI=ACC0;      //输出控制位0,DI=0,通道0输入,DI=1,通道1输入。
    ADC_CLK=1;        //第三个脉冲
    _nop_();
    ADC_DI=1;
    ADC_CLK=0;        //输入模式和通道号已经选择完。

    ADC_CLK=1;        //第四个脉冲
    ACC=0;                 
    
    for(i=8;i>0;i--)  //读取8位数据
  {                      
    ADC_CLK=0;        //脉冲下降沿
   
    ACC=ACC<<1;
    ACC0=ADC_DO;      //读取DO端数据
    _nop_();
    _nop_();                
    ADC_CLK=1;                   
  }
    ADC_CS=1;         //CS=1,片选无效。
    return(ACC);
}

/********************************************************************/
/*                                                                  */
/* 数据处理与显示函数                                               */
/* 将采集到的数据进行16进制转换为10进制的处理,然后送显示。         */
/*                                                                  */
/********************************************************************/

show_value(uchar ad_data)

{
    uchar  k; 
 
    dis[2]=ad_data/51;   //AD值转换为3为BCD码,最大为5.00V。
    dis[3]=ad_data%51;   //余数暂存
    dis[3]=dis[3]*10;    //计算小数第一位
    dis[1]=dis[3]/51;
    dis[3]=dis[3]%51;
    dis[3]=dis[3]*10;    //计算小数第二位
    dis[0]=dis[3]/51;                                                                             //
     
    for(k=0;k<3;k++)
     {
       disdata=disply[dis[k]];
       if(k==2){DISX=0;}
       P2=dis_scan[k];
       delay(1);
       P2=0xff;
     }          
} 
      
/********************************************************************/
/*                                                                  */
/*  主函数                                                          */
/*                                                                  */
/********************************************************************/
main()
{ 
    uchar i,j;
    while(1)
    {
      i=ADC_read(channel_0);
      for(j=0;j<20;j++)      
      {
        show_value(i);
      }     
    }
}
 
/********************************************************************/ 
/*                                                                  */
/*将i=ADC_read(channel_0)改为i=ADC_read(channel_1)即可使用JP6输入   */
/*                                                                  */
/********************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -