[mw_shl_code=c,true]#include<pic.h> // Використовуйте кристалічний осцилятор 12M #include"12864.h" #define uint unsigned int #define uchar unsigned char __CONFIG(FOSC_HS WDTE_OFF&LVP_OFF); Учар temp_valueH,hum_valueH,hum_valueL,temp_valueL,перевірено; uint delay_time; Порожнеча timer0_init()
{ TMR0=0; Перше значення T0CS=0; Виберіть джерело тактового сигналу, яке становить 1/4 кристалічного генератора; T0SE=1; Біти вибору ребер джерела тактового сигналу PSA=0; Біти передподілника PS0=0; PS1=0; PS2=0; Переддивізійні відбіркові моменти TMR0IF=0; Прапорець таймера чистий 0 GIE=1; Відкрити глобальне переривання TMR0IE=0; Таймер 0 увімкнено TMR0=236; Перша цінність вірша
} Таймер переривання порожнечі 0()
{ if(TMR0IF) { TMR0IF=0; TMR0=235; delay_time--; }
} Порожнеча timer0_delay(Uint delay_value)
{ delay_time=delay_value; TMR0IE=1; while(delay_time); TMR0IE=0;
} Uchar Read_byte()
{ Учар I, темп, гум; for(i=0; i<8; i++) { поки(! RC1); timer0_delay(2); Затримка 20us temp=0; if(RC1){temp=1; поки (RC1); } інакше{temp=0; } гул<<=1; hum|=temp; } return(гул);
} Порожнеча Read_data()
{ Учар ckeck_value; RC1=0; timer0_delay(2500); Автобус тягне вниз щонайменше на 18 МС RC1=1; timer0_delay(2); Шина підтягується підтягувальним резистором, а затримка хоста становить 20us TRISC1=1; Хост налаштований на вхід для оцінки сигналу відповіді підлеглого RC1=1; якщо(! RC1) { поки((! RC1)) // Визначити, чи випромінює підлеглий сигнал низької відповіді 80us чи ні { NOP(); } while(RC1) // Визначте, чи підлеглий випромінює високий рівень 80us, і якщо так, він переходить у стан прийому даних { NOP(); } temp_valueH=Read_byte(); temp_valueL=Read_byte(); hum_valueH=Read_byte(); hum_valueL=Read_byte(); check=Read_byte(); ckeck_value=hum_valueL+hum_valueH+temp_valueL+temp_valueH; if(check==ckeck_value) { Proce_num(0x84,temp_valueH); Proce_num(0x94,hum_valueH); } } TRISC1=0; RC1=1;
} Void main()
{ TRISB=0X00; lcdinit(); timer0_init(); поки (1) { Read_data(); } }[/mw_shl_code]
|