1、/*-*/ /*-*功能: 【ADS1115 单端输入检测电压 】*-*/*-*CPU: 【STC12C5A60S2】*-*/*-*ADC 芯片:【ADS1115 (2 差分输入或 4 单端输入) 】*-*/*-*液晶: 【LCD1602】*-*/*-*ADC 与单片机连接:【SCL:P1.0 , SDA:P1.1】*-*/*-*检测范围:【0.004.99V】*-*/*-*/ #include #include #define uint unsigned int#define uchar unsigned char#define _Nop() _nop_()/*-以下为 LCD1602 显示
2、模块端口定义及函数声明-*/sbit lcd_rs_port = P17; /*定义 LCD 控制端口*/sbit lcd_rw_port = P16;sbit lcd_en_port = P24;#define lcd_data_port P0unsigned 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);
3、 /LCD1602 延时void lcd_busy_wait(); /LCD1602 忙等待void lcd_command_write(uchar command); /LCD1602 命令字写入void lcd_system_reset(); /LCD1602 初始化void lcd_char_write(uchar x_pos,y_pos,lcd_dat); /LCD1602 字符写入void lcd_bad_check(); /LCD1602 坏点检查void Num_to_Disp(uint Num); /LCD1602 数据处理void LcdDisp(uint num); /LC
4、D1602 数据显示void delay_1ms(uchar x); /LCD1602 延时 1ms/*-以下为 ADS1115 模块端口定义及函数声明-*/sbit SCL = P10;sbit SDA = P11;#define TRUE 1#define FALSE 0unsigned int Config;unsigned char Writebuff4,Readbuff3;unsigned int Result2; int D_ADS; /转换的数字量#define Accuracy 32768 /定义 ADC 精度,ADS1115 单端输入时 15 位char VCC = 4.78
5、; /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/*POINTER REGISTER*/#define Pointer_0 0x00 /Convertion register#define Pointer_1 0x01 /Config register#define Pointer_2 0x02 /Lo_thresh regi
6、ster#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=AI
7、N0, 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 PG
8、A_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
9、#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_QU
10、E_1 0x0001#define COMP_QUE_2 0x0002#define COMP_QUE_3 0x0003/*ADDR Initial*/#define ADDRESS ADDRESS_0 /ADDR PIN -GND#define ADDRESS_W ADDRESS|0x00 /写地址#define ADDRESS_R ADDRESS|0x01 /读地址/*Config Initial*/#define OS OS_1#define MUX_A0 MUX_4 /AINp=AIN0, AINn=GND#define MUX_A1 MUX_5 /AINp=AIN1, AINn=GN
11、D#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_3void Delay_us_15 (void);void Delay_ms_1 (void); /功 能:延时void Start(void); /功 能:完成 II
12、C 的起始条件操作void Stop(void); /功 能:完成 IIC 的终止条件操作void ACK(void); /功 能:完成 IIC 的主机应答操作void NACK(void); /功 能:完成 IIC 的主机无应答操作unsigned char Check(void);/功 能:检查从机的应答操作void Write_1_Byte(unsigned char DataByte); /写 1 个字节unsigned char Write_N_Byte(unsigned char *writebuffer,unsigned char n); /写 N 个字节unsigned cha
13、r Read_1_Byte(void); /读 1 个字节void Read_N_Byte(unsigned int *readbuff,unsigned char n); /读 N 个字节void InitADS1115(bit S_MUX_0, bit S_MUX_1); /ADS1115 初始化void WriteWord(void); /写void ReadWord(void); /读unsigned int ADS1115(bit S_MUX_0, bit S_MUX_1); /ADS1115 取值/*-*/*-*【 主函数 】*-*/*-*/void main()unsigned
14、int result;lcd_system_reset(); /LCD1602 初始化lcd_bad_check(); /LCD1602 坏点检查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 取值_AIN3LcdDisp(result); /LCD1602 显示电压值/*-*/*-*-*/*-*/*-以下为 LCD1602
15、显示模块函数定义-*/void lcd_delay(uchar ms) /*LCD1602 延时 */uchar j;while(ms-)for(j=0;j 0;i-) _nop_();/*/函数名称:Start/功 能:完成 IIC 的起始条件操作/参 数:无/返回值 :无/*/void Start(void)SCL=1;SDA=1;Delay_us_15 ();SDA=0;Delay_us_15 ();SCL=0;Delay_us_15 ();/*/函数名称:Stop/功 能:完成 IIC 的终止条件操作/参 数:无/返回值 :无/*/void Stop(void) SDA=0;Delay
16、_us_15 ();SCL=1;Delay_us_15 ();SDA=1;Delay_us_15 ();/*/函数名称:ACK/功 能:完成 IIC 的主机应答操作/参 数:无/返回值 :无/*/void ACK(void)SDA=0;_nop_(); _nop_();SCL=1;Delay_us_15 ();SCL=0;_nop_(); _nop_();SDA=1;Delay_us_15 ();/*/函数名称:NACK/功 能:完成 IIC 的主机无应答操作/参 数:无/返回值 :无/*/void NACK(void)SDA=1;_nop_(); _nop_();SCL=1;Delay_us
17、_15 ();SCL=0;_nop_(); _nop_();SDA=0; Delay_us_15 (); /*检查应答信号函数*/*如果返回值为 1 则证明有应答信号,反之没有*/*/函数名称:Check/功 能:检查从机的应答操作/参 数:无/返回值 :从机是否有应答:1-有,0-无/*/unsigned char Check(void)unsigned char slaveack;SDA=1;_nop_(); _nop_();SCL=1;_nop_(); _nop_();_nop_(); _nop_();slaveack = SDA; /读入 SDA 数值SCL=0;Delay_us_15
18、 ();if(slaveack) return FALSE;else return TRUE;/*Write a Byte*/void Write_1_Byte(unsigned char DataByte)int i;for(i=0;i8;i+)if(DataByteelseSDA=0;Delay_us_15 ();SCL=1;Delay_us_15 ();SCL=0;Delay_us_15 ();DataByte = 1;SDA=1;_nop_(); /*Write N Byte*/unsigned char Write_N_Byte(unsigned char *writebuffer,
19、unsigned char n)int i;for(i=0;in;i+)Write_1_Byte(*writebuffer);if(Check()writebuffer +;elseStop();return FALSE;Stop();return TRUE;/*Read a Byte*/unsigned char Read_1_Byte(void)unsigned char data_Value = 0, FLAG, i;for(i=0;i8;i+)SDA=1;Delay_us_15 ();SCL=1;Delay_us_15 ();FLAG=SDA;data_Value = 1;if( FL
20、AG)data_Value |= 0x01;SCL=0;Delay_us_15 ();return data_Value;/*Read N Byte*/void Read_N_Byte(unsigned int*readbuff, unsigned char n)unsigned char i;for(i=0;in;i+)readbuffi=Read_1_Byte();if(i=n-1)NACK(); /不连续读字节else ACK(); /连续读字节Stop();/*初始化*/void InitADS1115(bit S_MUX_0, bit S_MUX_1)if (S_MUX_0 = 0
21、if (S_MUX_0 = 0 if (S_MUX_0 = 1 if (S_MUX_0 = 1 Writebuff0=ADDRESS_W;Writebuff1=Pointer_1;Writebuff2=Config/256;Writebuff3=Config%256;Readbuff0=ADDRESS_W;Readbuff1=Pointer_0;Readbuff2=ADDRESS_R;/*Write a Word*/void WriteWord(void)int t;Start(); /写入 4 个字节dot=Write_N_Byte(Writebuff,4);while(t=0);/*Rea
22、d Word*/void ReadWord(void)int t;Start(); /写入 2 个字节dot=Write_N_Byte(Readbuff,2);while(t=0);Start(); /写入 2 个字节dot=Write_N_Byte(while(t=0);Read_N_Byte(Result,2); /读出 2 个字节/*ADS1115*/unsigned int ADS1115(bit S_MUX_0, bit S_MUX_1)InitADS1115(S_MUX_0, S_MUX_1);WriteWord();Delay_ms_1(); ReadWord();D_ADS=Result0*256+Result1; /转换的数字量return D_ADS;