楼主帮忙看一下,我的测量的数据要么是0xffff 要么是 0x0b58
换算5V量程 4.92 和0.21V,有个很小的电压就显示0XFFFF,
keil u4 +STCI SP (v6.33)+STC12C5A60S2 (40 PIN DIP)
还有个问题,主函数中有一句 InitADS1115(); 但是在子函数中这个需要参数,不知道这一句是否在执行。先出过编译不过,后出的警告
- /*********************************************************************************************
- 函数名:通过串口发送温度与电压随时间变化
- 上位机软件 LABVIEW 2015
- 返回值:2字节数据,温度= (高8位*256+低8位)*0.25 ℃
- 2字节数据 ,电压=(高8位*256+低8位)*0.00007539 V
- 备 注:振荡晶体为11.0592MHz,PC串口端设置 [ 9600,8,无,1,无 ]
- 温度传感器芯片 max6675
- 电压传感芯片 ADS1115
- /**********************************************************************************************/
- #include <STC12C5A60S2.H>
- #include <string.h>
- #include<intrins.h >
- #include<ads1115.h>
- #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
- //定义全局变量与接口
- bit flag;
- unsigned char LOW_1;// 存放温度低8位
- unsigned char HI_1;//存放温度高8位,其中4位未用
- unsigned char LOW_2;// 存放电压低8位
- unsigned char HI_2;//存放电压高8位
- sbit SO=P0^2;//P0.2 与SO相连 6675
- sbit CS= P0^1;//P0.1 与CS相连 6675
- sbit SCK=P0^0;//P0.0与SCK相连 6675
- unsigned int P_Temp;
- sbit SDA= P2^0; //P2.0与SDA相连 1115
- sbit SCL= P2^1; //P2.1与SCL相连 1115
- // ADDR 与GND相连
- // ALRT 空
- //
- char Channel_Value;
- int D_ADS; //转换的数字量
- unsigned int Config;
- unsigned char Writebuff[4],Readbuff[3];
- unsigned int Result[2];
- /*********************************************************************************************
- 函数名:UART串口初始化函数
- 调 用:UART_init();
- 参 数:无
- 返回值:无
- 结 果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
- 备 注:振荡晶体为11.0592MHz,PC串口端设置 [ 19200,8,无,1,无 ]
- /**********************************************************************************************/
- void UART_init (void){
- EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
- ES = 1; //允许UART串口的中断
- TMOD = 0x20; //定时器T/C1工作方式2
- SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
- TH1 = 0xFD; //定时器初值高8位设置
- TL1 = 0xFD; //定时器初值低8位设置
- // PCON = 0x80; //波特率倍频(屏蔽本句波特率为9600)
- TR1 = 1; //定时器启动
- }
- /**********************************************************************************************/
- /*********************************************************************************************
- 函数名:UART串口接收中断处理函数
- 调 用:[SBUF收到数据后中断处理]
- 参 数:无
- 返回值:无
- 结 果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)
- 备 注:过长的处理程序会影响后面数据的接收
- /**********************************************************************************************/
- void UART_R (void) interrupt 4 using 1{ //切换寄存器组到1
- unsigned char UART_data; //定义串口接收数据变量
- RI = 0; //令接收中断标志位为0(软件清零)
- UART_data = SBUF; //将接收到的数据送入变量 UART_data
- flag=1;
- //用户函数内容(用户可使用UART_data做数据处理)
-
- //SBUF = UART_data; //将接收的数据发送回去(删除//即生效)
- //while(TI == 0); //检查发送中断标志位
- //TI = 0; //令发送中断标志位为0(软件清零)
- }
- /**********************************************************************************************/
- /*********************************************************************************************
- 函数名:UART串口发送函数
- 调 用:UART_T (?);
- 参 数:需要UART串口发送的数据(8位/1字节)
- 返回值:无
- 结 果:将参数中的数据发送给UART串口,确认发送完成后退出
- 备 注:
- /**********************************************************************************************/
- void UART_T (unsigned char UART_data){ //定义串口发送数据变量
- SBUF = UART_data; //将接收的数据发送回去
- while(TI == 0); //检查发送中断标志位
- TI = 0; //令发送中断标志位为0(软件清零)
- }
- /**********************************************************************************************/
- /*********************************************************************************************
- 函数名:毫秒级CPU延时函数
- 调 用:DELAY_MS (?);
- 参 数:1~65535(参数不可为0)
- 返回值:无
- 结 果:占用CPU方式延时与参数数值相同的毫秒时间
- 备 注:应用于1T单片机时i<600,应用于12T单片机时i<125
- /*********************************************************************************************/
- void DELAY_MS (unsigned int a){
- unsigned int i;
- while( a-- != 0){
- for(i = 0; i < 600; i++);
- }
- }
- /*********************************************************************************************/
- /*********************************************************************************************
- 函数名:微秒级CPU延时函数
- 调 用:DELAY_MS (?);
- 参 数:1~65535(参数不可为0)
- 返回值:无
- 结 果:占用CPU方式延时与参数数值相同的毫秒时间
- 备 注:应用于1T单片机时i<600,应用于12T单片机时i<125
- /*********************************************************************************************/
- void delay_us (unsigned int a){
- unsigned char i;
- for(i = 0;i < a;i++)
- _nop_();
- }
- /*********************************************************************************************
- 函数名:热电偶温度读取
- 调 用:?=RE_CONVERT()
- 参 数:无
- 返回值:温度
- 结 果:
- 备 注:
- /**********************************************************************************************/
- unsigned int Re_Convert() //热电偶转换
- {
- unsigned int i;
- unsigned long Temp_2;
- Temp_2=0;
- CS = 0; //低电平使能,开始传送数据
- delayNOP();
- SCK = 1; // 打开时钟
- delayNOP();
- for(i=16;i>0;i--)// 读取16位数据
- {
- Temp_2 = Temp_2<<1; // 左移一位
- delayNOP();
- SCK=1;
- if(SO == 1){
- Temp_2 = Temp_2|0x0001;} // 若接收到的位为1,则数据的最后一位置1
- else
- Temp_2 = Temp_2 & 0xffff; // 否则数据的最后一位保持不变,置0(前6行左移自动补0)
- delayNOP();
- SCK=0; //时钟滴答一次
- delayNOP(); //等待数据切换
- }
- CS=1;// 读数完毕,关闭低电平使能
- Temp_2=Temp_2<<1;
- Temp_2=Temp_2>>4;
- return(Temp_2);
- }
- /*********************************************************************************************
- 函数名:数据发送
- 调 用:DATA_SEND()
- 参 数:无
- 返回值:
- 结 果:
- 备 注:2字节数据
- /**********************************************************************************************/
- void DATA_SEND(){
- LOW_1=P_Temp&0x000ff;// 获取温度低8位
- P_Temp>>=8; //右移位,干掉低8位
- HI_1=P_Temp&0x000ff;// 获取温度高8位
- LOW_2 =D_ADS&0x000ff;// 获取电压低8位
- D_ADS>>=8; //右移位,干掉低8位
- HI_2=D_ADS&0x000ff;// 获取电压高8位
- UART_T(HI_1); // 发送温度高8位
- UART_T(LOW_1); // 发送温度低8位
- UART_T(HI_2); // 发送电压高8位
- UART_T(LOW_2) ; // 发送电压低8位
- }
- /******************************************************************************
- STM32F103RCT6 Scorpio Ver5.1
- By:天星科技
- 网址:gods-star.com
- 技术支持:天星科技.com
- 淘宝网店:gods-star.taobao.com
- QQ:3184693939
- ******************************************************************************/
- void ADS1115_Port_Init(void)
- {
- ;
- }
- void ADS1115_SDAPort_IN(void)
- {
- ;
- }
- void ADS1115_SDAPort_OUT(void)
- {
- ;
- }
-
- ///*******************************************
- //函数名称: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_us(15);
- SCL=1;
- delay_us(15);
- SDA=1;
- delay_us(15);
- }
- ///*******************************************
- //函数名称:ACK
- //功 能:完成IIC的主机应答操作
- //参 数:无
- //返回值 :无
- //********************************************/
- void ACK(void)
- {
- SDA=0;
- delay_us(1);
- SCL=1;
- delay_us(15);
- SCL=0;
- delay_us(1);
- SDA=1;
- delay_us(15);
- }
- //*******************************************
- //函数名称:NACK
- //功 能:完成IIC的主机无应答操作
- //参 数:无
- //返回值 :无
- //********************************************/
- void NACK(void)
- {
- SDA=1;
- delay_us(1);
- SCL=1;
- delay_us(15);
- SCL=0;
- delay_us(1);
- SDA=0;
- delay_us(15);
- }
- //**********检查应答信号函数******************/
- ///*如果返回值为1则证明有应答信号,反之没有*/
- ///*******************************************
- //函数名称:Check
- //功 能:检查从机的应答操作
- //参 数:无
- //返回值 :从机是否有应答:1--有,0--无
- //********************************************/
- unsigned char Check(void)
- {
- unsigned char slaveack;
-
- SDA=1;
- delay_us(1);
- SCL=1;
- ADS1115_SDAPort_IN(); // SDA设置为输入
- delay_us(15);
- slaveack = SDA_IN; //读入SDA数值
- SCL=0;
- delay_us(15);
- ADS1115_SDAPort_OUT(); // SDA设置为输出
-
- if(slaveack) return FALSE;
- else return TRUE;
- }
- /***************Write a Byte****************/
- void Write_1_Byte(unsigned char DataByte)
- {
- int i;
- 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;
- delay_us(1);
- }
- /***************Write N Byte****************/
- unsigned char Write_N_Byte(unsigned char *writebuffer,unsigned char n)
- {
- int i;
- for(i=0;i<n;i++)
- {
- Write_1_Byte(*writebuffer);
- if(Check())
- {
- writebuffer ++;
- }
- else
- {
- Stop();
- return FALSE;
- }
- }
- Stop();
- return TRUE;
- }
- //***************Read a Byte****************/
- 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;
- ADS1115_SDAPort_IN(); // SDA设置为输入
- delay_us(15);
- FLAG=SDA_IN;
- data_Value <<= 1;
- if( FLAG)
- data_Value |= 0x01;
- SCL=0;
- delay_us(15);
- ADS1115_SDAPort_OUT(); // SDA设置为输出
- }
- return data_Value;
- }
- //***************Read N Byte****************/
- void Read_N_Byte(unsigned int*readbuff, unsigned char n)
- {
- unsigned char i;
-
- for(i=0;i<n;i++)
- {
- readbuff[i]=Read_1_Byte();
- if(i==n-1)
- NACK(); //不连续读字节
- else
- ACK(); //连续读字节
- }
- Stop();
- }
- //*****************初始化******************/
- void InitADS1115(unsigned char S_MUX_0, unsigned char S_MUX_1)
- {
-
- if (S_MUX_0 == 0 && S_MUX_1 == 0)
- Config = OS+MUX_A0+PGA+DR+COMP_QUE+MODE;
- if (S_MUX_0 == 0 && S_MUX_1 == 1)
- Config = OS+MUX_A1+PGA+DR+COMP_QUE+MODE;
- if (S_MUX_0 == 1 && S_MUX_1 == 0)
- Config = OS+MUX_A2+PGA+DR+COMP_QUE+MODE;
- if (S_MUX_0 == 1 && S_MUX_1 == 1)
- 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 a Word***********************/
- void WriteWord(void)
- {
- int t;
- Start(); //写入4个字节
- do
- {
- t=Write_N_Byte(Writebuff,4);
- }while(t==0);
- }
- //***************Read Word***********************/
- void ReadWord(void)
- {
- int t;
- Start(); //写入2个字节
- do
- {
- t=Write_N_Byte(Readbuff,2);
- }while(t==0);
- Start(); //写入2个字节
- do
- {
- t=Write_N_Byte(&Readbuff[2],1);
- }while(t==0);
-
- Read_N_Byte(Result,2); //读出2个字节
- }
- //***************ADS1115********************/
- unsigned int ADS1115(unsigned char Channel)
- {
- unsigned char S_MUX_0, S_MUX_1;
- switch(Channel)
- {
- case 0:
- S_MUX_0 = 0;
- S_MUX_1 = 0;
- Channel_Value = Channel + '0';
- break;
- case 1:
- S_MUX_0 = 0;
- S_MUX_1 = 1;
- Channel_Value = Channel + '0';
- break;
- case 2:
- S_MUX_0 = 1;
- S_MUX_1 = 0;
- Channel_Value = Channel + '0';
- break;
- case 3:
- S_MUX_0 = 1;
- S_MUX_1 = 1;
- Channel_Value = Channel + '0';
- break;
- default :
- break;
- }
- InitADS1115(S_MUX_0, S_MUX_1);
- WriteWord();
- DELAY_MS(1);
- ReadWord();
-
- D_ADS=Result[0]*256+Result[1]; //转换的数字量
- return D_ADS;
- }
- main(void)
- {
- unsigned int ADS1115_Value;
- ADS1115_Port_Init(); // ADS1115端口初始化
- InitADS1115();
- UART_init();// 串口初始化
- CS=1;
- while(1)
- {
- ADS1115_Value = ADS1115(0); //通道0的数值
- P_Temp=Re_Convert(); //获取温度ADC值
- DATA_SEND();// 将数据发送出去
-
- DELAY_MS(1000);
- }
- }
复制代码
|