Главная » Статьи » PIC Simulator IDE |
Данное устройство позволяет: Назначение портов: но может быть скомпилирована на любой совместимый МК (например PIC16F628). Каждя кодовая посылка пульта ДУ содержит пятиразрядный двоичный адрес устройства, у меня это 10000, у других телевизоров может быть иначе, не проверял. Поэтому в программе заложен алгоритм автоматического перебора адресов устройств от 00000000 до 00011111. Подключить инфракрасный светодиод к порту МК можно через резистор сопротивлением 300 Ом, а для достижения максимальной дальности, как показано на рисунке irdriver или стабилизированный по питанию вариант на рисунке iremitter.
При разработке пульта помогла справочная информация о протоколе sharp Схема устройства: Программа для компилятора PICSimulatorIDE
Code
'rb.0 - 'rb.1 - on/off 'rb.2 - volume plus 'rb.3 - volume minus 'rb.4 - chanel plus 'rb.5 - chanel minus 'rb.6 - AV/TV 'rb.7 - infrared transiever WaitMs 100 Dim a1 As Byte Dim addres_var As Byte Dim add0 As Bit Dim add1 As Bit Dim add2 As Bit Dim add3 As Bit Dim add4 As Bit addres_var = %00000000 TRISB = %01111111 RB.7 = 0 start: add0 = addres_var.0 add1 = addres_var.1 add2 = addres_var.2 add3 = addres_var.3 add4 = addres_var.4 If RB.1 = 1 Then 'on/off Gosub addres Gosub logic_zero Gosub logic_one Gosub logic_one Gosub logic_zero Gosub logic_one Gosub logic_zero Gosub logic_zero Gosub logic_zero Gosub logic_one Gosub logic_zero Gosub pulse WaitMs 40 'on/off inverse Gosub addres Gosub logic_one Gosub logic_zero Gosub logic_zero Gosub logic_one Gosub logic_zero Gosub logic_one Gosub logic_one Gosub logic_one Gosub logic_zero Gosub logic_one Gosub pulse Endif If RB.2 = 1 Then 'volume plus Gosub addres Gosub logic_zero Gosub logic_zero Gosub logic_one Gosub logic_zero Gosub logic_one Gosub logic_zero Gosub logic_zero Gosub logic_zero Gosub logic_one Gosub logic_zero Gosub pulse WaitMs 40 'volume plus inverse Gosub addres Gosub logic_one Gosub logic_one Gosub logic_zero Gosub logic_one Gosub logic_zero Gosub logic_one Gosub logic_one Gosub logic_one Gosub logic_zero Gosub logic_one Gosub pulse Endif If RB.3 = 1 Then 'volume minus Gosub addres Gosub logic_one Gosub logic_zero Gosub logic_one Gosub logic_zero Gosub logic_one Gosub logic_zero Gosub logic_zero Gosub logic_zero Gosub logic_one Gosub logic_zero Gosub pulse WaitMs 40 'volume minus inverse Gosub addres Gosub logic_zero Gosub logic_one Gosub logic_zero Gosub logic_one Gosub logic_zero Gosub logic_one Gosub logic_one Gosub logic_one Gosub logic_zero Gosub logic_one Gosub pulse Endif If RB.4 = 1 Then 'chanel plus Gosub addres Gosub logic_one Gosub logic_zero Gosub logic_zero Gosub logic_zero Gosub logic_one Gosub logic_zero Gosub logic_zero Gosub logic_zero Gosub logic_one Gosub logic_zero Gosub pulse WaitMs 40 'chanel plus inverse Gosub addres Gosub logic_zero Gosub logic_one Gosub logic_one Gosub logic_one Gosub logic_zero Gosub logic_one Gosub logic_one Gosub logic_one Gosub logic_zero Gosub logic_one Gosub pulse Endif If RB.5 = 1 Then 'chanel minus Gosub addres Gosub logic_zero Gosub logic_one Gosub logic_zero Gosub logic_zero Gosub logic_one Gosub logic_zero Gosub logic_zero Gosub logic_zero Gosub logic_one Gosub logic_zero Gosub pulse WaitMs 40 'chanel minus inverse Gosub addres Gosub logic_one Gosub logic_zero Gosub logic_one Gosub logic_one Gosub logic_zero Gosub logic_one Gosub logic_one Gosub logic_one Gosub logic_zero Gosub logic_one Gosub pulse Endif If RB.6 = 1 Then 'AV/TV Gosub addres Gosub logic_one Gosub logic_one Gosub logic_zero Gosub logic_zero Gosub logic_one Gosub logic_zero Gosub logic_zero Gosub logic_zero Gosub logic_one Gosub logic_zero Gosub pulse WaitMs 40 'AV/TV inverse Gosub addres Gosub logic_zero Gosub logic_zero Gosub logic_one Gosub logic_one Gosub logic_zero Gosub logic_one Gosub logic_one Gosub logic_one Gosub logic_zero Gosub logic_one Gosub pulse Endif addres_var = addres_var + 1 If addres_var > %00011111 Then addres_var = %00000000 Endif WaitMs 40 Goto start End pulse: For a1 = 0 To 11 RB.7 = 1 WaitUs 7 RB.7 = 0 WaitUs 19 Next a1 Return addres: If add4 = 1 Then Gosub logic_one Else Gosub logic_zero Endif If add3 = 1 Then Gosub logic_one Else Gosub logic_zero Endif If add2 = 1 Then Gosub logic_one Else Gosub logic_zero Endif If add1 = 1 Then Gosub logic_one Else Gosub logic_zero Endif If add0 = 1 Then Gosub logic_one Else Gosub logic_zero Endif Return logic_zero: For a1 = 0 To 11 RB.7 = 1 WaitUs 7 RB.7 = 0 WaitUs 19 Next a1 WaitUs 680 Return logic_one: For a1 = 0 To 11 RB.7 = 1 WaitUs 7 RB.7 = 0 WaitUs 19 Next a1 WaitUs 1680 Return '' (PIC16F628) '' PIC16F84A @ 4MHz '' ----- '' -|1 |- '' -| |- '' -| |- '' -| |- '' -| |- 300 Ом '' -| |------[res]--------[IR diode]--- '' VDD-- /--------| |--------/ --VDD | '' VDD-- /--------| |--------/ --VDD | '' VDD-- /--------| |--------/ --VDD | '' ----- GND '' '' ''К rb.1-rb.6 подключены подтягивающие ''резисторы 3кОм (на схеме не показаны) ''для подтяжки входов к земле Архив с материалами можно скачать здесь Обсудить на форуме | ||||||
Просмотров: 14172 | Комментарии: 2 | | |
Всего комментариев: 2 | |||
| |||