樓主幫忙看一下,我的測量的數據要么是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);
- }
- }
復制代碼
|