⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 prog1.c

📁 this program reads data from sensors and then sends it to a PIC-WEB which then loads it to a server
💻 C
字号:
//portc6 y portc7 al display. portc4 reset PIC. PORTC5 enable display.


//#include <iom64v.h>
//#include <shortnametype.h>
//#include <macros.h>
//#include <eeprom.h>
#include <math.h>
#include <ctype.h>

#include <util/delay.h>

#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <avr/wdt.h>
#include <avr/io.h>
#include <avr/interrupt.h>

#define ACK                        1
#define noACK                      0

#define F_CPU 2000000UL
#define HUMIDITY_DDR	 DDRC
#define HUMIDITY_PIN	 PINC
#define HUMIDITY_PORT	 PORTC
#define PIC_DDR	 		 DDRB
#define PIC_PIN	 		 PINB
#define PIC_PORT	 	 PORTB
#define DATAVALID	     0x10 
#define DATAACCEPTED	 0x08
#define RESETPIC	 	 0x20
#define HUMIDITY_DATA	 0x01 
#define HUMIDITY_SCK	 0x02 
#define LED				 0x04

//adr command r/w 
#define HUMIDITY_STATUS_REG_W 0x06 //000 0011 0 
#define HUMIDITY_STATUS_REG_R 0x07 //000 0011 1 
#define HUMIDITY_MEASURE_TEMP 0x03 //000 0001 1 
#define HUMIDITY_MEASURE_HUMI 0x05 //000 0010 1 
#define HUMIDITY_RESET 0x1e //000 1111 0 

void HumidityInit(void); 
void HumidityDelay(void); 
void HumidityWriteByte(unsigned char value); 
unsigned char HumidityReadByte(unsigned char ack); 
void HumidityTransStart(void); 
void HumidityConnectionReset(void); 
void HumiditySoftReset(void); 
unsigned char HumidityReadStatus(void); 
void HumidityWriteStatus(unsigned char value); 
unsigned int HumidityMeasure(unsigned char mode); 
void HumidityCalc(float *p_humidity ,float *p_temperature); 
void HumidityGet(float *p_humidity ,float *p_temperature); 
void HumidityUpdate(void); 
void enviarPIC(unsigned int value);
char presionupdate(void);
void USART_Transmit( unsigned char data );
void USART_Init( unsigned int baud );
unsigned char USART_Receive( void );

unsigned char HumiError = 0;
float Temperature,Humidity;
unsigned int Temp,Hum,presion;
unsigned int tmp1,tmp2,tmp3;

void HumidityDelay(void) 
{ 
//int i; 
//for (i=0;i<20;i++) wdt_reset(); 
_delay_us(5);
} 

void HumidityInit(void) 
{ 
HUMIDITY_DDR |= HUMIDITY_DATA + HUMIDITY_SCK; 
HUMIDITY_PORT |= HUMIDITY_DATA + HUMIDITY_SCK; 
HumiditySoftReset(); 
} 


void HumidityWriteByte(unsigned char value) 
{ 
unsigned char i; 

HUMIDITY_DDR |= HUMIDITY_DATA; //DATA-line in output 

for (i=0x80;i>0;i/=2) //shift bit for masking 
{ 
HumidityDelay(); 
if (i & value) HUMIDITY_PORT |= HUMIDITY_DATA; 
else HUMIDITY_PORT &= ~HUMIDITY_DATA; 
HumidityDelay(); 
HUMIDITY_PORT |= HUMIDITY_SCK; 
HumidityDelay(); 
HUMIDITY_PORT &= ~HUMIDITY_SCK; 
} 

HUMIDITY_PORT |= HUMIDITY_DATA; //release DATA-line 
HUMIDITY_DDR &= ~HUMIDITY_DATA;	 //DATA-line in input 
HumidityDelay(); 
HUMIDITY_PORT |= HUMIDITY_SCK;	 //clk #9 for ack 
HumidityDelay(); 
if (HUMIDITY_PIN & HUMIDITY_DATA) HumiError = 1; //OJO SI NO ACK no hace nada?
HUMIDITY_PORT &= ~HUMIDITY_SCK; 
HumidityDelay(); 
} 

