![]() |
發(fā)布時間: 2017-3-14 15:00
正文摘要:小白初學,想實現(xiàn)k型熱電偶+max6675+stc89c52單片機 組成一個檢測溫度的系統(tǒng)。 但是上網(wǎng)學著寫了段程序,最后顯示不出正確的數(shù)值。。。想求助各位大大,哪里出問題了。 |
跪求大神,是不是熱電偶轉換那段函數(shù)出問題了?不是特別懂串口模擬SPI,不知道有沒有寫錯。 max6675是不是SCK CS SO三個引腳對應程序自己定義的三個I/O口,剩下的VCC和GND接在MCU對應的VCC和GND就好了? |
附上程序: #include "reg52.h"//頭文件 #include "absacc.h" #include "math.h" #include "intrins.h" #define uchar unsigned char //宏定義 #define uint unsigned int sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; sbit SO=P1^0; sbit SCK=P1^1; sbit CS=P1^2; #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; void delay(unsigned int i) { while(i--); } uint Re_Convert (void); //溫度轉換 void DigDisplay(); //溫度顯示 uchar qian=0,bai=0,shi=0,ge=0,xiao=0; uint P_Temp; float wendu; uchar code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//顯示0~F的值 uchar code xiaoshu[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //顯示0~F的值(含小數(shù)點) void main(void) //主程序 { delayNOP(); SO =0; while(1) { P_Temp=Re_Convert(); wendu=0.25*P_Temp;//P_Temp =(1024*P_Temp)/4096 delayNOP(); DigDisplay(); P_Temp=0; wendu=0; } } uint Re_Convert() //熱電偶轉換 { unsigned int i; unsigned long tdata; tdata=0; SCK = 1; SO=0; CS = 1; //選擇從機 delayNOP(); CS=0; for(i=0;i<16;i++) { tdata = tdata<<1; // 左移一位,或_crol_(temp,1) delayNOP(); SCK=0; if(SO == 1) tdata = tdata|0x01; // 若接收到的位為1,則數(shù)據(jù)的最后一位置1 else tdata = tdata & 0xfe; // 否則數(shù)據(jù)的最后一位置0 delayNOP(); SCK=1; delayNOP(); } tdata=tdata<<1; tdata=tdata>>4; return(tdata); } void DigDisplay()//溫度顯示 { uchar i; uint temp=wendu*10; bai=temp%10000/1000; shi=temp%1000/100; ge=temp%100/10; xiao=temp%10; P0=0x0ff; for(i=0;i<4;i++) { switch(i) //位選,選擇點亮的數(shù)碼管, { case(3): LSA=1;LSB=1;LSC=0; P0=smgduan[bai];break;//顯示第3位,即百位 case(2): LSA=0;LSB=1;LSC=0; P0=smgduan[shi];break;//顯示第2位,即十位 case(1): LSA=1;LSB=0;LSC=0; P0=xiaoshu[ge];break;//顯示第1位,即個位 case(0): LSA=0;LSB=0;LSC=0; P0=smgduan[xiao];break;//顯示第0位,即小數(shù)位 } delay(100); //間隔一段時間掃描 P0=0x00;//消隱 } } |
Powered by 單片機教程網(wǎng)