找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1935|回复: 0
打印 上一主题 下一主题
收起左侧

粉尘浓度检测仪的设计程序

[复制链接]
跳转到指定楼层
楼主
主要程序
/********************************************************************
* 名称 : Main()
* 功能 : 主函数
***********************************************************************/
void main()
{
       uchar h;
       uint sum;
    EA = 0;
       Timer0_Init();  //定时器0初始化
       EA = 1;
       RW=0;
       L1602_init();
       while(1)
       {
               if (FlagStartRH== 1&&set==0)   //温湿度转换标志检查
               {
                  TR0 = 0;
                     for(h=0;h<50;h++)
                     {
                            DA=adc0832(0);
                            sum=sum+DA;
                            delay_ms(100);
                            Key();
                     }
                     DA=sum/50;
                     sum=0;
                     DA=DA*(float)(DA/5);
                     ALARM();
                     if(set==0)
                     display();
                     TR0 = 1;
              }
              Key();
              ALARM();
       }
}
uchar ADC0832(bit mode,bit channel)     //AD转换,返回结果
{
       uchari,dat,ndat;
      
       ADCS= 0;//拉低CS
       _nop_();
       _nop_();
      
       ADDI = 1;      //1个下降沿为高电平
       ADCLK = 1;//拉高CLK
       _nop_();
       _nop_();
       ADCLK= 0;//拉低CLK,形成下降沿1
       _nop_();
       _nop_();
      
       ADDI= mode;     //低电平为差分模式,高电平为单通道模式。     
       ADCLK= 1;//拉高CLK
       _nop_();
       _nop_();
       ADCLK= 0;//拉低CLK,形成下降沿2
       _nop_();
       _nop_();
      
       ADDI= channel;  //低电平为CH0,高电平为CH1
       ADCLK= 1;//拉高CLK
       _nop_();
       _nop_();
       ADCLK= 0;//拉低CLK,形成下降沿3
      
       ADDI= 1;//控制命令结束(经试验必需)
       dat = 0;
       //下面开始读取转换后的数据,从最高位开始依次输出(D7~D0
       for(i = 0;i <8;i++)
       {
              dat<<= 1;
              ADCLK=1;//拉高晶振
              _nop_();
              _nop_();
              ADCLK=0;//拉低晶振端形成一次晶振脉冲
              _nop_();
              _nop_();
              dat|= ADDO;
       }
       ndat= 0;         //记录D0
       if(ADDO== 1)
       ndat|= 0x80;
       //下面开始继续读取反序的数据(从D1D7
       for(i= 0;i < 7;i++)
       {
              ndat>>= 1;
              ADCLK= 1;//拉高晶振
              _nop_();
              _nop_();
              ADCLK=0;//拉低晶振端形成一次晶振脉冲
              _nop_();
              _nop_();
              if(ADDO==1)
              ndat|= 0x80;
       }        
       ADCS=1;//拉高CS,结束转换
       ADCLK=0;//拉低CLK
       ADDI=1;//拉高数据端,回到初始状态
       if(dat==ndat)
       return(dat);
       else
       return0;   
}
/******************************************************************************
文 件 名   : adc0832.c

@file adc0832.c
@brief ADC0832驱动(8位ADC)

******************************************************************************/

/*----------------------------------------------*
* 包含头文件                                   *
*----------------------------------------------*/
#include "main.h"

#ifdef ADC0832_DEV_DRIVER

/*----------------------------------------------*
* 宏定义                                 *
*----------------------------------------------*/
#define DEBUG   ( 1 )

#if DEBUG
#define log(X)    print_string(X)
#else
#define log(X)
#endif

///ADC0832 IO口引脚定义
sbit ADC0832_PIN_CS  = P1^2;
sbit ADC0832_PIN_DO  = P1^3;
sbit ADC0832_PIN_DI  = P1^4;
sbit ADC0832_PIN_CLK = P1^5;

///ADC0832 IO操作
#define ADC0832_do_pin_read()      ADC0832_PIN_DO

#define ADC0832_di_pin_reset()     ADC0832_PIN_DI = 0
#define ADC0832_di_pin_set()       ADC0832_PIN_DI = 1

#define ADC0832_clk_pin_reset()    ADC0832_PIN_CLK = 0
#define ADC0832_clk_pin_set()      ADC0832_PIN_CLK = 1