unsigned char HumidityReadByte(unsigned char ack) //para mandar ACK ack=1
{ 
unsigned char i,val=0; 

HUMIDITY_PORT |= HUMIDITY_DATA; //release DATA-line 
HUMIDITY_DDR &= ~HUMIDITY_DATA;	 //DATA-line in input 

for (i=0x80;i>0;i/=2) //shift bit for masking 
{ 
HumidityDelay(); 
HUMIDITY_PORT |= HUMIDITY_SCK; //clk for SENSI-BUS 
HumidityDelay(); 
if (HUMIDITY_PIN & HUMIDITY_DATA) val=(val | i); //read bit 
HUMIDITY_PORT &= ~HUMIDITY_SCK; 
} 

if (ack == 1) 
{ 
HUMIDITY_DDR |= HUMIDITY_DATA;	 //DATA-line in output 
HUMIDITY_PORT &= ~HUMIDITY_DATA; //"ack==1" pull down DATA-Line 
HumidityDelay(); 
HUMIDITY_PORT |= HUMIDITY_SCK; 
HumidityDelay(); 
HUMIDITY_PORT &= ~HUMIDITY_SCK; 
} 
else 
{ 
HumidityDelay(); 
HUMIDITY_PORT |= HUMIDITY_SCK; 
HumidityDelay(); 
HUMIDITY_PORT &= ~HUMIDITY_SCK; 
} 
return val; 
} 

void HumidityTransStart(void) 
{ 
HUMIDITY_DDR |= HUMIDITY_DATA; //DATA-line in output 

HUMIDITY_PORT |= HUMIDITY_DATA; //DATA=1 
HUMIDITY_PORT &= ~HUMIDITY_SCK; //SCK=0 
HumidityDelay(); 
HUMIDITY_PORT |= HUMIDITY_SCK; //SCK=1 
HumidityDelay(); 
HUMIDITY_PORT &= ~HUMIDITY_DATA; //DATA=0 
HumidityDelay(); 
HUMIDITY_PORT &= ~HUMIDITY_SCK; //SCK=0 
HumidityDelay(); 
HUMIDITY_PORT |= HUMIDITY_SCK; //SCK=1 
HumidityDelay(); 
HUMIDITY_PORT |= HUMIDITY_DATA;	 //DATA=1 
HumidityDelay(); 
HUMIDITY_PORT &= ~HUMIDITY_SCK;	 //SCK=0 
HumidityDelay(); 
} 

void HumidityConnectionReset(void) 
{ 
unsigned char i; 

HUMIDITY_DDR |= HUMIDITY_DATA; //DATA-line in output 
HUMIDITY_PORT |= HUMIDITY_DATA; //DATA=1 
HUMIDITY_PORT &= ~HUMIDITY_SCK; //SCK=0 

for (i=0;i<9;i++) //9 SCK cycles 
{ 
HumidityDelay(); 
HUMIDITY_PORT |= HUMIDITY_SCK; //SCK=1 
HumidityDelay(); 
HUMIDITY_PORT &= ~HUMIDITY_SCK; //SCK=0 
} 
HumidityTransStart(); //transmission start 
HumiError = 0; 
} 

void HumiditySoftReset(void) 
{ 
int i; 
HumidityConnectionReset(); //Reset communication 
HumidityWriteByte(HUMIDITY_RESET); //send Reset-command to sensor 

//for (i=0;i<100;i++) HumidityDelay(); // 11ms delay 
_delay_ms(11);
} 

unsigned int HumidityMeasure(unsigned char mode) 
{ 
unsigned char msb,lsb; 
int i,j; 

HumidityTransStart(); //transmission start 
switch (mode)	 //send command to sensor 
{ 
	case HUMIDITY_MEASURE_TEMP : HumidityWriteByte(HUMIDITY_MEASURE_TEMP); 
	break; 
	case HUMIDITY_MEASURE_HUMI : HumidityWriteByte(HUMIDITY_MEASURE_HUMI); 
	break; 
	default : break; 
} 

HUMIDITY_PORT |= HUMIDITY_DATA; //release DATA-line 
HUMIDITY_DDR &= ~HUMIDITY_DATA;	 //DATA-line in input 

for (i=0;i<=200000;i++) 
{ 
	//for (j=0;j<1;j++) 
	//{
	wdt_reset();
	if((HUMIDITY_PIN & HUMIDITY_DATA) == 0) break; //wait until sensor 
	//}
}	 //has finished the measure 
if(i > 65530) 
{ 
	HumiError=1; // or timeout (~2 sec.) is reached 
	return 0xffff; 
} 

msb =HumidityReadByte(ACK); //read the first byte (MSB) 
lsb=HumidityReadByte(noACK); //read the second byte (LSB) 
//tmp =HumidityReadByte(noACK); //dummy read checksum 
return (msb<<8)+lsb; 
} 

