主要程序 /******************************************************************** * 名称 : 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; //下面开始继续读取反序的数据(从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端,结束转换 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
|