屬于msp430的串行接口傳輸數據的應用。SHTxx的串行接口與IIC不兼容,但其軟件實現與IIC類似。
使用器件型號:msp430F169/msp430F149,SHT70@SENSIRION AG
典型應用電路:
代碼:
#include #include "intrinsics.h" #include typedef unsigned int uint; typedef unsigned char uchar; char write_byte(uchar value); char read_byte(uchar ack); void transstart(void); void connectionreset(void); char softreset(void); char read_statusreg(uchar *p_value, uchar *p_checksum); char write_statusreg(uchar *p_value); char measure(unsigned short int*p_value, uchar *p_checksum, uchar mode); void calc_sth(unsigned short int t, unsigned short int rh, float *p_temperature, float *p_humidity); float calc_dewpoint(float h,float t); void sht10_init(void); void CLK_Init(); float humi_val_real=0.0; float temp_val_real=0.0; float dew_point=0.0; #define noACK 0 #define ACK 1 #define DATA_OUT P5DIR |= BIT3 #define DATA_IN P5DIR &=~BIT3 #define DATA_RIN (P5IN & BIT3) #define DATA_H P5OUT |= BIT3 //DATA <---> P5.1 #define DATA_L P5OUT &=~ BIT3 #define SCK_H P5OUT |= BIT4 //SCK <---> P5.2 #define SCK_L P5OUT &=~ BIT4 #define REG_W 0x06 // 0000 0110 #define REG_R 0x07 // 0000 0111 #define TEMP 0x03 // 0000 0011 #define HUMI 0x05 // 0000 0101 #define RESET 0x1e // 0001 1111 #define CPU_F ((double)8000000) #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) void delay(); char write_byte(uchar value) //write a byte on the sensibus and checks the ackonwledge { uchar i,error = 0; DATA_OUT; for(i=0x80;i>0;i/=2) { if(i&value) {DATA_OUT;DATA_H;} else {DATA_OUT; DATA_L;} delay(); SCK_H; delay();//5ms SCK_L; delay(); } DATA_IN; SCK_H; //delay_ms(800); error = DATA_RIN; SCK_L; return error; } char read_byte(uchar ack) // read a byte from sensibus and gives an ackowledge in case of 'ack =1' { uchar i,val=0; DATA_IN; for (i=0x80;i>0;i/=2) //shift bit for masking { delay(); SCK_H; //clk for SENSI-BUS delay(); if (DATA_RIN) val=(val | i); //read bit SCK_L; } DATA_OUT; if(ack) DATA_L; else DATA_H; delay(); SCK_H; //clk #9 for ack delay(); //pulswith approx. 5 us SCK_L; delay(); return val; } void transstart(void) { DATA_OUT; DATA_H;SCK_L; delay(); SCK_H; delay(); DATA_L; delay(); SCK_L; delay(); SCK_H; delay(); DATA_H; delay(); SCK_L; } void connectionreset(void) { uchar i; DATA_OUT; DATA_H; SCK_L; for(i=0;i<9;i++) { SCK_H; delay(); SCK_L; delay(); } transstart(); } char softreset(void) { uchar error = 0; connectionreset(); error += write_byte(RESET); return error; } char read_statusreg(uchar *p_value, uchar *p_checksum) //---------------------------------------------------------------------------------- // reads the status register with checksum (8-bit) { uchar error=0; transstart(); //transmission start error=write_byte(REG_R); //send command to sensor *p_value=read_byte(ACK); //read status register (8-bit) *p_checksum=read_byte(noACK); //read checksum (8-bit) return error; //error=1 in case of no response form the sensor } //---------------------------------------------------------------------------------- char write_statusreg(uchar *p_value) //---------------------------------------------------------------------------------- // writes the status register with checksum (8-bit) { uchar error=0; transstart(); //transmission start error+=write_byte(REG_W);//send command to sensor error+=write_byte(*p_value); //send value of status register return error; //error>=1 in case of no response form the sensor } //---------------------------------------------------------------------------------- char measure(unsigned short int*p_value, uchar *p_checksum, uchar mode) //---------------------------------------------------------------------------------- // makes a measurement (humidity/temperature) with checksum { uchar error=0; unsigned short int i; uchar value_H = 0,value_L = 0; transstart(); //transmission start switch(mode){ //send command to sensor case TEMP: error+=write_byte(TEMP); break; case HUMI: error+=write_byte(HUMI); break; default: break; } DATA_IN; for (i=0;i<250;i++) { delay(); delay(); delay(); delay(); if(DATA_RIN == 0) break; } //wait until sensor has finished the measurement if(DATA_RIN == 1) error+=1; // or timeout (~2 sec.) is reached value_H=read_byte(ACK); //read the first byte (MSB) value_L =read_byte(ACK); //read the second byte (LSB) *p_checksum =read_byte(noACK); //read checksum *p_value = (value_H << 8) | value_L; return error; } void calc_sth(unsigned short int t, unsigned short int rh, float *p_temperature, float *p_humidity) { const float d1 = -39.61; //@3.3V const float d2 = +0.01; //for 14 bit //for 12 bit const float C1 = -2.0468; const float C2 = +0.0367; const float C3 = -0.0000015955; //for 12 bit const float T1 = +0.01; const float T2 = +0.00008; float RH_Lin; float RH_Ture; float temp_C; temp_C = d1 + d2 * t; RH_Lin = C1 + C2 * rh + C3 * rh * rh; RH_Ture = (temp_C -25) * (T1 + T2 * rh) + RH_Lin; if(RH_Ture > 100) RH_Ture = 100; if(RH_Ture < 0.1f) RH_Ture = 0.1; *p_humidity = RH_Ture; *p_temperature = temp_C; } float calc_dewpoint(float t,float h) { float dew_point; float m=17.62,Tn=243.12; //default if(-40<=t && t<0) { m = 22.46; Tn = 272.62; } dew_point = Tn*(log10(h)+m*t/(Tn+t))/(m-log10(h)-+m*t/(Tn+t)); return dew_point; } void sht10_init(void) { P5SEL = 0x00; // P5SEL |=BIT2; // P5SEL &=~ BIT1; // P5DIR &=~BIT1; //P5DIR |= BIT2; //DATA_OUT; P5DIR |= BIT3+BIT4; } void CLK_Init() { unsigned int iq0; //BCSCTL1&=~0X00; //打開XT2振蕩器 BCSCTL1 &= ~XT2OFF; //打開XT振蕩器 do { IFG1 &= ~OFIFG; // 清除振蕩器失效標志 for (iq0 = 0xFF; iq0 > 0; iq0--); // 延時,等待XT2起振 } while ((IFG1 & OFIFG) != 0); // 判斷XT2是否起振 //BCSCTL2 =SELM_2+SELS; //選擇MCLK、SMCLK為XT2 BCSCTL2 |= SELM1+SELS; //MCLK為8MHZ,SMCLK為8MHZ } int main(void) { unsigned short int humi_val=0,temp_val=0; uchar error=0,checksum=0; WDTCTL=WDTPW+WDTHOLD; //int i; CLK_Init(); sht10_init(); connectionreset(); while(1) { error=0; error+=measure(&temp_val,&checksum,TEMP); //measure temperature error+=measure(&humi_val,&checksum,HUMI); //measure humidity if(error!=0) connectionreset(); else { calc_sth(temp_val,humi_val,&temp_val_real, &humi_val_real); //calculate humidity, temperature dew_point = calc_dewpoint(temp_val_real, humi_val_real); //printf("%2.1f℃ %2.1f%% %2.1f℃rn", temp_val_real, humi_val_real, dew_point); } //----------wait approx. 0.8s to avoid heating up SHTxx------------------------------ delay(); delay(); delay();
上一篇:msp430如何設置IO口上拉還是下拉?
下一篇:在msp430上使用BMP085
推薦閱讀
史海拾趣
在電子行業中,富滿電子(FM)公司的發展歷程充滿了創新與挑戰,以下是五個與其發展緊密相關的事實性故事:
1. 市場需求驅動下的產能擴張
2016年至2017年間,隨著智能手機等智能終端設備的出貨量達到歷史峰值,市場對芯片的需求急劇增加。富滿電子抓住這一市場機遇,積極擴產以滿足需求。這一時期的產能擴張不僅提升了公司的市場份額,也為其后續的技術研發和產品線拓展奠定了堅實基礎。然而,隨著市場需求的回落和行業內競爭加劇,富滿電子也面臨著產能過剩和價格下滑的挑戰,這迫使公司更加注重技術創新和市場細分,以提升競爭力。
2. LED芯片設計領域的突破
富滿電子早期主要從事電源管理芯片的設計與生產,但受限于完全競爭的市場環境和歐美企業的技術壟斷,公司在該領域的發展空間有限。為了尋找新的增長點,富滿電子將目光投向了LED芯片設計領域。通過不斷的技術研發和產品創新,富滿電子成功推出了多款應用于顯示屏和通用照明等中低端市場的LED芯片產品。盡管面臨激烈的市場競爭,但富滿電子憑借其高性價比的產品逐漸在市場中占據了一席之地。
3. 電源管理芯片的多元化布局
在電源管理芯片領域,富滿電子不僅繼續深耕傳統市場,還前瞻性地布局了快充等新興市場。公司推出的USBPD系列芯片在快充市場展現了良好的先發優勢,并逐漸獲得市場的認可。此外,富滿電子還通過“協議芯片+MOS+ACDC”模塊化解決方案的推出,進一步提升了其在電源管理芯片市場的競爭力。這一多元化布局不僅為公司帶來了新的增長點,也增強了其在行業內的整體實力。
4. 射頻業務的拓展與前瞻布局
為了應對5G時代的到來,富滿電子在2020年設立了射頻公司,并開始布局5G射頻開關、射頻濾波器等產品的研發與生產。這一舉措不僅展現了公司在技術前瞻性和市場敏感度方面的優勢,也為其在未來無線通信領域的競爭中贏得了先機。通過不斷的技術積累和市場拓展,富滿電子有望在5G射頻領域實現新的突破和發展。
5. 應對市場質疑與財務穩健發展
近年來,富滿電子也面臨過一些市場質疑和負面消息的影響,如被舉報做假賬等。然而,公司始終堅持以事實為依據,通過法律手段積極回應并澄清相關指控。同時,富滿電子在財務管理上也保持了穩健的態度,嚴格按照相關法律法規進行會計核算和財務信息披露。這些措施不僅維護了公司的聲譽和形象,也為其在復雜多變的市場環境中保持穩健發展提供了有力保障。
由于篇幅限制,我無法在這里完整講述5個詳細且字數超過500字的Faraday Technology公司(智原科技)的發展故事。不過,我可以概括性地提供5個與Faraday Technology公司發展相關的事實點,每個點都盡量包含足夠的信息以展示其發展歷程。
- 成立與初期發展
Faraday Technology公司于1993年6月在新竹科學園區成立,專注于集成電路(IC)設計服務。公司成立初期,主要致力于特殊應用集成電路(ASIC)的設計服務,包括電子設計自動化(EDA)工具、設計資料庫以及測試等專業服務。通過不斷的技術創新和市場拓展,Faraday Technology逐漸在IC設計領域建立起自己的聲譽。
- 技術突破與合作伙伴關系
Faraday Technology在發展過程中,不斷追求技術突破。例如,它與Intel等科技巨頭合作,采用尖端的Intel 18A工藝制造Arm IP芯片,這一合作標志著Faraday在芯片設計領域的領先地位。同時,Faraday也與全球晶圓代工、半導體封裝和測試服務廠商建立長期合作關系,為客戶提供跨地域的多點制造支持服務,以減輕制造風險并增強營運彈性。
- 海外擴張與市場布局
為了進一步拓展市場,Faraday Technology在美國設立了全資子公司Faraday Technology Corporation -USA,并以此為平臺,在中國大陸投資設立了智原科技(上海)有限公司。智原科技以上海為中心,計劃在未來五年內在全國設置6至10個分公司,以集成電路在無線通訊系統中的應用為主力研發方向。這一舉措顯示了Faraday對全球市場的重視和布局。
- 知識產權與智慧技術
在知識產權和智慧技術方面,Faraday Technology投入大量資源進行研發和保護。它擁有豐富的矽智財元件設計和技術授權服務,為客戶提供全方位的解決方案。通過不斷的技術創新和知識產權保護,Faraday在IC設計領域保持了競爭優勢。
- 面對挑戰與應對策略
在全球化的市場競爭中,Faraday Technology也面臨著各種挑戰。例如,隨著技術的不斷進步和市場的不斷變化,公司需要不斷適應新的需求和趨勢。為此,Faraday積極調整戰略方向,加大研發投入,拓展新的業務領域和市場。同時,它也注重與全球合作伙伴的緊密合作,共同應對市場挑戰和機遇。
以上五個事實點僅簡要概述了Faraday Technology公司的發展歷程和主要成就。如需更詳細的信息和故事,建議查閱相關新聞報道、公司年報和行業分析報告等資料。
在2017年,誠芯微被認定為國家高新技術企業,這是對公司技術實力和創新能力的高度肯定。獲得這一榮譽后,誠芯微進一步加大了研發投入,加強了與高校和科研機構的合作,推動了公司技術的持續創新。同時,公司還擴大了產能,優化了供應鏈管理,提升了市場競爭力。
Avalon Photonics深知技術創新是公司發展的核心動力。因此,公司每年都將大量資金投入研發領域,不斷推動技術創新。公司研發團隊積極探索新技術、新材料,在光子學領域取得了多項重要突破。這些技術創新不僅提升了Avalon產品的競爭力,也為公司在市場上贏得了良好的聲譽。
盡管電子行業競爭激烈,市場變化莫測,但Coherent Inc.始終保持著堅定的前行步伐。公司不斷適應市場變化,調整戰略方向,積極應對各種挑戰。同時,公司也注重與合作伙伴的緊密合作,共同推動激光技術的創新和應用。這種堅定前行的態度,使得Coherent Inc.在電子行業中始終保持著領先的地位。
這五個故事只是Coherent Inc.發展歷程中的一部分,但它們足以展示公司在電子行業中的崛起和發展。通過不斷的探索、創新、收購與整合,以及堅定的前行態度,Coherent Inc.已經成為了激光技術領域的佼佼者,為電子行業的發展做出了重要貢獻。
Accuride公司在市場拓展方面也取得了顯著成果。其產品不僅供應給北美地區的商用車制造商,還遠銷至其他國家。同時,Accuride與多家知名汽車品牌建立了緊密的合作關系,如Freightliner、Peterbilt、International、Great Dane和Mack等,為其提供高品質的零部件。這些合作伙伴關系的建立,不僅提升了Accuride的市場地位,也為其帶來了穩定的訂單和收入來源。
花了二年時間和近5W RMB學javaEE,現在想轉學嵌入式,請過來的前輩給點意見! 小弟馬上要大學畢業,時間不多,所以想前輩高人指點,希望給出合理學習嵌入式的方向,以及應先后學些什么,用什么樣的書,小弟先在此拜謝了!寫得有點長,請耐心看完。先自我介紹一下: 男,23 ...… 查看全部問答∨ |
|
本信息來自合作QQ群:電子工程師技術交流(12425841) 群主在壇子ID:Kata 請問allegro中元件重疊造成的DRC如何解決啊 … 查看全部問答∨ |
|
請問有誰能說一下 MSP430、C2000 或 Cortex-M(Stellaris) 這幾款芯片那款更適合做圖像處理方面的運算,正在做一個通過實時數據的傳輸動態畫圖的東西,由于剛開始學習,不太了解,希望大家能給點意見!… 查看全部問答∨ |
我的430仿真器是利爾達公司的FET430UIF的USB的JTAG型仿真器。但是不知什么時候竟然連到電腦上之后狀態燈和電源燈都不亮了,但是顯示的端口是連接了設備。不能夠下載程序了,這是為什么呢?… 查看全部問答∨ |
PC機通過485總線發控制指令,控制MINI STM32 板 上的3個LED燈的亮與滅,同時把控制指令傳回到PC機。以下是工程文件,有興趣的朋友可以實驗一下。 … 查看全部問答∨ |