|
- /*------------------------------------------------------------------------------------------------------------------------------------------*/
- /*--*************************功能: 【ADS1115單端輸入檢測(cè)電壓】********************--*/
- /*--*************************CPU: 【STC12C5A60S2】*******************************--*/
- /*--*************************ADC芯片:【ADS1115(2差分輸入或4單端輸入)】***********--*/
- /*--*************************液晶: 【LCD1602】************************************--*/
- /*--*************************ADC與單片機(jī)連接:【SCL:P1.0, SDA:P1.1】*******************--*/
- /*--*************************檢測(cè)范圍:【0.00~4.99V】*********************************--*/
- /*----------------------------------------------------------------------------------------------------------------------------------------*/
- #include <reg52.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define _Nop() _nop_()
- /*------------------------以下為LCD1602顯示模塊端口定義及函數(shù)聲明-----------------------*/
- sbit lcd_rs_port = P2^2; /*定義LCD控制端口*/
- sbit lcd_rw_port = P2^3;
- sbit lcd_en_port = P2^4;
- #define lcd_data_port P0
- unsigned char num_char_table[] ={"0123456789ABCDEF"};
- unsigned char Lcd_Dis1_table[] ={"Volt: V "}; //電壓顯示框架
- unsigned char pos_char_table[] ={" 67.9AB V "}; //電壓顯示位置
- void lcd_delay(uchar ms); //LCD1602 延時(shí)
- void lcd_busy_wait(); //LCD1602 忙等待
- void lcd_command_write(uchar command); //LCD1602 命令字寫入
- void lcd_system_reset(); //LCD1602 初始化
- void lcd_char_write(ucharx_pos,y_pos,lcd_dat); //LCD1602 字符寫入
- void lcd_bad_check(); //LCD1602 壞點(diǎn)檢查
- void Num_to_Disp(uint Num); //LCD1602 數(shù)據(jù)處理
- void LcdDisp(uint num); //LCD1602 數(shù)據(jù)顯示
- void delay_1ms(uchar x); //LCD1602 延時(shí)1ms
- /*------------------------以下為ADS1115模塊端口定義及函數(shù)聲明--------------------------*/
- sbit SCL = P1^0;
- sbit SDA = P1^1;
- #define TRUE 1
- #define FALSE 0
- unsigned int Config;
- unsigned char Writebuff[4],Readbuff[3];
- unsigned int Result[2];
- int D_ADS; //轉(zhuǎn)換的數(shù)字量
- #define Accuracy 32768 //定義ADC精度,ADS1115單端輸入時(shí)15位
- char VCC = 4.78; //VCC,電壓參考值
- #define ADDRESS_0 0x90 //ADDR PIN ->GND
- #define ADDRESS_1 0x92 //ADDR PIN ->VDD
- #define ADDRESS_2 0x94 //ADDR PIN ->SDA
- #define ADDRESS_3 0x96 //ADDR PIN ->SCL
- /************POINTERREGISTER*****************/
- #define Pointer_0 0x00 //Convertion register
- #define Pointer_1 0x01 //Config register
- #define Pointer_2 0x02 //Lo_thresh register
- #define Pointer_3 0x03 //Hi_thresh register
- /************CONFIG REGISTER*****************/
- #define OS_0 0x0000
- #define OS_1 0x8000
- #define MUX_0 0x0000 //AINp=AIN0, AINn=AIN1
- #define MUX_1 0x1000 //AINp=AIN0, AINn=AIN3
- #define MUX_2 0x2000 //AINp=AIN1, AINn=AIN3
- #define MUX_3 0x3000 //AINp=AIN2, AINn=AIN3
- #define MUX_4 0x4000 //AINp=AIN0, AINn=GND
- #define MUX_5 0x5000 //AINp=AIN1, AINn=GND
- #define MUX_6 0x6000 //AINp=AIN2, AINn=GND
- #define MUX_7 0x7000 //AINp=AIN3, AINn=GND
- #define PGA_0 0x0000 //FS=6.144V
- #define PGA_1 0x0200 //FS=4.096V
- #define PGA_2 0x0400 //FS=2.048V
- #define PGA_3 0x0600 //FS=1.024V
- #define PGA_4 0x0800 //FS=0.512V
- #define PGA_5 0x0A00 //FS=0.256V
- #define PGA_6 0x0C00 //FS=0.256V
- #define PGA_7 0x0E00 //FS=0.256V
- #define MODE_0 0x0000
- #define MODE_1 0x0100
- #define DR_0 0x0000 //Data Rate = 8
- #define DR_1 0x0020 //Data Rate = 16
- #define DR_2 0x0040 //Data Rate = 32
- #define DR_3 0x0060 //Data Rate = 64
- #define DR_4 0x0080 //Data Rate = 128
- #define DR_5 0x00A0 //Data Rate = 250
- #define DR_6 0x00C0 //Data Rate = 475
- #define DR_7 0x00E0 //Data Rate = 860
- #define COMP_MODE_0 0x0000
- #define COMP_MODE_1 0x0010
- #define COMP_POL_0 0x0000
- #define COMP_POL_1 0x0008
- #define COMP_LAT_0 0x0000
- #define COMP_LAT_1 0x0040
- #define COMP_QUE_0 0x0000
- #define COMP_QUE_1 0x0001
- #define COMP_QUE_2 0x0002
- #define COMP_QUE_3 0x0003
- //*************ADDRInitial********************/
- #define ADDRESS ADDRESS_0 //ADDR PIN ->GND
- #define ADDRESS_W ADDRESS|0x00 //寫地址
- #define ADDRESS_R ADDRESS|0x01 //讀地址
- /*************ConfigInitial*********************/
- #define OS OS_1
- #define MUX_A0 MUX_4 //AINp=AIN0, AINn=GND
- #define MUX_A1 MUX_5 //AINp=AIN1, AINn=GND
- #define MUX_A2 MUX_6 //AINp=AIN2, AINn=GND
- #define MUX_A3 MUX_7 //AINp=AIN3, AINn=GND
- #define PGA PGA_1 //FS=6.144V
- #define MODE MODE_1 //Continuous conversion mode
- #define DR DR_7 //Data Rate = 860
- #define COMP_QUE COMP_QUE_3
- void Delay_us_15 (void);
- void Delay_ms_1 (void); //功 能:延時(shí)
- void Start(void); //功 能:完成IIC的起始條件操作
- void Stop(void); //功 能:完成IIC的終止條件操作
- void ACK(void); //功 能:完成IIC的主機(jī)應(yīng)答操作
- void NACK(void); //功 能:完成IIC的主機(jī)無應(yīng)答操作
- unsigned char Check(void);//功 能:檢查從機(jī)的應(yīng)答操作
- void Write_1_Byte(unsigned char DataByte); //寫 1個(gè)字節(jié)
- unsigned char Write_N_Byte(unsigned char*writebuffer,unsigned char n); //寫 N個(gè)字節(jié)
- unsigned char Read_1_Byte(void); //讀 1個(gè)字節(jié)
- void Read_N_Byte(unsigned int*readbuff,unsigned char n); //讀 N個(gè)字節(jié)
- void InitADS1115(bit S_MUX_0, bit S_MUX_1); //ADS1115初始化
- void WriteWord(void); //寫
- void ReadWord(void); //讀
- unsigned int ADS1115(bit S_MUX_0, bitS_MUX_1); //ADS1115取值
- /*--------------------------------------------------------------------------------------------------------------------------------*/
- /*--*********************************【 主函數(shù) 】*******************************--*/
- /*-------------------------------------------------------------------------------------------------------------------------------*/
- void main()
- {
- unsignedint result;
-
- lcd_system_reset(); //LCD1602 初始化
- lcd_bad_check(); //LCD1602 壞點(diǎn)檢查
-
- while(1)
- {
- result= ADS1115(0,0); //ADS1115取值_AIN0
- //result= ADS1115(0,1); //ADS1115取值_AIN1
- //result = ADS1115(1,0); //ADS1115取值_AIN2
- //result = ADS1115(1,1); //ADS1115取值_AIN3
- LcdDisp(result); //LCD1602顯示電壓值
- }
- }
- /*--------------------------------------------------------------------------------------------------------------------------------*/
- /*--****************************************************************************--*/
- /*-------------------------------------------------------------------------------------------------------------------------------*/
- /*------------------------以下為LCD1602顯示模塊函數(shù)定義-----------------------*/
- void lcd_delay(uchar ms) /***********LCD1602 延時(shí)***************/
- {
- uchar j;
- while(ms--){
- for(j=0;j<250;j++)
- {;}
- }
- }
- void lcd_busy_wait() /**********LCD1602 忙等待*************/
- {
- lcd_rs_port = 0;
- lcd_rw_port = 1;
- lcd_en_port = 1;
- lcd_data_port = 0xff;
- while (lcd_data_port&0x80);
- lcd_en_port = 0;
- }
- void lcd_command_write(uchar command) /**********LCD1602 命令字寫入*************/
- {
- lcd_busy_wait();
- lcd_rs_port = 0;
- lcd_rw_port = 0;
- lcd_en_port = 0;
- lcd_data_port = command;
- lcd_en_port = 1;
- lcd_en_port = 0;
- }
- void lcd_system_reset() /**********LCD1602 初始化**************/
- {
- lcd_delay(20);
- lcd_command_write(0x38);
- lcd_delay(100);
- lcd_command_write(0x38);
- lcd_delay(50);
- lcd_command_write(0x38);
- lcd_delay(10);
- lcd_command_write(0x08);
- lcd_command_write(0x01);
- lcd_command_write(0x06);
- lcd_command_write(0x0c);
- }
- void lcd_char_write(ucharx_pos,y_pos,lcd_dat) /******LCD1602 字符寫入**********/
- {
- x_pos &= 0x0f; /* X位置范圍 0~15 */
- y_pos &= 0x01; /* Y位置范圍 0~ 1 */
- if(y_pos==1) x_pos += 0x40;
- x_pos += 0x80;
- lcd_command_write(x_pos);
- lcd_busy_wait();
- lcd_rs_port = 1;
- lcd_rw_port = 0;
- lcd_en_port = 0;
- lcd_data_port = lcd_dat;
- lcd_en_port = 1;
- lcd_en_port = 0;
- }
- void lcd_bad_check() /******LCD1602 壞點(diǎn)檢查**********/
- {
- char i,j;
- for(i=0;i<2;i++){
- for(j=0;j<16;j++) {
- lcd_char_write(j,i,0xff);
- }
- }
- lcd_delay(200);
- lcd_delay(200);
- lcd_delay(200);
- lcd_delay(100);
- lcd_delay(200);
- lcd_command_write(0x01); //clear lcd disp
- }
- void Num_to_Disp(uint Num) /******LCD顯示數(shù)據(jù)處理*****/ //Start_1-Over_1:顯示電壓值,Start_2-Over_2:顯示ADS1115輸出數(shù)值
- {
- floatNUM; //Start_1
- intxx, yy, zz, zzz;
- NUM= (Num / (float)Accuracy) * VCC; //ADS1115取值 = Accuracy× (Vin / VCC)
- xx= (int)NUM;
- yy= (int)((NUM - (float)(xx)) * 10);
- zz= (int)((NUM - (float)(xx)) * 100)%10;
- zzz= (int)((NUM - (float)(xx)) * 1000)%10;
- pos_char_table[6]= num_char_table[xx / 10]; //電壓值十位
- pos_char_table[7]=num_char_table[xx % 10]; //電壓值個(gè)位
- pos_char_table[9]=num_char_table[yy]; //電壓值小數(shù)點(diǎn)后一位
- pos_char_table[10]=num_char_table[zz]; //電壓值小數(shù)點(diǎn)后兩位
- pos_char_table[11]=num_char_table[zzz]; //電壓值小數(shù)點(diǎn)后三位 //Over_1
- /*
- pos_char_table[6]= num_char_table[Num / 10000]; //Start_2
- pos_char_table[7]= num_char_table[(Num % 10000) / 1000];
- pos_char_table[8]=num_char_table[((Num % 10) % 1000) / 100];
- pos_char_table[9]=num_char_table[(Num / 10) % 10];
- pos_char_table[A]=num_char_table[Num % 10]; //Over_2
- */
- }
- void LcdDisp(uint num) /************LCD顯示*************/
- {
- uinti=0;
- for(i=0;i<16;i++)
- {
- lcd_char_write(i,0,Lcd_Dis1_table[ i]); //顯示框架
- }
- Num_to_Disp(num);
- for(i= 6; i < 12; i++)
- {
- lcd_char_write(i,0,pos_char_table[ i]); //顯示電壓
- }
- delay_1ms(100);
- }
- void delay_1ms(uchar x) /*******1MS為單位的延時(shí)程序******/
- {
- uchar j;
- while(x--){
- for(j=0;j<125;j++)
- {;}
- }
- }
- /*------------------------以下為ADS1115模塊端口函數(shù)定義--------------------------*/
- void Delay_us_15 (void) /*延時(shí)程序*/
- {
- unsigned char i;
-
- for(i = 0;i < 15;i++)
- _nop_();
- }
- void Delay_ms_1 (void)
- {
- unsignedchar i;
- for(i= 150;i > 0;i--) _nop_();
- }
- ///*******************************************
- //函數(shù)名稱:Start
- //功 能:完成IIC的起始條件操作
- //參 數(shù):無
- //返回值 :無
- //********************************************/
- void Start(void)
- {
- SCL=1;
- SDA=1;
- Delay_us_15 ();
- SDA=0;
- Delay_us_15 ();
- SCL=0;
- Delay_us_15 ();
- }
- //
- ///*******************************************
- //函數(shù)名稱:Stop
- //功 能:完成IIC的終止條件操作
- //參 數(shù):無
- //返回值 :無
- //********************************************/
- void Stop(void)
- {
- SDA=0;
- Delay_us_15 ();
- SCL=1;
- Delay_us_15 ();
- SDA=1;
- Delay_us_15 ();
- }
- ///*******************************************
- //函數(shù)名稱:ACK
- //功 能:完成IIC的主機(jī)應(yīng)答操作
- //參 數(shù):無
- //返回值 :無
- //********************************************/
- void ACK(void)
- {
- SDA=0;
- _nop_(); _nop_();
- SCL=1;
- Delay_us_15 ();
- SCL=0;
- _nop_();_nop_();
- SDA=1;
- Delay_us_15 ();
- }
- //*******************************************
- //函數(shù)名稱:NACK
- //功 能:完成IIC的主機(jī)無應(yīng)答操作
- //參 數(shù):無
- //返回值 :無
- //********************************************/
- void NACK(void)
- {
- SDA=1;
- _nop_();_nop_();
- SCL=1;
- Delay_us_15();
- SCL=0;
- _nop_();_nop_();
- SDA=0;
- Delay_us_15();
- }
- //**********檢查應(yīng)答信號(hào)函數(shù)******************/
- ///*如果返回值為1則證明有應(yīng)答信號(hào),反之沒有*/
- ///*******************************************
- //函數(shù)名稱:Check
- //功 能:檢查從機(jī)的應(yīng)答操作
- //參 數(shù):無
- //返回值 :從機(jī)是否有應(yīng)答:1--有,0--無
- //********************************************/
- unsigned char Check(void)
- {
- unsigned char slaveack;
-
- SDA=1;
- _nop_(); _nop_();
- SCL=1;
- _nop_(); _nop_();
- _nop_(); _nop_();
- slaveack = SDA; //讀入SDA數(shù)值
- SCL=0;
- Delay_us_15 ();
-
- if(slaveack) return FALSE;
- else return TRUE;
- }
- /***************Write a Byte****************/
- void Write_1_Byte(unsigned char DataByte)
- {
- inti;
- for(i=0;i<8;i++)
- {
- if(DataByte&0x80) //if((DataByte<<i)&0x80)
- SDA=1;
- else
- SDA=0;
- Delay_us_15 ();
- SCL=1;
- Delay_us_15 ();
- SCL=0;
- Delay_us_15 ();
- DataByte <<= 1;
- }
- SDA=1;
- _nop_();
- }
- /***************Write NByte****************/
- unsigned char Write_N_Byte(unsigned char*writebuffer,unsigned char n)
- {
- inti;
- for(i=0;i<n;i++)
- {
- Write_1_Byte(*writebuffer);
- if(Check())
- {
- writebuffer++;
- }
- else
- {
- Stop();
- return FALSE;
- }
- }
- Stop();
- returnTRUE;
- }
- //***************Read aByte****************/
- unsigned char Read_1_Byte(void)
- {
- unsigned char data_Value = 0, FLAG, i;
-
- for(i=0;i<8;i++)
- {
-
- SDA=1;
- Delay_us_15();
- SCL=1;
- Delay_us_15();
- FLAG=SDA;
- data_Value <<= 1;
- if(FLAG)
- data_Value |= 0x01;
- SCL=0;
- Delay_us_15 ();
- }
- return data_Value;
- }
- //***************Read NByte****************/
- void Read_N_Byte(unsigned int*readbuff,unsigned char n)
- {
- unsignedchar i;
-
- for(i=0;i<n;i++)
- {
- readbuff[ i]=Read_1_Byte();
- if(i==n-1)
- NACK(); //不連續(xù)讀字節(jié)
- else
- ACK();//連續(xù)讀字節(jié)
- }
- Stop();
- }
- //*****************初始化******************/
- void InitADS1115(bit S_MUX_0, bit S_MUX_1)
- {
-
- if(S_MUX_0 == 0 && S_MUX_1 == 0) //AIN0
- Config= OS+MUX_A0+PGA+DR+COMP_QUE+MODE;
- if(S_MUX_0 == 0 && S_MUX_1 == 1) //AIN1
- Config= OS+MUX_A1+PGA+DR+COMP_QUE+MODE;
- if(S_MUX_0 == 1 && S_MUX_1 == 0) //AIN2
- Config= OS+MUX_A2+PGA+DR+COMP_QUE+MODE;
- if(S_MUX_0 == 1 && S_MUX_1 == 1) //AIN3
- Config= OS+MUX_A3+PGA+DR+COMP_QUE+MODE;
-
- Writebuff[0]=ADDRESS_W;
- Writebuff[1]=Pointer_1;
- Writebuff[2]=Config/256;
- Writebuff[3]=Config%256;
-
- Readbuff[0]=ADDRESS_W;
- Readbuff[1]=Pointer_0;
-
- Readbuff[2]=ADDRESS_R;
- }
- //***************Write aWord***********************/
- void WriteWord(void)
- {
- int t;
- Start(); //寫入4個(gè)字節(jié)
- do
- {
- t=Write_N_Byte(Writebuff,4);
- }while(t==0);
- }
- //***************ReadWord***********************/
- void ReadWord(void)
- {
- int t;
- Start(); //寫入2個(gè)字節(jié)
- do
- {
- t=Write_N_Byte(Readbuff,2);
- }while(t==0);
- Start(); //寫入2個(gè)字節(jié)
- do
- {
- t=Write_N_Byte(&Readbuff[2],1);
- }while(t==0);
-
- Read_N_Byte(Result,2); //讀出2個(gè)字節(jié)
- }
- //***************ADS1115********************/
- unsigned int ADS1115(bit S_MUX_0, bitS_MUX_1)
- {
- InitADS1115(S_MUX_0, S_MUX_1);
- WriteWord();
- Delay_ms_1();
- ReadWord();
-
- D_ADS=Result[0]*256+Result[1]; //轉(zhuǎn)換的數(shù)字量
- return D_ADS;
- }
復(fù)制代碼 |
|