void HumidityCalc(float *p_humidity ,float *p_temperature) 
{ 
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 @ 3V 
float T2=+0.00008; // for 14 Bit @ 3V 

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=t*0.01 - 40; //calc. temperature from ticks to [?C] 
rh_lin=C3*rh*rh + C2*rh + C1; //calc. humidity from ticks to [%RH] 
rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //calc. temp 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] 
} 

void HumidityGet(float *p_humidity ,float *p_temperature) 
{ 
unsigned int humi_val,temp_val; 

humi_val = HumidityMeasure(HUMIDITY_MEASURE_HUMI); //measure humidity 
temp_val = HumidityMeasure(HUMIDITY_MEASURE_TEMP); //measure temperature 

if(HumiError == 1) HumidityConnectionReset(); //in case of an error: Reset 
else 
{ 
*p_humidity=(float)humi_val; //converts integer to float 
*p_temperature=(float)temp_val; //converts integer to float 
HumidityCalc(p_humidity,p_temperature); //calculate humidity, temperature 
} 
} 

void HumidityUpdate(void) 
{ 
if (HumiError == 1) HumidityInit(); 
HumidityGet(&Humidity,&Temperature); 
Hum = Humidity;  //ojo multiplicar para precision
Temp = Temperature * 10; 
}

void enviarPIC(unsigned int value)
{
 char a[1];
  itoa(value,a,10);
  PIC_PORT=a[0];
  PORTD |= DATAVALID; 	 //DATAVALID=1
	while((PIND & DATAACCEPTED) == 0) 
   	{
	wdt_reset();
	}
  PORTD &= ~DATAVALID; 	 //DATAVALID=0
  	while((PIND & DATAACCEPTED) != 0)
	{
	wdt_reset();
	}
  return;
}

void USART_Init( unsigned int baud )
{
/* Set baud rate */
   //#define BAUD 9600
   //#include <util/setbaud.h>
   //UBRRH = UBRRH_VALUE;
   //UBRRL = UBRRL_VALUE;

  UBRRH = (unsigned char)(baud>>8);
  UBRRL = (unsigned char)baud;
/* Enable receiver and transmitter */
  UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 1s	top bit */
  UCSRC = (1<<URSEL)|(3<<UCSZ0);
}

void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
	while ( !( UCSRA & (1<<UDRE)) )
	;
/* Put data into buffer, sends the data */
	UDR = data;
}

unsigned char USART_Receive( void )
{
/* Wait for data to be received */
	while ( !(UCSRA & (1<<RXC)) )
	;
/* Get and return received data from buffer */
	return UDR;
}