#define ADC0832_cs_pin_reset()     ADC0832_PIN_CS = 0
#define ADC0832_cs_pin_set()       ADC0832_PIN_CS = 1

///ADC0832参考电压
#define ADC0832_AD_REF_VALTAGE    (5000ul)
/*----------------------------------------------*
* 枚举定义                            *
*----------------------------------------------*/

/*----------------------------------------------*
* 结构体定义                              *
*----------------------------------------------*/

/*----------------------------------------------*
* 外部函数原型说明                                     *
*----------------------------------------------*/

/*----------------------------------------------*
* 内部函数原型说明                                   *
*----------------------------------------------*/

/*----------------------------------------------*
* 全局变量                                     *
*----------------------------------------------*/

/*----------------------------------------------*
* 常量定义                                       *
*----------------------------------------------*/

/*---------------------------------------------------------------------------*/
/**
*@brief 读取adc0832的AD值
*
*
*@param channel 取值: 0/1, 其他值错误
*
*@return
*
*
*@note
*
*/
uint16_t adc0832_read_ad(uint8_t channel)
{
  uint8_t i = 0;
  uint8_t j;
  uint16_t dat = 0;
  uint8_t ndat = 0;

  if(channel == 0){
    channel = 2;
  }else if(channel == 1){
    channel = 3;
  }else{
    log("adc0832 channel err\r\n");
    return 0;
  }

  ADC0832_di_pin_set();
  _nop_();
  _nop_();
  ADC0832_cs_pin_reset();
  _nop_();
  _nop_();
  ADC0832_clk_pin_set();
  _nop_();
  _nop_();
  ADC0832_clk_pin_reset();
  _nop_();
  _nop_();
  ADC0832_clk_pin_set();
  if(channel&0x1){
    ADC0832_di_pin_set();
  }else{
    ADC0832_di_pin_reset();
  }
  _nop_();
  _nop_();
  ADC0832_clk_pin_reset();
  _nop_();
  _nop_();
  ADC0832_clk_pin_set();
  if((channel>>1)&0x1){
    ADC0832_di_pin_set();
  }else{
    ADC0832_di_pin_reset();
  }
  _nop_();
  _nop_();
  ADC0832_clk_pin_reset();
  ADC0832_di_pin_set();
  _nop_();
  _nop_();
  dat=0;
  for(i = 0; i < 8; i++)
  {
    dat |= ADC0832_do_pin_read();
    ADC0832_clk_pin_set();
    _nop_();
    _nop_();
    ADC0832_clk_pin_reset();
    _nop_();
    _nop_();
    dat <<= 1;
    if(i == 7){
      dat |= ADC0832_do_pin_read();
    }

  }  
  for(i = 0; i < 8; i++)
  {
    j = 0;
    j |= ADC0832_do_pin_read();/* 收数据 */
    ADC0832_clk_pin_set();
    _nop_();
    _nop_();
    ADC0832_clk_pin_reset();
    _nop_();
    _nop_();
    j <<= 7;
    ndat |= j;
    if( i < 7 ){
      ndat >>= 1;
    }
  }

  ADC0832_cs_pin_set();
  ADC0832_clk_pin_reset();
  dat <<= 8;
  dat |= ndat;
  dat >>= 8;

  return dat;
}
/*---------------------------------------------------------------------------*/
/**
*@brief 读取adc0832电压值
*
*
*@param channel 取值: 0/1, 其他值错误
*
*@return
*
*
*@note
*
*/
uint16_t adc0832_read_voltage_mv(uint8_t channel)
{
  uint32_t ad;

  ad = adc0832_read_ad(channel);

  ///计算电压值
  ad *= ADC0832_AD_REF_VALTAGE;
  ad >>= 8;

  return ad;
}
/*---------------------------------------------------------------------------*/
/**
*@brief adc0832初始化
*
*
*@param none
*
*@return
*
*
*@note
*
*/
void adc0832_init(void)
{
  adc0832_read_ad(0);///<读取Adc0832值,丢弃,防止第一次读取值时错误
}
/*---------------------------------------------------------------------------*/

#endif//ADC0832_DEV_DRIVER



1.png (67.24 KB, 下载次数: 109)

1.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表