جزاك الله خيراا
وشكرااا جزيلا ..
لقد توصلت الي ما احتاجه من هذه المشاركه ..
للعلم أخي رابط الكود والمحكاه لا يعمل ..
اشكرك اخي علي اهتمامك ..
سوف اقوم بالعمل علي هذا الكود لدمجه في مشروع كامل للتحكم في درجه الحراره والرطوبه .... ..
|
وجازاك بمثله أخي الكريم
أخي جربت الرابط وهو يعمل وعند فتحه يعطي هذه الصورة:
شكرا لأنك أخبرتني بهذا الأمر وسأبحث عن موقع أخر للتحميل لا بشترط التسجيل.
عموما هذا تذكير بالكود لمن يريد من الإخوة المحاكاة على بروتوس:
كود:
/*
Project: Temperature and humidity measurements using DHT11
MCU: PIC16F877A
Clock: 4.0MHz
*/
// LCD module connections
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
sbit Data at RA0_bit;
sbit DataDir at TRISA0_bit;
char message1[] = "Temp = 00.0 C";
char message2[] = "RH = 00.0 %";
unsigned short TOUT = 0, CheckSum, i;
unsigned short T_Byte1, T_Byte2, RH_Byte1, RH_Byte2;
void StartSignal(){
DataDir = 0; // Data port is output
Data = 0;
Delay_ms(25);
Data = 1;
Delay_us(30);
DataDir = 1; // Data port is input
}
unsigned short CheckResponse(){
TOUT = 0;
TMR2 = 0;
T2CON.TMR2ON = 1; // start timer
while(!Data && !TOUT);
if (TOUT) return 0;
else {
TMR2 = 0;
while(Data && !TOUT);
if (TOUT) return 0;
else {
T2CON.TMR2ON = 0;
return 1;
}
}
}
unsigned short ReadByte(){
unsigned short num = 0, t;
DataDir = 1;
for (i=0; i<8; i++){
while(!Data);
TMR2 = 0;
T2CON.TMR2ON = 1;
while(Data);
T2CON.TMR2ON = 0;
if(TMR2 > 40) num |= 1<<(7-i); // If time > 40us, Data is 1
}
return num;
}
void interrupt(){
if(PIR1.TMR2IF){
TOUT = 1;
T2CON.TMR2ON = 0; // stop timer
PIR1.TMR2IF = 0; // Clear TMR interrupt flag
}
}
void main() {
unsigned short check;
TRISB = 0;
PORTB = 0;
TRISA.B0 = 1;
ADCON1 = 7;
INTCON.GIE = 1; //Enable global interrupt
INTCON.PEIE = 1; //Enable peripheral interrupt
// Configure Timer2 module
PIE1.TMR2IE = 1; // Enable Timer2 interrupt
T2CON = 0; // Prescaler 1:1, and Timer2 is off initially
PIR1.TMR2IF =0; // Clear TMR INT Flag bit
TMR2 = 0;
Lcd_Init();
Lcd_Cmd(_Lcd_Clear);
Lcd_Cmd(_LCD_CURSOR_OFF);
do {
Delay_ms(1000);
StartSignal();
check = CheckResponse();
if (!check) {
Lcd_Cmd(_Lcd_Clear);
Lcd_Out(1, 1, "No response");
Lcd_Out(2, 1, "from the sensor");
}
else{
RH_Byte1 = ReadByte();
RH_Byte2 = ReadByte();
T_Byte1 = ReadByte();
T_Byte2 = ReadByte();
CheckSum = ReadByte();
// Check for error in Data reception
if (CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF))
{
message1[7] = T_Byte1/10 + 48;
message1[8] = T_Byte1%10 + 48;
message1[10] = T_Byte2/10 + 48;
message2[7] = RH_Byte1/10 + 48;
message2[8] = RH_Byte1%10 + 48;
message2[10] = RH_Byte2/10 + 48;
message1[11] = 223; // Degree symbol
Lcd_Cmd(_Lcd_Clear);
Lcd_Out(1, 1, message1);
Lcd_Out(2, 1, message2);
}
else{
Lcd_Cmd(_Lcd_Clear);
Lcd_Out(1, 1, "Checksum Error!");
Lcd_Out(2, 1, "Trying Again ...");
}
}
}while(1);
}
وهذا ملف Hex :
كود:
:02000000AC2929
:10000800FF00030E83018316B3000A08B4008A01B7
:1000180083128C1C13280130A00012118C10831637
:0E00280034088A00330E8300FF0E7F0E09009D
:10003600103083120313FD00FD0B1F28000008007B
:0400460000000800AE
:10004A00083083120313FC002330FD00FD0B2B281C
:06005A00FC0B2B2808003E
:1000600083160313BA1B3728831286133928831289
:10007000861783163A1B3F288312061341288312E2
:1000800006178316BA1A4728831286124928831244
:10009000861683163A1A4F288312061251288312A5
:1000A00006166C18552806155628061186152320A5
:1000B00086118316BA195F2883128613612883126A
:1000C000861783163A196728831206136928831244
:1000D00006178316BA186F288312861271288312A6
:1000E000861683163A187728831206127928831207
:1000F00006166C187D2806157E2806118615232005
:0E01000086116C1C8528252086281B200800EF
:0E010E00831203136B088A006A08820008003F
:10011C00831203136C1083163908BA0030206C1448
:02012C000800C9
:10012E0083120313A001910112150518A2282008AD
:10013E00031DA2289C2820080319A728F001B62821
:10014E009101051CAE282008031DAE28A828200802
:10015E000319B328F001B62812110130F00008007F
:10016E00C928803083160313B500DC28C030B500D3
:10017E00DC289430B500DC28D430B500DC28803083
:10018E00B500DC28831603133508013A0319B82885
:10019E003508023A0319BD283508033A0319C02859
:1001AE003508043A0319C328C6283603F00035086B
:1001BE00F0077008B5007008BA0030206C10831676
:1001CE00B80138083707840000080319F7283808E3
:1001DE00370784000008B9008E208316B80AE82875
:0601EE0083126C140800EE
:1001F40083160313B50105148312ED0108306D0253
:100204000318252905180729042991011215051C2D
:100214000C29092912111108283C031822296D08F8
:10022400073CF0007008F1000130F0007108031978
:100234001F29F00D7010FF3E192970088316B504AC
:0E0244008312ED0A002983163508F000080029
:1002520087208A110A128000840AEA0A0319EB0A2B
:08026200F003031D2929080027
:10026A0083120313F8010830FC00700DF80D7408AE
:10027A00F80203184229F8070310F00DFC0B3A297B
:02028A0008006A
:10028C00831603130510831205102130FC00763001
:10029C00FD00FD0B4F29FC0B4F2900000514093004
:1002AC00FD00FD0B57290000000083160514080003
:1002BC008316031386110611061286120613861373
:1002CC008312861106118613061386120612252038
:1002DC002520252086160616861523208611252016
:1002EC00861523208611252086152320861125208E
:1002FC0006128615232086112520861523208611AB
:10030C00861286178615232086112520861306163D
:10031C00861523208611061286152320861125208A
:10032C008615232086110616861523208611252076
:10033C0006128615232086118617061786160616B2
:0C034C0086152320861125206C14080063
:10035800E02283160313860183128601831605148F
:1003680007309F008B170B178C14831292018C1087
:1003780091015E2101308316BA0030200C308316BB
:10038800BA0030200630FB001330FC00AD30FD0011
:10039800FD0BCC29FC0BCC29FB0BCC290000000061
:1003A800462197207008031DEE2901308316BA00F4
:1003B800302001308316B5000130B6002130B70077
:1003C800B72002308316B5000130B600A030B70060
:1003D800B7207F2AFA2070088312EF00FA207008ED
:1003E8008312EE00FA207008B200FA207008B100FB
:1003F800FA207008B00083126E086F07F100F2014E
:100408000318F20A83163208F1070318F20A3108B2
:10041800F1070318F20AFF307105F3007208F400BF
:100428000030F40500307406031D1C2A730870069A
:10043800031D6B2A0A30F4003208F00035213030F1
:100448007007D2000A30F40083163208F000352114
:100458007808F00030307007D3000A30F4008316B3
:100468003108F000352130307007D5000A30F4002B
:100478006F08F000352130307007C4000A30F400EE
:100488006F08F00035217808F00030307007C5009B
:100498000A30F4006E08F000352130307007C700CC
:1004A800DF30D60001308316BA00302001308316C1
:1004B800B5000130B6004B30B700B72002308316C4
:1004C800B5000130B6003D30B700B7207F2A0130B3
:1004D8008316BA00302001308316B5000130B6000B
:1004E8002D30B700B72002308316B5000130B600B2
:0A04F8005930B700B720C629802A4A
:1005C000203084004A3083120313F0008630EA00A2
:1005D0000230EB002921A030840010308312F0009B
:0C05E000D030EA000230EB0029210800B6
:02050C000034B9
:10050E004E346F34203472346534733470346F3437
:08051E006E34733465340034BF
:1005260043346834653463346B34733475346D34F2
:1005360020344534723472346F34723421340034CA
:10054600523448342034203420343D34203430347E
:0C05560030342E3430342034253400348E
:10056200543465346D34703420343D3420343034A6
:0C05720030342E34303420344334003454
:10057E0054347234793469346E34673420344134EF
:10058E006734613469346E3420342E342E342E3474
:02059E00003427
:1005A000663472346F346D34203474346834653496
:1005B0002034733465346E3473346F3472340034E1
:02400E000A2F77
:00000001FF
أما الدائرة و اعدادات الميكروسي فهي المرفقة في الرد السابق
علما بأن المثال هو مجرد كود قراءة الحرارة والرطوبة
لكن يمكن استخدام النتائج في أغراض اخرى للقياس او الضبط بناء على هذه المعطيات :
- المتغير الذي يخزن درجة الحرارة هو المتغير :T_Byte1
- المتغير الذي يخزن درجة الرطوبة هو المتغير :RH_Byte1
و جزء الكود الذي يمكن التعديل عليه هو دالة تحقق القياس وهو :
كود:
// Check for error in Data reception
if (CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF))
{
// ....
}
هذه مجرد طريقة
ربما توجد طرق أخرى أفضل.
وفقك الله أخي الكريم وبارك فيك..