//ICC-AVR application builder : 2008-4-28 9:22:37 // Target : M8 // Crystal: 8.0000Mhz /************************************************************************* Le développement logiciel: ICC-AVR Fonction: 9600 bauds port série pour envoyer les données de température et d'humidité Format des données: forte humidité huit forte humidité 8 8 8 chèque à basse température et à basse température               Somme de contrôle = humidité élevée 8 + 8 + faible taux d'humidité température de température 8 + 8 inférieure Société: DHT21 Chip: M8 Crystal: 8Mhz externes Créé par: Création: 09.07.03 Mise à jour par: Mise à jour: Modifiez les raisons suivantes: **************************************************** **********************/ #include #include typedef unsigned char U8; /* defined for unsigned 8-bits integer variable */ typedef signed char S8; /* defined for signed 8-bits integer variable */ typedef unsigned int U16; /* defined for unsigned 16-bits integer variable */ typedef signed int S16; /* defined for signed 16-bits integer variable */ typedef unsigned long U32; /* defined for unsigned 32-bits integer variable */ typedef signed long S32; /* defined for signed 32-bits integer variable */ typedef float F32; /* single precision floating point variable (32bits) */ typedef double F64; /* double precision floating point variable (64bits) */ /************************************************************************** Définition des espace I/O ***************************************************************************/ // B0_IN DDRB &= ~(1 << PB0) /* entrée de réglage*/ // B0_OUT DDRB |= (1 << PB0) /*définir la sortie*/ // B0_CLR PORTB &= ~(1 << PB0) /* mettre bas*/ // B0_SET PORTB |= (1 << PB0) /* jeu de haut*/ // B0_R PINB & (1 <0; dly--) { WDR(); for (i=0; i<1119; i++); } } void Delay_10us(void) { U8 i; i++;i++;i++;i++;i++;i++;i++;i++;i++; i++;i++;i++;i++;i++;i++;i++;i++;i++; i++;i++;i++;i++;i++;i++;i++;i++;i++; i++;i++;i++;i++;i++;i++;i++;i++;i++; i++;i++;i++;i++;i++;i++;i++;i++;i++; i++;i++;i++;i++;i++;i++;i++;i++;i++; i++;i++;i++;i++;i++;i++;i++;i++;i++; i++;i++;i++;i++;i++;i++;i++; } void COM(void) { U8 i; for(i=0;i<8;i++) { U8FLAG=2; while((!(COM_R))&&U8FLAG++); if(U8FLAG==1)break; Delay_10us(); Delay_10us(); Delay_10us(); Delay_10us(); U8temp=0; if(COM_R)U8temp=1; U8FLAG=2; while((COM_R)&&U8FLAG++); //Délai d'attente de la boucle for if(U8FLAG==1)break; //Déterminer le bit de données est égal à 0 ou 1 // Si le niveau élevé HAUTE valeur 0 est supérieur à un bit prédéterminé de données 1 U8comdata<<=1; U8comdata|=U8temp; //0 }//rof } //-------------------------------- //----- Routine l'ecture humidité //-------------------------------- //----Les variables suivantes sont des variables globales-------- //----Haute température 8== U8T_data_H------ //----Basse température 8== U8T_data_L------ //----Une forte humidité 8== U8RH_data_H----- //----Le faible taux d'humidité 8== U8RH_data_L----- //----Check 8 == U8checkdata----- //----Sous-programmes d'appels---------- //---- Delay();, Delay_10us();,COM(); //-------------------------------- void RH(void) { //Master en tirant 18ms COM_OUT; COM_CLR; DelaymS(1); COM_IN; COM_SET; //Bus résistance pull-up tiré 20us retard d'accueil Delay_10us(); Delay_10us(); Delay_10us(); Delay_10us(); //Hôte est défini pour entrer signal de réponse jugement de la machine //P2_0=1; // Déterminer si l'esclave ne répond pas à un niveau bas en réponse à des signaux tels que vous sautez, délabré réponse // if(!P2_0) //T ! if(COM_R)U8FLAG=1; while(!(COM_R)) { U8FLAG=2; //Déterminer si le problème esclave 80US signal de faible niveau de réponse plus //while((!P2_0)&&U8FLAG++); while((!(COM_R))&&U8FLAG++); if(U8FLAG==1)break; U8FLAG=2; //Déterminer s'il convient de délivrer un esclave question 80US haut niveau tel est l'accès à la réception de données d'état //while((P2_0)&&U8FLAG++); while((COM_R)&&U8FLAG++); if(U8FLAG==1)break; //Données de réception d'état COM(); if(U8FLAG==1)break; U8T_data_H_temp=U8comdata; COM(); if(U8FLAG==1)break; U8T_data_L_temp=U8comdata; COM(); if(U8FLAG==1)break; U8RH_data_H_temp=U8comdata; COM(); if(U8FLAG==1)break; U8RH_data_L_temp=U8comdata; COM(); if(U8FLAG==1)break; U8checkdata_temp=U8comdata; break; }//while //P2_0=1; COM_IN; COM_SET; //Validation des données U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp); if(U8temp==U8checkdata_temp) { U8RH_data_H=U8T_data_H_temp; U8RH_data_L=U8T_data_L_temp; U8T_data_H=U8RH_data_H_temp; U8T_data_L=U8RH_data_L_temp; U8checkdata=U8checkdata_temp; }//fi COM_IN; COM_SET; } / *initialisation du port Fréquence du système: 2MHz Bits d'arrêt: 1 Vitesse de transmission: 9600 Longueur des données: 8 */ void Uart_Init(void) { UCSRA = 0x02; /*2 vitesses */ UCSRB = 0x18; /*autorisé à recevoir et envoyer */ UCSRC = 0x06; /*donnee 8 bit */ UBRRH = 0x00; //UBRRL = 47; /*9600 3.6864M */ //UBRRL = 95; /*9600 7.3728M */ UBRRL = 103; /*9600 8.0000M */ } / * La transmission en série de données Requête envoyée * / void Uart_Transmit(unsigned char i) { /* Attendre tampon de transmission vide*/ while (!(UCSRA & (1<