char presionupdate(void)
{
char t1[3],presiontmp[13],signo,t2,t3,t4;
USART_Transmit('g');
wdt_reset();
USART_Transmit('e');
wdt_reset();
USART_Transmit('t');
wdt_reset();
USART_Transmit(13);
for(int j=0;j<=2;j++)
     {
	 t1[j]=USART_Receive();
     wdt_reset();
	 }
wdt_reset();
if(t1[0]=='o' && t1[1]=='k' && t1[2]=='$')
  {
  for(int i=0;i<=12;i++)
     {
	 presiontmp[i]=USART_Receive();
     wdt_reset();
	 }
	 signo=presiontmp[0];
  if(presiontmp[7]=='-')
    {
	presion=0;
	wdt_reset();
	}
  else if(presiontmp[7]=='+')
    {
	t2=presiontmp[1];
	t3=presiontmp[3];
	t4=presiontmp[4];

	if(presiontmp[9]=='0')
	{
	  if(t2=='1')
	    presion=1;
	  else if (t2=='2')
	    presion=2;
	  else if (t2=='3')
	    presion=3;
  	  else if (t2=='4')
	    presion=4;
      else if (t2=='5')
	    presion=5;
      else if (t2=='6')
	    presion=6;
	  else if (t2=='7')
	    presion=7;
	  else if (t2=='8')
	    presion=8;
	  else if (t2=='9')
	    presion=9;
	  else 
	    presion=0;
	}
	else if(presiontmp[9]=='1')
	{
	  if(t2=='1')
	    presion=10;
	  else if (t2=='2')
	    presion=20;
	  else if (t2=='3')
	    presion=30;
  	  else if (t2=='4')
	    presion=40;
      else if (t2=='5')
	    presion=50;
      else if (t2=='6')
	    presion=60;
	  else if (t2=='7')
	    presion=70;
	  else if (t2=='8')
	    presion=80;
	  else if (t2=='9')
	    presion=90;
	  else 
	    presion=0;
	  if(t3=='1')
	    presion=presion+1;
	  else if (t3=='2')
	    presion=presion+2;
	  else if (t3=='3')
	    presion=presion+3;
  	  else if (t3=='4')
	    presion=presion+4;
      else if (t3=='5')
	    presion=presion+5;
      else if (t3=='6')
	    presion=presion+6;
	  else if (t3=='7')
	    presion=presion+7;
	  else if (t3=='8')
	    presion=presion+8;
	  else if (t3=='9')
	    presion=presion+9;
	  else if (t3=='0')
	    presion=presion+0;
	//presion=(atoi(t2))*10+atoi(t3);
	}
	else if(presiontmp[9]=='2')
	{
	if(t2=='1')
	    presion=100;
	  else if (t2=='2')
	    presion=200;
	  else if (t2=='3')
	    presion=300;
  	  else if (t2=='4')
	    presion=400;
      else if (t2=='5')
	    presion=500;
      else if (t2=='6')
	    presion=600;
	  else if (t2=='7')
	    presion=700;
	  else if (t2=='8')
	    presion=800;
	  else if (t2=='9')
	    presion=900;
	  else 
	    presion=0;
	  if(t3=='1')
	    presion=presion+10;
	  else if (t3=='2')
	    presion=presion+20;
	  else if (t3=='3')
	    presion=presion+30;
  	  else if (t3=='4')
	    presion=presion+40;
      else if (t3=='5')
	    presion=presion+50;
      else if (t3=='6')
	    presion=presion+60;
	  else if (t3=='7')
	    presion=presion+70;
	  else if (t3=='8')
	    presion=presion+80;
	  else if (t3=='9')
	    presion=presion+90;
	  else if (t3=='0')
	    presion=presion+0;
	  	  if(t4=='1')
	    presion=presion+1;
	  else if (t4=='2')
	    presion=presion+2;
	  else if (t4=='3')
	    presion=presion+3;
  	  else if (t4=='4')
	    presion=presion+4;
      else if (t4=='5')
	    presion=presion+5;
      else if (t4=='6')
	    presion=presion+6;
	  else if (t4=='7')
	    presion=presion+7;
	  else if (t4=='8')
	    presion=presion+8;
	  else if (t4=='9')
	    presion=presion+9;
	  else if (t4=='0')
	    presion=presion+0;
	//presion=(atoi(t2))*100+(atoi(t3))*10+atoi(t4);
	}
	
	}
	wdt_reset(); 
  }
else presionupdate();
return signo;
}

int main(void)
{
  char sign;
  wdt_reset();
  WDTCR = 0x0f;      // wathdog como en 2.2seg
  HumidityInit();
  USART_Init(12);    // 9600 baudios suponiendo fclk=2MHz
	  PIC_DDR =0xFF;		 //puerto pic es output
  DDRD |= DATAVALID;     	 //data valid es output
  DDRD &= ~DATAACCEPTED;	 //data accepted es input				 	 
  DDRD |= RESETPIC;
  DDRD |= LED;
  PORTD &= ~RESETPIC;
  _delay_us(100);
  PORTD |= RESETPIC; 
while(1)
  {
  wdt_reset(); 
  HumidityUpdate();
  tmp1=Hum/100;
  tmp2=(Hum-(tmp1*100))/10;
  tmp3=(Hum-(tmp1*100)-(tmp2*10));
  enviarPIC(tmp1);
  enviarPIC(tmp2);
  enviarPIC(tmp3);
  wdt_reset();
  tmp1=Temp/100;
  tmp2=(Temp-(tmp1*100))/10;
  tmp3=(Temp-(tmp1*100)-(tmp2*10));
  enviarPIC(tmp1);
  enviarPIC(tmp2);
  enviarPIC(tmp3);
  wdt_reset();
  sign=presionupdate();
  PIC_PORT=sign;
  PORTD |= DATAVALID; 	 //DATAVALID=1
	while((PIND & DATAACCEPTED) == 0) 
   	{
	wdt_reset();
	}
  PORTD &= ~DATAVALID; 	 //DATAVALID=0
  	while((PIND & DATAACCEPTED) != 0)
	{
	wdt_reset();
	}
  tmp1=presion/100;
  tmp2=(presion-(tmp1*100))/10;
  tmp3=(presion-(tmp1*100)-(tmp2*10));
  enviarPIC(tmp1);
  enviarPIC(tmp2);
  enviarPIC(tmp3);
  wdt_reset();
  if(sign=='-'||presion<=10)
	PORTD |= LED;
  else PORTD &= ~LED;
  wdt_reset();
  }
return(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -