با سلام
برنامه راه اندازی سنسور sht75 رو با کدویژن و سون سگمنت رو نوشتم ولی هر کار میکنم پرش اعداد روی سون سگمنت خیلی زیاده ؟
راه حلش چیه و چه جوری بنویسم؟ ممنون
این قسمت نمایش دما
برنامه راه اندازی سنسور sht75 رو با کدویژن و سون سگمنت رو نوشتم ولی هر کار میکنم پرش اعداد روی سون سگمنت خیلی زیاده ؟
راه حلش چیه و چه جوری بنویسم؟ ممنون
این قسمت نمایش دما
کد:
b=a%10; c=a/10; c=c%10; d=a/100; d=d%10; e=a/1000; PORTC.0=1; PORTD=seg[e]; delay_ms(10); PORTC.0=0; PORTC.1=1; PORTD=seg[d]; delay_ms(10); PORTC.1=0; PORTC.2=1; PORTD=seg[c]; delay_ms(10); PORTC.2=0; PORTC.3=1; PORTD=seg[b]; delay_ms(10); PORTC.3=0; delay_ms(1); این تمام برنامه #include <mega16.h> #include <stdio.h> #include <delay.h> #include <math.h> #include <stdlib.h> /* #asm .equ __lcd_port=0x12 #endasm #include <lcd.h> */ typedef union { unsigned int i; float f;} value; int a; int b=0; int c=0; int d=0; int e=0; //float f,g,h,ff,gg,hh; char seg[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; enum {TEMP,HUMI}; sfrb PINB = 0x16; sfrb PORTB = 0x18; sfrb DDRB = 0x17; #define SHT_DATA_OUT DDRB.0 #define SHT_DATA_IN PINB.0 #define SHT_SCK PORTB.1 #define noACK 0 #define ACK 1 //adr command r/w #define STATUS_REG_W 0x06 //000 0011 0 #define STATUS_REG_R 0x07 //000 0011 1 #define MEASURE_TEMP 0x03 //000 0001 1 #define MEASURE_HUMI 0x05 //000 0010 1 #define RESET 0x1e //000 1111 0 char str_hum_temp[100]; /* const float C1=-4.0; // for 12 Bit const float C2=+0.0405; // for 12 Bit const float C3=-0.0000028; // for 12 Bit const float T1=+0.01; // for 14 Bit @ 5V const float T2=+0.00008; // for 14 Bit @ 5V */ float C1=-4.0; // for 12 Bit float C2=+0.0405; // for 12 Bit float C3=-0.0000028; // for 12 Bit float T1=+0.01; // for 14 Bit @ 5V float T2=+0.00008; // for 14 Bit @ 5V char v; float dew_point; //SHT Functions char SHT_WriteByte(unsigned char value); char SHT_ReadByte(unsigned char ack); void s_transstart(void); void s_connectionreset(void); //void setting(void); char s_softreset(void); char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode); void calc_sth11(float *p_humidity ,float *p_temperature); float calc_dewpoint(float h,float t); //void set(void); /* unsigned char key=16,uch_TempTime_Number=0; int intTemp1=0,intTime1=0,intTemp2=0,intTime2=0,intTemp3=0,intTime3=0; int intTemp4=0,intTime4=0,intTemp5=0,intTime5=0,intTemp6=0,intTime6=0; */ value humi_val, temp_val; void print_temp_humy (void) { //int a; //int b=0; //int c=0; //int d=0; //int e=0; //float f,g,h,ff,gg,hh; //char seg[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; unsigned char error, checksum;// status; a=humi_val.f*100; error=0; error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI); error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP); if(error!=0) s_connectionreset(); else{ humi_val.f=(float)humi_val.i; //converts integer to float temp_val.f=(float)temp_val.i; //converts integer to float calc_sth11(&humi_val.f,&temp_val.f); //calculate humidity, temperature dew_point=calc_dewpoint(humi_val.f,temp_val.f); //calculate dew point } #asm("wdr"); b=a%10; c=a/10; c=c%10; d=a/100; d=d%10; e=a/1000; PORTC.0=1; PORTD=seg[e]; delay_ms(10); PORTC.0=0; PORTC.1=1; PORTD=seg[d]; delay_ms(10); PORTC.1=0; PORTC.2=1; PORTD=seg[c]; delay_ms(10); PORTC.2=0; PORTC.3=1; PORTD=seg[b]; delay_ms(10); PORTC.3=0; delay_ms(1); #asm("wdr"); if(temp_val.f>limit_temp) { delay_ms(300); PORTA.6=1; PORTA.4=1; } if(humi_val.f>limit_humi) { PORTA.7=1; PORTA.5=1; } //********//** if(temp_val.f<limit_temp-0.3) { PORTA.6=0; PORTA.4=0; } if(humi_val.f<limit_humi-1) { PORTA.7=0; PORTA.5=0; } } void main(void) { PORTA=0xff; DDRA=0xf0; PORTB=32; DDRB=0x00; PORTC=0x00; DDRC=0xFF; PORTD=0x00; DDRD=0xFF; TCCR0=0x00; TCNT0=0x00; TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; ASSR=0x08; TCCR2=0x05; TCNT2=0x00; OCR2=0x00; //GIMSK=0x00; MCUCR=0x00; TIMSK=0x40; ACSR=0x80; // Setup Sensibus Pins PORTB.1 = 0; // ClockLow DDRB.1 = 1; // SCK is an output PORTB.0 = 0; // Always Zero // Toggle DDRB.0 for Data // LCD module initialization //lcd_init(16); //Start: WDTCR=0x1E; WDTCR=0x0E; s_softreset(); print_temp_humy(); while (1) { /* b=a%10; c=a/10; c=c%10; d=a/100; d=d%10; e=a/1000; PORTC.0=1; PORTD=seg[e]; delay_ms(4); PORTC.0=0; PORTC.1=1; PORTD=seg[d]; delay_ms(4); PORTC.1=0; PORTC.2=1; PORTD=seg[c]; delay_ms(4); PORTC.2=0; PORTC.3=1; PORTD=seg[b]; delay_ms(4); PORTC.3=0; delay_ms(4); */ if(PINB.5==0){ delay_ms(200); // setting(); } else{ delay_ms(500); #asm("wdr"); print_temp_humy(); s_softreset(); } } } char SHT_WriteByte(unsigned char value) { unsigned char i,error=0; for (i=0x80;i>0;i/=2) { if (i & value) SHT_DATA_OUT=0; else SHT_DATA_OUT=1; SHT_SCK=1; delay_us(5); //pulswith approx. 5 us SHT_SCK=0; } SHT_DATA_OUT=0; //release DATA-line SHT_SCK=1; //clk #9 for ack error=SHT_DATA_IN; //check ack (DATA will be pulled down by SHT11) SHT_SCK=0; return error; #asm("wdr"); //error=1 in case of no acknowledge } //---------------------------------------------------------------------------------- // baca byte dari SHT, dan berikan ACK //---------------------------------------------------------------------------------- char SHT_ReadByte(unsigned char ack) { unsigned char i,val=0; SHT_DATA_OUT=0; //release DATA-line for (i=0x80;i>0;i/=2) { SHT_SCK=1; if (SHT_DATA_IN) val=(val | i); //read bit SHT_SCK=0; } SHT_DATA_OUT=ack; //in case of "ack==1" pull down DATA-Line SHT_SCK=1; //clk #9 for ack delay_us(5); //pulswith approx. 5 us SHT_SCK=0; SHT_DATA_OUT=0; //release DATA-line return val; #asm("wdr"); } //---------------------------------------------------------------------------------- // kondisi start // _____ ________ // DATA: |_______| // ___ ___ // SCK : ___| |___| |______ //---------------------------------------------------------------------------------- //---------------------------------------------------------------------------------- // reset koneksi, 9 clock diikuti dengan kondisi start // _____________________________________________________ ________ // DATA: |_______| // _ _ _ _ _ _ _ _ _ ___ ___ // SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______ //---------------------------------------------------------------------------------- void s_connectionreset(void) { unsigned char i; SHT_DATA_OUT=0; SHT_SCK=0; //Initial state for(i=0;i<9;i++) //9 SCK cycles { SHT_SCK=1; delay_us(4); SHT_SCK=0; #asm("wdr"); } s_transstart(); //transmission start } //---------------------------------------------------------------------------------- // reset SHT-nya !! //---------------------------------------------------------------------------------- char s_softreset(void) { unsigned char error=0; s_connectionreset(); //reset communication error+=SHT_WriteByte(RESET); //send RESET-command to sensor return error; #asm("wdr"); //error=1 in case of no response form the sensor } //---------------------------------------------------------------------------------- // pengukuran data //---------------------------------------------------------------------------------- char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode) { unsigned error=0; unsigned int i; s_transstart(); //transmission start switch(mode){ //send command to sensor case TEMP : error+=SHT_WriteByte(MEASURE_TEMP); break; case HUMI : error+=SHT_WriteByte(MEASURE_HUMI); break; default : break; } #asm("wdr"); for (i=0;i<65535;i++) if(SHT_DATA_IN==0) break; //wait until sensor has finished the measurement if(SHT_DATA_IN) error+=1; // or timeout (~2 sec.) is reached *(p_value+1) =SHT_ReadByte(ACK); //read the first byte (MSB) *(p_value) =SHT_ReadByte(ACK); //read the second byte (LSB) *p_checksum =SHT_ReadByte(noACK); //read checksum return error; } //---------------------------------------------------------------------------------------- // hitung temperature [°C] and humidity [%RH] // input : humi [Ticks] (12 bit) // temp [Ticks] (14 bit) // output: humi [%RH] // temp [°C] //---------------------------------------------------------------------------------------- void calc_sth11(float *p_humidity ,float *p_temperature) { //float rh=*p_humidity; // rh: Humidity [Ticks] 12 Bit //float t=*p_temperature; // t: Temperature [Ticks] 14 Bit float rh_lin; // rh_lin: Humidity linear float rh_true; // rh_true: Temperature compensated humidity float t_C; // t_C : Temperature [°C] t_C=*p_temperature*0.01 - 40; //calc. temperature from ticks to [°C] rh_lin=C3*(*p_humidity)*(*p_humidity) + C2*(*p_humidity) + C1; //calc. humidity from ticks to [%RH] rh_true=(t_C-25)*(T1+T2*(*p_humidity))+rh_lin; //calc. temperature compensated humidity [%RH] if(rh_true>100)rh_true=100; //cut if the value is outside of if(rh_true<0.1)rh_true=0.1; //the physical possible range *p_temperature=t_C; //return temperature [°C] *p_humidity=rh_true; //return humidity[%RH] #asm("wdr"); } //-------------------------------------------------------------------- // calculates dew point // input: humidity [%RH], temperature [°C] // output: dew point [°C] //-------------------------------------------------------------------- float calc_dewpoint(float h,float t) { float logEx,dew_point; logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2); dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx); return dew_point; #asm("wdr"); }
دیدگاه