標(biāo)題: 粉塵濃度檢測儀的設(shè)計(jì)程序 [打印本頁]
作者: 立即倆的爹 時(shí)間: 2021-4-27 10:54
標(biāo)題: 粉塵濃度檢測儀的設(shè)計(jì)程序
主要程序
/********************************************************************
* 名稱 : Main()
* 功能 : 主函數(shù)
***********************************************************************/
void main()
{
uchar h;
uint sum;
EA = 0;
Timer0_Init(); //定時(shí)器0初始化
EA = 1;
RW=0;
L1602_init();
while(1)
{
if (FlagStartRH== 1&&set==0) //溫濕度轉(zhuǎn)換標(biāo)志檢查
{
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轉(zhuǎn)換,返回結(jié)果
{
uchari,dat,ndat;
ADCS= 0;//拉低CS端
_nop_();
_nop_();
ADDI = 1; //第1個(gè)下降沿為高電平
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;//控制命令結(jié)束(經(jīng)試驗(yàn)必需)
dat = 0;
//下面開始讀取轉(zhuǎn)換后的數(shù)據(jù),從最高位開始依次輸出(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;
//下面開始繼續(xù)讀取反序的數(shù)據(jù)(從D1到D7)
for(i= 0;i < 7;i++)
{
ndat>>= 1;
ADCLK= 1;//拉高晶振端
_nop_();
_nop_();
ADCLK=0;//拉低晶振端形成一次晶振脈沖
_nop_();
_nop_();
if(ADDO==1)
ndat|= 0x80;
}
ADCS=1;//拉高CS端,結(jié)束轉(zhuǎn)換
ADCLK=0;//拉低CLK端
ADDI=1;//拉高數(shù)據(jù)端,回到初始狀態(tài)
if(dat==ndat)
return(dat);
else
return0;
}
/******************************************************************************
文 件 名 : adc0832.c
@file adc0832.c
@brief ADC0832驅(qū)動(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)
/*----------------------------------------------*
* 枚舉定義 *
*----------------------------------------------*/
/*----------------------------------------------*
* 結(jié)構(gòu)體定義 *
*----------------------------------------------*/
/*----------------------------------------------*
* 外部函數(shù)原型說明 *
*----------------------------------------------*/
/*----------------------------------------------*
* 內(nèi)部函數(shù)原型說明 *
*----------------------------------------------*/
/*----------------------------------------------*
* 全局變量 *
*----------------------------------------------*/
/*----------------------------------------------*
* 常量定義 *
*----------------------------------------------*/
/*---------------------------------------------------------------------------*/
/**
*@brief 讀取adc0832的AD值
*
*
*@param channel 取值: 0/1, 其他值錯(cuò)誤
*
*@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();/* 收數(shù)據(jù) */
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, 其他值錯(cuò)誤
*
*@return
*
*
*@note
*
*/
uint16_t adc0832_read_voltage_mv(uint8_t channel)
{
uint32_t ad;
ad = adc0832_read_ad(channel);
///計(jì)算電壓值
ad *= ADC0832_AD_REF_VALTAGE;
ad >>= 8;
return ad;
}
/*---------------------------------------------------------------------------*/
/**
*@brief adc0832初始化
*
*
*@param none
*
*@return
*
*
*@note
*
*/
void adc0832_init(void)
{
adc0832_read_ad(0);///<讀取Adc0832值,丟棄,防止第一次讀取值時(shí)錯(cuò)誤
}
/*---------------------------------------------------------------------------*/
#endif//ADC0832_DEV_DRIVER
-
1.png
(67.24 KB, 下載次數(shù): 109)
下載附件
2021-4-27 10:53 上傳
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |