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

📄 max.c

📁 这是我写的一个AD转换的程序
💻 C
字号:


#include <reg52.h>
#include <intrins.h>
#include<absacc.h>

#include "key.h"
#include "led.h"

extern uchar key;//存键值
extern bit key_flag;//键按下标志
extern uchar led_buf[];//显示缓冲区

#define nop8() {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}

#define IN_0_5_BASE    1.220703  //  5/4096,量程为0-5v每单位电压大小
#define IN_0_10_BASE   2.441406  //  10/4096 0-10v
#define IN_N5_5_BASE   2.441406  //  10/4096 -5v-5v
#define IN_N10_10_BASE 4.882813   // 20/4096 -10v-10v
                         //_cs HBEN  
#define ADCCOM  XBYTE[0x7fff]  //0   1  控制命令字地址
#define ADLO  XBYTE[0x3fff]  //0   0   低8位地址,
#define ADHI  XBYTE[0x7Fff]  //0   1     高四位地址
                         //内部时钟 内部采样 0 to 5  通道0 
uchar channel=0;        //PD1 PD0 ACQMOD RNG BIP A2 A1 A0

uchar volatile bdata command_byte=0x40;  //0   1     0    0   0   0  0  0
sbit PD1=command_byte^7; 
sbit PD0=command_byte^6;
sbit ACQMOD=command_byte^5;
sbit RNG=command_byte^4;
sbit BIP=command_byte^3;

//###################################################
//sbit _WR=P3^6;
//sbit _RD=P3^7;
//sbit CS=P2^7;     //引脚连接
//sbit HBEN=P2^6;
//###################################################
                 
void main(void)
{
 uchar msb,lsb;
 uint volatile data volt;
 uchar input_mode;
 CS=HBEN=1;

 key_init();

 led_buf[7]=channel;
 led_buf[6]=12+((uchar)BIP<<1)+(uchar)RNG; 

 //BIP RNG INPUT RANGE (V) 显示
 // 0   0    0 to 5    a
 // 0   1    0 to 10   b
 // 1   0     ±5      c
 // 1   1     ±10     d  
                              
 led_update();

 while(1)
 {
   
  if(_testbit_(key_flag))
  {
   if(read_key())//读按键
   {
    if(key==KEY_B)
    {
     ADCCOM=command_byte+channel;
     nop8();//等待8us让其完成转换
     ADCCOM=command_byte+channel; //让其测三次之后就可以得到稳定的电压了。
     nop8();//等待8us让其完成转换
     ADCCOM=command_byte+channel;
     nop8();//等待8us让其完成转换
     msb=ADHI&0x0f;
     lsb=ADLO;
     volt=msb*256+lsb; 
     lclear(0,5);
     input_mode=((uchar)BIP<<1)+(uchar)RNG;//由量程来确定如何处理数据
     switch(input_mode)
     {
      case 0:
       volt*=IN_0_5_BASE;
       break;
      case 1:
       volt*=IN_0_10_BASE;
       break;
      case 2:
       volt*=IN_N5_5_BASE;
       if(volt>5000)//如是为负电压
       {
        led_buf[0]=LED_NEG;
        volt=10000-volt; 
       }
       else
        led_buf[0]=LED_BLANK;//显示负号
       break;
      case 3:
       volt*=IN_N10_10_BASE;
       if(volt>10000)//如是为负电压
       {
        led_buf[0]=LED_NEG;
        volt=20000-volt; 
       }
       else
        led_buf[0]=LED_BLANK;//显示负号
       break;
      
     }
     if(volt>9999)
      lprinti(volt,0x35,1);//格式输出
     else
     {
      lprinti(volt,0x34,2);//格式输出
     }
     led_update(); 
    }
    else if(key==KEY_C)//按键选择量程为0-5v
    {
     BIP=0;
     RNG=0;
    }
    else if(key==KEY_D)//按键选择量程为0-10v
    {
     BIP=0;
     RNG=1;
    }
    else if(key==KEY_E)//按键选择量程为-5-5v
    {
     BIP=1;
     RNG=0;
    }
    else if(key==KEY_F)//按键选择量程为-10-10v
    {
     BIP=1;
     RNG=1;
    }
    else if(key<KEY_8)//选择通道0~7
    {
     channel=key;
     led_buf[7]=channel;//通道送显
    }
    led_buf[6]=12+((uchar)BIP<<1)+(uchar)RNG;//量程送显
    led_update();
   }
  }
 }
}

⌨️ 快捷键说明

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